Structured Text Konvertierung Datentypen Unsigned 32-bit Codesys Modbus

sadik

Level-1
Beiträge
30
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Ich habe ein Modbus-Profil, das für Register 40149 mit U32-Bit beschreibbar ist.
Ich verwende den WagoLibModbus_IP_01, als Modbus API in Codesys.
Mein Ansatz ist folgender:

Transmit_Data: ARRAY [0..1] OF WORD;


(* Datentyp S32 bzw DINT in 2 MODBUS-Register konvertieren *)
di:=-2000;
Transmit_Data[0] := DWORD_TO_WORD(SHR(DINT_TO_DWORD(di),16));
Transmit_Data[1] := DINT_TO_WORD(di);





KOMMU_E2(
xCONNECT:= TRUE ,
strIP_ADDRESS:= '192.168.2.13',
wPORT:= 502 ,
bUNIT_ID:= 3,
bFUNCTION_CODE:= 16#10,
wWRITE_ADDRESS:= 40149 ,
wWRITE_QUANTITY:= 2,
ptSEND_DATA:= ADR(Transmit_Data),
xSEND:= xSend
);



[FONT=Times New Roman,serif][FONT=Arial,sans-serif](* erneutes Senden, nachdem der vorherige Sendevorgang für Zeit x abgeschlossen ist *)[/FONT]
[FONT=Times New Roman,serif][FONT=Arial,sans-serif]TON1(IN:= NOT xSend[/FONT][/FONT]
[FONT=Times New Roman,serif][FONT=Arial,sans-serif], PT:= T#10s);[/FONT][/FONT]
[FONT=Times New Roman,serif][FONT=Arial,sans-serif]xSend:= TON1.Q;[/FONT][/FONT]
[/FONT]


Funktioniert aber leider nicht. Der Datentyp DINT das 32 Bit Unsigned ist kann ich nicht in zwei Word-Arrays transformieren und das Modbus-Gerät akzeptiert es auch nicht.

Ideen ?
 
was funktioniert nicht? Das Senden oder das Packen in die Array Elemente?

Ich kenne die Wago Lib nicht, kann mir aber vorstellen, dass es auch an wWrite_Quantity liegen könnte, dass da Bytes als Länge eingetragen sein sollten. xxSend würde ich auch zum Test mal fest auf TRUE setzen und in das Array die Bytes 1,2,3 4 reinpacken.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Anscheinend akzeptiert das Gerät das Datentyp nicht, also irgendwo mache ich den Fehler bei der korrekten Darstellung einer Unsigned 32 Bit.
Laut Modbus-Profil erwartet der Register 40149 U32Bit, also 40149 ist 16-bit und 40150 (16-Bit) werden als ein Datenblock gesehen.
Ich habe das mal mit nodejs gemacht und schicke es als octetstream z.B die Zahl 2000 ist octettstream: geschickt funktioniert.
Also 2000 ist codiert : 0x00 ,0x00, 0x07, 0xd0 und es funktioniert.
 
Ich habe das mal mit nodejs gemacht und schicke es als octetstream z.B die Zahl 2000 ist octettstream: geschickt funktioniert.
Also 2000 ist codiert : 0x00 ,0x00, 0x07, 0xd0 und es funktioniert.
Das scheint mir ein Little/Big-Endian-Problem zu sein.

Wenn Deine SPS Big Endian hat dann sollte es so funktionieren:
Code:
di := 2000;

KOMMU_E2(
  xCONNECT       := TRUE,
  strIP_ADDRESS  := '192.168.2.13',
  wPORT          := 502,
  bUNIT_ID       := 3,
  bFUNCTION_CODE := 16#10,
  wWRITE_ADDRESS := 40149,
  wWRITE_QUANTITY:= 2,
  ptSEND_DATA    := ADR(di),
  xSEND          := xSend
);

Wenn Deine SPS Little Endian hat dann vor dem Senden die Reihenfolge der 4 Bytes umdrehen:
Code:
dwBig : DWORD;

di := 2000;
dwBig :=    (ROL(DINT_TO_DWORD(di),8) AND 16#00FF00FF)
         OR (ROR(DINT_TO_DWORD(di),8) AND 16#FF00FF00);

KOMMU_E2(
  xCONNECT       := TRUE,
  strIP_ADDRESS  := '192.168.2.13',
  wPORT          := 502,
  bUNIT_ID       := 3,
  bFUNCTION_CODE := 16#10,
  wWRITE_ADDRESS := 40149,
  wWRITE_QUANTITY:= 2,
  ptSEND_DATA    := ADR(dwBig),
  xSEND          := xSend
);

Harald
 
Zurück
Oben