MODBUS mit zwei mal ILC 151 ETH

connix

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum,
ich versuche zwei ILC 151 ETH über Modbus TCP miteinander sprechen zu lassen.
Leider geht es nur, das ich ein Datenword vom Server an das Device schicken kann, aber keines zurück.

Den Busaufbau auf beiden Seiten habe ich als Bild angehängt.

Kann mir Jemand helfen, was ich falsch mache?

MfG
ConnixBildschirmfoto 2021-01-20 um 12.30.17.jpg
 
Hallo,

normalerweise brauchst du einen Server, der einen Puffer aufbaut und in dem du definierst, welche Bereiche geschrieben oder gelesen werden können. Die Gegenstation kann dann als Client mit Read und Write darauf zugreifen.

Beispiel für einen Server:

MB_TCP_Server_V1_32_1( Activate:=TRUE,
AutoQuit:= TRUE,
Port:=502,
PartnerIP:= '192.168.1.215',
TimeOut:=T#5s,
RegOffset:= UINT#0,
RegOffsetInputs:= UINT#0,
MODBUS_Data:=Modbus_puffer);


Active:=MB_TCP_Server_V1_32_1.Active;
Connect:=MB_TCP_Server_V1_32_1.Connection;
Error:=MB_TCP_Server_V1_32_1.Error;
Diag :=MB_TCP_Server_V1_32_1.DiagCode;
Diag_2 :=MB_TCP_Server_V1_32_1.AddDiagCode;
Modbus_puffer:=MB_TCP_Server_V1_32_1.MODBUS_Data;

MfG
SLe
 
Hallo,

einfacher als Modbus ist die Kommunikation über IP_CONNECT, IP_USEND und IP_URCV. Die Möglichkeit der IEC-61131-5 Übertragung macht es sehr einfach und das programm ist in jeder ILC151 gleich.

IP_CONNECT_1(EN_C:=TRUE,
PARTNER:='/PORT=502 /IP=192.168.1.10');

IP_Valid:=IP_CONNECT_1.VALID;
IP_Error:=IP_CONNECT_1.ERROR;
IP_Status:=IP_CONNECT_1.STATUS;


Blinker_1(); (* erzeugt den Sendetakt *)

IP_USEND_1(REQ:=Blinker_1.Q,
ID:=IP_CONNECT_1.ID,
R_ID:='61131-5',
SD_1:=S_Puffer_61131);

S_Puffer_61131:=IP_USEND_1.SD_1;


IP_URCV_1(EN_R:=TRUE,
ID:=IP_CONNECT_1.ID,
R_ID:='61131-5',
RD_1:=E_Puffer_61131);

E_Puffer_61131:=IP_URCV_1.RD_1;

MfG
SLe
 
Hallo,

normalerweise brauchst du einen Server, der einen Puffer aufbaut und in dem du definierst, welche Bereiche geschrieben oder gelesen werden können. Die Gegenstation kann dann als Client mit Read und Write darauf zugreifen.

Warum sollte man das bei einer ILCxx1 noch so machen? Ich habe das nur bei den alten gemacht die noch keine Modbus Implementierung in der Firmware hatten.


connix ich würde die ILC mal als "Modbus Device" reinhängen.

AX7tCVY9O52wAAAAAElFTkSuQmCC
 

Anhänge

  • Unbenannt1.PNG
    Unbenannt1.PNG
    11,8 KB · Aufrufe: 12
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke SLe.
Ich habe es ausprobiert und hat funktioniert.
Jetzt möchte ich einen Raspberry Pi mit CoDeSys anhängen. Der spricht nur TCP/IP (zumindest habe ich nichts anderes gefunden).
Ist die Eingabe so korrekt?

IP_CONNECT_1(EN_C:=TRUE,
PARTNER:='/Passive /PORT=502 /IP=192.168.1.10');

Connix
 
Nur TCP/IP? Was meinst du?
Modbus (TCP) ist doch im OSI-Modell im Application Layer und nutzt TCP.

Bei CoDeSys musst du doch nur das passende Gerät (Modbus TCP Master oder ... Slave Device) anhängen.


Wenn die ILC der Server sprich Slave ist, ist das so richtig:
IP_CONNECT_1(EN_C:=TRUE,
PARTNER:='/PASSIVE /PORT=502 /IP=192.168.1.10');

Aber
/PASSIVE /PORT=502
reicht auch, es sei denn du willst das nur 192.168.1.10 eine Verbindung aufbauen darf.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

als Rückgabewert kommt dann die ID, die du dann für IP_USEND und IP_URCV brauchst.

Valid :=IP_CONNECT_1.VALID;
Error :=IP_CONNECT_1.ERROR;
Status :=IP_CONNECT_1.STATUS;
ID :=IP_CONNECT_1.ID;

MFG
SLe
 
Zurück
Oben