TIA IN_OUT Variable in TIA

Pikador

Level-2
Beiträge
249
Reaktionspunkte
17
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
habe ein IN_OUT Parameter für ein Wert an einem FB erstellt. An dem Parameter ist eine Variable die mit HMI verbunden ist. Der Grund ist: Der Bediener kann in HMI den Wert ändern und ich kann den auch in dem FB manipulieren. Er wird in HMI dann auch aktualisiert. Das Problem ist wenn ich in Visu den Wert ändere wird er sofort auf das alte überschrieben. Erst nach mehreren Versuchen wird der Wert übernommen. Es scheint, dass man den Zeitpunkt treffen muss wo der FB den Parameter liest und nicht beschreibt.
Habe das ganze ohne HMI ausprobiert. Ich beschreibe die Variable bei einer Flanke. Das gleiche Problem.
Es ist eine S71500. Mit S7300 hat es immer funktioniert.
Kennt jemand das Problem? Muss ich was einstellen?

Viele Grüße
Pikador
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Problem ist mehr oder weniger ein alter Hut, bei der S7-300 findet die Kommunikation "brav" am Zykluskontrollpunkt statt (typischerweise Ende oder Anfang vom Zyklus), und bei der S7-1500 irgendwann auch mitten im Zyklus, deine Beobachtungen ist insoweit völlig korrekt und trifft ins schwarze.

Hier findest du einiges dazu, wobei so wirklich allgemeingültige, oder gar wirklich gute Lösungen ...
Zykluskontrollpunkt S7-1500
 
H
Habe das ganze ohne HMI ausprobiert. Ich beschreibe die Variable bei einer Flanke. Das gleiche Problem.
Es ist eine S71500. Mit S7300 hat es immer funktioniert.
Kennt jemand das Problem? Muss ich was einstellen?

Viele Grüße
Pikador

Wenn du das Signal mit einer Flanke beschreibst und dann ändert es sich gleich wieder, dann wird es von deinem FB bearbeitet und entsprechend beeinflußt.
Das ist aber insoweit richtig, wer zuletzt kommt gewinnt hier!
 
Moin,
Grundsätzlich hast du deine Frage schon selber beantwortet. Es schreiben ja gerade das HMI und der FB auf eine Variable. Nun kommt hinzu, dass das HMI in Zeiten von TIA zu irgendeinen Zeitpunkt auf diese Variable schreibt (Stichwort azyklische Kommunikation). Das ist ein bekanntes Problem und wurde hier schon ganz oft diskutiert (siehe insbesondere den Link von MSB in obiger Antwort).
Wenn du das ganze jetzt richtig machen willst, dann müsstest du über deine Software-Struktur nachdenken. Also beispielsweise aus deiner In/Out 2 In (einmal SPS-Sollwert und einmal HMI-Sollwert) und einen Out machen und anschließend in der Software entscheiden welcher Sollwert, wann Gültigkeit besitzt... oder aber hunderte andere Möglichkeiten.
Wenn du wiederum nicht möchtest, dass deine HMI-Kommunikation deinen FB-Aufruf stört, dann kann man auch die Prio des aufrufenden OBs erhöhen (>15 wird nicht von Kommunikation unterbrochen). Aber auch hier sollte man sich sehr gut überlegen, was sich daraus für Konsequenzen ergeben.
 
Ich beschreibe die Variable im FB nicht. Alles auskommentiert.

Hier ist es glaub ich relevant ob der FB optimiert ist oder nicht. Ich bin der Meinung bei nicht optimierten FBs werden die In/Out-Variablen als Call by Value übergeben. Und dann reicht schon der Aufruf eines FBs um die In/Out bei FB-Beginn zu lesen und verlassen des FBs wieder zu schreiben.
Nur bei optimierten Bausteinen wird Call by Reference gelesen und geschrieben. Dies müsste dann dazu führen, dass der eigentliche Speicher auch nur geschrieben wird, wenn die Variable explizit im Code verwendet wird. :confused:

Hierzu nochmal die Siemens-Hilfe:
Wenn bei einem Bausteinaufruf Strukturen als Durchgangsparameter (InOut) an den aufgerufenen Baustein übergeben werden, werden diese standardmäßig als Pointer übergeben (Call by reference).
Dies gilt jedoch nicht, wenn beide Bausteine unterschiedliche Optimierungseinstellungen haben: Wenn einer der Bausteine die Eigenschaft "Optimierter Zugriff" und der andere Baustein die Eigenschaft "Standardzugriff" hat, werden grundsätzlich alle Parameter als Kopie übergeben (Call by value).
Wenn der Baustein viele strukturierte Parameter enthält, kann das schnell dazu führen, dass der temporäre Speicherbereich (Lokaldaten-Stack) des Bausteins überläuft.
Außerdem können Probleme entstehen, wenn die ursprünglichen Operanden durch asynchrone Prozesse verändert werden, z. B. durch HMI-Zugriffe oder durch Alarm-OBs. Wenn nach der Bausteinbearbeitung die Kopien wieder auf die ursprünglichen Operanden zurückkopiert werden, werden dabei die seit dem Anlegen der Kopie beim Bausteinaufruf asynchron durchgeführten Änderungen an den ursprünglichen Operanden überschrieben.
Das können Sie vermeiden, indem Sie für beide Bausteine dieselbe Zugriffsart einstellen oder die asynchronen Zugriffe zuerst in einen separaten Speicherbereich schreiben lassen und diesen Bereich dann zu einem geeigneten Zeitpunkt synchron kopieren
 
Zuletzt bearbeitet:
Habe jetzt die CPU Mindestzykluszeit auf 10ms eingestellt. Jetzt funktioniert. Schön ist das aber nicht:evil: und auch keine "richtige" Lösung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe jetzt die CPU Mindestzykluszeit auf 10ms eingestellt. Jetzt funktioniert.
Funktioniert aber nicht sicher. Du hast lediglich die statistische Chance etwas erhöht, daß die HMI-Zugriffe außerhalb der FB-Laufzeit stattfinden. Dein Problem kann aber immer noch vorkommen.

Harald
 
Habe jetzt ca. 100 Mal den Wert in HMI eingegeben. Es wurde nur ein Mal zurück beschrieben. Damit kann ich erstmal leben.
 
Kann der Anlagenbediener bzw. Dein Auftraggeber auch damit leben?

Hey, wir sind professionelle (hoch-)bezahlte Programmierer und keine Bastler, die was abliefern können was manchmal funktioniert und manchmal nicht.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann der Anlagenbediener bzw. Dein Auftraggeber auch damit leben?

Hey, wir sind professionelle (hoch-)bezahlte Programmierer und keine Bastler, die was abliefern können was manchmal funktioniert und manchmal nicht.

Harald

Hehe. Das schreib mal den TIA Entwicklern :)

Gruss
 
Aber vielleicht könnt ihr ja auch mal Siemens nerven.

Habe ich auch schon, bringt aber leider nichts...

Ob optimierter bzw. nicht optimiert Zugriff ist irrelevant, solange alle Bausteine inkl. OB die gleiche Einstellungen haben. Wenn nicht, dann wird zwischen Optimiert und nicht Optimiert die Daten umkopiert.

Das Problem ist, dass "einfache" Datentypen bei der 1200/1500er immer als Call by Value an INOUT übergeben wird... das einzige was per Call by Reference übergeben wird sind UDTs.
 
Zurück
Oben