<< Click to Display Table of Contents >> Navigation: Modbus Universal MasterOPC Server > Руководство по языку Lua 5.1 > Примеры и полезности > Обработка признака качества > Создание скрипта |
Составим алгоритм решения нашей задачи:
1.Считать текущее значение тега и признак качества.
2.Если признак качества хороший - сделать дополнительную проверку тега Status.
3.Считать значение тега Status.
4.Проверить 0 и 1 бит данного значения Status. Если они True, записать в тег признак качества Sensor_Failure и последнее достоверное значение
5.Проверить 2 бит значения Status. Если он True, то записать в тег признак качества Device_Failure и последнее достоверное значение.
Итоговый код будет выглядеть следующим образом:
OldValue=0
-- Initialization
function OnInit()
end
-- Uninitialization
function OnClose()
end
-- Processing
function OnRead()
Val,Qual=server.ReadCurrentTag(); --читаем значение и качества текущего тега
if Qual==OPC_QUALITY_GOOD then
Status=server.ReadTagByRelativeName("Status") --читаем статус
if bit.BitFromData(Status,0) or bit.BitFromData(Status,1) then --проверяем биты 0 и 1
server.WriteCurrentTag(OldValue,OPC_QUALITY_SENSOR_FAILURE ) --записываем старое значение и признак качества "Ошибка датчика"
return --выходим
end
if bit.BitFromData(Status,2) then --проверяем бит 2
server.WriteCurrentTag(OldValue,OPC_QUALITY_DEVICE_FAILURE ) --записываем старое значение и признак качества "Ошибка устройства"
return --выходим
end
end
OldValue=Val --сохраняем текущее значение
end
В начале скрипта мы создаем переменную OldValue - в нее мы в каждом удачном цикле опросе будем сохранять текущее значение, чтобы потом, в случае ошибки выдать его с недостоверным признаком.
Затем с помощью функции server.ReadCurrentTag считывается значение и признак качества тега. Признак качества сверяется с константой OPC_QUALITY_GOOD - если значение достоверно то можно проверить тег Status. Затем с помощью функции server.ReadTagByRelativeName считывается значение тега Status. После начинается проверка считанного значения. Для этого нужно извлечь биты 0, 1 и 2 - для этого используются функция bit.BitFromData.
Если одно из условий сработало, то с помощью функции server.WriteCurrentTag в текущий тег записывается сохраненное значение OldValue и нужная константа недостоверного признака. Оператор return используется, чтобы выйти из функции - если этого не сделать, то в переменную OldValue запишется текущее недостоверное значение, которое будет подставлено в следующем цикле.