<< Click to Display Table of Contents >> Navigation: Modbus Universal MasterOPC Server > Руководство по языку Lua 5.1 > Примеры и полезности > Формирование расширенного Modbus запроса > Обработка ошибок |
Наш код работает и способен опрашивать датчик. Однако мы никак не позаботились об обработке ошибок. Мы реализовали повтор запроса на случай некорректного ответа, но возможен ли случай когда ответ корректный (количество байт, контрольная сумма), но при этом он неправильный? Да, возможен.
Например, представим себе следующую ситуацию. На одной шине Modbus у нас подключены несколько датчиков влажности МАВ-ТС100 и несколько модулей ввода, которые например, нужно опрашивать функцией 0х03. При создании конфигурации OPC сервера мы случайно перепутали адреса, и указали у датчика МАВ-ТС100 адрес модуля ввода – теперь OPC сервер начнет посылать запросы функцией 0х19 модулю, который данную функцию не поддерживает.
Что в этом случае ответит устройство? В стандарте Modbus, на этот случай прописан ответ содержащий функцию ошибки – 0x80 + номер функции, то есть в данном случае код ошибки будет равен 0x99. Данная функция также имеет вспомогательные коды, по которым можно определить тип ошибки. Например, код 0х01 – это некорректная функция, 0х02 – некорректный адрес регистра и т.д. (полный список кодов можно прочитать в описании к стандарту).
Таким образом, наше устройство должно ответить (допустим, устройство имеет адрес 1):
01 99 01 crc_hi crc_lo
Данную ситуацию также можно обработать в коде – например, можно просто проверить второй элемент таблицы. Если он равен 0x19, то считать, что запрос выполнен корректно, иначе – записать сообщение в журнал и вернуть в код флаг недостоверности.
Код будет выглядеть следующим образом:
if err>=0 then
--запрос выполнен корректно
if dest[2]==0x19 then
return true,dest[3]; --возвращаем флаг что запрос корректен
else
server.Message("Неизвестная функция");--пишем сообщение в лог
return false,0; --запрос некорректен
end;
else
return false,0; --запрос некорректен, возвращаем соответствующий флаг
end;
В этой ситуации, также можно возвращать флаг ошибки, и в основном коде записывать в тег признак качества "Ошибка устройства" (Device Failure).