# Libnodave Timer und Counter



## Paul.Juergen (30 Juni 2010)

Hallo Liebes Forum,

Erstmal ein RIEßEN Lob für diese Plattform, Transparenz und Präsenz der Mitglieder!

Zum Titel:
Ich möchte gerne mit einem VB.Net Programm diverse  S5T# - Zeiten und Zählwerte Counter# aus einem DB einer S7 SPS in eine Textbox auslesen/schreiben. Ich verwende dazu DaveWrite/ReadManyBytes. (Da es auch mal mehr werden kann)

Verbindung funktioniert schon über TCP/IP.

Aber ich bekomme die Daten nicht dekodiert/kodiert!
Verstehe auch nicht so recht den Aufbau der 16 Bit Timer Datentypen.

Muss das mit den DavePut/Get Methoden als 16 Bit Integer Wert übermittelt werden oder 2 x DavePut/Get Methode 8 Bit Byte Wert übermittelt werden? (Aufgrund Little/Big Endian?!)

Würde in meinem Fall sogar 4 Textboxes als Eingabemöglichkeit vorgeben um Stunden, Minuten, Sekunden, Millisekunden einzeln ausgeben/eingeben zu können.

Kann mir einer ein Code Beispiel oder Hilfe geben? Suche wurde durchgeführt im Forum...

Lieben Gruß Paul 

EDIT:
Eine 2. Frage:
Mit DaveWrite/ReadManyBytes kann man meiner Erfahrung nach um die 1 kB Daten aus einer S7 CPU lesen/schreiben.
Weis einer den genauen Wert in Bytes, der übermittelt werden kann, ohne das Fehler auftreten?


----------



## Jochen Kühner (30 Juni 2010)

*Infos...*

Mit Read Many Bytes sollte es eigentlich keine Beschränkungen geben! Ich hab die Funktion in meiner libnodave.net.cs aber selbst implementiert, da Ich mit der aus LibNodave Probleme hatte.

Ich habe in meiner ConnectionLibrary aber auch ne neuere Version wo ein paar weitere Funktionen drinn sind, auch zum auslesen von s5time werten!

Download hier:
http://jochensserver.dyndns.org/wordpress/?page_id=55


----------



## Paul.Juergen (30 Juni 2010)

Danke Jochen für die Infos, aber das hilft mir so direkt bei dem Thema nicht weiter, da ich ja dann ein neues Projekt erstellen muss...
Werde mir aber bei nächster Gelegenheit deine ConnectionLibrary anschauen und ausprobieren inwiefern ich damit klar komme...

Könnte mir noch jemand einen Tipp geben wie ich die Timer kodieren/dekodieren kann?!


----------



## Earny (30 Juni 2010)

Hallo Paul,

im nachfolgenden Beispiel wird der Timer T1 (S5T - 16 Bit) gelesen. Bei den S5-Timern ist in den linken 4 Bit die Zeitbasis codiert und in den rechten 12 Bit steht der Zeitwert. Die Libnodave-Funktion daveGetSecondsAt macht automatisch die Wandlung von Big nach Little Endian und versteht offensichtlich auch die Zeitcodierung der S5T-Timer.


```
[COLOR=#0000ff][COLOR=#0000ff]Private[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Declare[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Function[/COLOR][/COLOR] daveGetSecondsAt [COLOR=#0000ff][COLOR=#0000ff]Lib[/COLOR][/COLOR] [COLOR=#800000][COLOR=#800000]"libnodave.dll"[/COLOR][/COLOR] ([COLOR=#0000ff][COLOR=#0000ff]ByVal[/COLOR][/COLOR] dc [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Integer[/COLOR][/COLOR], [COLOR=#0000ff][COLOR=#0000ff]ByVal[/COLOR][/COLOR] pos [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Integer[/COLOR][/COLOR]) [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Single[/COLOR][/COLOR]
[COLOR=#0000ff]
[/COLOR][COLOR=#0000ff][COLOR=#0000ff]Private[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Sub[/COLOR][/COLOR] Timer3_Tick([COLOR=#0000ff][COLOR=#0000ff]ByVal[/COLOR][/COLOR] sender [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] System.Object, _
[COLOR=#0000ff][COLOR=#0000ff]ByVal[/COLOR][/COLOR] e [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] System.EventArgs) [COLOR=#0000ff][COLOR=#0000ff]Handles[/COLOR][/COLOR] Timer3.Tick
[COLOR=#0000ff][COLOR=#0000ff]Dim[/COLOR][/COLOR] buf(1) [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Byte[/COLOR]
[/COLOR]res = daveReadBytes(dc, daveTimer, 0, 1, 2, buf(0))
txtT1Lesen.Text = daveGetSecondsAt(dc, 0)
[COLOR=#0000ff][COLOR=#0000ff]End[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Sub[/COLOR]
[/COLOR]
```
 
