Witam.
Mam problem z protokołem MODBUS RTU na ATMega644, który błędnie interpretuje mi ramki.
Kod w BASCOM wygląda następująco:
Czyli standard jaki znajdzie się w podręczniku BASCOM'a.
Na początek kilka informacji, by ewentualnie wyeliminować jakieś wątpliwości:
- procesor jest mocny jak na potrzeby tego programu, ale jego rola, jak i program są znacznie rozbudowane, a 644 to minimum jakie potrzebuje;
- płytka jest kupna, to EvB 5.1 z and-tech i przy innych projektach nie stanowi problemu, więc to nie problem z wykonaniem prototypu,
- procesor ustawiony tak jak przyszedł z tą płytką - ma wgrany bootloader (to jest problemem?) i standardowe fusebit'y,
- BASCOM, bo korzystam już z tego co mam kiedyś napisane i raczej nie chciałbym tego przepisywać na inny język, a komunikacja MODBUS to ostatnia rzecz jakiej mi brakuje przy tym projekcie.
Płytka komunikuje (a właściwie nie komunikuje się) się z urządzeniem zewnętrznym przy pomocy MODBUS'a. Chciałbym to zrobić wykorzystując MODBUS RTU (teoretycznie zostaje mi jeszcze ASCII),a do zestawu mam podpięty jeszcze skaner nasłuchujący na RS485, by wstawiać własne ramki i nasłuchiwać co się dzieje na magistrali (bez skanera objawy są identyczne).
Prawidłowa ramka w transmisji wygląda następująco:
Zostawiam znaczniki czasu by było widać co pochodzi ze skanera.
Pierwsza to zapytanie wysłane do urządzenia, z którym chce połączyć mój procesor, druga odpowiedź z urządzenia. Takiej się spodziewałem więc wszystko jest OK - ale to ruch pomiędzy skanerem, a urządzeniem zewnętrznym - czyli urządzenia działają poprawnie, problem więc jest w moim urządzeniu.
Teraz co się dzieje na płytce po wgraniu przedstawionego powyżej programu.
Płytka po wgraniu oprogramowania widzi powyżej wykazane linie jako:
Czyli coś się łapie w ramce z oryginału, ale większość to informacji w ramce to śmieci.
Polecenie makebodbus użyte w programie zgodnie z dokumentacją powinno wysłać ramkę:
a wysyła:
lub
Jak widać w pierwszym przypadku, wynik jest nawet zbliżony, na końcu dodane są jednak wartości 00, co zważywszy że w ramce jest suma kontrolna całkowicie odpada.
Jak wyślę ramkę w postaci:
jest ona na płytce AVR odczytywana jako:
I jeszcze kilka przykładów, opisanych jako wysłana ramka ---> odczytana przez procesor ramka, może komuś pozwoli to na wysunięcie jakiś wniosków:
[12:04:15 ---] 01 ---> 01,
[12:06:37 ---] 01 AB ---> 01,F5,
[12:13:15 ---] 01 AB 02 ---> 01,35,
[12:14:19 ---] 01 AB 02 CD ---> 01,35,CD,
[12:15:28 ---] 01 AB 02 CD 03 ---> 01,35,CD,E0,
[12:17:29 ---] 01 AB 02 CD 03 EF ---> 01,35,CD,A0,FF,
[12:19:09 ---] 01 AB 02 CD 03 EF 04 --- 01,35,CD,A0,8F,
Może ktoś wie co tu jest nie tak? Bo ja już chyba poległem, na temacie który wygląda na prosty. Prędkości na RS są prawidłowe, a odebrane wartości nie są losowe, bo za każdym razem są identyczne.
Pozdrawiam wszystkich czytających:
Chris
Mam problem z protokołem MODBUS RTU na ATMega644, który błędnie interpretuje mi ramki.
Kod w BASCOM wygląda następująco:
Code: basic4gl
Czyli standard jaki znajdzie się w podręczniku BASCOM'a.
Na początek kilka informacji, by ewentualnie wyeliminować jakieś wątpliwości:
- procesor jest mocny jak na potrzeby tego programu, ale jego rola, jak i program są znacznie rozbudowane, a 644 to minimum jakie potrzebuje;
- płytka jest kupna, to EvB 5.1 z and-tech i przy innych projektach nie stanowi problemu, więc to nie problem z wykonaniem prototypu,
- procesor ustawiony tak jak przyszedł z tą płytką - ma wgrany bootloader (to jest problemem?) i standardowe fusebit'y,
- BASCOM, bo korzystam już z tego co mam kiedyś napisane i raczej nie chciałbym tego przepisywać na inny język, a komunikacja MODBUS to ostatnia rzecz jakiej mi brakuje przy tym projekcie.
Płytka komunikuje (a właściwie nie komunikuje się) się z urządzeniem zewnętrznym przy pomocy MODBUS'a. Chciałbym to zrobić wykorzystując MODBUS RTU (teoretycznie zostaje mi jeszcze ASCII),a do zestawu mam podpięty jeszcze skaner nasłuchujący na RS485, by wstawiać własne ramki i nasłuchiwać co się dzieje na magistrali (bez skanera objawy są identyczne).
Prawidłowa ramka w transmisji wygląda następująco:
Code: bash
Zostawiam znaczniki czasu by było widać co pochodzi ze skanera.
Pierwsza to zapytanie wysłane do urządzenia, z którym chce połączyć mój procesor, druga odpowiedź z urządzenia. Takiej się spodziewałem więc wszystko jest OK - ale to ruch pomiędzy skanerem, a urządzeniem zewnętrznym - czyli urządzenia działają poprawnie, problem więc jest w moim urządzeniu.
Teraz co się dzieje na płytce po wgraniu przedstawionego powyżej programu.
Płytka po wgraniu oprogramowania widzi powyżej wykazane linie jako:
Code: bash
Czyli coś się łapie w ramce z oryginału, ale większość to informacji w ramce to śmieci.
Polecenie makebodbus użyte w programie zgodnie z dokumentacją powinno wysłać ramkę:
Code: bash
a wysyła:
Code: bash
lub
Code: bash
Jak widać w pierwszym przypadku, wynik jest nawet zbliżony, na końcu dodane są jednak wartości 00, co zważywszy że w ramce jest suma kontrolna całkowicie odpada.
Jak wyślę ramkę w postaci:
Code: bash
jest ona na płytce AVR odczytywana jako:
Code: bash
I jeszcze kilka przykładów, opisanych jako wysłana ramka ---> odczytana przez procesor ramka, może komuś pozwoli to na wysunięcie jakiś wniosków:
[12:04:15 ---] 01 ---> 01,
[12:06:37 ---] 01 AB ---> 01,F5,
[12:13:15 ---] 01 AB 02 ---> 01,35,
[12:14:19 ---] 01 AB 02 CD ---> 01,35,CD,
[12:15:28 ---] 01 AB 02 CD 03 ---> 01,35,CD,E0,
[12:17:29 ---] 01 AB 02 CD 03 EF ---> 01,35,CD,A0,FF,
[12:19:09 ---] 01 AB 02 CD 03 EF 04 --- 01,35,CD,A0,8F,
Może ktoś wie co tu jest nie tak? Bo ja już chyba poległem, na temacie który wygląda na prosty. Prędkości na RS są prawidłowe, a odebrane wartości nie są losowe, bo za każdym razem są identyczne.
Pozdrawiam wszystkich czytających:
Chris