Libnodave konsistent DB ?

eloboy

Level-1
Beiträge
70
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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!
 
wie liest du die Daten aus? Man kann 32 Bytes an Daten zumindest Konsitent übertragen, wenn man es richtig programmiert!

Libnodave Teil
Code:
res = dc.readBytes(libnodave.daveFlags, DB_out, 0, 32, buf)
TCP Client Teil
Code:
  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)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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.
 
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.
 
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.
 
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.

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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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!
 
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:
Code:
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!
 
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:
Code:
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!

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