-> Hier kostenlos registrieren
Hallo!
Auf einer AC500-eco versuche Ich mittels COM_MOD_MAST (RS485) Daten von mehreren Teilehmern zu auszutauschen.
Dazu verwende Ich folgenden Kode:
Mod_Done:=MBTxRq.DONE;
Mod_Error:=MBTxRq.ERR;
RqCnt:=(RqCnt+1) MOD 13;
Der Kode ist Bestandteil von einem zyklyschen POU (500 ms, PRI 5).
Soweit OK - die Daten werden ausgetauscht. Dann habe Ich die RS485 Verbindung zu einem der MODBUS Slave Teilnehmer unterbrochen, und stellte fest, dass ERR und DONE staendig FALSE sind und somit keinerlei Diagnostik der Kommunikation moeglich ist. Alle Versuche die Werte von ERR und DONE auf andere Variablen - z.B Mod_Done und Mod_Error(global/lokal) zu uebertragen waren ergebnisslos. In der obigen Variante sind MB_ERR und MB_RDY digitale on-board Ausgaenge, auch das half nicht. Wenn aber auf den COM_MODE_MAST Block ein breakpoint gesetzt wird, werden ERR und DONE wie erwartet gesetzt -TRUE, sobald aber der Block verlassen wird, werden sie erneut FALSE!
Zusaetzlich versuchte Ich die Ausfuehrungszeit von dem COM_MODE_MAST zu ermitteln - vor und nach Block mass Ich die laufende Zeit (TIME()) und speicherte sie in einer Matrix. Fuer alle Telegramme war sie < 1 ms - unabhaengig davon ob die Kommunikation erfolgreich oder nicht war, obwohl eine TIMEOUT vor 250 ms vorgegeben wurde.
Offensichtlich ist etwas nicht wie es sein sollte, aber WAS?
Ich waere fuer jede Hilfe SEHR dankbar!
Frohe Ostern!
Auf einer AC500-eco versuche Ich mittels COM_MOD_MAST (RS485) Daten von mehreren Teilehmern zu auszutauschen.
Dazu verwende Ich folgenden Kode:
CASE RqCnt OF
(*This is a new Communication Cycle! *)
0:
(*This is a new Communication Cycle! *)
0:
MB_Fct:=3; (* Rx Command!*)
MBSlaveDvADR:=1;
MBRxLngth:=20;
MBSlaveRqAddr:=128;
MBSlaveDvADR:=1;
MBRxLngth:=20;
MBSlaveRqAddr:=128;
MBRxDataAdr:=ADR(tmH1St);
1:
MBSlaveRqAddr:=5;
MBRxLngth:=1;
MBRxDataAdr:=ADR(tmH1HD1St);
MBRxLngth:=1;
MBRxDataAdr:=ADR(tmH1HD1St);
2:
In jedem weiteren Zweig werden jeweils verschiedene Parameter vorgegeben - Modbus Teilnehmer Addresse, Register etc.etc.
3:
.............
12:
.............
ELSE
PLC_St:=COMM_FAULT;
END_CASE
MBTxRq(EN:=FALSE);
MBTxRq(EN:= TRUE,
MBTxRq(EN:=FALSE);
MBTxRq(EN:= TRUE,
COM := 2,
SLAVE := MBSlaveDvADR,
FCT := MB_Fct,
TIMEOUT := 250,
ADDR := MBSlaveRqAddr,
NB := MBRxLngth,
DATA := MBRxDataAdr,
DONE => MB_RDY,
ERR => MB_ERR,
ERNO =>Mod_ErrNum
SLAVE := MBSlaveDvADR,
FCT := MB_Fct,
TIMEOUT := 250,
ADDR := MBSlaveRqAddr,
NB := MBRxLngth,
DATA := MBRxDataAdr,
DONE => MB_RDY,
ERR => MB_ERR,
ERNO =>Mod_ErrNum
);
Mod_Done:=MBTxRq.DONE;
Mod_Error:=MBTxRq.ERR;
RqCnt:=(RqCnt+1) MOD 13;
Der Kode ist Bestandteil von einem zyklyschen POU (500 ms, PRI 5).
Soweit OK - die Daten werden ausgetauscht. Dann habe Ich die RS485 Verbindung zu einem der MODBUS Slave Teilnehmer unterbrochen, und stellte fest, dass ERR und DONE staendig FALSE sind und somit keinerlei Diagnostik der Kommunikation moeglich ist. Alle Versuche die Werte von ERR und DONE auf andere Variablen - z.B Mod_Done und Mod_Error(global/lokal) zu uebertragen waren ergebnisslos. In der obigen Variante sind MB_ERR und MB_RDY digitale on-board Ausgaenge, auch das half nicht. Wenn aber auf den COM_MODE_MAST Block ein breakpoint gesetzt wird, werden ERR und DONE wie erwartet gesetzt -TRUE, sobald aber der Block verlassen wird, werden sie erneut FALSE!
Zusaetzlich versuchte Ich die Ausfuehrungszeit von dem COM_MODE_MAST zu ermitteln - vor und nach Block mass Ich die laufende Zeit (TIME()) und speicherte sie in einer Matrix. Fuer alle Telegramme war sie < 1 ms - unabhaengig davon ob die Kommunikation erfolgreich oder nicht war, obwohl eine TIMEOUT vor 250 ms vorgegeben wurde.
Offensichtlich ist etwas nicht wie es sein sollte, aber WAS?
Ich waere fuer jede Hilfe SEHR dankbar!
Frohe Ostern!