# Modbus Variable lesen und beschreiben



## Deichk1nd (22 August 2021)

Mahlzeit Freunde,
ich sitze gerade an meiner Facharbeit und hätte da eine Frage bezüglich der Modbus Einrichtung.
Die grundlegende Kommunikation zwischen meiner Wago PFC200 und meiner zweiten SPS vom Typ Saia PCD3.5340 steht soweit das heißt, dass ich bereits 2 Temperaturen von der Saia mit der Wago auslesen kann. Jetzt zu meinem Problem.
Ich habe mehrere Register in meinem Saia Programm, darunter MultiStateSchalter wie die Anlagenfreigabe auf dem Screenshot oder auch Reglerparameter, die ich mit der Wago auslesen und beschreiben möchte. Wenn ich jetzt z.B. die Anlagenfreigabe im Konfigurator mit der Berechtigung fürs lesen und schreiben anlege und sie dann anschließend bereitstelle taucht sie dann aber als WriteOnly Variable im Master auf.
Das beschreiben funktioniert dann tatsächlich auch. Die Variable wird jetzt allerdings dauerhaft von der Wago überschrieben so dass ich auf der Saia keine Möglichkeit habe den Wert zu ändern.
Ist es irgendwie möglich diese Variablen zyklisch auszulesen und sie dann von der Wago einmalig beschreiben zu lassen so dass auch Änderungen von der Saia SPS möglich sind?
Vielen Dank im Voraus!
MfG


----------



## Tobsucht (23 August 2021)

Dann stell doch WriteOnly auf ReadWrite um.


----------



## sven_r. (23 August 2021)

Deichk1nd schrieb:


> zyklisch auszulesen und sie dann von der Wago einmalig beschreiben zu lassen


Woher soll die Saia denn dann wissen, ob sie jetzt den Wert nehmen soll, der über Modbus kommt (jede von dir eingestellte T=200ms) oder der lokale Wert Vorrang hat?
Leg doch eine Bool-Variable an, die der PFC benutzen kann, um die Anforderung für die Anlagenkontrolle zu schicken. Wenn die Saia das "genehmigt", stellt sie die Multistate Variable auf "Kontrolle via PFC" um. Die iAnlagenfreigabe wäre dann aus WAGO Sicht readOnly - sie wird vom Saia ausgelesen.


----------



## Deichk1nd (23 August 2021)

Vielen Dank für den Hinweis Tobsucht! Ich habe genau das mehrmals versucht aber wie mir jetzt aufgefallen ist immer wenn ich mit der PFC verbunden war... ist die Verbindung getrennt lässt sich der Zugriff umstellen. Das Problem bleibt allerdings bestehen.


Um das ganze nochmal etwas verständlicher zu machen:
Ich möchte meine Saia SPS via Modbus in ein Wago Netzwerk integrieren. Meine Vorstellung ist also z.B. eine Visualisierung auf der Wago zu entwerfen die mir die Betriebswerte (Temperaturen, Rückmeldungen von Ventilatoren etc.) der Saia Anlage anzeigt. Außerdem möchte ich einige Parameter des Regelungsprogramms ebenfalls über die Wago Visualisierung zugänglich machen. Einer dieser Parameter ist der Anlagenschalter iAnlagenfreigabe. Das ist ein Register aus einer Funktionsbox welches mit den Integerwerten 1(Automatikbetrieb), 2(Hand Aus) und 3(Hand Ein) beschrieben werden kann. Ich suche jetzt also quasi nach einem Trick wie ich dieses Register von 2 Seiten aus beschreiben kann damit ich die Anlage sowohl von der Visualisierung der Wago aus als auch an der Saia Sps über meinen Laptop Ein und Aus schalten kann.


----------



## JSEngineering (24 August 2021)

Moin Deichkind,

kannst Du den Datenpunkt als RW anlegen? Dann sollte er den Wert behalten, der von der Saia ausgelesen wird und nur überschrieben werden, wenn Du ihn im Programm veränderst.

Falls nicht, würde ich den Datenpunkt zwei Mal anlegen: Einmal als R und einmal als W. Und zwar genau in der Reihenfolge.
Du liest den Wert erst aus der Saia aus und schreibst ihn dann zurück. Sofern Du den jetzt aus dem Programm ändern möchtest, schreibst Du nicht den gelesenen, sondern Deinen eigenen Wert zurück.
Ich weiß nicht, ob das so funktioniert, aber so herum würde ich es probieren.

Gruß
    Jens


----------



## schlittk (24 August 2021)

