# Zu lange Verarbeitungszeit beim schreiben mit Libnodave



## dolo280 (4 Februar 2011)

Morgen Zusammen!

Bin in letzter Zeit hier etwas aktiv gewesen und habe nun mein Programm soweit fertig - es Kopiert einen *String* aus ca. *72 Zeichen *in den DB einer S7 mit hilfe der Libnodave.dll

Das ganze klappt soweit auch gut - nur leider benötigt das Kopieren in die Steuerung deutlich zu lange.. im moment brauche ich ca. 2-3.Sekuden bis der ganze String kopiert wurde...

Hat jemand eine Idee wie ich das ganze reduzieren könnte?

Habe es schonmal versucht über eine "prepareWriteRequest();" zu verbessern allerdings schaffe ich es mit diesen Kommandos absolut nicht in die Steuerung zu schreiben...


```
int len = textstring.Length;
int i = len;
while (i > 0)
{
       //Ermittle die aktuelle länge des Strings
       int aktuellelenge = textstring.Length;
       //Konvertiere den String ins einen char im Ascii
       Int16 zeichen = (Int16)char.Parse(textstring.Substring(aktuellelenge - 1, 1));
 
       //Verkürtze mit jeder Schleife den String um 1
       if (textstring.Length > 1)
       {
            textstring = textstring.Remove(aktuellelenge - 1, 1);
       }
       //Nun in die SPS schreiben!
       dc.writeBytes(libnodave.daveDB, dbnummer, i, intlen, BitConverter.GetBytes(libnodave.daveSwapIed_16(zeichen)));
       i = i - 1;
}
```


----------



## Jochen Kühner (4 Februar 2011)

*hmmm*

warum schreibst du denn immer nur ein Zeichen und nicht die 72 Bytes auf einmal?


----------



## dolo280 (4 Februar 2011)

Hey, danke für die schnelle Antwort!

Da ich jedes Zeichen des Strings erstmal in Ascii übersetzte dachte ich es wär das einfachste die ganze Übertragung jeweils in der Schleife zu lösen..

Du meinst eine Lösung in dieser Richtung?!



```
i = 2 
//startadresse?? 
intlen = 53 
//kommplette länge des Strings?
zeichen = abcde... 
//aber sicherlich nicht als String? vorher in ascii umwandlen und das dann komplett kopieren?! 
 
dc.writeBytes(libnodave.daveDB, dbnummer, i, intlen, zeichen);
```


----------



## Jochen Kühner (4 Februar 2011)

in was arbeitest du denn?? Csharp? Wenn ja, da mach Ich es so: Encoding.ASCII.GetBytes(value);


----------



## dolo280 (4 Februar 2011)

Ja exakt! C# - ok das ist mir auch soweit geläufig, jetzt stellt sich nur wieder die frage wie ich den "buffer" indem ich meine sachen ablege wieder an libnodave weitergebe...

```
string textin = "ABCD";
byte[] buffer = {};
buffer = Encoding.ASCII.GetBytes(textin);
 
dc.writeBytes(libnodave.daveDB, dbnummer, i, intlen, buffer);
```
 
Kommt das so hin? Wenn ich den Buffer in die Console.Schreibe ( über Convert.ToString(buffer); - erhalte ich nur ein "System.Byte[]

Lg Dominik


----------



## Jochen Kühner (4 Februar 2011)

Jo, so ungefaehr, intlen würde ich noch durch buffer.Length ersetzen! Du musst nur darauf achten, dein string darf nich größer als deine pdu size minus header sein!

Kannst dir auch mal meine lib ansehen, die baut auf libnodave auf, da kannst du direkt strings lesen znd schreiben (http://jochensserver.dyndns.org/wordpress/?page_id=200)


----------



## dolo280 (9 Februar 2011)

```
string textin = "ABCD";
byte[] buffer = {};
buffer = Encoding.ASCII.GetBytes(textin); 
dc.writeBytes(libnodave.daveDB, dbnummer, i, textin.Length, buffer);
```
 

hat Funktionier! vielen vielen Dank!


----------

