Skocz do zawartości
simba92

Modbus - komunikacja PC-Robot(bluetooth)

Pomocna odpowiedź

Cześć!

Realizuje bezprzewodową  komunikacje po protokole Modbus RTU pomiędzy PC, a Robotem i mam pytanie : jeżeli Master generuje ramkę(adres urządzenia + kod funkcji(0x03 odczyt n rejestrów) + adresy n - rejestrów + liczba rejestrów + suma_kontrolna) do SLAVE (STM32f103vct6) to... JAKI podać adres rejestru z mikrokontrolera pod, którym jest jakaś dana np. 2 bajtowa  ?

Przykład o co chodzi : tworzę tablice przechowującą n dwóbajtowych(np.int16_t) elementów  i chciałbym w zapytaniu MASTERA podać adres np. pierwszej komórki, pytanie jaki ???? jak zadeklarować tablice w języku C w programie robota by jej adres tj. adres pierwszej komórki był stały i znany dla MASTERA(zakładam, że utworzę taką tablicę i sprawdzę np. za pomocą terminala adres pierwszej komórki &tab[0] , by potem wykorzystać ją dla informacji dla MASTERA)???? 

Z góry dzięki, za pomoc i proszę o pytania jeśli coś niejasno opisałem  !!!

Udostępnij ten post


Link to post
Share on other sites

Nie wolno tego robić w ten sposób, bo grzebanie w pamięci pracującego programu jest niebezpieczne (odczyty może mniej) a poza tym jak chcesz zapanowac nad "stałością" takich adresów w przyszłości? Możesz co prawda umieszczać obiekty w osobnych sekcjach a podczas konsolidacji i lokowania kodu kazać linkerowi umieszczać sekcje pod wskazanymi adresami, ale to zły pomysł. Protokół na tym poziomie nie powienien nic wiedzieć o rzeczywistych adresach w RAMie. W tym konkretnym przypadku (MODBUS) i na tym poziomie abstrakcji  liczby z pola adresu są pewnymi umownymi numerami, które umieszczasz w dokumentacji swojego modułu jako stałe i niezmienne. Są to jednak tylko hm.. identyfikatory prawdziwych danych. Program pracujący po drugiej stronie (SLAVE) powinien sprawdzać czy dany adres jest mu znany (może je mieć np. zgromadzone w jakiejś tablicy a między rejestrami używanymi mogą być dziury) i jeśli akurat jest on zaimplementowany, zamieniać go na pewną czynność, np. pobranie zawartości jakiejś danej i wysłanie tego jako odpowiedź. Robić to może funkcja wołana przez wskaźnik pobrany z tablicy struktur, zawierającej adresy znanych rejestrów i akcje jakie trzeba podjąć podczas żądania zapisu lub odczytu danego rejestru.

Jeżeli Twoja tablica z danymi jest długa, to w takim adresowaniu "wprost" jakie proponujesz może zacząć brakować rejestrów a poza tym to nieeleganckie by zajmować ich mnóstwo i jeszcze nie wiadomo czy za chwilę nie będzie ich więcej lub mniej i nie trzeba będzie adresów kolejnych rejestrów przesuwać. Staraj się stabilizować interfejsy prezentowane przez Twoje urządzenie na zewnątrz, bo tak łatwiej będzie innym ludziom z Tobą współpracować. Dlatego lepiej od razu zrób tak, że pod jednym adresem (np. R) tworzysz (wirtualny) rejestr "adresowy" do którego MASTER ładuje adres (0..N) komórki z tablicy (i może ten adres oczywiście odczytać), a w kolejnym rejestrze - "danych" (adres R+1) MASTER widzi zawartość tej zaadresowanej komórki. Możesz dodać mechanizm autoinkrementacji w którym kolejne odczyty tego samego rejestru (tego z danymi) będą otrzymywały w odpowiedzi kolejne komórki tablicy. W ten sposób korzystając tylko z dwóch adresów rejestrów możesz zrobić sporą tablicę a  jej rzeczywista wielkość nie wpływa na mapę adresów rejestrów. Ona powinna być stała dla danego urządzenia SLAVE i dość wcześnie określona w dokumentacji projektu.

Udostępnij ten post


Link to post
Share on other sites

Właściwie nasuwają się tylko pytania.

1. Jaka platforma sprzętowa do tej komunikacji bezprzewodowej?

2. Standard MODBUS określa organizację pamięci danych, instrukcje (funkcje), i zasady dostępu. Po co wyważasz otwarte drzwi ? Adres w pamięci mikrokontrolera, a adres MODBUS nie muszą (i zazwyczaj nie są) być takie same. Inaczej mówiąc adresy MODBUS są mapowane, w pamięci programu urządzenia. Jeżeli instrukcja (funkcja właściwie) protokołu MODBUS np. 4x czyta z pod adresu 1, to nie oznacza że w pamięci mikrokontrolera, czyta z adresu 1, może równie dobrze czytać bezpośrednio z rejestru Timera.

2. Czemu nie skorzystasz z gotowych bibliotek do obsługi MODBUS RTU MASTER/SLAVE. Master może być tylko jeden, tak na marginesie.

Udostępnij ten post


Link to post
Share on other sites
Dnia 11.09.2018 o 00:14, simba92 napisał:

JAKI podać adres rejestru z mikrokontrolera pod, którym jest jakaś dana np. 2 bajtowa  ?

Rejestry protokołu Modbus (tzw. Holding Registers) są nijak powiązane z rejestrami mikrokontrolera.

Możesz je zaimplementować w postaci tablicy w programie na uC. Wtedy Master wpisując wartość pod jakiś rejestr będzie zapisywał do tej tablicy.

W międzyczasie aplikacja na uC będzie sobie sprawdzać wartości tablicy i używać zadane tam wartości do wyznaczonych celów.

 

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...