Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

MODBUS AVR BASCOM - BASCOM - Modbus RTU błędnie interpretowane ramki

sikp 01 Jun 2015 13:45 1815 0
  • #1
    sikp
    Level 1  
    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:

    Code: basic4gl
    Log in, to see the code


    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
    Log in, to see the code


    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
    Log in, to see the code


    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
    Log in, to see the code

    a wysyła:
    Code: bash
    Log in, to see the code

    lub
    Code: bash
    Log in, to see the code


    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
    Log in, to see the code

    jest ona na płytce AVR odczytywana jako:
    Code: bash
    Log in, to see the code


    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
    [28-30.06.2022, targi] PowerUP EXPO 2022 - zasilanie w elektronice. Zarejestruj się za darmo