Hallo,

das letzte mal als ich es über den Modbus Konfigurator versucht hatte, hat es nicht funktioniert. Als Alternative habe ich FbMbSimpleServerTcp zusammen mit FbMbMasterTcp verwendet.

Gruß
schlittk


----------



## Tobsucht (24 August 2021)

Wenn die Wago Steuerung der Master ist, geht es mit dem Konfigurator.
Der Master liest den Wert zyklisch vom Slave. Ändert der Slave die Betriebsart, wird diese in die Variable übernommen.
Ändert sich die Betriebsart im Master für dieser einen einmaligen Schreibzugriff mit dem neuen Wert aus.
Zugegeben musst Du hier die Variable länger auf dem neuen Wert festhalten, sonst überschreibt die Leseanfrage Deinen neuen Wert.

Ist die Wago Steuerung der Slave gibt es (zur Zeit) nur Ein- ODER Ausgangsvariablen. Ein bidirektionaler Zugriff ist hier nicht möglich.
Hier ist die Bibliothek WagoAppPlcModbus klar im Vorteil.


Grüße


----------



## Deichk1nd (24 August 2021)

Vielen Dank erstmal für eure Beiträge!
Ich bin jetzt schon ein ganzes Stück weiter. Ich habe tatsächlich die beiden Befehle Schreiben (Strg+F7) und Forcen(F7) durcheinander gekriegt.
Der Befehl Forcen tut genau das was ich die ganze Zeit wollte. Der vorbereitete Wert wird übernommen und bleibt nach aufheben des Forcens im Register stehen bis er egal von welcher Seite aus wieder verändert wird.
Soweit so gut.
Jetzt habe ich testweise eine Combobox Integer in der Visualisierung mit der Modbus Variable der Anlagenfreigabe verknüpft und kann den Wert nicht verändern weil die Box eben einen Schreibbefehl und keinen Forcebefehl ausführt nehme ich an.

Also scheint es nicht auszureichen den Wert nur zu schreiben weil er dann nicht übernommen wird...
Wie bekomme ich es denn jetzt hin dass die Werte auch mit dem Schreibbefehl übernommen werden?

Kleine Ergänzung:
ich habe testweise ein leeres Register auf der Saia SPS erstellt was weder von einer Funktionsbox noch irgendwo anders her beschrieben wird und auch bei diesem Register kann ich den Wert von der Wago aus forcen aber nicht beschreiben.


----------



## Deichk1nd (25 August 2021)

Tobsucht wie kann ich denn beeinflussen wie lange die Variable auf dem neuen Wert festgehalten wird?


----------



## schlittk (25 August 2021)

Du könntest es ja mal mit dem Baustein TOF versuchen, und die Variable solange beschreiben bis die Zeit von TOF abgelaufen ist.


----------



## Deichk1nd (25 August 2021)

Nun ja also ein TOF Baustein ist glaube ich nicht die Lösung. Ich will die Werte ja am besten direkt aus der Visualisierung mit z.B. Textfeldern oder solchen integer comboboxen ändern... 
Ich habe jetzt mal diesen ModbusTCPMaster Baustein ausprobiert allerdings werde ich nicht so richtig schlau aus der Info. 
Meine Parametereinstellungen könnt ihr auf dem Screenshot sehen. Der Adressbereich entspricht den Modbus Adressen die ich in der Saia vergeben habe.
Habe ich das ganze richtig verstanden, dass die empfangenen Werte nun unter diesen awWriteData Registern auftauchen sollten?
die Register in meiner Saia sind ja nun vom Typ Integer... können die denn so ohne weiteres in den awWriteData Registern vom Typ Word angezeigt werden?
Bei mir sind die awWriteData Register jedenfalls alle leer...
vllt kann mich ja jemand von euch über diese Box aufklären
Vielen Dank im Voraus


----------



## schlittk (26 August 2021)

Wenn ich mich nicht irre, ist schon eine weile her als ich das zuletzt benötigt habe, sollten die empfangenen Werte unter awData in utResponse zu finden sein. In awWriteData von utQuery schreibst du die Werte für die Output Register rein. 
Ein int hat genau wie ein word in codesys 16bit, passt also genau in ein word rein. Ein word ist aber nicht vorzeichenbehaftet, hat also einen anderen Wertebereich. Du kannst sie mit z.b. to_word() bzw. to_int() umwandeln. Verwendest du Datantypen die mehr als 16bit verwenden, musst du sie auf die Register aufteilen und danach wieder zusammensetzen.


----------

