Modbus - urządzenia wymagające różnych parity na jednym masterze - jak?

Witam Was serdecznie,

Zabrałem się za przenoszenie czego można na kable.

Zakupiłem kartę 8 przekaźników sterowanych Modbusem - wymaga parity N
Posiadam licznik energii DDM18SD oraz RS485 → Zamel RXM-01 - wymagają parity E
Jak to ustawić na jednym urządzeniu?

Jeśli robię tak:
zawartość coniguration.yaml:

modbus:
  #- type: tcp
  #  host: 192.168.0.254
  #  port: 502
  - name: "parityN"
    type: serial
    method: rtu
    port: /dev/ttyUSB1
    baudrate: 9600
    stopbits: 1
    bytesize: 8
    parity: N # Dla Zamela i licznika ma być E, dla Relaya N
    timeout: 1
    retry_on_empty: true
    # message_wait_milliseconds: 5

    switches:
      - name: 01 Grzejnik Sypialnia # ON 02 06 0001 0100 D9A9   OFF 02 06 0001 0200 D959
        unique_id: relay1
        slave: 2 # 02
        write_type: holding # 06
        address: 1 # 0001
        command_on: 256 # 0100
        command_off: 512 # 0200
        verify: # 02 03 0001 0001 D5 CA
          # input_type: holding  # 03 Nie trzeba podawać jak ten sam typ co write_type
          # address: 1 # 0001 Nie trzeba podawać jak ten sam co wyżej
          state_on: 1
          state_off: 0

      - name: 02 Grzejnik Łazienka
        unique_id: relay2
        slave: 2
        write_type: holding #06
        address: 2
        command_on: 256
        command_off: 512
        verify:
            state_on: 1
            state_off: 0

      - name: 03 Grzejnik Salon
        unique_id: relay3
        slave: 2
        address: 3
        write_type: holding
        command_on: 256
        command_off: 512
        verify:
            state_on: 1
            state_off: 0

      - name: 04 Grzejnik Kuchnia
        unique_id: relay4
        slave: 2
        address: 4
        write_type: holding
        command_on: 256
        command_off: 512
        verify:
            state_on: 1
            state_off: 0

      - name: 05 Głośniki sypialnia
        unique_id: relay5
        slave: 2
        address: 5
        write_type: holding
        command_on: 256
        command_off: 512
        verify:
            state_on: 1
            state_off: 0

      - name: 06 Girlanda
        unique_id: relay6
        slave: 2
        address: 6
        write_type: holding
        command_on: 256
        command_off: 512
        verify:
            state_on: 1
            state_off: 0

      - name: 07 Przekaźnik
        unique_id: relay7
        slave: 2
        address: 7
        write_type: holding
        command_on: 256
        command_off: 512
        verify:
          state_on: 1
          state_off: 0

      - name: 08 Karmnik
        unique_id: relay8
        slave: 2
        address: 8
        write_type: holding
        command_on: 256
        command_off: 512
        verify:
          state_on: 1
          state_off: 0

  - name: "parityE"
    type: serial
    method: rtu
    port: /dev/ttyUSB1
    baudrate: 9600
    stopbits: 1
    bytesize: 8
    parity: E # Dla Zamela i licznika ma być E, dla Relaya N
    timeout: 1
    switches:    
      - name: Zamel1 # Wciśnięty 01 05 0000 FF00 8C3A  puszczony 01 05 0000 0000 CDCA
        slave: 1 # 01
        write_type: coil # 05
        address: 0 # 0000
        command_on: 65280 # FF00
        command_off: 0 # 0000

      - name: Zamel2 # OFF 01 05 0001 FF00 DDFA
        slave: 1
        address: 1
        write_type: coil
        command_on: 65280 # FF00
        command_off: 0 # 0000

    # Licznik energii DDM18SD w szafie
    sensors:
      - name: Szafa Licznik Napięcie
        unit_of_measurement: V
        device_class: power
        slave: 16
        address: 0
        input_type: input
        count: 2
        precision: 2
        data_type: float32
      - name: Szafa Licznik Natężenie
        unit_of_measurement: A
        device_class: power
        slave: 16
        address: 8
        input_type: input
        count: 2
        precision: 2
        data_type: float32
      - name: Szafa Licznik Chwilowe
        unit_of_measurement: W
        device_class: power
        slave: 16
        address: 18
        input_type: input
        count: 2
        precision: 2
        data_type: float32    
      - name: Szafa Licznik Całkowite
        unit_of_measurement: kWh
        device_class: power
        slave: 16
        address: 256
        input_type: input
        count: 2
        precision: 2
        data_type: float32

To wywala w logach “Modbus parityE contains duplicate host/port /dev/ttyUSB1, not loaded!”

Jeśli zrobię tylko jednego huba Modbus z parity E lub N to działają odpowiednio urządzenia z parity E albo z N (dość logiczne :slight_smile: ).

Jak to ugryźć?

Skąd to “wymagają”? Z dokumentacji jest do wyboru:

image

Zasada jest prosta: wszystkie urządzenia ma Modbus (w ramach jednej magistrali) muszą mieć te same parametry transmisji, w każdym urządzeniu można to ustawić. Bardzo często stosuje się “8N1” - eight (8) data bits, no (N) parity bit and one (1) stop bit., oczywiście prękość również ta sama. Ustaw wszystkie urządzenia w ten sam sposób i wszystko będzie działać.

Oczywiście nie stoi nic na przeszkodzie aby zrobić dwie osobne magistrale na dwóch różnych konwerterach RS485 (jeden na port: /dev/ttyUSB1, drugi na port: /dev/ttyUSB2) dla różnych parametrów transmisji, tylko po co?

Może źle to nazwałem - tak mają te sterowniki ustawione fabrycznie.

Niestety w karcie z przekaźnikami można tylko ustawić prędkość nie da się parzystości.

W tym przypadku mogę zmienić w Zamelu i w liczniku, ale co w sytuacji gdy jakiś kolejny sterownik nie będzie miał opcji przestawienia?

Rozumiem że nie ma innej opcji i w takiej hipotetycznej sytuacji zostaje tylko i wyłącznie kolejna magistrala?

Możesz zmienić.

Czy to przypadkiem nie jakaś “chińska” karta z przekaźnikami?

To by oznaczyło, że sterownik nie spełnia podstawowych wymagań odnośnie ustawień Modbus.

Dokładnie tak.

Zdecydowanie chińszczyzna z Ali.

Dzięki za precyzyjne i nie pozostawiające wątpliwości odpowiedzi :slight_smile:

Walczę z ustawieniem tych parzystości ale nie potrafię zinterpretować dokumentacji.

Tak to wygląda w liczniku energii:


Piszą, że 01 10 00 08 00 02 04 40 00 00 00 E7 C9 zmienia adres licznika na 02

01 - adres licznika - to ok
10 - funkcja 10 - to ok
00 08 - rejestr gdzie siedzi adres - to ok
00 02 - liczba rejestrów - to ok
04 - ile bajtów - to ok
40 00 00 00- to zmienia adres na 02 - ale jak? tego nie rozumiem
E7 C9 - to wiadomo CRC Check

Ja potrzebuję: 16 10 00 02 00 02 04 XX XX XX XX CRCC

Z tej instrukcji nie potrafię ogarnąć co podać za XX XX XX XX

Ktoś pomoże?

Najpierw zamiast zmieniać ten rejestr, odczytaj go i będziesz dokładnie wiedział jak teraz jest to zapisane na tych 4 bajtach.

Jest to liczba typu floatig, co napisane jest w instrukcji.
float 0x40000000 = dec 2
0x3f800000 =1
0x40400000 =3
0x40800000 =4
Dziwniej już się chyba nie dało tego zrobić? :flushed: