"Word-Informationen" aus Modbus per Merker oder Union "umwandeln"?

Gärtner

Level-2
Beiträge
45
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
also ich bin hier nur Hobby mäßig unterwegs (man sieht es sicherlich am Titel) und habe eine Frage. Der Hintergrund ist, dass ich viele Informationen zwischen Steuerungen austausche. Ich habe in einem Codesys 3.5 Projet unter anderem zwei PFC200 Controller. Einer ist Modbus Master und der andere Slave.
Ich tausche Variablen verschiedener Bit-Größen aus und mache zum Beispiel aus 2 Word Variablen aus Modbus per Merker eine Real Variable (oder mehrere Bit und Bytes in ein Word usw.)
Also wie
Word1 at %MW00
Word2 at % MW01
Real1 at %MW00
Das funktioniert so weit. Um den Überblick nicht zu verlieren habe ich bei größeren Datenmengen in Modbus 2 Kanäle (einmal lesen und einmal schreiben) und dafür jeweils ein Array of Word in der entsprechenden Größe als Merker deklariert:
durchMastergelesen at %MW1000: Array[0..9] of Word;
durchmastergeschrieben at %mw2000: array[0..29] of Word;

das auf beiden Steuerungen an der gleichen Stelle und so kann ich Bit, Bytes, Word, Dint etc. durch die richtige Adressierung in beiden Steuerungen überall mit der gleichen Adresse ansprechen.
Das hat mir erst mal gut geholfen.

Inzwischen habe ich mich über Union schlau gemacht. Wenn ich das richtig verstehe macht Union im Grunde nichts anderes?
Die Variante per Union benötigt mehr Tipparbeit würde ich einschätzen.
Die Variante per Merker biete die Gefahr, dass man durch falsche Belegung fehler Einbau, welche schwer zu finden sind (mühsam das ganze Projekt durchsuchen und jeden Merker auf den richtigen Speicherplatz hin prüfen).

Meine Frage: gibt es sonst Vor oder Nachteile beider Varianten? Performancetechnisch oder andere Argumente? Gibt es Gründe, warum ich das alles ändern sollte? In meinen Codesys 2.3 Steuerungen werde ich bei den Merkern bleiben, da a) ich so auf die Variablen überhaupt zugreifen kann und b) es kein Union unter 2.3 gibt?
 
Inzwischen habe ich mich über Union schlau gemacht. Wenn ich das richtig verstehe macht Union im Grunde nichts anderes?
Mit Union kann man mehrere Variablen auf dieselbe Adresse legen, muss die Adresse aber nicht angeben und kann das dem Compiler überlassen. Da passieren weniger Fehler, darum ist das die bessere Variante als Adressen manuel zu berechnen/abzuzählen.

Die Variante per Union benötigt mehr Tipparbeit würde ich einschätzen.
Hier ein Beispiel:
Oder den REAL-Wert via UNION aus Words oder Bytes zusammenbasteln:
Code:
TYPE U_REALWORDS :
  UNION
    uReal  : REAL;
    uaWord : ARRAY[0..1] OF WORD;
  END_UNION
END_TYPE

tempU : U_REALWORDS;


tempU.uaWord[0] := dasEineWord;
tempU.uaWord[1] := dasAndereWord;
rMyReal := tempU.uReal;
(...)
 
Struct_xyz AT %M... geht m.W. nicht.
Mit einer Union kann man aber auch Structs mit z.B. Word-Arrays überlagern.
 
Struct_xyz AT %M... geht m.W. nicht.
Mit einer Union kann man aber auch Structs mit z.B. Word-Arrays überlagern.
Dabei aber vorsichtig sein, bei Structs können Füllbytes von Codesys eingefügt worden sein. Bei TwinCAT gibt es ein Pragma um dies zu verhindern, ich weiß aber nicht, ob dieses auch bei Codesys direkt existiert.
Wenn auf beiden Seiten die selbe Steuerung zum Einsatz kommt ist das zwar nur bedingt schlimm, aber bei der Berechnung der Größe des WORD Arrays muss dieser Umstand berücksichtigt werden.
 
Zurück
Oben