Sterownik MPM ma na swoim pokładzie nadajnik/odbiornik RS485, który umożliwia prowadzenie komunikacji modbus z urządzeniami takimi jak liczniki, pompy ciepła i centrale wentylacyjne i im podobnymi.
--konfigurujemy komunikację adres_master = 98 --tu wstaw adres urządzenia predkosc = 9600 --możliwe są też 19200, 38400, 57600 liczbabitow = 8 --może być 7 lub 8 bitów danych parzystosc = "NONE" --możliwe są też "ODD" i "EVEN" bitystopu = 1 --w modbus może być 1 lub 2 bity stopu --na początek zamykamy modbus z możliwych wcześniejszych instancji skryptu modbus.close() --otwieramy modbus modbus.open(adres_master, "RTU", predkosc, liczbabitow, parzystosc, bitystopu)
Od tego momentu mamy już w skrypcie możliwość bezpośredniego odpytywania poszczególnych rejestrów modbus z konkretnie wybranych urządzeń.
Przykłady czytanych typów rejestrów modbus
--odczytujemy rejestr typu coil (1 bit)
adres_urzadzenia_slave = 4
adres_rejestru = 4001
liczba_odczytywanych_wartości = 1
blad, values = modbus.coil_read(adres_urzadzenia_slave, adres_rejestru, liczba_odczytywanych_wartości)
if blad == 0 then
przeczytana_wartosc = values[1]
else
print("Błąd odczytu rejestru coil. Kod błędu: ", blad)
end
--odczytujemy rejestr typu digital input (1 bit)
adres_urzadzenia_slave = 4
adres_rejestru = 4002
liczba_odczytywanych_wartości = 1
blad, values = modbus.di_read(adres_urzadzenia_slave, adres_rejestru, liczba_odczytywanych_wartości)
if blad == 0 then
przeczytana_wartosc = values[1]
else
print("Błąd odczytu rejestru digital input. Kod błędu: ", blad)
end
--odczytujemy rejestr read-only typu input register (16 bitów)
adres_urzadzenia_slave = 4
adres_rejestru = 4091
liczba_odczytywanych_wartości = 1
blad, values = modbus.fp_read(adres_urzadzenia_slave, adres_rejestru, liczba_odczytywanych_wartości)
if blad == 0 then
przeczytana_wartosc = values[1]
else
print("Błąd odczytu rejestru holding register. Kod błędu: ", blad)
end
--odczytujemy rejestr typu holding register zapisany zmiennoprzecinkowo (16 bitów)
adres_urzadzenia_slave = 4
adres_rejestru = 4101
liczba_odczytywanych_wartości = 1
czytaj_od_najstarszych = 1
blad, values = modbus.fp_read(adres_urzadzenia_slave, adres_rejestru, liczba_odczytywanych_wartości, czytaj_od_najstarszych)
if blad == 0 then
przeczytana_wartosc = values[1]
else
print("Błąd odczytu rejestru holding register. Kod błędu: ", blad)
end
--odczytujemy rejestr typu holding register zapisany jako wartość całkowita, bez znaku (32 bity uint long)
adres_urzadzenia_slave = 4
adres_rejestru = 4151
liczba_odczytywanych_wartości = 2 --2x słowo 16 bitów
blad, values = modbus.hr_read(adres_urzadzenia_slave, adres_rejestru, liczba_odczytywanych_wartości)
if blad == 0 then
przeczytana_wartosc = (values[1] * 0x10000) + values[2]
else
print("Błąd odczytu rejestru holding register. Kod błędu: ", blad)
end
Przykłady zapisywanych typów rejestrów modbus
--zapisujemy rejestr typu holding register zmiennoprzecinkowo (16 bitów)
adres_urzadzenia_slave = 4
adres_rejestru = 4201
kolejnosc_rejestrow = 1 --najpierw starszy = 1 | najpierw młodszy = 0
--tak zapisujemy wartość
wartość = 1
blad, opis_bledu = modbus.fp_write(adres_urzadzenia_slave, adres_rejestru, wartość, kolejnosc_rejestrow)
if blad ~= 0 then
print("Błąd zapisu wartości do rejestru holding register. Kod błędu: ", blad)
print(opis_bledu)
end
--tak zapisujemy tablicę wartości
tablica = {0x25, 1.3, 6}
blad, opis_bledu = modbus.fp_write(adres_urzadzenia_slave, adres_rejestru, tablica, kolejnosc_rejestrow)
if blad ~= 0 then
print("Błąd zapisu wartości do rejestru holding register. Kod błędu: ", blad)
print(opis_bledu)
end
--zapisujemy rejestr typu holding register wartością 16 bitową
adres_urzadzenia_slave = 4
adres_rejestru = 202
kolejnosc_rejestrow = 1 --najpierw starszy = 1 | najpierw młodszy = 0
wartość = 1020
blad, opis_bledu = modbus.hr_write(adres_urzadzenia_slave, adres_rejestru, wartość, kolejnosc_rejestrow)
if blad ~= 0 then
print("Błąd zapisu wartości do rejestru holding register. Kod błędu: ", blad)
print(opis_bledu)
end
