Обработка сигнала с задержкой
Если значение температуры averageTemp, рассчитанное предыдущим скриптом, будет превышать 10 °C в течение 5 секунд, то будет считаться, что возникла аварийная ситуация (тег alarmTag будет установлен в значение true).
alarmDelay.lua
local async = require("async") -- загрузка модуля асинхронных операций
local tagApi = require("simplight.api.channels") -- загрузка модуля работы с тегами
local time = require('time') -- загрузка модуля работы со временем
local tempAlTime -- таймер аварии. Если аварии нет, то значение остаётся nil
setInterval(function()
async(function()
local tempAvg = (await(tagApi.readMany({"averageTemp"})))[1].value
if tempAvg > 10 then -- проверка условия превышения температуры
if not tempAlTime then
tempAlTime = time.now() + 5 * 1000 -- расчет времени задержки: текущее время + 5 секунд
elseif time.now() > tempAlTime then -- если текущее значение времени превышает время задержки
await(tagApi.writeMany({values = {{name = "alarmTag", value = true, quality = 0xC0}} -- в аварийный тег записывается true и пр.качества
}))
tempAlTime = nil -- и выполняется сброс переменной таймера для следующего цикла
end
else
tempAlTime = nil
-- если условие превышения температуры не выполнилось в аварийный тег записывается false
await(tagApi.writeMany({values = {{ name = "alarmTag", value = false, quality = 0xC0}}
}))
end
end):catch(function(err) -- обработка возможных ошибок
print("error", err)
end)
end, 1000)
Для проверки корректности перехода тега alarmTag в аварийное состояние после разворачивания проекта на сервере, необходимо выполнить проверку с использованием теста тегов проекта.