Hallo,
ich habe eine winzig kleine Frage:
ich möchte Daten aus einem Feld via Modbus übertragen. Dazu verwende ich z.Z. folgenden Code:
MB256:=DATA(1);
MB257:=DATA(2);
MB258:=DATA(3);
...
Die Daten würde ich gern mit einer For/Next Schleifen umkopieren.
Aber wie kann ich die EA/Modbusadressen mit einem Index z.b. DATA(t) versehen?
Hallo gnassel,
Modbus kennt nur Bit-Dienste und Wort-Dienste.
Du kannst also via Modbus (über Wortdienste) nicht nur z.B. MB256 holen / schreiben sondern nur MW256 (also MB 512 / 513) oder
MW128 also (MB 256 / 257).
Das am Rande.
Aber nun zum eigentlichen Problem.
Du kannst ein ARRAY einfach in den Merkerbereich legen.
z.B.
VAR
Merker AT %MB256 : ARRAY[0..10] OF BYTE;
END_VAR
und dann kannst du in einer Schleife natürlich auf Merker[ i ] zugreifen.
Vorsicht : wenn du ein Word-Array nimmst dann solltest du als Adresse auch %MW angeben
und keine Byteadresse da es dir sonst passieren kann dass du ein Wort-Element auf eine
ungerade Adresse legst (z.B. Merker AT %MB1 : ARRAY[0..10] OF WORD; ).
Die Folge wäre im Code ein Wortzugriff auf eine ungerade Byte-Adresse und das führt meist zum Absturz.
Auch bei Strukturen muss man aufpassen (zusätzlich zu obigen Punkt können dort für das Wordalignment
Füllbytes eingefügt werden).
Uwe
Das ist ja mal ne Chance mit Pointern zu prahlen
Unter ST würde das so aussehen:
var
pt : pointer to byte;
end_Var;
for x:=100 to 300
pt:=adr(%MB0)+x;
pt^:=0;
end_for;
das Beispiel würde die Bytes 100 bis 300 mit Nullen beschreiben. das ^ nennt sich Inhaltsoperator.
Log in to post a comment.
Hallo,
ich habe eine winzig kleine Frage:
ich möchte Daten aus einem Feld via Modbus übertragen. Dazu verwende ich z.Z. folgenden Code:
MB256:=DATA(1);
MB257:=DATA(2);
MB258:=DATA(3);
...
Die Daten würde ich gern mit einer For/Next Schleifen umkopieren.
Aber wie kann ich die EA/Modbusadressen mit einem Index z.b. DATA(t) versehen?
Hallo gnassel,
Modbus kennt nur Bit-Dienste und Wort-Dienste.
Du kannst also via Modbus (über Wortdienste) nicht nur z.B. MB256 holen / schreiben sondern nur MW256 (also MB 512 / 513) oder
MW128 also (MB 256 / 257).
Das am Rande.
Aber nun zum eigentlichen Problem.
Du kannst ein ARRAY einfach in den Merkerbereich legen.
z.B.
VAR
END_VAR
und dann kannst du in einer Schleife natürlich auf Merker[ i ] zugreifen.
Vorsicht : wenn du ein Word-Array nimmst dann solltest du als Adresse auch %MW angeben
und keine Byteadresse da es dir sonst passieren kann dass du ein Wort-Element auf eine
ungerade Adresse legst (z.B. Merker AT %MB1 : ARRAY[0..10] OF WORD; ).
Die Folge wäre im Code ein Wortzugriff auf eine ungerade Byte-Adresse und das führt meist zum Absturz.
Auch bei Strukturen muss man aufpassen (zusätzlich zu obigen Punkt können dort für das Wordalignment
Füllbytes eingefügt werden).
Uwe
Das ist ja mal ne Chance mit Pointern zu prahlen
Unter ST würde das so aussehen:
var
pt : pointer to byte;
end_Var;
for x:=100 to 300
pt:=adr(%MB0)+x;
pt^:=0;
end_for;
das Beispiel würde die Bytes 100 bis 300 mit Nullen beschreiben. das ^ nennt sich Inhaltsoperator.