Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

vicmyc 02 Gru 2014 09:01 2049 7
  • #1 02 Gru 2014 09:01
    vicmyc
    Poziom 7  

    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)...

    0 7
  • #2 02 Gru 2014 09:55
    krolikbest
    Poziom 9  

    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,

    0
  • #3 02 Gru 2014 10:03
    vicmyc
    Poziom 7  

    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

    0
  • #4 02 Gru 2014 11:52
    krolikbest
    Poziom 9  

    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,

    0
  • #5 02 Gru 2014 12:17
    vicmyc
    Poziom 7  

    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

    0
  • #6 03 Gru 2014 16:24
    jestam
    Specjalista Automatyk

    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.

    0
  • #8 03 Gru 2014 18:50
    jestam
    Specjalista Automatyk

    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ół.

    0