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

Tak ? a działa switch co wysyła “on” na holding a weryfikuje z discrete_input ?
Czyli wysyłasz na %MW(X)0(.0), a czytasz (weryfikujesz stan) z %QW(X)0? Jak w przykładzie ?

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

W CodeSys wygląda to tak:
W deklaracji

HA_INPUT1 AT %MX0.0 : BOOL;

W programie:

OUT1 := HA_INPUT1;

I konfiguracja IN/OUT sterownika
image

To ciekawe bo jak tylko doda się verify do discrete_input to u mnie HA zwraca błąd i wpisuje do logów:

ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/components/modbus/base_platform.py", line 316, in async_update
value = int(result.registers[0])
AttributeError: 'ReadDiscreteInputsResponse' object has no attribute 'registers'

Pokaż proszę konfigurację, jak weryfikujesz stan switcha z realnego stanu wyjścia w WAGO, skoro Tobie działa, a mi nie…

Cześć, a myślałeś może o komunikacji poprzez serwer OPC lub z brokerem MQTT? Jest jeszcze możliwość poprzez zwykłe UDP, polecam kanał Kurta Brauna z WAGO. Naprawdę dużo wiedzy przekazuje. Osobiście używam w domu PFC100 i komunikacja u mnie działa po MQTT ale na razie tylko w jedna stronę (publikacja). Planuje rozgryźć temat serwera OPC u siebie.

Nie, mam dość rozbudowany program w wago i na ten moment mam 16KB miejsca w sterowniku więc mogę czasem nie zmieścić bibliotek od MQTT, a modbus jest w sterowniku domyślnie, dlatego chcę go używać, ale nie wszystko działa tak jakby się chciało np. weryfikacja stanu switcha na realnym wyjściu.

Edit:

Od wersji 2022.3, błąd weryfikacji stanu z rejestrów discrete_input został naprawiony, także już wszystko działa.

Hej,
mam to samo rozwiązanie w domu. Wszystkie przełączniki dzwonkowe, próbuję to zintegrtować z wago, w HA mam tak zdefiniowany switch:

  switches:
    - name: "TEST_IN_OUT"
      address: 32768
      scan_interval: 1
      write_type: coil
      command_on: 1
      command_off: 0
      verify:
          input_type: discrete_input
          address: 1
          state_on: 1
          state_off: 0

na adresie 1 modbus OUTPUIT jest zmapowany stan ze zmiennej odpowiadajacej za odpalenie swiatla, natomiast na rejestrze 32768 jest zmienna Input, ktora ma byc tym “tooglem”.
Po nacisnieciu przycisku w Home Assistant załącza sie swiatlo, ale juz nie da sie go wylaczyc, pomimo, ze zmienna Input w wago jest wyzerowana.

Jakies pomysly, Porady? Bardzo duzo ludzi pyta o te rozwiazania modbus z HA ale malo wiedzy w sieci wlasciwie, widze ze kazdy do tego po trupach dochodzi sam :slight_smile:

O ile dobrze zrozumiałem?

…to naturalnym powinno być

      command_on: 1
      command_off: 1

trzeba tylko sprawdzić czy rejestr po wykonaniu toggle sam wraca na “0” czy trzeba go z integracji wyzerować.

Ja to robię tak:

      - name: "Nazwa"
        scan_interval: 1
        slave: 1
        address: 12288
        command_on: 1
        command_off: 1
        verify:
          address: 512
          input_type: discrete_input 

A w wago deklaracja:

	VIS_IN1 AT %MX0.0 : BOOL;

W programie na końcu ją zeruje:

IF VIS_IN1 THEN
VIS_IN1 := 0;
END_IF

Czyli z HA zawsze wystawiam “1”, a w PLC jak się ta jedynka wykona to ją zeruje, a stan do HA wraca odczytany z fizycznego wyjścia, wszystko działa jak należy :wink:

1 polubienie

Po kolei pokażę jak to mam zrobione obecnie:
To jest fragment z HA:

  switches:
    - name: "TEST_IN_OUT"
      address: 32768
      scan_interval: 1
      write_type: coil
      command_on: 1
      command_off: 1
      verify:
          input_type: discrete_input
          address: 1

Tutaj fragment z PLC - deklaracja zmiennych:
NVL_Gniazdo_Choinkowe_OUT - ukazuje stan wyjścia z PLC.
a GV.Modbus_SW_Choinkowe - to wejście binarne. które togglem ma włączać/wyłączać gniazdo choinkowe. (akurat tego uzylem do testow).

Tutaj fragment logiki - bloczek do toglowania:

No i ostatnim taskiem w PLC jest zerowanie stanu z Modbus:
Zrzut ekranu 2022-04-01 100020

W tak wykonanym programie, konfiguracji, mogę tylko załączyć gniazdo, niestety pomimo, że jest zerowane, mruga wejście z modbus ON/OFF.

Prawdopodobnie muszę zerować w HA, albo odpalac na 200ms na ON.
Ktoś podpowie jak to ugryźć?

Będę zobowiazany :slight_smile:

      verify:
          input_type: discrete_input
          address: 1

To jest przykład czy faktycznie weryfikujesz z adresu “1” ? (wg. dokumentacji to jest stan fizycznego wejścia sterownika, a nie wyjścia, te zaczynają się od 512 - przynajmniej u mnie). Sprawdź czy działa Ci np. przez qModMaster - tam da się wysłać “1” do sterownika, i odczytać stan z wyjść / wejść jak tam będzie ok to szukać trzeba w HA, ale myślę, że to po stronie sterownika lub złej weryfikacji do HA jest problem.

PS:

 write_type: coil

Spróbuj to wyrzucić, bo pisząc do zmiennych w pamięci NOVRAM powinno być holding (to jest domyślny write_type, więc nie musi go być).

Jak można zauważyć na zdjęciu to ja podpiąłem zmienną o stanie wyjścia na Modbus Address 1. Obrazuje to pierwszy screen z poprzedniego wpisu.

Stan monitorowany jest prawidłowo, bo jak z włącznika ściennego wyłączę to gniazdo choinkowe, to lampka w HA gaśnie.

Jeśli chodzi o:

PS:

 write_type: coil

Już próbowałem… nie pomogło.

Zamysł jest taki, aby przycisk z HA działał jak monostabilny, a już status w HA był czytany z innego rejestru modbus, a ja już w PLC pod ten rejestr podepnę odpowiednie zmienne.
Jeżeli ja w wago zdefiniowałem że Direction Output, Zmienna typu BOOL podpięta jest pod Coil:1 to odczytuję ją w HA w Coil 1 czy inny adress?

Niestety ale z FBD nie pomogę, tylko ST używam.
Ale moim zdaniem nie możesz używać rejestrów, które są zarezerwowane - patrz na tabelki, skopiowane z instrukcji serownika, wklejone wyżej. Jedyne rejestry jakie możesz sobie swobodnie używać (przypisywać do zmiennych logicznych) to 12288 … 24575, a pozostałe są zarezerwowane. Chyba, że Ty nie masz sterownika wago, a zgodnie z instrukcją w Twoim sterowniku możesz używać co chcesz?
To jak przycisk w HA ma być monostabilny to nie możesz go zapinać do zmiennej, która jest R_TRIG lub F_TRIG (to jest Rising / Falling edge detector, a więc rozpoznawanie zbocza narastającego lub opadającego) - to reaguje jedynie na zmianę stanu 0 > 1 lub z 1 → 0 (min. czas na jaki zmienna musi zmienić stan to czas wykonania pętli programu), a więc albo monostabilny z HA (wtedy go nie zerujesz i w PLC trzymasz stan), albo “krótka jedynka” i wtedy PLC dostaje sygnał jak z przycisku na ścianie i wykonuje program, a HA jedynie pokazuje aktualny stan.
Z qModMaster działa Ci tak jak byś chciał ? wklej zrzuty ekranu, a jeżeli tam działa to z HA też musi, dlatego przydadzą się zrzuty ekranu.

Chyba mam rozwiązanie.
Przetestuję, spróbuję powielić na wszystkie włączniki (ponad 100) i dam znać dla potomnych.

Cześć, ogółnie też rozpracowywałem ten problem, Jedno co zauważyłem, po wysterowaniu w HA danej encji, zmienna nie wraca do jakiejś wartości default.
Co prawda korzystam z PLC S7-1200 a nie WAGO, ale myślę, że mój sposób może podpowiedzieć Ci ścieżkę działania.

Ogólnie wykorzystałem darmową bibliotekę SIEMENS LGF Pulse Relay. Dopisałem tylko do kodu, aby przy każdej zmianie stanu, zmienną odpowiedzialną za sterowanie z HA (przekazywaną po Modbus) zmieniało do stanu, który nie jest standardowy. Ponieważ na początku największym problemem było to, że jeżeli zmienisz stan encji light w HA, to encja ma stałą wartość - coś na zasadzie przełącznika bistabilnego.

Dla potomnych, bo testuję od kwietnia, a obiecywałem, że się podzielę.
Rozwiązanie przedstawione poniżej pozostawia trochę do życzenia, ale działa niezawodnie (stabilnie).
Prawdopodobnie przez to, że w HA odpytuję kolejno każdy bit (a mam ponad 100 wejść i ponad 100 wyjść), a nie całe rejestry, opóźnienie względem PLC jest zauważalne. TZN. Włączam w HA “otwórz roletę”, i jeżeli od razu dam “STOP”, roleta zatrzymuje się z opóźnieniem, ale nie jest to sterowanie dronem :wink: , więc taki czas reakcji do sterowania domem jest akceptowalny. Jeżeli kiedyś będę miał wenę i uda mi się usprawnić prędkość komunikacji MODBUS na pewno będzie to wielki plus.

Poniżej cofiguration.yaml
Definicja PLC:

modbus:
  name: wago
  type: tcp
  host: xxx.xxx.xxx.xxx
  port: 502

Definicja wejść z PLC → HA (i tak dla każdego sygnału z całego domu):

  binary_sensors:
    - name: "input_nad_barkiem"
      address: 12288
      scan_interval: 1
      slave: 1
    - name: "input_jadalnia"
      address: 12289
      scan_interval: 1
      slave: 1

itp…

Definicja Wyjść HA → PLC (adekwatnie do WE dla każdego wyjścia z HA):

  switches:
    - name: output_nad_barkiem 
      address: 32768
      scan_interval: 1
      write_type: coil
      command_on: 1
      command_off: 0
    - name: output_jadalnia 
      address: 32769
      scan_interval: 1
      write_type: coil
      command_on: 1
      command_off: 0

W PLC taki bit jest podpięty pod funkcję TOGGLE dla np. Światła…

image

A wyjścia z PLC są mapowane na zmienne modbus do HA.

Ważna rzecz, jak ktoś już wcześniej wspominał, włączenie zmiennej po MODBUS setuje ją na stałe, w związku z tym w HA mam włączone 2 automatyzacje i dla każdej z nich jest przypisana połowa ze wszystkich wyjść, automatyzacja sprawdza czy stan jest 1, i po 250ms zmienia go na 0.

Poniżej kod automatyzacji:

alias: Momentary switches
description: Turn any switch into a momentary switch
trigger:
  - platform: state
    entity_id: group.momentary
    from: 'off'
    to: 'on'
    for: '00:00:00.25'
condition: []
action:
  - service: homeassistant.turn_off
    data: {}
    entity_id: group.momentary
mode: parallel

definicja grupy groups.yaml

  momentary:
    name: momentary
    entities:
      - switch.output_nad_barkiem
      - switch.output_jadalnia
1 polubienie

@gonzales, @dar3k, @macek Od dłuższego czasu próbuję podłaczyć moje PFC200 z HA korzystając z modbusa ale za każdym razem dostaję coś takieg:

2022-12-15 13:50:30.222 ERROR (SyncWorker_1) [homeassistant.components.modbus.modbus] Pymodbus: wago: Modbus Error: [Connection] ModbusTcpClient(192.168.10.60:502): Connection unexpectedly closed 0.000072 seconds into read of 8 bytes without response from unit before it closed connection

Za każdym razem dostaję coś takiego, nie ważne co mam ustawione

modbus:
  - name: wago
    type: tcp
    host: 192.168.10.60
    port: 502
    binary_sensors:
      - name: "binary_sensor1"
        address: 30007
        scan_interval: 5
        slave: 1
      - name: "binary_sensor2"
        address: 30008
        scan_interval: 5
        slave: 1

A sprawdzałeś czy działa Ci przez np. qModMaster?
W ustawieniach wago da się wyłączyć porty dla modbusa i wtedy nie działa.
image

Niby się łączy ale wygląda tak jakby po każdym podłączeniu i pobraniu danych musiałbym resetować połączenie. Dwa razy na jednym połączeniu nie pobiorę danych:

Ja na moim PFC200 mam trochę inaczej te ustawienia niż ty, ale generalnie MODBUS włączony na porcie 502. I faktycznie dwoma tool’ami pobiorę dane ale tylko raz. Muszę potem się rozłączyć i połączyć ponownie.

Wygląda na problem po stronie sterownika, nie miałem do czynienia z tym sterownikiem, ale masz wyłączoną funkcje keepalive - próbowałeś to włączyć? (albo sprawdź w manualu co ta funkcja robi dokładnie).

Domyślnie w protokole TCP/IP żadne dane nie są przesyłane przez bezczynne połączenie TCP. Dlatego jeśli żaden proces na końcach połączenia TCP nie wysyła danych do drugiego, nic nie jest wymieniane między dwoma modułami TCP. Zakłada się, że aplikacja kliencka lub aplikacja serwera używa liczników czasu do wykrywania braku aktywności w celu zamknięcia połączenia.
Zaleca się włączenie opcji KEEPALIVE zarówno dla połączenia klienta, jak i serwera, aby odpytywać drugi koniec, aby dowiedzieć się, czy serwer zdalny uległ awarii i jest wyłączony lub uległ awarii i został ponownie uruchomiony.

⦾ KeepAliveTime to czas między dwiema transmisjami utrzymującymi aktywność w stanie bezczynności.

⦾ KeepAliveInterval to czas między dwiema kolejnymi retransmisjami podtrzymującymi aktywność, jeśli nie otrzymano potwierdzenia poprzedniej transmisji podtrzymującej aktywność.

⦾ KeepAliveRetry to liczba retransmisji, które należy przeprowadzić przed stwierdzeniem, że zdalny koniec jest niedostępny.

Spróbuję ale wydaje mi się, że to nie to ponieważ miałem zarówno w programie i HA refresh ustawiony na 1-2s.
Dokopałem się do jakiegoś forum i kilka osób miało podobne problemy. Jeden koleś wykrył, że używał “złego adresowania”, obstawiam, że chodziło o złe rejestry.
Jakich dokładnie rejestrów używacie do zmiennych output i input?

WAGO od zawsze miało takie rejestry jak wyżej w tym poście HA przycisk zamiast przełącznika w komunikacji po modbus do Wago PLC - #11 przez dar3k (to jest zrzut ekranu z manuala do sterownika, myślę, że w PFC to się nie zmieniło bo standard powinien być zachowany).