Modbus w HA - brak komunikacji

Witajcie, zaczynam swoją zabawę z protokołem modbus niestety napotkałem na problem z którym walczę od tygodnia stąd ten post. Posiadam następującą konfigurację:

  • Listwa Eletechsup ETD8A12 ip. 192.168.8.45
  • Konwerter Waveshare RS485 to ETH (B) ip. 192.168.8.43
  • HA postawione na Proxmox

Mimo najróżniejszej konfiguracji nie mogę połączyć się z listwą.
Co może być nie tak? Zaznaczam, to mój początek z Modbus.

homeassistant:

modbus:
  - name: modbus_hub
    type: rtuovertcp
    host: 192.168.8.43
    port: 5000

    delay: 0
    message_wait_milliseconds: 30
    timeout: 5
    
    
switch:
  - platform: modbus
    registers:
      - name: "qwe1" 
        hub: hubrelay
        slave: 1
        register: 1
        command_on: 256
        command_off: 512
        state_on: 1
        state_off: 0
      - name: "qwe2" 
        hub: hubrelay
        slave: 1
        register: 2
        command_on: 256
        command_off: 512
        state_on: 1
        state_off: 0
      - name: "qwe3" 
        hub: hubrelay
        slave: 1
        register: 3
        command_on: 256
        command_off: 512
        state_on: 1
        state_off: 0
      - name: "qwe4" 
        hub: hubrelay
        slave: 1
        register: 4
        command_on: 256
        command_off: 512
        state_on: 1
        state_off: 0
      - name: "qwe5"
        hub: hubrelay
        slave: 1
        register: 5
        command_on: 256
        command_off: 512
        state_on: 1
        state_off: 0
      - name: "qwe6"
        hub: hubrelay
        slave: 1
        register: 6
        command_on: 256
        command_off: 512
        state_on: 1
        state_off: 0
      - name: "qwe7"
        hub: hubrelay
        slave: 1
        register: 7
        command_on: 256
        command_off: 512
        state_on: 1
        state_off: 0
      - name: "qwe8"
        hub: hubrelay
        slave: 1
        register: 8
        command_on: 256
        command_off: 512
        state_on: 1
        state_off: 0 
      - name: "qwe9"
        hub: hubrelay
        slave: 1
        register: 9
        command_on: 256
        command_off: 512
        state_on: 1
        state_off: 0
      - name: "qwe10"
        hub: hubrelay
        slave: 1
        register: 10
        command_on: 256
        command_off: 512
        state_on: 1
        state_off: 0
      - name: "qwe11"
        hub: hubrelay
        slave: 1
        register: 11
        command_on: 256
        command_off: 512
        state_on: 1
        state_off: 0
      - name: "qwe12"
        hub: hubrelay
        slave: 1
        register: 12
        command_on: 256
        command_off: 512
        state_on: 1
        state_off: 0
    sensors:
      - name: "Zalacz_1"
        scan_interval: 2
        slave: 1
        address: 128
        input_type: holding
        scale: 1
        offset: 0
        precision: 0
      - name: "Zalacz_2"
        scan_interval: 2
        slave: 1
        address: 129
        input_type: holding
        scale: 1
        offset: 0
        precision: 0
      - name: "Zalacz_3"
        scan_interval: 2
        slave: 1
        address: 130
        input_type: holding
        scale: 1
        offset: 0
        precision: 0
      - name: "Zalacz_4"
        scan_interval: 2
        slave: 1
        address: 131
        input_type: holding
        scale: 1
        offset: 0
        precision: 0
      - name: "Zalacz_5"
        scan_interval: 2
        slave: 1
        address: 132
        input_type: holding
        scale: 1
        offset: 0
        precision: 0
      - name: "Zalacz_6"
        scan_interval: 2
        slave: 1
        address: 133
        input_type: holding
        scale: 1
        offset: 0
        precision: 0
      - name: "Zalacz_7"
        scan_interval: 2
        slave: 1
        address: 134
        input_type: holding
        scale: 1
        offset: 0
        precision: 0
      - name: "Zalacz_8"
        scan_interval: 2
        slave: 1
        address: 135
        input_type: holding
        scale: 1
        offset: 0
        precision: 0
      - name: "Zalacz_9"
        scan_interval: 2
        slave: 1
        address: 136
        input_type: holding
        scale: 1
        offset: 0
        precision: 0
      - name: "Zalacz_10"
        scan_interval: 2
        slave: 1
        address: 137
        input_type: holding
        scale: 1
        offset: 0
        precision: 0
      - name: "Zalacz_11"
        scan_interval: 2
        slave: 1
        address: 138
        input_type: holding
        scale: 1
        offset: 0
        precision: 0
      - name: "Zalacz_12"
        scan_interval: 2
        slave: 1
        address: 139
        input_type: holding
        scale: 1
        offset: 0
        precision: 0
