Jak w Lua napisać skrypt czytający Modbus sterownikiem MPM?

utworzone przez | 24/04/2025 | Baza wiedzy

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