Najpierw przygotowujemy funkcje pomocnicze:
-- podstawowa obsługa logu
function log(...)
print(os.date(), ...)
end
-- funkcja uruchamiająca port modbus
function modbus_reset()
err = modbus.open(100,"RTU",9600,8,"ODD",1)
end
-- Obsluga bledow modbus
function modbus_error(nr_bledu)
if nr_bledu == 3000 then
log("Uplynal czas odpowiedzi.")
elseif nr_bledu == 3003 then
log("Brak interfejsu RS485.")
elseif nr_bledu == 5002 then
log("Nieprawidlowy adres slave.")
elseif nr_bledu == 5003 then
log("Uzyto nieprawidlowej komendy.")
else
log("Nieznany blad:" .. nr_bledu)
end
end
Od tego momentu możemy już uruchomić program, uruchamiamy go raz na 3 sekundy:
--HoldingRegister----------- result, values = modbus.hr_read(SE8000_id,1,4) --odczyt 4 rejestrĂłw zaczynajÄ…c od adresu 1 z urzadzenia o id SE8000_id if result == 0 then ME.BV110 = values[1] --temperature scale ME.AV110 = values[2] --jezyk ME.AV114 = values[3] --fan mode ME.AV112 = values[4] --system mode else modbus_error(result) end result, values = modbus.hr_read(SE8000_id,23,1) if result == 0 then ME.AV116 = values[1] --occupancy command ME.AV120 = values[1] --network units else modbus_error(result) end result, values = modbus.hr_read(SE8000_id,81,2) if result == 0 then ME.AV160 = values[1] --custom button icon ME.AV162 = values[2] --custom button behaviour else modbus_error(result) end result, values = modbus.hr_read(SE8000_id,4001,2) if result == 0 then --ME.AV130 = values[1] / 10 -- occ cool setpoint ME.AV132 = values[2] / 10 -- occ heat setpoint else modbus_error(result) end if ME.AV132 ~= ME.AV133 then if ME.AV132_Present_Value.time > ME.AV133_Present_Value.time then ME.AV133 = ME.AV132 else result = modbus.hr_write(SE8000_id,4002,ME.AV133*10) end end result, values = modbus.hr_read(SE8000_id,4009,2) if result == 0 then ME.AV138 = values[1] / 10 -- sby cool setpoint ME.AV140 = values[2] / 10 -- sby heat setpoint else modbus_error(result) end result, values = modbus.hr_read(SE8000_id,4017,2) if result == 0 then ME.AV118 = values[1] -- password else modbus_error(result) end result, values = modbus.hr_read(SE8000_id,8001,1) if result == 0 then ME.AV151 = values[1] -- PI Heating Demand --ME.AV152 = values[2] -- PI Cooling Demand else modbus_error(result) end --IN----------- result, values = modbus.in_read(SE8000_id,1,3) if result == 0 then ME.AV150 = values[1] / 10 --temperatura pomieszczenia ME.AV155 = values[3] / 10 --nawiew else modbus_error(result) end result, values = modbus.in_read(SE8000_id,1002,1) if result == 0 then ME.AV156 = values[1] --jasnosc w pomieszczeniu else modbus_error(result) end end
A dodatkowo raz na 10 minut sczytajmy sobie dodatkowe rejestry:
if every(600) then result, values = modbus.in_read(SE8000_id,9001,6) if result == 0 then ME.AV101 = values[1] ME.AV102 = values[2] ME.AV103 = values[3] ME.AV104 = values[4] ME.AV105 = values[5] ME.AV106 = values[6] else modbus_error(result) end end
A teraz to co ma się wykonać możliwie szybko:
if ME.BV110 ~= ME.BV111 then if ME.BV110_Present_Value.time > ME.BV111_Present_Value.time then ME.BV111 = ME.BV110 else result = modbus.hr_write(SE8000_id,1,ME.BV111) end end --av117 z harmonogramu, av116 status z regulatora if ME.AV116 ~= ME.AV117 then if ME.AV116_Present_Value.time > ME.AV117_Present_Value.time then ME.AV117 = ME.AV116 if ME.AV116 > 1 then ME.BV122 = 1 --2 unocc ME.BV121 = 0 ME.BV120 = 0 elseif ME.AV116 > 0 then ME.BV122 = 0 ME.BV121 = 1 --1 occ ME.BV120 = 0 else ME.BV122 = 0 ME.BV121 = 0 ME.BV120 = 1 --0 local end else result = modbus.hr_write(SE8000_id,22,ME.AV117) end end if every(30) then --result = modbus.hr_write(SE8000_id,4003,ME.AV135*10) --unocc cool setpoint result = modbus.hr_write(SE8000_id,4004,ME.AV137*10) --unocc heat setpoint end if ME.AV160 ~= ME.AV161 then if ME.AV160_Present_Value.time > ME.AV161_Present_Value.time then ME.AV161 = ME.AV160 else result = modbus.hr_write(SE8000_id,81,ME.AV161) end end if ME.AV162 ~= ME.AV163 then if ME.AV162_Present_Value.time > ME.AV163_Present_Value.time then ME.AV163 = ME.AV162 else result = modbus.hr_write(SE8000_id,82,ME.AV163) end end
