-> Hier kostenlos registrieren
Hallo zusammen,
möchte die Werte einer Brink KWL (Flair 400) über den Modbus mit einer Wago 750-652 auslesen und steuern.
Wago 750-8100 + e!Cockpit (alles aktuelle Version).
Ich nutze das Demoprogramm ModbusSerialMaster aus der Bibliothek WagoAppPlcModbus. Mit dem Funktionsblock FbMbMasterSerial.
Die Wago 750-652 ist auf Werkseinstellungen zurückgesetzt und ich habe die Einstellungen der KWL entsprechend gesetzt.
Die KWL hat die Modbus-Adresse 20.
Verkabelt ist die Wago 750-652 mit der KWL nach der Wago Anleitung der 750-652 auf Seite 48.
PROGRAM ModbusSerialMaster
VAR
mySerialMaster : FbMbMasterSerial := ( xConnect := FALSE,
udiBaudrate := 9600,
usiDataBits := 8,
eParity := WagoTypesCom.eTTYParity.None,
eStopBits := WagoTypesCom.eTTYStopBits.One,
eHandshake := WagoTypesCom.eTTYHandshake.None,
ePhysical := WagoTypesCom.eTTYPhysicalLayer.RS485_HalfDuplex,
eFrameType := eMbFrameType.RTU,
tTimeOut := T#500MS
);
//--- Identification Object for use of FC43 (in case the slave support it) ------
myBaseIdentification : FbIdentifyBaseObject; // only needed for FC43
//-------------------------------------------------------------------------------
utQuery : typMbQuery := ( bUnitId := 20, // Slaveaddress
bFunctionCode := 16#04, // read input registers
IIdentifyObject := myBaseIdentification, // only needed for FC43
uiReadAddress := 0, // Startaddress
uiReadQuantity := 10, // Quantity of wanted registers
uiWriteAddress := 0, // not needed for FC4
uiWriteQuantity := 0, // not needed for FC4
awWriteData := [124(0)] // not needed for FC4
);
xTxTrigger : BOOL; (* Set this variable once for start a job.
This variable will be automaticly reset by the master
if the job is done.
*)
utResponse : typMbResponse; (* After the job is done you can find at this structure
the result.
*)
tonDelay : TON := (PT := T#20MS); // This is the silence time between two requests
myData : ARRAY [0..124] OF WORD;
strDescription : ARRAY [0..100] OF STRING;
i : INT;
END_VAR
//--- delay between two requests ----------------------
tonDelay( IN := (NOT tonDelay.Q) AND (NOT xTxTrigger));
xTxTrigger S= tonDelay.Q; // trigger the next request
//--- call cyclic the master --------------
mySerialMaster( I_Port := RS485, // my serial port
utQuery := utQuery,
xTrigger := xTxTrigger,
utResponse := utResponse
);
mySerialMaster.xConnect := GVL.b_xConnect;
IF mySerialMaster.oStatus.sDescription <> 'OK' THEN
strDescription := mySerialMaster.oStatus.sDescription;
i:=i+1;
END_IF
IF i = 100 THEN
i:=0;
END_IF
Ich schreibe die letzten 100 Fehler in die Variable strDescription
Ich erhalte folgende Fehler:
- Error while transmission -> transporlayer can not transmit
- Error time out
In einem anderen Beitrag habe ich gelesen, dass das zeitgleiche setzen der xConnect auf true Probleme machen soll.
Zum testen setze ich xConnect manuell über einen Button auf der Visualisierung.
Hat jemand eine Idee und könnte helfen?
Gruß
möchte die Werte einer Brink KWL (Flair 400) über den Modbus mit einer Wago 750-652 auslesen und steuern.
Wago 750-8100 + e!Cockpit (alles aktuelle Version).
Ich nutze das Demoprogramm ModbusSerialMaster aus der Bibliothek WagoAppPlcModbus. Mit dem Funktionsblock FbMbMasterSerial.
Die Wago 750-652 ist auf Werkseinstellungen zurückgesetzt und ich habe die Einstellungen der KWL entsprechend gesetzt.
Die KWL hat die Modbus-Adresse 20.
Verkabelt ist die Wago 750-652 mit der KWL nach der Wago Anleitung der 750-652 auf Seite 48.
PROGRAM ModbusSerialMaster
VAR
mySerialMaster : FbMbMasterSerial := ( xConnect := FALSE,
udiBaudrate := 9600,
usiDataBits := 8,
eParity := WagoTypesCom.eTTYParity.None,
eStopBits := WagoTypesCom.eTTYStopBits.One,
eHandshake := WagoTypesCom.eTTYHandshake.None,
ePhysical := WagoTypesCom.eTTYPhysicalLayer.RS485_HalfDuplex,
eFrameType := eMbFrameType.RTU,
tTimeOut := T#500MS
);
//--- Identification Object for use of FC43 (in case the slave support it) ------
myBaseIdentification : FbIdentifyBaseObject; // only needed for FC43
//-------------------------------------------------------------------------------
utQuery : typMbQuery := ( bUnitId := 20, // Slaveaddress
bFunctionCode := 16#04, // read input registers
IIdentifyObject := myBaseIdentification, // only needed for FC43
uiReadAddress := 0, // Startaddress
uiReadQuantity := 10, // Quantity of wanted registers
uiWriteAddress := 0, // not needed for FC4
uiWriteQuantity := 0, // not needed for FC4
awWriteData := [124(0)] // not needed for FC4
);
xTxTrigger : BOOL; (* Set this variable once for start a job.
This variable will be automaticly reset by the master
if the job is done.
*)
utResponse : typMbResponse; (* After the job is done you can find at this structure
the result.
*)
tonDelay : TON := (PT := T#20MS); // This is the silence time between two requests
myData : ARRAY [0..124] OF WORD;
strDescription : ARRAY [0..100] OF STRING;
i : INT;
END_VAR
//--- delay between two requests ----------------------
tonDelay( IN := (NOT tonDelay.Q) AND (NOT xTxTrigger));
xTxTrigger S= tonDelay.Q; // trigger the next request
//--- call cyclic the master --------------
mySerialMaster( I_Port := RS485, // my serial port
utQuery := utQuery,
xTrigger := xTxTrigger,
utResponse := utResponse
);
mySerialMaster.xConnect := GVL.b_xConnect;
IF mySerialMaster.oStatus.sDescription <> 'OK' THEN
strDescription := mySerialMaster.oStatus.sDescription;
i:=i+1;
END_IF
IF i = 100 THEN
i:=0;
END_IF
Ich schreibe die letzten 100 Fehler in die Variable strDescription
Ich erhalte folgende Fehler:
- Error while transmission -> transporlayer can not transmit
- Error time out
In einem anderen Beitrag habe ich gelesen, dass das zeitgleiche setzen der xConnect auf true Probleme machen soll.
Zum testen setze ich xConnect manuell über einen Button auf der Visualisierung.
Hat jemand eine Idee und könnte helfen?
Gruß