Ich komme nicht wirklich beim Lesen verschiedener Adressen durch den BM_Client voran.
Vorallem glaube ich, dass mein Problem an dem richtigen Schalten des Request-Einganges liegt.
Kann mir Jemand sagen, wie Ihr den Request-Eingang richtig schaltet?
Hier ist mein Programm:
Von dem Schritt 300 bis 305 wird die Kommunikation aufgebaut.
Ab den Schritt 310 werden die Register gelesen:
Zuerst wird ein Register Adressiert und ein Request gestartet.
Sobald die
Rückmeldug
(#x_Client_Busy = false AND #x_Client_Done) OR (#x_Client_Error AND "Clock_10Hz")
erfüllt wird, weden die gelieferten Werte verarbeitet und anschließend ein anderes Register gelesen.
Leider habe ich mit der
Rückmeldung nicht das gewünschte Ergebnis,
machmal liefert der Baustein die Daten und manchmal auch nicht.
Es kommt es vor, dass Busy und Done gleichzeitig FALSE sind.
Auch Error ist machmal FLASE, sodass die Schrittkette hängen bleibt.
Ich bekomme auch manchemal den Status: 8200:
Parameter STATUS (S7-1200, S7-1500)
- Eine andere Modbus-Anfrage wird zur Zeit über den Port verarbeitet.
- Eine weitere Instanz von MB_CLIENT mit den gleichen Verbindungsparametern bearbeitet eine bereits bestehende Modbus-Anfrage.
|
Ich frage mich ob ich durch das Rumprobieren irgendetwas eingefügt habe, was jetzt stört.
Code:
IF #x_Start AND #i_state < 300 AND #x_Stop = false
THEN
#i_state := 300;
END_IF;
IF #x_Stop THEN
#i_state := 0;
END_IF;
(*
IF #x_Client_Error THEN
#i_state := 300;
END_IF;
*)
CASE #i_state OF
0:
#x_Clienr_Request := false;
#x_Client_Disconnect := false;
//Start
300:
#x_Clienr_Request := true;
#x_Client_Disconnect := true;
IF #w_Client_Status = 16#7000 THEN
#i_state := 305;
END_IF;
IF #x_Client_Done THEN
#i_state := 301;
END_IF;
IF #x_Client_Busy THEN
#i_state := 302;
END_IF;
305:
#x_Client_Disconnect := false;
#x_Clienr_Request := false;
IF #w_Client_Status = 16#7004 THEN
#i_state := 310;
END_IF;
//Connection established
//Read Register
310:
#udi_Client_Register := 4909; //Bussadresse
#x_Clienr_Request := true;
IF (#x_Client_Busy = false AND #x_Client_Done) OR (#x_Client_Error AND "Clock_10Hz")
THEN
#i_state := 315;
END_IF;
315:
#x_Clienr_Request := false;
#dData.iBussadresse := WORD_TO_INT(#w_Client_Data[0]);
IF #w_Client_Status = 16#7004 THEN
#i_state := 320;
END_IF;
320:
#udi_Client_Register := 4911; //Baudrate
#x_Clienr_Request := true;
IF (#x_Client_Busy = false AND #x_Client_Done) OR (#x_Client_Error AND "Clock_10Hz")
THEN
#i_state := 325;
END_IF;
325:
#x_Clienr_Request := false;
#dData.iBaudrate := WORD_TO_INT(#w_Client_Data[0]);
IF #w_Client_Status = 16#7004 THEN
#i_state := 330;
END_IF;
//Read Register
330:
#udi_Client_Register := 4912; //Modbusdatenübertr
#x_Clienr_Request := true;
IF (#x_Client_Busy = false AND #x_Client_Done) OR (#x_Client_Error AND "Clock_10Hz")
THEN
#i_state := 335;
END_IF;
335:
#x_Clienr_Request := false;
#dData.iModBusDatenuebertr := WORD_TO_INT(#w_Client_Data[0]);
#i_state := 345;
//Read Register
345:
#udi_Client_Register := 4913; //Parität
#x_Clienr_Request := true;
IF (#x_Client_Busy = false AND #x_Client_Done) OR (#x_Client_Error AND "Clock_10Hz")
THEN
#i_state := 350;
END_IF;
350:
#x_Clienr_Request := false;
#dData.iParitaet := WORD_TO_INT(#w_Client_Data[0]);
#i_state := 355;
//Read Register
355:
#udi_Client_Register := 2259;//3873; //Volumenfluss
#x_Clienr_Request := true;
IF (#x_Client_Busy = false AND #x_Client_Done) OR (#x_Client_Error AND "Clock_10Hz")
THEN
#i_state := 360;
END_IF;
360:
#x_Clienr_Request := false;
#Byte0 := #w_Client_Data[0].%B0;
#Byte1 := #w_Client_Data[0].%B1;
#Byte2 := #w_Client_Data[1].%B0;
#Byte3 := #w_Client_Data[1].%B1;
#tempWord0 := (SHL(IN := BYTE_TO_WORD(#Byte1), N := 8)) OR #Byte0;
#tempWord1 := (SHL(IN := BYTE_TO_WORD(#Byte3), N := 8)) OR #Byte2;
#dData.rVolumenfluss := DWORD_TO_REAL(SHL( IN:= WORD_TO_DWORD(#tempWord0), N:= 16) OR WORD_TO_DWORD(#tempWord1));
#i_state := 365;
365:
IF (#x_Client_Busy = false AND #x_Client_Done) OR (#x_Client_Error AND "Clock_10Hz") OR "Clock_0.5Hz"
THEN
#i_state := 310;
END_IF;
END_CASE;