Добрый день, подскажите пожалуйста.
Задача: логировать ошибки 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 с расшифровками ошибок? (пришлось ручками набивать, не придумал как иначе).
Спасибо.




Ответить с цитированием