Was das Lesen von großen Speicherbereichen anbelangt, so habe ich schon 1000 Integerwerte aus einem DB mit der Libnodave-Funktion daveReadManyBytes gelesen. Mit dieser Funktion müsste der gesamte Inhalt eines DBs gelesen werden können, also z.B. 8 oder 16 KByte - bei der S7-300.

Gruß
Earny


----------



## Jochen Kühner (30 Juni 2010)

Paul.Juergen schrieb:


> Danke Jochen für die Infos, aber das hilft mir so direkt bei dem Thema nicht weiter, da ich ja dann ein neues Projekt erstellen muss...
> Werde mir aber bei nächster Gelegenheit deine ConnectionLibrary anschauen und ausprobieren inwiefern ich damit klar komme...
> 
> Könnte mir noch jemand einen Tipp geben wie ich die Timer kodieren/dekodieren kann?!



Nöö, wieso?? Musst mal schauen, bei mir ist in meiner Lib auch ne neuer Version der libnodave.net enthalten, welche du betsimmt auch verwendest. Und bei mir sind dann Timer funktionen drinn.


----------



## Jochen Kühner (30 Juni 2010)

*Folgende Funktion...*

Bei mir gibts diese Funktion:

 public static TimeSpan getS5Timefrom(byte[] b, int pos)


----------



## Paul.Juergen (1 Juli 2010)

> im nachfolgenden Beispiel wird der Timer T1 (S5T - 16 Bit) gelesen. Bei  den S5-Timern ist in den linken 4 Bit die Zeitbasis codiert und in den  rechten 12 Bit steht der Zeitwert. Die Libnodave-Funktion  daveGetSecondsAt macht automatisch die Wandlung von Big nach Little  Endian und versteht offensichtlich auch die Zeitcodierung der S5T-Timer.



Hallo Earny, Danke für den Tipp!

Habe das ausprobiert mit davegetsecondsat und ja du hast recht es werden ausnahmslos die s5t# Werte übertragen! 
So gut so fein, aber ich möchte diese gerne auch nach Wertänderung der Textbox zurücksenden können.
Leider konnte ich in der libnodave.dll keinen davePUTsecondsat Befehl finden. 

Zudem wird der durch davegetsecondsat eine Single (32 Bit) Variable ausgegeben, die s5t# Variablen haben doch 16 Bit?!

Hast du vielleicht dafür einen Vorschlag?

Ich habe einfach das dumme Gefühl, es muss Byteweise in 4 Textboxes übertragen werden a la:

Stunden ; Minuten ; Sekunden ; Millisekunden

Dann muss aber auch Little/Big Endian beachtet werden.

Zudem müsste man sich die ankommenden 2 Byte so dekodieren, dass diese den 4 Textboxes zugeordnet werden können und umgekehrt- 

Nur wie?!


----------



## Paul.Juergen (1 Juli 2010)

> Nöö, wieso?? Musst mal schauen, bei mir ist in meiner Lib auch ne neuer  Version der libnodave.net enthalten, welche du betsimmt auch verwendest.  Und bei mir sind dann Timer funktionen drinn.


Hallo Jochen,

Danke für den Tipp! Habe die ConnectionLibrary Probehalber unter Verweise in das VB Projekt integriert.

Sind die Befehle mit dem angewendeten Standardverbindungsaufbau der Libnodave Beispielen Kompatibel?! 

Oder könntest du mir ein kurzes Beispiel in VB geben, wie man die Funktion public static TimeSpan getS5Timefrom(byte[] b, int pos)  für eine Standard Verbindung zu einer 300er CPU verwendet?


----------



## Jochen Kühner (1 Juli 2010)

Paul.Juergen schrieb:


> Hallo Jochen,
> 
> Danke für den Tipp! Habe die ConnectionLibrary Probehalber unter Verweise in das VB Projekt integriert.
> 
> ...



Die libnodave.net.cs ist gleich bei den funktionen die schon in der orginal drinnen sind, ich habe sie nur erweitert (Falls du die routing funktionen verwenden willst musst du aber auch meine libnodave.dll verwenden). Die getS5Timefrom kannst du ganz normal auf dein gelesenes bytearray verwenden, was willst du da genau wissen. Bei meiner Connection Library ist auch ein VB Beispiel Programm dabei!


----------



## Earny (1 Juli 2010)

Hallo Paul,

