HA przycisk zamiast przełącznika w komunikacji po modbus do Wago PLC

Szukam i nie mogę znaleźć czy jest gotowe rozwiązanie czy jedynie droga dookoła aby to wykonać.
Mam w domu sterownik WAGO 750-881, na który napisałem program do sterowania większością automatyki w domu, lecz ma on dość wolną wizualizację, z której się ciężko korzysta, więc chce przenieść część wizualizacyjną do HA, lecz mój program jest napisany tak aby wszystkie wejścia rozpoznawał po R/F-TRIG, a więc po zboczu narastania bądź opadania stanu wejściowego. W HA znalazłem jedynie przyciski zmieniające stan 0 lub 1, można by zrobić to jako switch + automatyzację co zmieni jego stan z 1 na 0 po 1s.
Jak po modbus z HA wysyłać najlepiej jedynie krótką “1” ?

Ktoś wie z jaką częstotliwością można odpytywać WAGO po modbus TCP/IP, aby prezentacja stanów pracowała płynnie i nie powodowała problemów z komunikacją ? (Mam ok 300 rejestrów do odpytywania, większość to stany 0/1, a część to jakieś wartości jak np. położenie rolety itd.)

PS: Czy ktoś wie gdzie można znaleźć przykłady implementacji do HA, najlepiej wraz z prezentacja działania. Na oficjalnej stronie jest instrukcja jak i co, lecz często jest tak, że spędzam kilka godzin aby to stworzyć, a finalnie i tak działa inaczej niż chciałem.

Można skorzystać z Modbus i z takich “pojęć” jak:

  • Discrete Inputs (DI) – zmienne bitowe wejściowe – możliwy tylko odczyt – 1 bit długości
  • Input Registers (IR) – rejestry wejściowy – możliwy tylko odczyt – 16 bitów długości
  • Coils (C) – zmienne bitowe – możliwy odczyt i zapis – 1 bit długości
  • Holding Registers (HR) – rejestry – możliwy odczyt i zapis – 16 bitów długości

Poniżej przykład wejścia (binary_sensors) i wyjścia (switches, light) odczytywanego przez Modbus:

# Example configuration.yaml entry for a serial connection
modbus:
  - name: hub1
    type: serial
    baudrate: 9600
    bytesize: 8
    method: rtu
    parity: N
    port: /dev/ttyUSB0
    stopbits: 2
    binary_sensors:
      - name: "MR-DIO-1 in1"
        address: 4000
        input_type: discrete_input
        device_class: door
        scan_interval: 1
        slave: 70
      - name: "MR-DIO-1 in2"
        address: 4001
        input_type: discrete_input
        device_class: door
        scan_interval: 1
        slave: 70
      - name: "MR-DIO-1 in3"
        address: 4002
        input_type: discrete_input
        device_class: door
        scan_interval: 1
        slave: 70
      - name: "MR-DIO-1 out4"
        address: 2003
        scan_interval: 1
        slave: 70
      - name: "MR-DIO-1 out5"
        address: 2004
        scan_interval: 1
        slave: 70
      - name: "MR-DIO-1 out6"
        address: 2005
        scan_interval: 1
        slave: 70
    switches:
      - name: "MR-DIO-1 out4"
        address: 2003
        write_type: coil
        scan_interval: 1
        slave: 70
        command_on: 1
        command_off: 0
        verify:
            input_type: coil 
    lights:  
      - name: "MR-DIO-1 out5"
        address: 2004
        write_type: coil
        scan_interval: 1
        slave: 70
      - name: "MR-DIO-1 out6"
        address: 2005
        write_type: coil
        scan_interval: 1
        slave: 70
        command_on: 1
        command_off: 0

1 Like

Z tego wynika: Modbus - Home Assistant
Że platforma light korzysta z komend ON / OFF podawanych na stałe, a ja mam np. krótką “1” jako ON, kolejna krótka 1 jako OFF. Z roletami podobnie krótka “1” jako praca (góra czy dół), druga krótka “1” jako stop.
Switch, ma tak samo Modbus - Home Assistant komenda ON / OFF.
W moim przypadku jeden przycisk jest jako on i off w zależności od aktualnego stanu urządzenia.

To nie do konca tak działa: w HA działa zgodnie z funkcjami Modbus, w którym są dostępne następujące kody:

#01 – odczyt wyjść bitowych (Coils)
#02 – odczyt wejść bitowych (Discrete Inputs)
#03 – odczyt n rejestrów (Holding Registers)
#04 – odczyt n rejestrów wejściowych (Input Registers)
#05 – zapis 1 bitu (Coil)
#06 – zapis 1 rejestru (Holding Register)
#07 – odczyt statusu
#08 – test diagnostyczny
#0F – zapis n bitów (Coils)
#10 – zapis n rejestrów (Holding Registers)
#11 – identyfikacja urządzenia slave
#80 – #FF – zarezerwowane na odpowiedzi błędne

Wyjście Modbus ma swój określony rejestr, w przypadku powyżej to jest coil (jeden bit - 0 albo1) o np. adresie 2005 (light name: “MR-DIO-1 out6”), aby włączyć wyjście wysyłane jest polecenie #05 (zapis 1 bitu (coil)) przez HA poprzez wywołanie “pod spodem usługi” modbus.write_coil:

Poczytaj jak działa komunikacja Modbus i wszystko będzie jasne, HA tylko wywołuje odpowiednie kody funkcji na odpowiednich rejestrach.
Jeżeli źle skonfigurujesz w HA light np. podasz, że jest to coils (bajt) a powinno być coil (bit) (bo tak jest w specyfikacji urządzenia) to dojdzie do wysłania poprawnych funkcji do niepoprawnych rejestrów i nie będzie działać.

1 Like

Tak, tylko on tą “1” wysyła i trzyma aż nie zmienisz stanu na 0, a ja potrzebuje wysłać 1 i zaraz zmienić to na 0.
Czy “zerowanie” muszę wykonać po stronie PLC wtedy ?

Nie, HA tylko wysyła komendą “1” a to sterownik PLC trzyma w rejestrze tę wartość, tę wartość może zmienić program w sterowniku PLC, np. na podstawie przycisku podłaczonego do wejscia tego sterownika - Ty to robisz na podstawie zbocza - zbocze ustawia wyjście, kolejne zbocze zeruje wyjście, prawda?
HA zgodnie z parametrem scan_interval w konfiguracji Modbus również odczytuje stan tego wyjścia ze sterownika PLC więc statusy wejść/wyjść są synchronizowane.

Masz rację, problem tylko, że ja ten zmiennej nigdzie nie zeruje… w wago jest opcja toggle lub tap i wszystkie mam jako tap, a więc same się zerują po puszczeniu przycisku. Muszę w takim razie zmienić to w programie w WAGO.

Wg mnie nie musisz, zacznij testy z Modbus, nie wiem czy Twoje Wago ma już interface Modbus - RS485 dla Modbus RTU albo ethernet dla Modbus TCP.

Tego na razie nie wiem, na RPi3+ czasami w logach pojawiaja sie ostrzeżenia typu:

Często określa się komunikację Modbus jako “no real time”, coś w tym prawdy może jest :wink:.

WAGO ma modbus tcp, wystawia IO fizyczne na modbus i da się je czytać bez problemu (pisać do nich też chociaż to trochę niebezpieczne bo da się nadpisać program nawet). A jak chcesz inne zmienne to przy deklaracji musisz przypisać im rejestr.

Tak, wszystko jest zawsze w dokumentacji Modbus, jaki jest adres rejestru, jaką funkcją go odczytać lub zapisać itd., np. dokumentacja MR-DIO-1 moduł wejść/wyjść z wyjściem MODBUS RTU.

image

Do testowania komunikacji Modbus polecam program QModMaster.

Jest tak jak myślałem, zrobiłem test i muszę w PLC zerować zmienne. Jak w HA przełączy to trzyma “1”, a więc muszę po wykryciu “1” zmieniać stan na “0”.
W wago masz różne możliwości jeżeli chodzi o modbusa.
writing
reading
Do rejestrów 4096 … 12287 i 12288 … 24575 masz możliwość programowania swoich zmiennych (deklarowania ich w programie) np:
test AT %MX0.0 : BOOL; > dostępny jest na rejestrze 12288 jako R/W.

Natomiast do zmiennych 0 … 255 masz dostęp, są to 1:1 wystawione wejścia fizyczne sterownika
To samo 512…767 tyczy się wyjść.

Zmienna wyzerowana np. modbus pool, zmienia stan w HA po kilku sekundach również na “0” także stan czyta poprawnie.

Chyba to zrobię wykorzystując obecne zmienne do sterowania z wizualizacji w wago, a na “feedback” zadeklaruje nowe zmienne, które przypisane zostaną do fizycznych wyjść, a jeżeli staną się “1” wyzerują stan zmiennej wejściowej.
Chociaż wolałbym aby switch w HA wysyłał, krótką “1” i zmieniał w “0” wtedy jako potwierdzenie mógłbym użyć wartości wyjścia np. załączenie światła wysłałoby “1”->“0”, a potwierdzenie załączenia = fizyczne wyjście ze sterownika, a program w WAGO mógłby pozostać bez zmian (tam już niestety prawie nie mam miejsca).

Jak testowo bawiłem się symulatorem PLC to przyjąłem trochę inną logikę:

  • wykrycie zbocza na wejściu (przycisk dzwonkowy) powoduje toogle dodatkowego znacznika w systemie
  • stan znacznika jest przepisywany na wyjście sterownika.

Taka logika powoduje, że bez problemu można dodatkować sterować znacznikiem np. przez Modbus.

O tym decyduje, jak pisałem wcześniej, parametr scan_interval (default: 10s) w konfiguracji HA.

@dar3k w jakim języku programujesz ten sterownik? Dokładnie jakie przekaźniki stosujesz na wyjściach?

U mnie też wejście powoduje zmianę stanu dodatkowej zmiennej, która “podtrzymuje stan wyjścia”.

Język ST.
Przekaźniki monostabilne (podane 24V = załączony).

A konkretnie jaki model bo na rynku jest tego sporo a opinii mało.

Ojj różne, głównie mam takie jakie zdobyłem za darmo np. z demontażu przy modernizacjach z jakiś obiektów itd.
Więc część mam WAGO 788-312, część phoenixa 2961105 - one na 230VAC jak mają zwierać to lubią się kleić więc korzystam z nich do zwierania sygnałów jak np otwarcie bramy czy coś, jeszcze jakieś findera - generalnie co było to mam, większych problemów nie ma jedynie te phoenixa cienkie co się kleiły - ale te interfejsówki mają to do siebie.

A to Ty chyba elektryk/automatyk jesteś więc PLC Ci nie obce :grin:

Tak, dlatego na PLC zrobiłem dom, a nie na jakimś gotowym rozwiązaniu, bo wszystkie sprzęty miałem za darmo z demontaży (a te sterowniki PLC WAGO potrafią działać niezawodnie i po 20 lat z mojego doświadczenia) teraz walczę z HA bo nie mam miejsca już w sterowniku, a wizualizacja na wago działa wolno, stąd lepiej to robić na zewnątrz. Z HA pracuję od ok tygodnia, i musze się nauczyć go bo dużo rzeczy trzeba niestety robić trochę w koło jak to w programowaniu, a często część da się zrobić prościej tylko nie wie się jak…

Nic tylko pozazdrościć :slight_smile:.

Pytaj śmiało na forum, niektóre rzeczy naprawdę robi się prosto w HA.

Jednak nie jest tak pięknie jakbym chciał…
Wymyśliłem, że będę zerował wejście w WAGO jak już wykona swoje zadanie przez prosty warunek

IF ZMIENNA THEN 
ZMIENNA:=0; 
END_IF

A w HA wezmę stan wyjścia jako potwierdzenie to muszę czytać jako discrete_input

    - name: "wago test " 
      scan_interval: 1
      slave: 10
      address: 12288
      command_on: 1
      command_off: 0
      verify:
        address: 512
        input_type: discrete_input

Co niestety nie działa. Jest jakiś prosty sposób aby to zrobić ? Czy muszę po stronie WAGO wyjścia wpisać do zmiennych logicznych ? np do tej samej ale na bicie 2 ?

Wychodzi na to, że HA ma bug i dlatego verify do discrete_input nie działa.

To jest “jakiś” tam wycinek z “czegoś” tam i tylko Ty wiesz (i nikt inny) co to jest za encja.

Mało prawdopododne bo “u mnie działa” - wejścia i wyjścia (mogą być zdefiniowane jako switch lub light) sterowane po Modbus: