Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 1 maja 2025, o 01:27


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 20 ] 
    Autor Wiadomość
     Tytuł: Modbus + LCD
    PostNapisane: 7 sty 2017, o 10:24 
    Offline
    Użytkownik

    Dołączył(a): 29 cze 2013
    Posty: 209
    Lokalizacja: Tarnowskie Góry
    Pomógł: 0

    Witam
    mam podłączone arduino z PLC gdzie PLC pracuje jako master a arduino jako slave. Plc odpytuje dwa urządzenia slave o stan pinow oraz temperaturę. I teraz chciał bym na tej samej lini RS485 podłączyć wyświetlacz(slave) który by wyświetlał wybrane dane na wyświetlaczu które są przesyłane między pozostałymi urządzeniami. Czy ma ktoś jakis pomysł jak to zrobić?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 sty 2017, o 11:26 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 cze 2014
    Posty: 820
    Lokalizacja: Tam gdzie PYRY są
    Pomógł: 64

    Tak, Wyświetlacz robisz jako trzecie urządzenie slave ze swoim adresem, podłączasz go pod magistralę i zapisujesz do niego dane które chcesz wyświetlić.

    Oczywiście wyświetlacz to będzie moduł z własnym mikrokontrolerem, zasilaniem i RS485. Zapis robisz za pomocą funkcki 16 - write N-registers

    _________________
    IntegraMETEO
    WordCLOCK
    IntegraTOUCH



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 sty 2017, o 12:18 
    Offline
    Użytkownik

    Dołączył(a): 29 cze 2013
    Posty: 209
    Lokalizacja: Tarnowskie Góry
    Pomógł: 0

    Aktualnie korzystam z tego przykładu

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Do moich potrzeb przerobiłem go na odczyt dwóch czujników DS18B20 których wartość wysyła po modbasie np. 25,34C jako 2534
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    W moim przykładzie nie mam takiej opcji czy muszę mieć inna bibliotekę ? w jaki sposób na wyswietlaczu slave mam odczytać tą wartość która jest zapisana pod 30001



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 sty 2017, o 12:53 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 cze 2014
    Posty: 820
    Lokalizacja: Tam gdzie PYRY są
    Pomógł: 64

    Nie znam arduino wogole więc ciężko mi się to czyta ale poszukaj w bibliotekach funkcji odpowiedniej.

    Ogólnie zasada jest taka, że tutaj w programie odczytujesz czujniki temp i zapisujesz wynik do tablicy (chyba regBank 30001 i 30002) a PLC odpytuje je funkcją pewnie 03.

    U ciebie w module z wyświetlaczem musisz odwrócić sytuację.
    Używając w PLC funkcji np 16 musisz zapisać do tablicy (może być ta sama regBank(30001) - to i tak inny procek) liczby odpowiadające pomiarom temperatury.
    Później juź w funkcji wyświetlającej liczby na wyświetlaczu wyświetlasz interesujące Cię dane. Pamiętaj, że zmienne z modbusa to słowa 16-to bitowe. Musisz użyć odpowiedniej funkcji lub przerobić je na stringi i wyświetlić jako tekst.

    _________________
    IntegraMETEO
    WordCLOCK
    IntegraTOUCH



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 sty 2017, o 14:52 
    Offline
    Użytkownik

    Dołączył(a): 29 cze 2013
    Posty: 209
    Lokalizacja: Tarnowskie Góry
    Pomógł: 0

    Sprawdziłem bibliotekę którą używam i nie znalazłem tam możliwości pobierania danych z mastera i wyświetlania go na wyświetlaczu. Nie upieram się na moim przykładzie ale jeśli ktoś posiada jakiś inny to prosił bym o udostępnienie



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 sty 2017, o 15:29 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 cze 2014
    Posty: 820
    Lokalizacja: Tam gdzie PYRY są
    Pomógł: 64

    Nie wiem co masz na myśli pisząc
    endurasek napisał(a):
    nie znalazłem tam możliwości pobierania danych z mastera i wyświetlania go na wyświetlaczu.
    ale slave nigdy nie poprosi mastera o dane, więc takiej funkcji nie oczekuj. Ale na pewno master powinien mieć możliwość zapisu n-rejestrów do slavea. Sam modbus jako standard to zapewnia. Co innego czy Twoja biblioteka ma zaimplementowaną obsługę funkcji 16. Niestety biblioteki nie załączyłeś to musisz się sam pomęczyć.

    Druga sprawa - wyświetlanie danych na wyświetlaczu to oddzielny temat - z tym chyba nie masz problemu??

    Możesz się przesiąść na C w przypadku tego jednego modułu czy musi być arduino?

    _________________
    IntegraMETEO
    WordCLOCK
    IntegraTOUCH



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 sty 2017, o 17:02 
    Offline
    Użytkownik

    Dołączył(a): 29 cze 2013
    Posty: 209
    Lokalizacja: Tarnowskie Góry
    Pomógł: 0

    Tak wiem ze slave nie poprosi o dane z mastera ale może wyłapywać dane jakie master wysyła i z tym mam problem.
    Z wyświetlaniem nie ma problemów tylko nie wiem skąd mam je pobrać ;-(
    Co do języka C hmmm kilka razy próbowałem ale dla mnie to jest sklep Torebkami i damskimi butami... po prostu nie wiem o co w tym chodzi ;p

    modbus.h
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    modbusDevice.ccp
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    modbusDevice.h
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    modbusRegBank.ccp
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    modbusRegBank.h
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    modbusSlave.cpp
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    modbusSlave.h
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 sty 2017, o 17:41 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 cze 2014
    Posty: 820
    Lokalizacja: Tam gdzie PYRY są
    Pomógł: 64

    A spróbuj inaczej. Ściągnij sobie program np. modbus poll i podepnij się rs'em pod Twoje arduino z wgranym wsadem. Może być nawet Twój moduł, który już działa ten od temperatur. W programie na komputerze odpytuj moduł o temperatury i zobacz czy odpowiada.
    w modbus poll wduś:
    Obrazek
    i w okienku, które się ukażeustaw:
    slave ID 10, funkcja 03, adress 3000, quantity 2.
    Obrazek
    Jeżeli działa Tobie modbus tak jak pisałeś w 1 poście, powinieneś uzyskać komunikację z modułem i otrzymywać temperatury w komputerze.


    Jak zadziała, miożesz iść dalej:
    Wybierz funkcję 06
    Obrazek
    i w okienku ustaw swoje parametry:
    Obrazek
    zobacz czy program wysyła dane do modułu i nie ma błędów.

    Da Ci to obraz, czy Twój moduł obsługuje F06,16.

    Jak bedzie ok, pójdziemy dalej

    Oczywiście pamiętaj o ustawieniu parametrów RS w programie zgodnie z Twoim modułem

    _________________
    IntegraMETEO
    WordCLOCK
    IntegraTOUCH



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 sty 2017, o 19:15 
    Offline
    Użytkownik

    Dołączył(a): 29 cze 2013
    Posty: 209
    Lokalizacja: Tarnowskie Góry
    Pomógł: 0

    Tak działa wysyłanie temperatury do komputera
    Obrazek

    Zrobiłem też twoim programem ale na innych ustawieniach bo tak dziwactwa wysyłał
    Obrazek

    Co do drugiej części to za bardzo nie wiem jak wyświetlić te dane na wyświetlaczu bo wyśle ale jak je odebrać i wyświetlić ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 sty 2017, o 19:59 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 cze 2014
    Posty: 820
    Lokalizacja: Tam gdzie PYRY są
    Pomógł: 64

    Jak master (PLC lub komputer) wyśle dane i nie dostanie odpowiedzi z błędem ani timeouta, możesz śmiało założyć, że dane dotarły do modułu i ten je poprawnie odebrał. Połowa roboty za Tobą. Załóżmy, że wysyłasz dane do adresów - Temp1 do 30001, Temp2 do 30002. W module z wyświetlaczem nie msz czujników temperatury, więc te adresy są wolne i możesz ich użyć prawda?

    I teraz kolej na Ciebie. Dane trafiają do tablicy modbusa, którą na pewno gdzieś definiowałeś i podawałeś jej rozmiar oraz adres początkowy. U Ciebie adresy zaczynają się od 0 czyli to co zapiszesz pod adres 30001 trafi do procesora pod element [01] w Twojej tablicy.

    Nie znam arduino jak już pisałem, ale szukałbym tutaj:

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    domyślam się, że to:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    rezerwuje miejsce na dane a to
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    zapisuje dane do konkretnej komórki pamięci.

    zauważ, że funkcja regBank.get() zwraca wynik w postaci uint16t

    spróbuj czegoś w stylu: LCD_long(regBank.get(30001));
    Nie wiemy do teraz jakiego lcd używasz ale to nie istotne. pamiętaj, że wyświetlasz danle 16-to bitowe.

    _________________
    IntegraMETEO
    WordCLOCK
    IntegraTOUCH



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 sty 2017, o 20:51 
    Offline
    Użytkownik

    Dołączył(a): 29 cze 2013
    Posty: 209
    Lokalizacja: Tarnowskie Góry
    Pomógł: 0

    Zrobiłem jak napisałeś chyba....
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    ale funkcja regBank.set(30002); nie dziala



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 sty 2017, o 21:07 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 cze 2014
    Posty: 820
    Lokalizacja: Tam gdzie PYRY są
    Pomógł: 64

    a funkcja lcd.print wyświetla co? wszystko?? czy czasem nie tylko stringi??

    jak nie działa?? nie kompiluje się?? nic nie wyswietla? wyswietla 0?

    _________________
    IntegraMETEO
    WordCLOCK
    IntegraTOUCH



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 sty 2017, o 06:18 
    Offline
    Użytkownik

    Dołączył(a): 29 cze 2013
    Posty: 209
    Lokalizacja: Tarnowskie Góry
    Pomógł: 0

    Wiec wyświetla cały czas "0" a jak w programie modbus poll wysyłam jakąś liczbę to w tej samej sekundzie dostaje odpowiedz o takiej samej treści jak zapytanie .
    Obrazek



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 sty 2017, o 09:14 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 cze 2014
    Posty: 820
    Lokalizacja: Tam gdzie PYRY są
    Pomógł: 64

    Kurczaki....
    Jak dostajesz odpowiedź taką samą, znaczy, że slave przyjął dane i tak włąśnie to potwierdza. Ramka też jest prawidłowa
    0A 06 75 32 00 6F 73 5E

    0A - adres slave'a w hex 10
    06 - funkcja Write Single Reg
    75 32 - adres rejestru w hex 30002
    00 6F - 2x8bit wartości - 6f czyli 111
    73 5E - CRC
    ----------------------
    czyli komunikacja jest ok. Teraz trzeba poszukać dlaczego nie wyświetla. Na początku spróbuj na sztywno ustawić ten rejestr przez
    regBank.set(30002,111); przed pętlą while, najlepiej zaraz po inicjalizacji modbusa i rejestrów
    zoczacz czy wyświetli.

    _________________
    IntegraMETEO
    WordCLOCK
    IntegraTOUCH



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 sty 2017, o 15:58 
    Offline
    Użytkownik

    Dołączył(a): 29 cze 2013
    Posty: 209
    Lokalizacja: Tarnowskie Góry
    Pomógł: 0

    Tak wyświetla, ale dalej szukam miejsca gdzie te dane przychodzą... i nie potrafię znaleźć



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 sty 2017, o 21:32 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 cze 2014
    Posty: 820
    Lokalizacja: Tam gdzie PYRY są
    Pomógł: 64

    Troche jaśniej please bo zaczynam się gubić.

    Wyswietla ale co? Tak jak Ci pisałem po wpisie przez regBank.set tak? i wyswietla wartosć taką jaką wpisujesz? Wyswietlasz przez lcd.print(regBank.get())??


    -----------------------

    teraz mnie oswieciło. Rejestry 3xxxx to tzw Input registers. Holding Registers to 1xxxx chyba.
    W C można sobie przypisywać dowolne zakresy. W arduino chyba jest na stałe o ile dobrze widzę. Jeżeli tak jest to do InputRegisters nie możesz nic zapisać z poziomu magistrali. Rejestry te przechowują dane otrzymane bezposrednio w module czyli czujniki itp. Możesz je odpytać ale nie zapisać do nich. Nie wiem czy nie powinienes dostać odpowiedź z kodem błędu illegal operation ale może w arduino nie ma tak. sprobuj zapisac do np.:
    regBank.set(10001,100)
    i wyswiel=tlic na lcd:
    lcd.print(regBank.get(10001))

    daj znac co sie dzieje


    Autor postu otrzymał pochwałę

    _________________
    IntegraMETEO
    WordCLOCK
    IntegraTOUCH



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 10 sty 2017, o 09:26 
    Offline
    Użytkownik

    Dołączył(a): 29 cze 2013
    Posty: 209
    Lokalizacja: Tarnowskie Góry
    Pomógł: 0

    Masz rację co do adresu ale jego dopiero sprawdzę w piątek jak wrócę z delegacji i na pewno dam znać.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 sty 2017, o 21:23 
    Offline
    Użytkownik

    Dołączył(a): 29 cze 2013
    Posty: 209
    Lokalizacja: Tarnowskie Góry
    Pomógł: 0

    Co do zmiany adresu miałeś rację ale trochę inny miał być a wynika to z tego...



    Read Holding Registers (FC=03)

    Request

    This command is requesting the content of analog output holding registers # 40108 to
    40110 from the slave device with address 17.

    11 03 006B 0003 7687

    11: The Slave Address (11 hex = address17 )
    03: The Function Code 3 (read Analog Output Holding Registers)
    006B: The Data Address of the first register requested.
    ( 006B hex = 107 , + 40001 offset = input #40108 )
    0003: The total number of registers requested. (read 3 registers 40108 to 40110)
    7687: The CRC (cyclic redundancy check) for error checking.

    Response

    11 03 06 AE41 5652 4340 49AD

    11: The Slave Address (11 hex = address17 )
    03: The Function Code 3 (read Analog Output Holding Registers)
    06: The number of data bytes to follow (3 registers x 2 bytes each = 6 bytes)
    AE41: The contents of register 40108
    5652: The contents of register 40109
    4340: The contents of register 40110
    49AD: The CRC (cyclic redundancy check).


    A działający kod wygląda tak:

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Dzięki wielkie za pomoc !!!! a teraz muszę się pobawić w liczby ujemne i z funkcja 16 write multiple register



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 sty 2017, o 21:34 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 cze 2014
    Posty: 820
    Lokalizacja: Tam gdzie PYRY są
    Pomógł: 64

    No i fajnie, że działa. Musi działać. Modbus jest fajny.

    F16 i liczby ujemne to już z górki

    _________________
    IntegraMETEO
    WordCLOCK
    IntegraTOUCH



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 18 sty 2017, o 11:44 
    Offline
    Użytkownik

    Dołączył(a): 29 cze 2013
    Posty: 209
    Lokalizacja: Tarnowskie Góry
    Pomógł: 0

    Dla potomnych
    Więc biblioteka SimpleModbusSlave.h obsługuje funkcje F16 oraz liczby ujemne... ale w głównym programie należy sobie zmienić z unsigned int holdingRegs[HOLDING_REGS_SIZE]; na int holdingRegs[HOLDING_REGS_SIZE];

    Ale co do wyświetlania po przecinku to mam pytanie bo chce przesłać liczbę -22,22 to chciałem zrobić w ten sposób że mnożę x100 i mam -2222 którą wysyłam po modbasie ale jest problem z odwroceniem
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    bo jest problem ze znakiem "-" który pojawia się w całości i reszcie

    a może jest inny sposób na zrobienie tego??

    Mam jeszcze jedno pytanie odnośnie komendy modbus_update();
    Mimo że nie wysyłam nic po modbus-sie to on wyświetla ostatnią zapamiętaną wartość jak sie tego pozbyć?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 20 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO