Обработка ошибок ModbusTCP
Добрый день, подскажите пожалуйста.
Задача: логировать ошибки Modbus TCP Slave устройства.
Вот, что пока накидал
Код:
VAR
MbState: IoDrvModbusTCP.MB_ErrorCodes;
sMbLog: STRING(255);
sMbLogError: STRING(255);
byMbLog: BYTE;
byMbLogPrev: BYTE;
xLogMbWrite: BOOL;
FB_FIFO_64_STRING_0: FB_FIFO_64_STRING;
END_VAR
MbState:= Modbus_TCP_Slave.byModbusError;
byMbLog := MbState;
IF Modbus_TCP_Slave.xError THEN
xLogMbWrite:= TRUE;
// коды ошибок из IoDrvModbusTCP (enum MB_ErrorCodes)
IF byMbLog = 16#0 THEN sMbLogError := 'RESPONSE_SUCCESS';END_IF
IF byMbLog = 16#1 THEN sMbLogError := 'ILLEGAL_FUNCTION';END_IF
IF byMbLog = 16#2 THEN sMbLogError := 'ILLEGAL_DATA_ADDRESS';END_IF
IF byMbLog = 16#3 THEN sMbLogError := 'ILLEGAL_DATA_VALUE';END_IF
IF byMbLog = 16#4 THEN sMbLogError := 'SLAVE_DEVICE_FAILURE';END_IF
IF byMbLog = 16#5 THEN sMbLogError := 'ACKNOWLEDGE';END_IF
IF byMbLog = 16#6 THEN sMbLogError := 'SLAVE_DEVICE_BUSY';END_IF
IF byMbLog = 16#8 THEN sMbLogError := 'MEMORY_PARITY_ERROR';END_IF
IF byMbLog = 16#A THEN sMbLogError := 'GATEWAY_PATH_UNAVAILABLE';END_IF
IF byMbLog = 16#B THEN sMbLogError := 'GATEWAY_DEVICE_FAILED_TO_RESPOND';END_IF
IF byMbLog = 16#A1 THEN sMbLogError := 'RESPONSE_TIMEOUT';END_IF
IF byMbLog = 16#A2 THEN sMbLogError := 'RESPONSE_CRC_FAIL';END_IF
IF byMbLog = 16#A3 THEN sMbLogError := 'RESPONSE_WRONG_SLAVE';END_IF
IF byMbLog = 16#A4 THEN sMbLogError := 'RESPONSE_WRONG_FUNCTIONCODE';END_IF
IF byMbLog = 16#A5 THEN sMbLogError := 'TCP_COMMUNICATION_ERROR';END_IF
IF byMbLog = 16#A6 THEN sMbLogError := 'RESPONSE_INVALID_DATA';END_IF
IF byMbLog = 16#A7 THEN sMbLogError := 'RESPONSE_INVALID_PROTOCOL';END_IF
IF byMbLog = 16#A8 THEN sMbLogError := 'RESPONSE_INVALID_HEADER';END_IF
IF byMbLog = 16#FF THEN sMbLogError := 'UNDEFINED';END_IF
sMbLog := CONCAT(TSandCYCLES, sMbLogError);
sMbLog := CONCAT(sMbLog, '$N');
FB_FIFO_64_STRING_0 (StrIn:=sMbLog, E:=TRUE, RD:=FALSE, WD:=xLogMbWrite, RST:=FALSE);
END_IF
Сам код работает. У меня возникли такие вопросы:
1. Правильно ли отлавливать ошибки по Modbus_TCP_Slave.xError, не нужна ли дополнительная обработка? (например при обрыве связи постоянно сыплет сообщения "TCP_COMMUNICATION_ERROR").
2. Можно ли уйти от большего количества конструкций "IF byMbLog = 16# THEN sMbLogError := 'ERROR'; END_IF с расшифровками ошибок? (пришлось ручками набивать, не придумал как иначе).
Спасибо.