logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

sikp 01 Cze 2015 13:45 2244 0
REKLAMA
  • #1 14737110
    sikp
    Poziom 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:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    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:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    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:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    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ę:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod

    a wysyła:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod

    lub
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    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:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod

    jest ona na płytce AVR odczytywana jako:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    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
  • REKLAMA
REKLAMA