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

Jak połączyć dwa bajty w jedną zmienną w AVR dla Modbus?

marcinpie 12 Gru 2005 11:39 2688 7
REKLAMA
  • #1 2076379
    marcinpie
    Poziom 11  
    Posty: 28
    Ocena: 2
    Witam.Usiłuje zmusić procesorek avr do pracy pod modbusem niestety zabrakło mi wiedzy, a konkretnie wartość pojedynczej zmiennej składa się z dwóch bajtów w jaki sposób wyliczyć wartość tych dwóch bajtów. Nie chodzi mi konkretnie o kod programu a raczej o samą ideę jak się za to zabrać.
  • REKLAMA
  • #2 2076797
    genetix
    Poziom 24  
    Posty: 669
    Pomógł: 42
    marcinpie napisał:
    niestety zabrakło mi wiedzy, a konkretnie wartość pojedynczej zmiennej składa się z dwóch bajtów w jaki sposób wyliczyć wartość tych dwóch bajtów. (...)


    Na mój gust - jest to nie po polsku.

    Wartość bajtów jest taka jaka jest - po co ją wyliczać? Jak bajt młodszy ma np. wartość 0x78 a starszy 0xA7 to wartość całej zmiennej jest 0xA778.

    Sprecyzuj o co Ci chodzi.
  • REKLAMA
  • #3 2077754
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    marcinpie napisał:
    konkretnie wartość pojedynczej zmiennej składa się z dwóch bajtów w jaki sposób wyliczyć wartość tych dwóch bajtów
    Sory, ale nie rozumiem treści pytania, modbus jest jedynie specyfikacją warstwy transportowej, a jej zadaniem jest przenosić dane, niezależnie od wartości samych danych. To co jest zapisywane lub odczytywane z rejestru przez modbus zależy tylko i wyłącznie od specyfikacji urządzenia.
  • #4 2078997
    marcinpie
    Poziom 11  
    Posty: 28
    Ocena: 2
    Spróbuje wyjaśnić na przykładzie o co mi chodzi. Pomijając całe adresowanie i biorąc pod uwagę tylko dane jeżeli pierwszy bajt ma wartość 7 a drugi 8 to program do obsługi modbusa odczytuje to jako 1800 a jeżeli pierwszy bajt przyjmie wartość 7 a drugi 0 to po odczytaniu jest to 1792, a w jaki sposób uzyskać wartości ujemne
  • #5 2079439
    sepher
    Poziom 19  
    Posty: 301
    Pomógł: 21
    Ocena: 4
    Połącz binarne reprezentacje 7 binarnie - 111, 0 binarnie - wiadomo :). Wysyłasz 00000111 00000000 (spacja dzieli poszczególne bajty). Połącz to w jeden ciąg i przelicz na postać dziesiętną ;). Widać program interpretuje te 2 bajty jako składową całej,16-bitowej liczby, a nie poszczególne cyfry. Co do kodowania liczb ujemnych - spróbuj wysłać coś, co na najstarszej pozycji ma '1', może jest to zwykłe kodowanie z bitem znaku, może z uzupełnieniem do 2.
  • REKLAMA
  • #6 2080300
    DosinskY
    Poziom 19  
    Posty: 332
    Pomógł: 24
    Ocena: 9
    Witanko,

    Jak patrze na te cyferki to pierwsze co widze to:

    bajt1*256+bajt2

    pzdr
    Dosinsky

    dodano:
    hehe cyferki widze, ale nie zobaczylem tego ze sepher tez je widzi i juz sie tym pochwalil ;)
  • REKLAMA
  • #7 2080670
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    marcinpie napisał:
    a w jaki sposób uzyskać wartości ujemne
    Przeczytaj dokładnie to co napisałem poprzednio, modbus odpowiada tylko za transport danych a interpretacją zajmuje się już urządzenie. To czy dane są interpretowane jako liczba ze znakiem czy bez znaku, albo jako liczba bitowa zależy od urządzenia a nawet od numeru rejestru. Tak jak koledzy napisali najczęściej będzie to kod U2, ale równiedobrze może to być dowolny rodzaj kodu, np znak-liczba.
  • #8 2081914
    marcinpie
    Poziom 11  
    Posty: 28
    Ocena: 2
    Dzięki za pomoc no cóż wszystko najpierw musi być trudne zanim stanie się proste .

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy łączenia dwóch bajtów w jedną zmienną 16-bitową w mikrokontrolerach AVR komunikujących się przez protokół Modbus. Podkreślono, że Modbus jest jedynie warstwą transportową i nie interpretuje danych, a ich znaczenie zależy od urządzenia i specyfikacji rejestru. Wartość zmiennej 16-bitowej można uzyskać przez połączenie bajtów w postaci: (bajt starszy * 256) + bajt młodszy, co odpowiada złożeniu ich binarnych reprezentacji. W przypadku liczb ujemnych sugerowano sprawdzenie kodowania znaków, np. kodu U2 (uzupełnienie do dwóch) lub innego formatu z bitem znaku. Przykłady wartości bajtów i ich interpretacji wskazują, że program odczytuje dane jako liczbę całkowitą 16-bitową, a nie jako oddzielne cyfry.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA