Перейти к содержанию

Обработка сигнала с задержкой

Если значение температуры 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 в аварийное состояние после разворачивания проекта на сервере, необходимо выполнить проверку с использованием теста тегов проекта.