![waveshare RS485toETH|689x365](upload://nbWQ7GfxkXs9uMRkQ1vjo9hxD26.png)

już poprawione, literówka przy pisaniu postu.

Do pełni szczęścia kogoś kto będzie próbował pomóc potrzebna dokumentacja listwy (działające linki bez logowania lub załącznik .zip zawierający wszystko co istotne) oraz informacja po co ten konwerter Waveshare.

Dokumentacja w załączniku.
Konwerter zastosowałem z uwagi na to, że w przyszłości zapewne będzie więcej urządzeń z RS485 dlatego staram się zrozumieć zasadę działania tego protokołu i współpracę z HA.

Posiadam również konwerter na USB jak w linku poniżej jednak chciałbym by to ten na ETH działał, i go docelowo chcę stosować.

ETD8A12 Manual.zip (4,8 MB)

I od tego należy zacząć przygodę a nie ją sobie od razu utrudniać dodatkowym konwerterem :wink: jak wszystko będzie działać na konwerterze USB Modbus możesz potem zamienić urządzenie USB na bramkę Modbus, to w sumie tylko kosmetyczna “zmiana”. Możesz zacząć od połączenia plytki z komputerem z Windows jak niżej używając oprogramowania QModMaster download | SourceForge.net.

Dziękuję za odpowiedź, dziś podziałam na tym sofcie w połączeniu z konwerterem na USB. Nadal jednak kwestia YAML w HA. Czy są tam jakieś rażące błędy dotyczące wysyłania sygnału załączenia i odczytu stanu?

Nie wnikałem w szczegóły bo wg mnie nawet nie wiesz czy użyte rejestry i komendy Modbus są poprawne dla tej płytki.

Rozumiem, dziś wieczorem znów do tego usiądę i skorzystam z oprogramowania które poleciłeś. Wrócę z informacjami lub pytaniami. Dziękuję za wyrozumiałość oraz pomoc w zrozumieniu tego protokołu.

1 Like

Przetestowałem dziś QModMaster. Zgodnie z instrukcją listwy wykorzystałem rejestry 03 Odczyt, 06 Zapis, 16 Zapis wielu rejestrów.

  1. Odczyt przebiega prawidłowo
  2. Zapis pojedynczego rejestru zwraca błąd
  3. Zapis wielu rejestrów nie zwraca błędów ale nie zmienia nic na listwie

Wszystkie możliwości zarejestrowane na zrzutach ekranów. Nie ukrywam, nie mam pomysłu co jest nie tak.

Przy załaczonych 2 cewkach wysyłam za pośrednictwem rejestru 16 polecenie otwarcia wszystkich. Zwrotnie dostaje informację o ich otwarciu oraz, że zostały zapisane prawidłowo jednak na listwie nadal są one załączone.

[RTU]>Tx > 22:19:07:774 - 01  10  00  00  00  0C  18  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  92  DF  
[RTU]>Rx > 22:19:07:849 - 01  10  00  00  00  0C  C0  0C  
Sys > 22:19:07:849 - values written correctly.

Ogólny obraz sytuacji jest taki, że mogę dane odczytywać jednak nie mogę ich zapisywać (nie mogę zdalnie uruchomić cewek).



I teraz rozumiesz dlaczego nie było sensu analizować integracji HA przez bramkę Modbus TCP skoro to nie działa na prostym połaczeniu komputer - moduł. Spróbuję sprawdzić dokumentację producenta i dam znać.

Miałeś okazję zweryfikować dokumentację. Ja nadal pozostaje w kropce. Dziś znów będę nad tym siedział jednak do tej pory nie znalazłem rozwiązania.

Nie rób zapisu wielu rejestrów, tylko skorzystaj z komendy charakterystycznej dla tego sterownika umożliwiającej w jednej komendzie zapisać wszystkie rejestry przekaźników naraz (ustawiając wartość binarną).

Jeśli skonfigurujesz w module najwyższą możliwą prędkość, to jest szansa, że nie będziesz miał problemów z timeoutami (gdy próbujesz wysłać naraz za wiele komend)

Problem w tym, że zapis wielu rejestrów (kod funkcji 0x10) nie zmienia nic na listwie (mimo, że jak widać RX zwraca prawidłową wartość) ale nie zwraca błędów. Zapis jednego rejestru (kod funkcji 0x06) zwraca błąd pokazany na wcześniejszym zrzucie ekranu.

Po dłuższej przerwie znów usiadłem do modbus i rozwiązałem temat komunikacji za pomocą USB do RS485. Listwa odpowiada prawidłowo, wszystko działa jak powinno.

Wraca temat RS485 do ETH.

Listwa wymaga formatu HEX.
Mogę wysłać komendy (w formacie HEX) zmiany stanu cewek na które listwa reaguje prawidłowo, nie ma możliwości jednak odczytu stanu. Wszystko wskazuje na to, że konwerter RS->ETH posługuje się formatem DEC. Na zdjęciach wysłana komenda i raport powrotny.

Mogę to jakoś rozwiązać?

Różnica pomiędzy HEX a DEC jest tylko w sposobie prezentacji, po drucie leci ten sam ciąg bitów.
Niewłaściwie używasz trybów modbusRTU, modbusTCP. Tyle można wnioskować z zamieszczonych informacji.
Wszystko zależy jaki rodzaj protokołu ustawiony jest w konwerterze.

Wszystkie ustawienia konwertera przedstawione na zdjęciu poniżej.

Jakiego protokołu używasz do komunikacji?
Pytam o modbus master.
Przy takim ustawieniu konwertera powinien być modbusTCP, albo zmień w konwertrze na RAW lub Serial- nie wiem co tam masz.

ustawienia tcp QModMaster:
1

ustawienia LAN listwy:

ustawienia SERIAL PORT listwy:

gdy mam ją podłączoną po RS-USB listwa nalicza impulsy TX i RX, gdy jest podłączona za pośrednoctwem RS-ETH liczniki wskazują zero mimo, że manipuluje cewkami.

Zupełnie nie rozumiem koncepcji tej listwy.
To można się z nią połączyć dwojako- przez RS485 lub przez lan?
Jeśli próbujesz przez konwerte i później przez RS to powinien on być jako TCP serwer. Wcześnij to przeoczyłem.
Najlepiej gdybyś narysował swoje klocki w torze komunikacji. W układzie w który dziala i w tym co nie działa.
Ze szczątkowej instrukcji wynika, że można się z listwą połaczyć bezpośrednio po LAN - na adresie 8.45
Oprogramowanie modbus master łączy się DO serwera. Więc listwa lub konwerter musi być serwerem.

Poniżej mapa połączeń w obu sytuacjach. Po LAN łączę się z listwą tylko w sytuacji gdy chce zmienić jej ustawienia. Ta platforma testowa ma działać po RS485 właśnie.

Z góry przepraszam za to zamieszanie bo odbiegliśmy od tematu dosyć daleko lecz zależy mi by docelowo działało to za pośrednictwem konwertera ETH jednak rozważam opcję wykorzystania jednak tego na USB, działa i generuje mniejszą ilość problemów.

W wolnej chwili usiądę do zmian w configuration.yaml by wykorzystać RS485-USB. wczoraj dodałem wpis z jego konfiguracją, uruchomiłem ponownie HA jednak nie pojawiła się żadna zmiana, zapewne mam błąd w samej konfiguracji, musze to ponownie sprawdzić.