tMDS-16 - Miernik temperatury z interfejsem Modbus

tMDS-16 to moduł do pomiaru temperatury przeznaczony do systemów opartych na protokole Modbus RTU. Wyposażony jest w dwa niezależne interfejsy 1-Wire, z których każdy obsługuje do 8 czujników temperatury DS18B20, co daje możliwość podłączenia maksymalnie 16 czujników.

Dane pomiarowe udostępniane są przez rejestry Modbus, które zawierają zarówno bieżące odczyty temperatury, jak i odpowiadające im wartości offsetów kalibracyjnych, co zapewnia dokładne i spójne wyniki pomiarów.

Urządzenie zostało zaprojektowane głównie jako rozszerzenie dla LK4 lub LK3.5+ (również kompatybilne z LK3.9), umożliwiając skalowalny i rozproszony pomiar temperatury.
Gotowy do użycia plik konfiguracyjny dla tych urządzeń dostępny jest na stronie produktu tMDS-16, co pozwala na szybką integrację bez dodatkowej konfiguracji.

Domyślnie urządzenie posiada adres Modbus Slave ID = 1, który można zmienić przez konsolę USB.

Podstawowe własności #

Specyfikacja techniczna #

Zasilanie5-12 V DC (złącze)
5 V (USB)
Obsługa czujnikówDo 2 x 8 czujników DS18B20
Interfejsy1-Wire: 2 magistrale przez złącze RJ12 i 3-pinowe złącze śrubowe,
Modbus RTU (RS485),
Serial (przez USB; 115200 baud)
Wymiary74 x 40 x 30 mm (bez uchwytu DIN)
Waga44 g

Integracja z LK #

tMDS-16 bezproblemowo integruje się z urządzeniami LK4 oraz LK3.5+. Może być zasilany bezpośrednio z wyjść 5V i GND kontrolera LK. Następnie należy podłączyć go — samodzielnie lub wraz z innymi urządzeniami Modbus — do złącz Modbus A+ i B− w urządzeniu LK, aby nawiązać komunikację.

Po podłączeniu skonfiguruj niestandardowy moduł Modbus w LK, korzystając z gotowego pliku konfiguracyjnego dostępnego w sekcji Do pobrania. Plik ten można łatwo dostosować do własnych potrzeb, np. ograniczając odczyt do wybranych czujników lub offsetów kalibracyjnych.

Aktualizacja firmware #

Aby zaktualizować oprogramowanie, urządzenie tMDS-16 należy uruchomić w trybie bootloadera. W tym trybie urządzenie pojawia się jako nośnik pamięci masowej o nazwie RPI-RP2 po podłączeniu do komputera. Wystarczy skopiować nowy plik z firmware do tego nośnika. Po zakończeniu kopiowania urządzenie automatycznie się zrestartuje i wznowi normalną pracę z nowym oprogramowaniem.

Uruchamianie trybu bootloadera #

Tryb bootloadera można włączyć na dwa sposoby:

💡 Pliki z oprogramowaniem dostępne są w sekcji Do pobrania.

Podstawowa konfiguracja przyciskiem funkcyjnym #

Przycisk funkcyjny na urządzeniu tMDS-16 umożliwia szybkie i intuicyjne wykonanie podstawowych operacji konfiguracyjnych — bez konieczności podłączania przez USB. To rozwiązanie sprawdza się idealnie w przypadku szybkiej konfiguracji w terenie.

Przycisk znajduje się obok złączy magistrali 1-Wire, a dioda LED statusu znajduje się pomiędzy nimi. Dioda informuje, jaka funkcja zostanie uruchomiona w zależności od długości przytrzymania przycisku.

Jak to działa #

Podczas przytrzymywania przycisku, dioda LED miga, sygnalizując wybraną akcję:

Czas przytrzymania Sygnał LED Wywołana akcja
< 2 sekundy 1 krótkie mignięcie update_sensors – wykrycie i przypisanie czujników
2–5 sekund 2 mignięcia po 2 sekundach set_offsets – autokalibracja wszystkich czujników (offsety zapisywane automatycznie)
5–10 sekund 3 mignięcia po 5 sekundach reset_sensors – wyczyszczenie przypisań czujników i offsetów
> 10 sekund Brak działania Anulowanie (przycisk przytrzymany zbyt długo)

Aby wywołać wybraną funkcję, zwolnij przycisk zaraz po odpowiednim sygnale LED.
Jeśli przycisk zostanie przytrzymany zbyt długo (>10 s), żadna akcja nie zostanie wykonana.

ℹ️ W celu bardziej zaawansowanej konfiguracji i diagnostyki, skorzystaj z konsoli USB (opisana w następnej sekcji).

Zaawansowana konfiguracja #

Aby zmienić ustawienia, musisz podłączyć tMDS-16 do komputera przez USB. Urządzenie może być zasilane przez USB, więc nie są potrzebne żadne dodatkowe połączenia zasilania.

Wymagane oprogramowanie #

Aby nawiązać połączenie z licznikiem impulsów, będziesz potrzebować aplikacji obsługującej komunikację szeregową. Popularne opcje to:

Przykładowy proces konfiguracji #

  1. Wyświetlenie dostępnych portów:
    Uruchom pyserial-ports, aby wyświetlić dostępne porty COM przed podłączeniem urządzenia. Wynik może wyglądać tak:

    COM1
    COM3
    COM15
    COM16
    COM17
    

  2. Podłącz urządzenie
    Podłącz tMDS-16 i uruchom ponownie polecenie. Nowy port COM (np. COM11) będzie reprezentował podłączone urządzenie.

  3. Połącz z tMDS-16
    Użyj następujących parametrów połączenia:

    • Baud rate: 115200
    • Byte size: 8 bits
    • Parity: None
    • Stop bits: 1

    Przykładowe polecenie:

    pyserial-miniterm COM11 115200

  4. Wysyłanie poleceń
    Po połączeniu możesz wydawać polecenia do urządzenia. Każde polecenie musi być zakończone klawiszem Enter. Przydatnym poleceniem jest ? lub help, które wyświetla listę wszystkich dostępnych poleceń (opisanych poniżej).

Lista poleceń #

Polecenie Opis
address? | a? Odczytuje aktualny adres Modbus (Slave ID).
address=X | a=X Ustawia adres Modbus. Parametry: X – adres do ustawienia, liczba z zakresu <1, 255>.
offsetX? | oX? Odczytuje offset kalibracyjny dla czujnika DSX. X: numer czujnika <1, 16>.
offsetX=Y | oX=Y Ustawia offset dla czujnika. X: numer czujnika <1, 16>, Y: wartość offsetu <-32768, 32767>.
update_sensors | us Aktualizuje listę czujników – wykrywa i przypisuje podłączone czujniki.
set_offsets | so Automatycznie oblicza offsety dla wszystkich aktywnych czujników.
reset_sensors Resetuje przypisania ID czujników i ich offsety.
read_sensors | rs Wyświetla aktualne odczyty temperatury z czujników.
save_config | sc Zapisuje konfigurację do pamięci Flash. Należy użyć po zmianie adresu Modbus i offsetów.
read_registers | rr Odczytuje wartości rejestrów Modbus.
read_definitions | rd Odczytuje definicje rejestrów Modbus: nazwa, adres, typ.
bootloader Uruchamia urządzenie w trybie bootloadera w celu aktualizacji oprogramowania. Po podłączeniu do komputera urządzenie pojawi się jako dysk o nazwie RPI-RP2, na który należy skopiować plik firmware z rozszerzeniem uf2. Następnie urządzenie automatycznie zrestartuje się i uruchomi w trybie normalnej pracy.
restart Restartuje urządzenie.
verbose=X | v=X Włącza lub wyłącza tryb szczegółowy (verbose), który wyświetla więcej komunikatów.
help | ? Wyświetla pomoc z listą dostępnych poleceń.

Typowe przypadki użycia #

Poniżej przedstawiono praktyczne przykłady konfiguracji i obsługi tMDS-16 za pomocą konsoli. Scenariusze te obejmują najczęstsze zadania integracyjne i kalibracyjne.

🔧 1. Zmiana adresu Slave Modbus

Podczas używania wielu urządzeń Modbus na jednej magistrali, należy przypisać każdemu unikalny adres.

address=5

Następnie zapisz nową konfigurację:

save_config
🌡️ 2. Ręczna kalibracja odczytów z czujnika

Aby ręcznie dostosować odczyty poszczególnych czujników, użyj offsetów indywidualnych.

Przykład: ustawienie offsetu −0.5°C dla czujnika nr 3:

offset3=-0.5

Zapisz zmiany:

save_config
⚙️ 3. Automatyczna kalibracja wszystkich czujników

Aby wyrównać odczyty wszystkich podłączonych czujników DS18B20, użyj komendy:

set_offsets

Polecenie oblicza średnią temperaturę ze wszystkich aktywnych czujników i ustawia offsety, które dopasowują każdy czujnik do tej wartości. Pozwala to zniwelować drobne różnice fabryczne i zwiększa spójność pomiarów w różnych środowiskach.

🛈 Przed uruchomieniem tej komendy zaleca się umieszczenie wszystkich czujników w jednym miejscu, przy stabilnej temperaturze. Odczekaj chwilę, aż czujniki się wyrównają, a następnie wykonaj kalibrację.

Komenda automatycznie zapisuje wyliczone offsety do pamięci Flash.

🔍 4. Odczyt bieżących wartości z czujników

Aby wyświetlić odczyty temperatury w konsoli:

read_sensors
♻️ 5. Wykrywanie podłączonych czujników

Po podłączeniu nowych czujników lub wymianie starych, zaktualizuj listę:

update_sensors

Aby zresetować przypisania ID czujników i ich offsety:

reset_sensors
🧪 6. Podgląd rejestrów Modbus

Aby wyświetlić aktualne wartości rejestrów:

read_registers

Aby wyświetlić listę rejestrów z nazwami, typami i adresami:

read_definitions

Rejestry Modbus #

Poniżej przedstawiono listę rejestrów Modbus dostępnych w urządzeniu.
Lista odpowiada wynikowi komendy read_definitions i zawiera nazwy, adresy, typy i dzielniki.

| Name                           | Addr | Type   | Func         | Divisor |
| ------------------------------ | ---- | ------ | ------------ | ------- |
| uptime                         | 3000 | uint32 | 0x04 (IREG)  |         |
| ds1                            | 3002 | int32  | 0x04 (IREG)  |      10 |
| ds2                            | 3004 | int32  | 0x04 (IREG)  |      10 |
| ds3                            | 3006 | int32  | 0x04 (IREG)  |      10 |
| ds4                            | 3008 | int32  | 0x04 (IREG)  |      10 |
| ds5                            | 3010 | int32  | 0x04 (IREG)  |      10 |
| ds6                            | 3012 | int32  | 0x04 (IREG)  |      10 |
| ds7                            | 3014 | int32  | 0x04 (IREG)  |      10 |
| ds8                            | 3016 | int32  | 0x04 (IREG)  |      10 |
| ds9                            | 3018 | int32  | 0x04 (IREG)  |      10 |
| ds10                           | 3020 | int32  | 0x04 (IREG)  |      10 |
| ds11                           | 3022 | int32  | 0x04 (IREG)  |      10 |
| ds12                           | 3024 | int32  | 0x04 (IREG)  |      10 |
| ds13                           | 3026 | int32  | 0x04 (IREG)  |      10 |
| ds14                           | 3028 | int32  | 0x04 (IREG)  |      10 |
| ds15                           | 3030 | int32  | 0x04 (IREG)  |      10 |
| ds16                           | 3032 | int32  | 0x04 (IREG)  |      10 |
| ds1_readErrors                 | 3034 | uint32 | 0x04 (IREG)  |         |
| ds2_readErrors                 | 3036 | uint32 | 0x04 (IREG)  |         |
| ds3_readErrors                 | 3038 | uint32 | 0x04 (IREG)  |         |
| ds4_readErrors                 | 3040 | uint32 | 0x04 (IREG)  |         |
| ds5_readErrors                 | 3042 | uint32 | 0x04 (IREG)  |         |
| ds6_readErrors                 | 3044 | uint32 | 0x04 (IREG)  |         |
| ds7_readErrors                 | 3046 | uint32 | 0x04 (IREG)  |         |
| ds8_readErrors                 | 3048 | uint32 | 0x04 (IREG)  |         |
| ds9_readErrors                 | 3050 | uint32 | 0x04 (IREG)  |         |
| ds10_readErrors                | 3052 | uint32 | 0x04 (IREG)  |         |
| ds11_readErrors                | 3054 | uint32 | 0x04 (IREG)  |         |
| ds12_readErrors                | 3056 | uint32 | 0x04 (IREG)  |         |
| ds13_readErrors                | 3058 | uint32 | 0x04 (IREG)  |         |
| ds14_readErrors                | 3060 | uint32 | 0x04 (IREG)  |         |
| ds15_readErrors                | 3062 | uint32 | 0x04 (IREG)  |         |
| ds16_readErrors                | 3064 | uint32 | 0x04 (IREG)  |         |
| version_major                  | 3100 | uint16 | 0x04 (IREG)  |         |
| version_minor                  | 3101 | uint16 | 0x04 (IREG)  |         |
| version_patch                  | 3102 | uint16 | 0x04 (IREG)  |         |
| address                        | 4000 | uint16 | 0x03 (HREG)  |         |
| offset1                        | 4001 | int32  | 0x03 (HREG)  |      10 |
| offset2                        | 4003 | int32  | 0x03 (HREG)  |      10 |
| offset3                        | 4005 | int32  | 0x03 (HREG)  |      10 |
| offset4                        | 4007 | int32  | 0x03 (HREG)  |      10 |
| offset5                        | 4009 | int32  | 0x03 (HREG)  |      10 |
| offset6                        | 4011 | int32  | 0x03 (HREG)  |      10 |
| offset7                        | 4013 | int32  | 0x03 (HREG)  |      10 |
| offset8                        | 4015 | int32  | 0x03 (HREG)  |      10 |
| offset9                        | 4017 | int32  | 0x03 (HREG)  |      10 |
| offset10                       | 4019 | int32  | 0x03 (HREG)  |      10 |
| offset11                       | 4021 | int32  | 0x03 (HREG)  |      10 |
| offset12                       | 4023 | int32  | 0x03 (HREG)  |      10 |
| offset13                       | 4025 | int32  | 0x03 (HREG)  |      10 |
| offset14                       | 4027 | int32  | 0x03 (HREG)  |      10 |
| offset15                       | 4029 | int32  | 0x03 (HREG)  |      10 |
| offset16                       | 4031 | int32  | 0x03 (HREG)  |      10 |