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

Arduino - komunikacja modbus rtu (jako master) z innym urządzenim

spec-miachl 02 Gru 2014 09:01 4014 7
REKLAMA
  • #1 14184242
    spec-miachl
    Poziom 13  
    Posty: 72
    Pomógł: 5
    Ocena: 20
    Posiadam pewne urządzenie, do którego można podpiąć konwerter TTL-RS485 i za pomocą komputera odczytać rejestry 30000 oraz 30001.

    Kolega bez konwertera TTL-RS485 połączył się programem Qmodbus i odczytał te dane. Jak zabrać się do tego z Arduino?

    Czy transmisja serial dla Arduino będzie odpowiednia??

    Serial1.print (v3,0x01)...
  • REKLAMA
  • #2 14184322
    krolikbest
    Poziom 11  
    Posty: 103
    Ocena: 58
    Zakładając, że to urządzenie obsługuje protokół Modbus RTU, to:
    - czy wiesz jak wygląda ramka w tym protokole? I jakie typy zapytań w nim występują?
    Jeśli tak, to musisz sobie "zaimplementować" ten protokół w kodzie programu na Arduino. Jeśli nie znasz protokołu, to najlepiej poczytaj tutaj.
    Pamiętaj też o wyliczaniu sumy kontrolnej CRC. Najlepiej sprawdź sobie swój algorytm tym kalkulatorem
    Na necie znajdziesz kilka gotowych rozwiązań wyliczania sumy kontrolnej. Tak z własnego doświadczenia dorzucę, że raczej dotyczą Modbusa w trybie ASCII, ale mała przeróbka wystarczy, aby taki algorytm nadawał się do trybu RTU.

    Pozdrawiam,
  • REKLAMA
  • #3 14184342
    spec-miachl
    Poziom 13  
    Posty: 72
    Pomógł: 5
    Ocena: 20
    Wiem jak wygląda ramka

    Zastanawiam się tylko jak to ruszyć.
    Podpiąć RX i TX z Atmegi do urządzenia ?
    i wysyłać jako serial 01 03 00 00 00 0a

    Reszta jest już gotowa - web serwer wyświetlający i wysyłające dane do neta
  • REKLAMA
  • #4 14184563
    krolikbest
    Poziom 11  
    Posty: 103
    Ocena: 58
    Z Arduino nie pracuję, ale moje oprogramowanie na pc-cie właśnie tak działa, portem szeregowym (rs232) wysyłam ramkę na jakieś tam urządzenie i z tego urządzenia również odbieram ramkę na tym porcie. Pecet jest Masterem i wysyła ramki w pętli czasowej co 200 ms.
    Wspomniałeś tylko o poziomie napięć TTL, więc pamiętaj o przetworzeniu sygnału, a jeżeli urządzenie pracuje na rs485 to jeszcze konwerter rs232-rs485.

    Pozdrawiam,
  • #5 14184611
    spec-miachl
    Poziom 13  
    Posty: 72
    Pomógł: 5
    Ocena: 20
    Może nie za dokładnie wyjaśniłem:

    Urządzenie ma wyjście TTL po podpięciu do TTL - USB komputera otrzymuje dane

    Standardowo w wejście TTL urządzenia można wpiąć konwerter TTL-RS485 i dalej RS485-USB

    Ja chce uzyskać coś w stylu:

    Urządzenie - TTL - Arduino - RJ45 - Http

    Część Arduino - RJ45 - Http (mam gotową)

    Całość ma na celu stworzenie web serwera dla urządzania z wyjściem TTL w standardzie Modbus RTU
  • #6 14188455
    jestam
    Specjalista Automatyk
    Posty: 1794
    Pomógł: 210
    Ocena: 144
    vicmyc napisał:
    i wysyłać jako serial 01 03 00 00 00 0a

    Raczej jako ciąg bajtów 01 03 00 00 00 0a c5 cd - suma kontrolna!

    krolikbest napisał:
    Jeśli nie znasz protokołu, to najlepiej poczytaj tutaj[url].

    To źródło pomija wiele istotnych informacji. Bardzo wiele. Lepiej [url]http://www.modbus.org/specs.php


    krolikbest napisał:
    Na necie znajdziesz kilka gotowych rozwiązań wyliczania sumy kontrolnej. Tak z własnego doświadczenia dorzucę, że raczej dotyczą Modbusa w trybie ASCII, ale mała przeróbka wystarczy, aby taki algorytm nadawał się do trybu RTU.

    Nie chcę się czepiać, ale ta mała przeróbka to napisanie od nowa. Nie ma problemu ze znalezieniem przykładu wyliczającego CRC.
  • REKLAMA
  • #7 14188573
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    jestam napisał:
    Raczej jako ciąg bajtów 01 03 00 00 00 0a c5 cd - suma kontrolna!

    Adresu 30000 raczej tym nie odczyta.
    jestam napisał:
    Nie ma problemu ze znalezieniem przykładu wyliczającego CRC.

    Daleko nie trzeba szukać
    https://www.elektroda.pl/rtvforum/topic2306451.html#10954067
  • #8 14188950
    jestam
    Specjalista Automatyk
    Posty: 1794
    Pomógł: 210
    Ocena: 144
    michalko12 napisał:
    Adresu 30000 raczej tym nie odczyta.


    Tak zupełnie na marginesie, istnieje konwencja zapisu adresów, w której pierwsza cyfra określa strefę pamięci: 3 to Input Registers (jak kod rozkazu).

    @vicmyc: Gdybyś miał wątpliwości jaką ramkę wysłać, wstaw DTRkę urządzenia.
    Pamiętaj też, że adresy w ramce są liczone od 0 a w samym protokole od 1. Częsty błąd to próba odczytu adresu o jeden w górę lub w dół.

Podsumowanie tematu

✨ Użytkownik poszukuje sposobu na komunikację z urządzeniem obsługującym protokół Modbus RTU za pomocą Arduino, korzystając z konwertera TTL-RS485. Wskazówki dotyczące implementacji protokołu obejmują zrozumienie struktury ramki Modbus oraz konieczność obliczenia sumy kontrolnej CRC. Użytkownik planuje podłączyć RX i TX z Atmegi do urządzenia i wysyłać odpowiednie ramki. W dyskusji podkreślono, że adresy w ramkach są liczone od 0, co jest częstym błędem. Dodatkowo, zasugerowano korzystanie z dostępnych zasobów online w celu lepszego zrozumienia protokołu.
Wygenerowane przez model językowy.
REKLAMA