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



Teraz jest 19 wrz 2024, o 17:35


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 ]
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 ]
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 ]
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 ]
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 ]
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 ]
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 ]
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 ]
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 ]
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 ]
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 1 gość


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