tMDS-16 - Miernik temperatury z interfejsem Modbus

tMDS-16 to moduł pomiaru temperatury z interfejsem Modbus RTU. Wyposażony jest w dwie niezależne magistrale 1-Wire, z których każda może obsłużyć do 8 czujników temperatury DS18B20, co daje łącznie możliwość podłączenia do 16 czujników.

Dane pomiarowe są udostępniane za pośrednictwem rejestrów Modbus, które zawierają zarówno bieżące odczyty z czujników, jak i odpowiadające im wartości offsetów używane do kalibracji. Kalibracja zapewnia dokładne i spójne pomiary dla wszystkich podłączonych czujników.

tMDS-16 jest przeznaczony przede wszystkim do pracy jako moduł rozszerzeń dla urządzeń LK4 lub LK3.5+ (również kompatybilny z LK3.9), umożliwiając skalowalny i rozproszony pomiar temperatury.
Dostępny jest gotowy plik konfiguracyjny dla tych urządzeń, pozwalający na szybkie i bezproblemowe uruchomienie.

Domyślnie urządzenie używa adresu Modbus Slave ID 1, który można zmienić za pomocą konsoli szeregowej na USB.

Podstawowe funkcje

Specyfikacja techniczna

Parametr Wartość
Zasilanie 5 - 12 V DC (złącze)
5 V (USB)
Obsługa czujników Do 2 × 8 czujników DS18B20
Interfejsy 1-Wire: 2 magistrale przez RJ12 i 3-pozycyjną listwę zaciskową,
Modbus RTU (RS485),
Serial (przez USB; 115200 baud)
Wymiary 74 × 40 × 28 mm (bez uchwytu DIN)
Waga 44 g

Integracja z LK

Moduł tMDS-16 bezproblemowo integruje się z urządzeniami LK4 i LK3.5+. Można go zasilać bezpośrednio z kontrolera LK za pomocą wyjść 5 V i GND. Następnie należy go podłączyć – samodzielnie lub razem z innymi urządzeniami Modbus – do zacisków Modbus A+ i B− kontrolera LK, aby nawiązać komunikację.

Po podłączeniu skonfiguruj niestandardowy moduł Modbus w LK, korzystając z gotowego presetu konfiguracyjnego dostępnego w sekcji Do pobrania. Preset można łatwo zmodyfikować tak, aby odczytywać tylko potrzebne parametry, np. wybrane czujniki temperatury lub offsety kalibracyjne.

Aktualizacja firmware

Aby zaktualizować firmware, urządzenie musi zostać uruchomione w trybie bootloadera. W tym trybie po podłączeniu do komputera pojawi się jako urządzenie pamięci masowej o nazwie RPI-RP2. Wystarczy skopiować plik nowego firmware na ten nośnik. Po przesłaniu, urządzenie automatycznie uruchomi się ponownie i wznowi normalną pracę z nowym firmware.

Włączanie trybu bootloadera

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

Pliki firmware są dostępne w sekcji Do pobrania.

Podstawowa konfiguracja przyciskiem funkcyjnym

Przycisk funkcyjny na tMDS-16 umożliwia wygodne wykonywanie podstawowych czynności konfiguracyjnych bez konieczności podłączania urządzenia do komputera.

Przycisk znajduje się przy krawędzi płytki przeciwnej do strony, na której znajdują się port USB oraz złącza Modbus i zasilania.
Dioda LED obok przycisku wskazuje, która funkcja zostanie wykonana, w zależności od czasu przytrzymania przycisku.

Jak to działa

Po przytrzymaniu przycisku dioda LED zacznie migać, sygnalizując wybraną akcję:

Czas przytrzymania Sygnalizacja LED Wykonana akcja
< 2 sekundy 1 krótkie mignięcie krótko po naciśnięciu update_sensors – wykrywa i przypisuje podłączone czujniki
2 - 5 sekund 2 mignięcia po 2 sekundach set_offsets – automatycznie kalibruje wszystkie czujniki (offsety zapisywane automatycznie)
5 - 10 sekund 3 mignięcia po 5 sekundach reset_sensors – usuwa wszystkie przypisania czujników i offsetów
> 10 sekund Brak akcji anulowanie (przycisk przytrzymany zbyt długo)

Aby wykonać daną funkcję, należy zwolnić przycisk natychmiast po pojawieniu się odpowiedniej sekwencji błysków.
Jeśli przycisk zostanie przytrzymany zbyt długo (>10 s), nie zostanie podjęta żadna akcja.

ℹ️ Aby przeprowadzić bardziej zaawansowaną konfigurację i diagnostykę, użyj konsoli USB, jak opisano w następnej sekcji.

Zaawansowana konfiguracja

Aby zmienić ustawienia, należy podłączyć tMDS-16 do komputera przez USB. Urządzenie może być zasilane przez USB, więc dodatkowe zasilanie nie jest wymagane.

Wymagane oprogramowanie

Do nawiązania połączenia z urządzeniem potrzebny jest program obsługujący komunikację szeregową. Popularne narzędzia 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ć następująco:

    COM1
    COM3
    COM15
    COM16
    COM17
  2. Podłącz urządzenie
    Podłącz tMDS-16 i uruchom polecenie ponownie. Nowy port COM (np. COM11) będzie odpowiadał podłączonemu urządzeniu.

  3. Połącz się 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 nawiązaniu połączenia możesz wysyłać polecenia do urządzenia. Każde polecenie należy zakończyć klawiszem Enter. Przydatnym poleceniem jest ? lub help, które wyświetla listę dostępnych poleceń (opisanych poniżej).

Lista poleceń

Polecenie Opis
address? | a? Odczytuje adres Modbus (Slave ID).
address=X | a=X Ustawia adres Modbus. Parametry: X – adres do ustawienia, liczba <1, 255>.
offsetX? | oX? Odczytuje wartość offsetu dla DSX. Parametry: X – numer czujnika <1, 16>.
offsetX=Y | oX=Y Ustawia wartość offsetu. Parametry: X – numer czujnika <1, 16>; Y – wartość offsetu, liczba <-3_276.8, 3_276.7>.
idX? | iX? Odczytuje identyfikator czujnika DSX. Parametry: X – numer czujnika <1, 16>.
idX=Y | iX=Y Ustawia identyfikator czujnika. Parametry: X – numer czujnika <1, 16>; Y – identyfikator w formacie AA:AA:AA:AA:AA:AA:AA:AA.
update_sensors | us Aktualizuje listę czujników – wykrywa i przypisuje czujniki.
set_offsets | so Automatycznie oblicza offsety dla wszystkich aktywnych czujników.
reset_sensors Resetuje identyfikatory czujników oraz ich offsety.
read_sensors | rs Odczytuje aktualne wartości z czujników.
save_config | sc Zapisuje konfigurację do pamięci Flash. Należy użyć po zmianie adresu Modbus lub 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 firmware. Po podłączeniu do komputera pojawi się jako urządzenie pamięci masowej o nazwie RPI-RP2, do którego należy skopiować plik firmware z rozszerzeniem uf2. Następnie urządzenie uruchomi się ponownie w trybie normalnej pracy.
restart Uruchamia ponownie 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 komunikat pomocy z listą dostępnych poleceń.

Typowe przypadki użycia

Poniżej znajdują się praktyczne przykłady konfiguracji i użytkowania tMDS-16 za pośrednictwem konsoli.

Zmiana adresu Modbus

Jeżeli na jednej magistrali pracuje kilka urządzeń Modbus, każde z nich musi mieć unikalny adres.

Przykład:

address=5
save_config

Ustawia adres urządzenia na 5 i zapisuje konfigurację w pamięci Flash.

Ręczna kalibracja czujnika

Jeżeli czujnik wykazuje stały błąd względem wzorcowego termometru, można skorygować odczyt poleceniem offsetX=Y.

Przykład:

offset3=-0.5
save_config

Powoduje korektę −0.5 °C dla czujnika DS3.

Automatyczna kalibracja wszystkich czujników

Jeżeli wszystkie czujniki znajdują się w tym samym środowisku o znanej temperaturze, można automatycznie wyliczyć offsety:

set_offsets

Urządzenie zmierzy aktualne temperatury i obliczy offsety tak, aby wszystkie czujniki wskazywały tę samą wartość.

Polecenie automatycznie zapisuje wyliczone offsety w pamięci Flash.

Odczyt temperatur

Aby wyświetlić aktualne odczyty z czujników:

read_sensors
Wykrywanie czujników

Jeśli czujniki zostały dodane lub usunięte, można odświeżyć listę:

update_sensors

Aby całkowicie wyczyścić zapisane identyfikatory i offsety czujników:

reset_sensors
Sprawdzanie rejestrów Modbus

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

read_definitions
read_registers

Polecenia te są przydatne przy diagnostyce lub podczas integracji z oprogramowaniem Modbus.

Rejestry Modbus

Poniżej znajduje się lista rejestrów Modbus dostępnych w urządzeniu.
Zawartość odpowiada wynikowi polecenia read_definitions i zawiera nazwy rejestrów, adresy, typy oraz 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 |