logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ORNO OR-WE-516/517 - opinie o funkcji MODBUS i komunikacji RS485

michcior 09 Paź 2017 11:44 41625 153
Najlepsze odpowiedzi LABEL_AI_GENERATED

Jak poprawnie zestawić komunikację MODBUS RS485 z licznikami ORNO OR-WE-516/517 i jak odczytywać ich rejestry?

Da się z nimi komunikować, ale trzeba użyć MODBUS RTU z parametrami 9600, 8E1 (parity EVEN), czytać rejestry jako holding registers funkcją 03 i najlepiej skorzystać z działającego skryptu Pythona; w praktyce część osób musiała też zejść do pySerial 2.7, a później poprawiano obsługę pod nowsze 3.x [#16788438][#16920590][#17753035] Początkowe wrażenie o „7-bitowym kodowaniu” było błędne — dane, zwłaszcza napięcia i moce, są w rzeczywistości zapisane jako 32-bit floaty w dwóch rejestrach [#16748903] Jeśli komunikacja nie działa, problemem bywa adapter USB-RS485 lub sterownik, bo ten licznik potrafi być kapryśny z niektórymi przejściówkami, mimo że na innych działa od razu [#16920590]
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
  • #1 16746632
    michcior
    Poziom 30  
    Posty: 1132
    Pomógł: 159
    Ocena: 462
    Witam,
    Cóż, liczników z wyjściem MODBUS nie jest wiele. Dlatego niedrogi i nowoczesny licznik od ORNO serii OR-WE-51x wydaje się bardzo atrakcyjny.

    "Nic bardziej mylnego!"

    Po pierwsze, wstydzą się funkcji MODBUS, teraz już wiem dlaczego. Informacja o programie narzędziowym i spis rejestrów to jakaś wielka tajemnica, trzeba dzwonić się o to prosić. Kogo jak kogo ale mnie to poniża.

    Druga sprawa. Komunikacja po RS485 to zagadka sama w sobie. Okazuje się, że koncept FIFO jest obcy konstruktorom tego zacnego licznika. Jak się nie da pauzy gdzieś 5ms pomiędzy znakami, to żadnej komunikacji nie będzie! To jakiś absurd, na 9600 znak wysyłany jest ok 0.9ms a pauza 5ms?!

    Kodowanie danych, no to już poezja. Żadnej informacji jak czytać dane. I wiecie co? Kodowanie jest 7 BITOWE! Tak 7 BITOWE! Jakby to był stary terminal ASCII! Czytam rejestr który w modbusie jest 16 bitowy, ale trzeba młodszy bajt dodać do starszego bajtu pomnożonego przez 128 i podzielić wszystko przez 32768 żeby dostać wartość np. napięcia. Jakieś bity dodatkowe są pozapalne, nie wiadomo co oznaczają. Zero informacji.

    Jako, że nie ma żadnej notki CopyRight, publikuję to dla wszystkich poszukujących.
    Tak, nie mylicie się to wszystko, żadnej informacji co do kodowania w rejestrach. I czy to są "Holding Registers" też nie ma. Czytamy je rozkazem 03. Dobrze, że parametry transmisji są dostępne.
    ORNO OR-WE-516/517 - opinie o funkcji MODBUS i komunikacji RS485

    Jakoś F&F LE-03M działa jak złoto. Pół godziny mi zajęło okiełznanie go, dane i rejestry wyjaśnione w instrukcji. Można? Można?
  • #2 16748001
    zychzbig
    Poziom 11  
    Posty: 15
    Ocena: 1
    Witaj,
    ale z pobieżnej lektury dokumentacji F&F wyszło mi, że te liczniki nie dają informacji o zużyciu energii per każda faza z osobna - ale może się mylę?
    Nabyłem właśnie OR-WE-516 - więc może już trochę za późno na zmianę decyzji...
    Ale ładnie poproszę o informację - czym dokładnie się łączysz z tym miernikiem? (konwerter RS-485 do USB/Eth/pin?)

    Mam instalację solarną z falownikiem Zeversolar TLC który też można monitorować przez RS-485 (nie podam linka, bo nie mogę),
    oraz do tego kupiłem licznik, żeby dokładnie wiedzieć ile energii na której fazie aktualnie zużywam w domu (i ewentualnie włączać np. grzejniki c.w.).
    Chciałbym to podłączyć do jakiegoś raspberry lub może i nawet arduino. Jakieś sugestie?

    ZZ.
  • #3 16748197
    michcior
    Poziom 30  
    Posty: 1132
    Pomógł: 159
    Ocena: 462
    Jak na razie używałem PCta/Linux. Mam napisany w pythonie stos modbus więc na malinkę też pójdzie. Przejściówka o taka:
    3.1.18. Nie wysyłaj linków, które po pewnym czasie przestaną być aktywne. To spowoduje, że dyskusja straci jakikolwiek sens. [retrofood]


    Czyli najtańszy szmelc, ale każda inna powinna też chodzić, w końcu to RS485.

    Programujesz w pythonie? Mogę to udostępnić.

    Po godzinie walki, zacząłem sprawdzać kilkoma programami do modbus-a wszystkie nic. Dopiero porównanie z tym "programem narzędziowym" dało jakiś efekt. Aha, on chodzi pod WindowsXP. Z 7 i wyższymi chyba jest jakiś problem z wersją .net. Dobre, co?
  • #4 16748283
    zychzbig
    Poziom 11  
    Posty: 15
    Ocena: 1
    Nie programuje, ale to nie powinien być duzy problem, kod w pythonie parę razy widziałem i wygląda w miarę przystępnie ;)
    Chętnie przyjmę wszystko - a wynikami się podzielę - aczkolwiek to chwilę potrwa, instalację zrobili mi 2 tyg. temu, zakład energetyczny jescze nie zrobił odbioru i nie zmienił swojego licznika na taki "we/wy".

    PS: linka Ci mod wyciął poproszę o priva ;)
  • #5 16748295
    michcior
    Poziom 30  
    Posty: 1132
    Pomógł: 159
    Ocena: 462
    No i "mu w oko".
    Jak się w all..o wpisze "USB RS485" to te czarne po 9zł.
    Dzięki za życzenia. Wyciąłem jednak nie dlatego by Ci dokuczać, lecz byś to określił w sposób trwały bo za kilka tygodni Twój link i tak byłby nieaktywny. [retrofood]
    Program. Sam jestem zainteresowany rozkodowaniem tych rejestrów. Na razie mam tylko napięcie.

    Jak działa, to wygląda tak:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod

    Uruchamia się "sudo ./ornowe517.py" (sudo bo zwykle port szeregowy jest tylko dla roota)
    Załączniki:
    • modbus_orno.zip (5.57 MB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #6 16748368
    zychzbig
    Poziom 11  
    Posty: 15
    Ocena: 1
    na bazie CH340?
  • #7 16748903
    michcior
    Poziom 30  
    Posty: 1132
    Pomógł: 159
    Ocena: 462
    MAM!!!
    Wartości to są float, 32 bity!

    Taka procedura w Pythonie:
    Kod: Python
    Zaloguj się, aby zobaczyć kod

    W C wystarczy zmapować pamięć. Zna ktoś w pythonie coś tak sprytnego? Zamiast takiej funkcji?

    EDIT:
    oczyswicie jest. Cały plik z odczytem prądu wygląda tak:

    Kod: Python
    Zaloguj się, aby zobaczyć kod



    To z tym 7 bitami to była zmyłka. Ale mnie oślepiło. A to zwykły float.

    Dodano po 17 [godziny] 5 [minuty]:

    Jeszcze raz cały program odczytujący kilka podstawowych danych z miernika:
    Załączniki:
    • licznik_orno51x.zip (11.33 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #8 16750764
    mipix
    Poziom 38  
    Posty: 4068
    Pomógł: 495
    Ocena: 1483
    Witam

    Czy wiesz jak ustawić stałą impulsową S0 w tym liczniku?
    Instrukcja podaje: "Można ustawić 12000/1200/120/12, ogółem cztery tryby wyjścia impulsowego przy komunikacji."

    Chciałbym mieć na wyjściu te 12000 imp/kWh

    Pozdrawiam
  • #9 16750822
    michcior
    Poziom 30  
    Posty: 1132
    Pomógł: 159
    Ocena: 462
    Zobacz na obrazek z mojego pierwszego postu, rejestr 09h to stała SO. Tylko co się tam wpisuje to nie wiadomo. Polecam uruchomić program narzędziowy, on interpretuje te dane i podpatrzyć co czyta, ewentualnie może da możliwość zapisu. Są tam jakieś konfiguracje. Program - patrz pw
  • #10 16751738
    zychzbig
    Poziom 11  
    Posty: 15
    Ocena: 1
    Odebrałem paczki! Mam miernik i przejściówkę USB-RS485 - ale podłączenie to zrobię dopiero gdzieś w sobotę...
  • #11 16752395
    michcior
    Poziom 30  
    Posty: 1132
    Pomógł: 159
    Ocena: 462
    Kolejny "kwiatek". Jeżeli gdzieś jest napisane, że impulsy mogą być 12000/1200/120/12 to jest to nieprawda. Jedyne jakie działają to 1000/100/10/1. Wpisywanie innych wartości do rejestru jest możliwie ale licznik działa na ostatniej poprawnej.
  • #12 16788329
    mlukjani
    Poziom 12  
    Posty: 103
    Ocena: 10
    Witam !

    Też walczę z OR-WE-517, chcę to połączyć z Openhabem.
    Czyli wszystkie rejestry to floaty32 ?
    Jaki jest6 typ danych:coil, discrete, holding, or input ?
    Nie jestem tez pewien kodowania czy jest RTU, ASCI czy BIN
    oraz parzystości, instrukcja podaje że parzyste a w screenie kolegi wyżej widzę ustawione : even?
  • #13 16788438
    michcior
    Poziom 30  
    Posty: 1132
    Pomógł: 159
    Ocena: 462
    1) Wygląda że wszystkie to float-y
    2) RTU
    3) rejestry są holding, czytasz rozkazem 03
    4) parity:even,9600, 1SB
    5) Jeśli nie zauważyłeś, podstawowy BUG w tym cacku to to, że wysyłanie znaków trzeba spowolnić dodając pauzę tak na oko 4ms min pomiędzy bajtami. Nie wszędzie to się da.

    Powyżej jest program w pythonie, tam jest wszystko działające, jeśli lubisz python.

    Ten licznik to !#@!$# z jedną przejściówką RS-USB działa z inną nie, po wymianie chipa MAX485 na inny w przejściówce zaczyna działać. Na przykład.
  • #14 16788593
    mlukjani
    Poziom 12  
    Posty: 103
    Ocena: 10
    Dzięki za info !
    Niestety nie udało mi się połączyć, jak deklaruje jako RTU wywala mi błąd:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Próbuje czytać jako Float32 od adresu 0.
    Jak zmienię RTU na Ascii to nie wywala błędu ale nic nie czyta.

    Twój skrypt się odpalił i podał wartości V1, V2, itd, czyli połączenie jest ok.
    Możesz jeszcze przybliżyć co wypluwają poniższe skrypty ?
    Nie wiem czy nie robię błędu w adresie rejestru, nie wiem też jak odczytać poniższe wartości rejestrów ..

    Kod: Bash
    Zaloguj się, aby zobaczyć kod
  • #15 16788600
    michcior
    Poziom 30  
    Posty: 1132
    Pomógł: 159
    Ocena: 462
    Za wyjątkiem pliku ornowe51x.py, wszystkie inne nie powinny być uruchamiane, a wypluwają zwykle jakieś testy używane podczas pisania. Zignoruj to.

    Tak jak pisałem, kluczem jest czas pomiędzy znakami. Bez niego nie ma szans na odpowiedź.
  • #16 16788983
    mlukjani
    Poziom 12  
    Posty: 103
    Ocena: 10
    michcior napisał:
    Za wyjątkiem pliku ornowe51x.py, wszystkie inne nie powinny być uruchamiane, a wypluwają zwykle jakieś testy używane podczas pisania. Zignoruj to.

    Tak jak pisałem, kluczem jest czas pomiędzy znakami. Bez niego nie ma szans na odpowiedź.


    Mogę ustawić pauzę pomiędzy rejestrami, ale nie bitami - jeżeli o to Ci chodzi. Próbowałem z wartościami od 50ms do 1500ms i nic to nie daje. Poza tym na razie chcę odczytać jeden rejestr, czyli 2x16 bitów.
    Jeszcze muszę po walczyć z adresami rejestrów, bo coś czuje, że tutaj jest problem.
  • #17 16789037
    michcior
    Poziom 30  
    Posty: 1132
    Pomógł: 159
    Ocena: 462
    mlukjani napisał:
    Mogę ustawić pauzę pomiędzy rejestrami, ale nie bitami - jeżeli o to Ci chodzi.

    Właśnie chodzi od pauzę pomiędzy znakami (bajtami), jakby ten licznik nie używał FIFO. Niestety, inaczej nic z tego.

    Dodano po 11 [minuty]:

    Mam propozycję. Przestaw to cudo na bardzo niską prędkość transmisji. Np. 1200bps, może wtedy pauza nie będzie potrzebna bo znaki będą "kapać" bardzo wolno! Do tego potrzebujesz użyć programu pod windows (chyba działa tylko na XP) albo zapisać odpowiedni rejestr moim programem: rejestr 03, odczytaj go najpierw, zobacz co tam jest. Jest tylko jeden rejestr więc chyba to nie float tylko int. Powinno być 9600 potem zmień i zobacz korzystając z LCD licznika, na którejś pozycji to pokazuje. Po zmianie chyba trzeba "zresetować" licznik.
  • #18 16816889
    asern
    Poziom 9  
    Posty: 31
    Ocena: 3
    koledzy krótkie pytanie czy RS485 znajduje się w gnieździe po prawej czy po lewej ? bo tez nie potrafię znaleźć informacji
  • #19 16816968
    mlukjani
    Poziom 12  
    Posty: 103
    Ocena: 10
    michcior napisał:
    mlukjani napisał:
    Mogę ustawić pauzę pomiędzy rejestrami, ale nie bitami - jeżeli o to Ci chodzi.

    Właśnie chodzi od pauzę pomiędzy znakami (bajtami), jakby ten licznik nie używał FIFO. Niestety, inaczej nic z tego.

    Dodano po 11 [minuty]:

    Mam propozycję. Przestaw to cudo na bardzo niską prędkość transmisji. Np. 1200bps, może wtedy pauza nie będzie potrzebna bo znaki będą "kapać" bardzo wolno! Do tego potrzebujesz użyć programu pod windows (chyba działa tylko na XP) albo zapisać odpowiedni rejestr moim programem: rejestr 03, odczytaj go najpierw, zobacz co tam jest. Jest tylko jeden rejestr więc chyba to nie float tylko int. Powinno być 9600 potem zmień i zobacz korzystając z LCD licznika, na którejś pozycji to pokazuje. Po zmianie chyba trzeba "zresetować" licznik.


    Odczytuję to pod linuxem i plugin co załatwia sprawę nie ma opcji z przerwami pomiędzy bajtami, może jedynie robić przerwę po odczytaniu całego rejestru (float32). Niestety mimo, prędkości 9600 i wieeelu prób nie udało mi się go odczytać :cry: .

    Dodano po 48 [sekundy]:

    asern napisał:
    koledzy krótkie pytanie czy RS485 znajduje się w gnieździe po prawej czy po lewej ? bo tez nie potrafię znaleźć informacji


    RS masz na zaciskach śrubowych, pod górną zaślepką, na boku licznika jest ładnie wszystko rozpisane.
  • #20 16817000
    michcior
    Poziom 30  
    Posty: 1132
    Pomógł: 159
    Ocena: 462
    Prawo-Lewo zależy jak patrzeć. Jeśli dobrze pamiętam, RS485 jest na złączu bliżej krawędzi, z boku jest nadrukowana rozpiska złącz.

    Dodano po 2 [minuty]:

    mlukjani napisał:
    Niestety mimo, prędkości 9600

    To właśnie jest za szybko, trzeba na 1200 albo 2400 bo wtedy jeden znak to kilka milisekund, czyli tyle co potrzeba.
  • #21 16817021
    mlukjani
    Poziom 12  
    Posty: 103
    Ocena: 10
    michcior napisał:


    mlukjani napisał:
    Niestety mimo, prędkości 9600

    To właśnie jest za szybko, trzeba na 1200 albo 2400 bo wtedy jeden znak to kilka milisekund, czyli tyle co potrzeba.


    ale licznik podaje prędkość 9600 ... spr jutro z 2400.
  • #22 16817134
    michcior
    Poziom 30  
    Posty: 1132
    Pomógł: 159
    Ocena: 462
    mlukjani napisał:
    ale licznik podaje prędkość 9600 ... spr jutro z 2400

    No to właśnie trzeba najpierw zmienić, tylko jak to zrobić skoro nie działa? Można tym ich programem, albo moim narzędziem.
  • #23 16820469
    mlukjani
    Poziom 12  
    Posty: 103
    Ocena: 10
    michcior napisał:
    mlukjani napisał:
    ale licznik podaje prędkość 9600 ... spr jutro z 2400

    No to właśnie trzeba najpierw zmienić, tylko jak to zrobić skoro nie działa? Można tym ich programem, albo moim narzędziem.


    Przetestowałe na 2400 i dalej to samo, nie mogę nic odczytać. Próbowąłem nawet bajt (int8) i nic ..
    Cytat:
    2017-11-13 15:39:45.530 [ERROR] [w.m.io.ModbusSerialTransaction] - execute try 2/3 error: I/O exception - failed to read. Request: net.wimpi.modbus.msg.ReadMultipleRegistersRequest@11df9f6 (unit id 1 & transaction 8). Serial parameters: SerialParameters@1b43bfb[portName=/dev/ttyUSB0,baudRate=2400,flowControlIn=none,flowControlOut=none,databits=8,stopbits=1,parity=even,encoding=rtu,echo=false,receiveTimeoutMillis=1500]
    2017-11-13 15:39:47.070 [ERROR] [i.modbus.io.ModbusRTUTransport] - Last request: 01 03 0f ae 00 00 27 3f
  • #24 16846968
    asern
    Poziom 9  
    Posty: 31
    Ocena: 3
    te kody na pythonie cos mi nie dzialaja ;/ jakies dodatkowe biblioteki trzeba dograc ?

    oryginalny soft mi dziala
  • #26 16847680
    asern
    Poziom 9  
    Posty: 31
    Ocena: 3
    Linux:

    testing @ /dev/ttyUSB0
    Traceback (most recent call last):
    File "ornowe51x.py", line 51, in <module>
    testEmeter=energymeter.testPort(DEVICE_0, ADDR)
    File "/home/asern/Pulpit/licznik/energymeter.py", line 71, in testPort
    mbcli = createClient(portDevice, adres)
    File "/home/asern/Pulpit/licznik/energymeter.py", line 46, in createClient
    tecl.transportOpen(portDevice, brate=9600)
    File "/home/asern/Pulpit/licznik/mbusclient.py", line 117, in transportOpen
    self.portdev.setTimeout(timeout)
    AttributeError: 'Serial' object has no attribute 'setTimeout'
  • #28 16847718
    asern
    Poziom 9  
    Posty: 31
    Ocena: 3
    to teraz

    testing @  /dev/ttyUSB0
    Traceback (most recent call last):
      File "ornowe51x.py", line 51, in <module>
        testEmeter=energymeter.testPort(DEVICE_0, ADDR)
      File "/home/asern/Pulpit/licznik/energymeter.py", line 71, in testPort
        mbcli = createClient(portDevice, adres)
      File "/home/asern/Pulpit/licznik/energymeter.py", line 46, in createClient
        tecl.transportOpen(portDevice, brate=9600)
      File "/home/asern/Pulpit/licznik/mbusclient.py", line 117, in transportOpen
        self.portdev.setTimeout(timeout)	        
    AttributeError: 'Serial' object has no attribute 'setTimeout'
    
  • #30 16847867
    asern
    Poziom 9  
    Posty: 31
    Ocena: 3
    testing @ /dev/ttyUSB0
    Traceback (most recent call last):
    File "ornowe51x.py", line 51, in <module>
    testEmeter=energymeter.testPort(DEVICE_0, ADDR)
    File "/home/asern/Pulpit/licznik/energymeter.py", line 71, in testPort
    mbcli = createClient(portDevice, adres)
    File "/home/asern/Pulpit/licznik/energymeter.py", line 46, in createClient
    tecl.transportOpen(portDevice, brate=9600)
    File "/home/asern/Pulpit/licznik/mbusclient.py", line 117, in transportOpen
    self.portdev.setTimeout(timeout)
    AttributeError: 'Serial' object has no attribute 'setTimeout'

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy liczników energii ORNO OR-WE-516/517 z interfejsem RS485/MODBUS, których dokumentacja okazała się niepełna i trudna do zdobycia. Uczestnicy opisują problemy z komunikacją: konieczność bardzo krótkich przerw między bajtami, zależność od konkretnego konwertera RS485-USB, wymaganie ustawienia RTU, parzystości EVEN i 9600 bps oraz kłopoty z pySerial 3.x, gdzie działała dopiero wersja 2.7 lub poprawki w kodzie. Ustalono, że wiele rejestrów jest kodowanych jako float32, część wartości wymaga odczytu z dwóch rejestrów, a dla liczników jednofazowych adresy rejestrów różnią się od wersji trójfazowej. Omówiono też konfigurację stałej impulsowej S0, odczyt napięcia, prądu, mocy, energii i częstotliwości, integrację z Pythonem, Raspberry Pi, OpenHAB, Domoticz, MQTT, Grafaną i InfluxDB oraz problemy z ustawianiem slave ID i taryf. W końcowej części potwierdzono, że licznik działa poprawnie po odpowiedniej konfiguracji portu, wersji biblioteki i dopasowaniu rejestrów do konkretnego modelu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA