===== Miscellaneous functions ===== ==== GetTime ==== The GetTime function returns table with local time information. **sec** field contains seconds in Unixtime format. **ns** field contains nanoseconds passed since begin of current second. This function is available since WebHMI version 3.6 Example: function main (userId) local time = GetTime(); INFO("Seconds: " .. time.sec); INFO("Nanoseconds:" .. time.ns); end ==== Delay ==== function main (userId) -- Uncomment this part to measure the time spent -- local start_time = GetTime(); -- Delay(100.25, GetTimePrecise()) -- Uncomment this part to measure the time spent -- local cur_time = GetTime(); local cur_sec, cur_ns = cur_time.sec, cur_time.ns -- local time_spent_sec, time_spent_ns = cur_sec - start_time.sec, cur_ns - start_time.ns -- local millseconds_spent = time_spent_sec * 1000 + time_spent_ns / 1000000 -- ERROR("Time spent ms = " .. millseconds_spent) -- end -- Additional functions can be defined after or before main() loop function GetTimePrecise() local start_time = GetTime(); return start_time.sec * 1000^3 + start_time.ns end function Delay (milliseconds, precise_start_time) repeat delay_ns = milliseconds * 1000000 local cur_time = GetTime(); time_over = GetTimePrecise() > (precise_start_time + delay_ns) until time_over end ==== GetReg filter nil (if nil then zero) ==== function main (userId) val1 = GetReg(1) or 0 -- if GetReg is nil, then it will be equal to 0 TRACE("val1 " ..tostring(val1)) val2 = GetReg("temperature") TRACE("val2 " ..tostring(val2)) val2_filtered = (val2 or 0) -- if val2 is nil, then it will be equal to 0 too. TRACE("val2_filtered " ..tostring(val2_filtered)) sum = val1 + val2_filtered TRACE(sum) end ==== IfInRangeHHMM ==== function main (userId) now = os.time() working_time = ifInRangeHHMM(now, 20,0,8,0) TRACE("working_time = " .. tostring(working_time)) if working_time then -- Add your code here end end function ifInRangeHHMM(now, start_hour, start_min, end_hour, end_min) -- проверяет текущее время на попадание в диапазон час минута out = false local cur_HH, cur_MM = tonumber(os.date("%H", now)), tonumber(os.date("%M", now)) -- TRACE("now = " .. os.date("%X %x", now) .. " " .. cur_HH .. ":" .. cur_MM) not_splitted_midnight_shift = start_hour < end_hour or start_hour == end_hour and start_min < end_min if not_splitted_midnight_shift then local after_start = (cur_HH > start_hour) or (cur_HH == start_hour and cur_MM >= start_min) local before_end = (cur_HH < end_hour) or (cur_HH == end_hour and cur_MM <= end_min) -- TRACE("after_start =" .. tostring(after_start)) -- TRACE("before_end =" .. tostring(before_end)) out = after_start and before_end ; --TRACE("going to return " .. tostring(out)) else TRACE("ifInRangeHHMM: Range is midnight splitted") out = ifInRangeHHMM(now, start_hour, start_min, 23, 59) or ifInRangeHHMM(now, 0, 0, end_hour, end_min) end return out end