# Libnodave konsistent DB ?



## eloboy (26 Februar 2011)

Hallo zusammen,

ich lese mit Vb.net und Libnodave 32 Byte aus einer Softsps aus.
Nun kommt es ab und zu vor das nicht die letzen Byts nicht zum Rest passen.

1. zu welchen Zeitpunkt werden den Daten des Datenbausteins an Libnodave übergeben? 

2. werden die Daten konsistent übertragen?


----------



## Jochen Kühner (27 Februar 2011)

wie liest du die Daten aus? Man kann 32 Bytes an Daten zumindest Konsitent übertragen, wenn man es richtig programmiert!


----------



## Rainer Hönle (27 Februar 2011)

Jochen Kühner schrieb:


> wie liest du die Daten aus? Man kann 32 Bytes an Daten zumindest Konsitent übertragen, wenn man es richtig programmiert!



Und wo muss man da was richtig programmieren?


----------



## Jochen Kühner (27 Februar 2011)

Ohne Code weiss Ich ja nicht was er gemacht hat, und es kann ja sein das er z.B. Byte für Byte mit einer extra PDU einliest, wer weiss das schon!


----------



## eloboy (27 Februar 2011)

Jochen Kühner schrieb:


> wie liest du die Daten aus? Man kann 32 Bytes an Daten zumindest Konsitent übertragen, wenn man es richtig programmiert!



Libnodave Teil

```
res = dc.readBytes(libnodave.daveFlags, DB_out, 0, 32, buf)
```
TCP Client Teil

```
TCP_client.Blocking = False
  TCP_client.SendTimeout = 0
  TCP_client.NoDelay = True
  If TCP_client.Connected Then
              Dim i As Integer = TCP_client.Send(buf, 32,SocketFlags.None)
```


----------



## Ralle (27 Februar 2011)

Ich glaube nicht, das man das konsistent übertragen kann, ohne eigene Software dafür zu schreiben. Die PG-Kommunikation läuft m.W. asynchron und greift zu einem beliebigen Zeitpunkt sie Daten ab. Wenn ich Daten habe, die konsistent sein müssen (z.Bsp. eine Real muß unbedingt über ihre 4 Byte konsistent sein, sonst kann da richtiger Mist entstehen!), dann schreibe ich die Daten in einen DB und setze danach ein Bit für meine Libnodave-Anwendung, dass die Daten abgeholt werden können.


----------



## Rainer Hönle (27 Februar 2011)

Sehe ich auch so. Deshalb habe ich ja gefragt, wo man was richtig programmieren muss.
Und es wird mit den neuen CPUs und den neuen Firmwaren noch schlimmer. Da kann dann mehrfach im Zyklus kommuniziert werden. Da wird die Frage nach der Konsistenz immer wichtiger.


----------



## Thomas_v2.1 (27 Februar 2011)

Sollten denn nicht zumindest alle <= 4 Byte Operationen atomar sein? Ansonsten würde das ja ein heilloses Durcheinander geben, auch was Interrupts betrifft.
Interessant wäre auch mal mit welcher Firmware-Version der 300er CPUs die Kommunikation aus dem Zykluskontrollpunkt herausgenommen wurde. Bei den 400ern war das Verhalten ja schon immer so.


----------



## eloboy (27 Februar 2011)

Danke euch schon mal

wie würde es ausschauen wenn ich die Daten 
mit dem sfc20 auf einne zweiten DB kopieren würde?


----------



## Rainer Hönle (27 Februar 2011)

Thomas_v2.1 schrieb:


> Sollten denn nicht zumindest alle <= 4 Byte Operationen atomar sein? Ansonsten würde das ja ein heilloses Durcheinander geben, auch was Interrupts betrifft.
> Interessant wäre auch mal mit welcher Firmware-Version der 300er CPUs die Kommunikation aus dem Zykluskontrollpunkt herausgenommen wurde. Bei den 400ern war das Verhalten ja schon immer so.



Die neuen 315, 317, 319 mit Firmware >= 3.2. Dort kann es in der Konfiguration aktiviert werden. Hatte so ein Teil leider noch nicht auf dem Tisch und kann deshalb nichts über die Auswirkungen sagen.


----------



## Thomas_v2.1 (27 Februar 2011)

Rainer Hönle schrieb:


> Die neuen 315, 317, 319 mit Firmware >= 3.2. Dort kann es in der Konfiguration aktiviert werden. Hatte so ein Teil leider noch nicht auf dem Tisch und kann deshalb nichts über die Auswirkungen sagen.


