TIA Nicht geschriebene Daten per S7 Plus Protokoll

Jochen Kühner

Level-3
Beiträge
4.565
Reaktionspunkte
766
Zuviel Werbung?
-> Hier kostenlos registrieren
Hat es jemand schon mal erlebt, das daten welche via S7PlusProtkoll auf ein CPU geschrieben werden, nicht in dieser landen?

Wir haben in unserer Visu ein Script, das das schreiben triggert (durch eine bedinung auf der PLC), wir haben auch eine wireshark Aufzeichnung die das schreiben enthält (ohne fehlercode bei der Antwort), aber auf der S7 ändert sich der Wert nie.

Wenn der wert sich durch die Visu nicht ändert, erzeugen wir auf der S7 auch eine Störung, und mit dieser haben wir einen Trace mit Pretrigger gestartet. In dem Trace sehen wir nicht das der geschriebene Wert von der Visu ankommt.

Hatte jemand schon mal so ein problem? Das passiert natürlich nur sporadisch, meist funktioniert es...
 
Der Klassiker mit einer Mischung aus optimierten und nicht optimierten Bausteinen? Da die Aufzeichnung üblicherweise am Ende des OB1 passiert, kommt scheinbar nichts an, es wurde aber lediglich überschrieben.
 
Ist nicht mein PLC Programm, aber Kollege hat gesagt, der wert wird nirgends im Programm beschrieben (Ist ein optimierter Baustein).
Wir haben die ganze Zeit in der Visu den Fehler gesucht, bin froh das ich diese nun ausschließen kann.

Läuft der Trace nur zyklisch am ende vom OB1? oder macht die CPU auch zwischen dem Zyklus aufzeichnungen?
Dachte die überwacht die signale vlt. irgendwie direkt
 
Standardmäßig wird nach Ausführung des OB1 aufgezeichnet. Die Kommunikation zu HMI wird je nach CPU Typ azyklisch durchgeführt. Und wenn dann von einem optimierten Baustein aus ein nicht optimierter aufgerufen wird (oder umgekehrt) und während der Baustein Bearbeitung die Daten vom HMI ankommen, werden die vom HMI geänderten Daten am Ende der Baustein Bearbeitung wieder mit den alten Daten überschrieben.
 
... und der DB wird als IN_OUT übergeben? Dann wird er nach der FB-Bearbeitung aus der FB-Kopie (Instanz-DB) zurückgeschrieben und überschreibt damit eventuelle Änderungen am DB durch andere Tasks (z.B. höherpriore Kommunikation) während der FB läuft.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie ist es, wenn ich aus einem optimierten FB auf einen nicht optimierten DB zugreife (ohne übergabe als parameter). Werden die Zugriffe direkt gemacht, oder auch der DB vorher kopiert?
 
Muss denn der FB in den per IN_OUT übergebenen DB schreiben? Wenn nur lesen nötig, dann am einfachsten den DB (UDT) als IN übergeben. Problem bei IN_OUT: da wird nach Ende des FB auf jeden Fall die (eventuell veränderte oder unveränderte) FB-lokale Kopie in den DB zurückgeschrieben, bei IN aber nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hier noch der betreffende Punkt in der Siemens Doku
Wenn Sie für den Datenbaustein und die Funktion nicht die gleichen Optimierungseinstellungen konfigurieren (ein Baustein ist optimiert, der andere ist nicht optimiert), dann muss das System vor der Übergabe an die Funktion eine Kopie der Struktur anlegen. Weil das System diese Kopie der Struktur anlegen muss, wird "Call-by-Reference" dadurch praktisch in "Call-by-Value" umgewandelt.
Das hätte allerdings für das Überschreiben der gesendeten Daten eigentlich nur eine Auswirkung, wenn das Schreiben in den DB im Moment der Bausteinearbeitung erfolgt.
Tritt dieses "Daten werden nicht übernommen" nur sporadisch auf oder immer?
Edit: hatte er ja schon beantwortet...
 
IN war aber glaube ich immer langsam, da immer per copy übergeben wird
IN_OUT wird bei "optimierten FB auf einen nicht optimierten DB" sogar immer 2x kopiert (vor und nach dem FB-Aufruf). Und das zweite Rückkopieren macht deine Probleme. Siemens Beschreibung genau lesen : "Call-by-Value"
 
Zuviel Werbung?
-> Hier kostenlos registrieren
IN war aber glaube ich immer langsam, da immer per copy übergeben wird
Call by Value:
Initial langsamer, da eine Kopie erstellt wird.
In der Baustein-Bearbeitung dann aber schneller, da die Daten direkt "da" sind.

Call by Refernce:
Initial schneller, da das Kopieren der Daten entfällt.
Dafür ist jeder Zugriff auf die Variable langsamer, da jedes Mal auf die Referenz "raus" gegriffen werden muss.

Siehe auch
 
IN_OUT wird bei "optimierten FB auf einen nicht optimierten DB" sogar immer 2x kopiert (vor und nach dem FB-Aufruf). Und das zweite Rückkopieren macht deine Probleme. Siemens Beschreibung genau lesen : "Call-by-Value"
Das ist mir schon klar...

Ich wollte nur wissen ob "IN" parameter immer call bei value sind, also auch bei Optimiert=>optimiert
 
Call by Value:
Initial langsamer, da eine Kopie erstellt wird.
In der Baustein-Bearbeitung dann aber schneller, da die Daten direkt "da" sind.

Call by Refernce:
Initial schneller, da das Kopieren der Daten entfällt.
Dafür ist jeder Zugriff auf die Variable langsamer, da jedes Mal auf die Referenz "raus" gegriffen werden muss.

Siehe auch
Ist das sicher so? Kommt ja auch darauf an wie Siemens das CallByValue implementiert hat. Es wird ja bei großen Strukturen trotzdem ein Zeiger auf das kopierte Objekt sein, also auch wieder indirekt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Fragst du Sachen...
Die Unterschiede im Detail könnten dir vermutlich nur die Programmierer des Compilers genau erklären ¯⁠\⁠_⁠(⁠ツ⁠)⁠_⁠/⁠¯

Im Programmierleitfaden
Gibt's in Abschnitt 3.4 ein paar Infos zur Zugriffsgeschwindigkeit, wobei hier die Zugriffszeiten für IN & InOut jeweils nur als "schnell" angegeben werden (was auch immer das heißen mag).
Ich meine meine oben genannte Info zu Call by Value/Reference stammt (glaube ich) aus einem der früheren TIA Infoblätter, welches ich Grade nicht mehr finde.

Denke es kann auch gut sein, dass meine Aussage inzwischen obsolet & die Zugriffszeit auf die jeweiligen Variablen-Bereiche inzwischen identisch ist bzw. ein ggf. Vorhandener Geschwindigkeitsunterschied nur noch über den Kopievorgang bei Call by Value zu Stande kommt.
Wobei der Unterschied wohl eher akademischer Natur sein wird, solange man nicht titantische Mengen an Daten übergibt ¯⁠\⁠_⁠(⁠ツ⁠)⁠_⁠/⁠¯
 
Gerade beim Wechsel zwischen optimiert und nicht optimiert (und umgekehrt) dauert das Umkopieren länger weil ja auch die Bytedreherei stattfinden muss. Aber generell würde ich sagen wenn ich auf relativ wenige Variablen zugreifen muss, ist byref zu bevorzugen, wenn ich auf nahezu alle Variablen der Struktur zugreifen muss ist byvalue besser.
 
Zurück
Oben