ich habe auch keine davePutSecondsAt-Funktion gefunden. Wenn diese Funktion nicht existiert, dann müsste die Codierung aufwändig in VB programmiert werden. Das will ich mir nicht antun.

Vielleicht ist folgender Weg einfacher.
Wenn du Zeitwerte in die S7 schreiben willst, dann könntest Du auch den Wert in ms durch Libnodave in ein Doppelwort schreiben und den Wert dann in der S7 durch die FC40 (IEC-Time nach S5T) in das S5T-Format wandeln. Wenn Du das S7-Programm nicht verändern darfst, scheidet dieser Weg allerdings auch aus.

Oder Du lässt das mit den S5T-Timern ganz bleiben und ersetzt sie durch IEC-Timer.

Gruß
Earny


----------



## Jochen Kühner (1 Juli 2010)

Earny schrieb:


> Hallo Paul,
> 
> ich habe auch keine davePutSecondsAt-Funktion gefunden. Wenn diese Funktion nicht existiert, dann müsste die Codierung aufwändig in VB programmiert werden. Das will ich mir nicht antun.
> 
> ...



Also wie oben auch schon geschrieben, Habe Ich in meiner erweiterteten libnodave.net.cs eine funktion für s5 zeiten implementiert. Aber hier auch noch mal der Code. (Der könnte bestimmt noch optimiert werden, aber er geht!)


```
public static void putS5Timeat(byte[] b, int pos, TimeSpan value)
    {
        byte basis;
        int wert;
        if (value.TotalMilliseconds <= 999*10)
        {
            basis = 0;
            wert = Convert.ToInt32(value.TotalMilliseconds)/10;
        }
        else if (value.TotalMilliseconds <= 999*100)
        {
            basis = 1;
            wert = Convert.ToInt32(value.TotalMilliseconds)/100;
        }
        else if (value.TotalMilliseconds <= 999*1000)
        {
            basis = 2;
            wert = Convert.ToInt32(value.TotalMilliseconds)/1000;
        }
        else if (value.TotalMilliseconds <= 999*10000)
        {
            basis = 3;
            wert = Convert.ToInt32(value.TotalMilliseconds)/10000;
        }
        else
        {
            basis = 3;
            wert = 999;
        }

        int p1, p2, p3;

        p3 = (wert/100);
        p2 = ((wert - p3*100)/10);
        p1 = (wert - p3*100 - p2*10);

        b[pos] = Convert.ToByte(basis << 4 | p3);
        b[pos + 1] = Convert.ToByte((p2 << 4 | p1));
    }
```


----------



## Paul.Juergen (2 Juli 2010)

> ich habe auch keine davePutSecondsAt-Funktion gefunden. Wenn diese  Funktion nicht existiert, dann müsste die Codierung aufwändig in VB  programmiert werden. Das will ich mir nicht antun.



Hallo Earny du hast vollkommen recht!



> Vielleicht ist folgender Weg einfacher.
> Wenn du Zeitwerte in die S7 schreiben willst, dann könntest Du auch den  Wert in ms durch Libnodave in ein Doppelwort schreiben und den Wert dann  in der S7 durch die FC40 (IEC-Time nach S5T) in das S5T-Format wandeln.  Wenn Du das S7-Programm nicht verändern darfst, scheidet dieser Weg  allerdings auch aus.



Ja stimmt eine vernünftige und logische Möglichkeit, werde das auch so wohl machen. 
Aber trotzdem möchte ich das Problem mit VB lösen, einfach um zu wissen ob und wie das geht... Danke für den Tipp!


----------



## Paul.Juergen (2 Juli 2010)

> Also wie oben auch schon geschrieben, Habe Ich in meiner erweiterteten libnodave.net.cs eine funktion für s5 zeiten implementiert. Aber hier auch noch mal der Code. (Der könnte bestimmt noch optimiert werden, aber er geht!)


 
Hallo Jochen,

Ok werde mich gleich mal ans Visual Studio setzen und das umschreiben in VB..

Zu deiner LibnodaveConnectionLibrary habe ich noch eine Frage:
Wollte zum Test für die S5 Zeiten die gets5 puts5 Befehle integrieren.
Habe die LibnodaveConnectionLibrary.dll unter Verweise in das VB-Projekt hinzugefügt. 
Anschließend habe ich ein LibnodaveConnectionLibrary.vb Modul in das Projekt integriert.
In diesem Projekt habe ich dann den Text:

PublicModule LibnodaveConnectionLibrary
PublicDeclareFunction getS5Timefrom Lib"LibNoDaveConnectionLibrary.dll" (ByVal b() AsByte, ByVal pos AsInteger) As System.TimeSpan
EndModule

integriert. Anschließend verwende ich die ein Private Sub im Ablauf Modul mit folgendem Code:

PrivateSub buttonclick usw

Dim buf(99) AsByte
Dim zeit As TimeSpan

res = daveReadBytes(dc, daveDB, 4, 0, 2, buf(0))
zeit = gets5timefrom(buf, 0)

EndSub

Nur so geht mir der Debugger bei zeit = ... an und sagt dass die gets5time Funktion nicht in LibnodaveConnectionLibrary.dll gefunden wurde...


----------



## Paul.Juergen (2 Juli 2010)

```
[SIZE=2]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] a, c [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Integer
[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] basis [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Byte
[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] wert [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Integer
[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] b(99) [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Byte
[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] pos [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Integer
[/COLOR][/SIZE][/COLOR][/SIZE][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] value [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]New[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] TimeSpan(0, 0, 0, a, c)
TextBox9.Text = Convert.ToString(value)
[/SIZE][SIZE=2][COLOR=#008000][SIZE=2][COLOR=#008000]'public static void putS5Timeat(byte[] b, int pos, TimeSpan value)
[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] (value.TotalMilliseconds <= 999 * 10) [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Then
[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]basis = 0
wert = Convert.ToInt32(value.TotalMilliseconds) / 10
[/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]ElseIf[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] (value.TotalMilliseconds <= 999 * 100) [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Then
[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]basis = 1
wert = Convert.ToInt32(value.TotalMilliseconds) / 100
[/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]ElseIf[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] (value.TotalMilliseconds <= 999 * 1000) [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Then
[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]basis = 2
wert = Convert.ToInt32(value.TotalMilliseconds) / 1000
[/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]ElseIf[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] (value.TotalMilliseconds <= 999 * 10000) [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Then
[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]basis = 3
wert = Convert.ToInt32(value.TotalMilliseconds) / 10000
[/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Else
[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]basis = 3
wert = 999
[/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]End[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]If

[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] p1, p2, p3 [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Integer
[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]p3 = (wert / 100)
p2 = ((wert - p3 * 100) / 10)
p1 = (wert - p3 * 100 - p2 * 10)
b(pos) = Convert.ToByte(basis << 4 [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Or[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] p3)
b(pos + 1) = Convert.ToByte((p2 << 4 [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Or[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] p1))
TextBox7.Text = b(0)
TextBox8.Text = b(1)
[/SIZE]
```
 
Getestet mit 1s200ms funktioniert!
Getestet mit 1s20ms funktioniert!
Getestet mit 20s200ms funktioniert!
Getestet mit 1s180ms funktioniert nicht- Fehler: Der Wert für ein unsigniertes Byte war zu groß oder zu klein.


----------



## Jochen Kühner (2 Juli 2010)

Paul.Juergen schrieb:


> Hallo Jochen,
> 
> Ok werde mich gleich mal ans Visual Studio setzen und das umschreiben in VB..
> 
> ...



Die funktion existiert auch nicht direkt in der dll. Ich habe bei mir die libnodave.net.dll welche bei libnodave dabei ist erweitert um diese funktionen. Wenn du die libnodave connection library verwendest, brauchst du diese funktionen aber nicht direkt, da diese library ein wrapper auf einer höheren ebene sein soll, das man sich nicht mit den ganzen sachen rumschlagen muss welche man bei libnodave beachten muss (pdu größe, umwandlung der datentypen, usw...). Also wenn du die funktionen willst welche ich in die libnodave.net.cs eingebaut habe, einfach nur diese kompielieren (da ist glaub bei libnodave eine batch dafür dabei!). Aber Achtung, Ich habe in diese auch schon funktionen meiner erweiterten libnodave.dll eingebaut (Routing), welche die orginale libnodave.dll nicht hat! Falls du meine Connection lib verwenden willst, liegt dieser auch ein VB.NET Beispielprogramm bei!


----------



## Paul.Juergen (3 Juli 2010)

Ok danke für die Aufklärung Jochen 

Hast du noch eine Ahnung warum genau der Wert 1s180ms zum Absturz führt- Nach dem Code oben ?...


----------



## Jochen Kühner (3 Juli 2010)

Paul.Juergen schrieb:


> Ok danke für die Aufklärung Jochen
> 
> Hast du noch eine Ahnung warum genau der Wert 1s180ms zum Absturz führt- Nach dem Code oben ?...




Nö.... Musst halt mal haltepunkte in der funktion setzen und sehen was schiefläuft... Also meine c-Sharp  Funktion geht auch mit 1s180ms!

Nimm doch einfach meine libnodave.net.cs dann hast du die funktion...

Mfg.


----------