Die Option "Priorisierte BuB Kommunikation" scheint dafür verantwortlich zu sein. Als Voreinstellung ist diese jedoch deaktiviert.
Im aktuellen Handbuch gibt es einen Abschnitt Datenkonsistenz ein dem das etwas näher beschrieben ist.
Dort steht auch dass u.A. "Byte-, Wort-, Doppelwortzugriffe wie z. B. L MDx" weiterhin konsistent sind.

So gesehen ist das Diagramm im Abschnitt "Kommunikationslast" bei priorisierter BuB Kommunikation nicht ganz korrekt.



eloboy schrieb:


> wie würde es ausschauen wenn ich die Daten
> mit dem sfc20 auf einne zweiten DB kopieren würde?



Wie oben geschrieben hängt das von deinem CPU-Typ ab, ob und wie du die Konsistenz gewährleisten musst.
Wenn du wirklich große Datenmengen (>240 Byte) auf einer 400er oder neuen 300er CPU mit priorisierter Bub-Kommunikation übertragen willst, reicht auch kein SFC20 sondern dann bräuchtest du den SFC81 UBLKMOV, da nur dieser vom Betriebssystem nicht unterbrochen werden kann.


----------



## Jochen Kühner (27 Februar 2011)

Weiss auch nicht was Ich heute da wieder gedacht habe. Die Kommunikation läuft ja wahrend des Zyklus und nicht davor oder danach, stand heut wohl irgendwie auf dem Schlauch.

Aber mit den Lesefunktionen welche die Variablentabelle von Step 7 verwendet, könnte es doch möglich sein, da Ich da als Lesetriggerbedingung den Zyklusbeginn, oder das Zyklusende einstellen kann!


----------



## Rainer Hönle (27 Februar 2011)

Jochen Kühner schrieb:


> Aber mit den Lesefunktionen welche die Variablentabelle von Step 7 verwendet, könnte es doch möglich sein, da Ich da als Lesetriggerbedingung den Zyklusbeginn, oder das Zyklusende einstellen kann!


Genau, aber damit kommuniziert libnodave von Haus aus nicht.


----------



## eloboy (27 Februar 2011)

Rainer Hönle schrieb:


> Genau, aber damit kommuniziert libnodave von Haus aus nicht.



Kann dann Libnodave vor das Haus gehen?

Ist es Möglich oder nicht?




			
				Thomas_v2.1 schrieb:
			
		

> Wie oben geschrieben hängt das von deinem CPU-Typ ab



Benütze eine WinAC RTX 2009


----------



## Jochen Kühner (27 Februar 2011)

Dazu musst du dir die PDU halt selbst zusammenbauen, aber es wäre damit möglich!


----------



## Jochen Kühner (2 März 2011)

Ich hab die Variablen Tabellen Lesefunktionen mal in meine Bibliothek eingebaut (siemensplctoolboxlib.codeplex.com), damit sollte dann ein konsistentes lesen zum Zyklusende möglich sein. Also Ich hab's getestet und es geht, es kann aber natürlich noch Bugs geben!

Beispielcode wie man z.B. 3 Merker am Zyklusende abfragen könnte:

```
PLCConnection myConn = new PLCConnection("myApps-Connection");
myConn.Connect();
List<PLCTag> myValues = new List<PLCTag>() { new PLCTag("MW0"), new PLCTag("MW2"), new PLCTag("MW4") };
PLCConnection.VarTabData vtab = myConn.ReadValuesWithVarTabFunctions(myValues,PLCReadTriggerVarTab.EndOfCycle);
vtab.RequestData();

//Mit vtab.RequestData(); können die Werte immer neu angefragt werden!
```


----------



## Ralle (3 März 2011)

Jochen Kühner schrieb:


> Ich hab die Variablen Tabellen Lesefunktionen mal in meine Bibliothek eingebaut (siemensplctoolboxlib.codeplex.com), damit sollte dann ein konsistentes lesen zum Zyklusende möglich sein. Also Ich hab's getestet und es geht, es kann aber natürlich noch Bugs geben!
> 
> Beispielcode wie man z.B. 3 Merker am Zyklusende abfragen könnte:
> 
> ...



Ich gehe aber davon aus, dass die Anzahl der Daten, die die über diese Funktion zu lesen sind, begrenzt ist.


----------



## Jochen Kühner (3 März 2011)

Denke Ich auch, habs aber noch nicht probiert! Zumindest wird die Pdu größe eine grenze sein!


----------

