Musze połączyć się z czujnikami pracującymi na magistrali Modbus.
Ponieważ mam z tym problemy, ominąłem magistralę 485 i połączyłem bezpośrednio USARTy obu urządzeń. Niestety, czujnik nie odpowiada. Wysyłam mu jako pytanie jego nr, kod odczytu rejestrów (0x03), dwa bajty adresu pocz. (00,00,) itd. Na końcu wysyłana jest suma kontrolna, też dwa bajty. W opisie Modbusa znalazłem opis obliczania sumy CRC, wg której zrobiłem funkcję wyliczającą ją. Dla jednego bajtu wygląda tak:
dla nastepnych bajtów powtarza się procedurę, podstawiając odpowiednio bajt2, bajt3 itd... Nie wiem czy funkcja jest dobra, czujniki nie odpowiadają. Jeżeli ktoś robił cos z Modbusem może wie jak zrobić odpowiednią funkcję, lub może ta powyżej jest z jakimś błedem?
Dodano po 15 [minuty]:
Dla mnie procedura jest trochę bez sansu, bo traci się informacje o wartosci najmłodszego bitu danych - najpierw przesuniecie w prawo, potem sprawdzanie. Opis wygląda tak (i może coś źle rozumię):
1) załadowanie wartości FFFFh do 16-bitowego rejestru;
2) pobranie bajtu z bloku danych (zabezpieczana wiadomość) i wykonanie operacji EXOR
z młodszym bajtem rejestru, umieszczenie rezultatu w rejestrze;
3) przesunięcie zawartości rejestru w prawo o jeden bit połączone z wpisaniem 0 na
najbardziej znaczący bit (MSB=0);
4) sprawdzenie stanu najmłodszego bitu (LSB) w rejestrze, jeżeli jego stan równa się 0, to
następuje powrót do kroku 3 (kolejne przesunięcie) , jeżeli 1, to wykonywana jest operacja EXOR rejestru ze stałą A00lh;
5) powtórzenie kroków 3 i 4 osiem razy, co odpowiada przetworzeniu całego bajtu;
6) powtórzenie sekwencji 2, 3, 4, 5 dla kolejnego bajtu wiadomości, kontynuacja tego
procesu aż do przetworzenia wszystkich bajtów wiadomości;
7) zawartość rejestru po wykonaniu wymienionych operacji jest poszukiwaną wartością
CRC.
Ponieważ mam z tym problemy, ominąłem magistralę 485 i połączyłem bezpośrednio USARTy obu urządzeń. Niestety, czujnik nie odpowiada. Wysyłam mu jako pytanie jego nr, kod odczytu rejestrów (0x03), dwa bajty adresu pocz. (00,00,) itd. Na końcu wysyłana jest suma kontrolna, też dwa bajty. W opisie Modbusa znalazłem opis obliczania sumy CRC, wg której zrobiłem funkcję wyliczającą ją. Dla jednego bajtu wygląda tak:
Code: c
dla nastepnych bajtów powtarza się procedurę, podstawiając odpowiednio bajt2, bajt3 itd... Nie wiem czy funkcja jest dobra, czujniki nie odpowiadają. Jeżeli ktoś robił cos z Modbusem może wie jak zrobić odpowiednią funkcję, lub może ta powyżej jest z jakimś błedem?
Dodano po 15 [minuty]:
Dla mnie procedura jest trochę bez sansu, bo traci się informacje o wartosci najmłodszego bitu danych - najpierw przesuniecie w prawo, potem sprawdzanie. Opis wygląda tak (i może coś źle rozumię):
1) załadowanie wartości FFFFh do 16-bitowego rejestru;
2) pobranie bajtu z bloku danych (zabezpieczana wiadomość) i wykonanie operacji EXOR
z młodszym bajtem rejestru, umieszczenie rezultatu w rejestrze;
3) przesunięcie zawartości rejestru w prawo o jeden bit połączone z wpisaniem 0 na
najbardziej znaczący bit (MSB=0);
4) sprawdzenie stanu najmłodszego bitu (LSB) w rejestrze, jeżeli jego stan równa się 0, to
następuje powrót do kroku 3 (kolejne przesunięcie) , jeżeli 1, to wykonywana jest operacja EXOR rejestru ze stałą A00lh;
5) powtórzenie kroków 3 i 4 osiem razy, co odpowiada przetworzeniu całego bajtu;
6) powtórzenie sekwencji 2, 3, 4, 5 dla kolejnego bajtu wiadomości, kontynuacja tego
procesu aż do przetworzenia wszystkich bajtów wiadomości;
7) zawartość rejestru po wykonaniu wymienionych operacji jest poszukiwaną wartością
CRC.