Skocz do zawartości

Modbus - komunikacja PC-Robot(bluetooth)


Pomocna odpowiedź

Napisano

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  !!!

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.

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.

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.

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...