Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 21 maja 2025, o 09:40


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
    Autor Wiadomość
    PostNapisane: 9 lis 2024, o 02:41 
    Offline
    Użytkownik

    Dołączył(a): 25 maja 2014
    Posty: 92
    Lokalizacja: Krosno
    Pomógł: 0

    Hej,
    witam wszystkich forumowiczów, dawno mnie tu nie było :)
    Chciałbym się z wami podzielić tym czego dowiedziałem się na temat MODBUS RTU.
    Tworzę sobie mały układ, który będzie Serwerem MODBUS i przy okazji musiałem trochę wgryźć się w temat:)

    Może komuś się przyda, a po drugie może ktoś zweryfikuje czy nie piszę głupot:)

    Przepraszam za nie uporządkowany wygląd postu ale miałem ładnie poukładane, to jak wkleiłem treść, wszystko się porozjeżdżało :oops:
    Jest na to jakiś sposób??

    Wszystko co tu opisałem jest na podstawie :

    strony http://www.modbus.org

    MODBUS APPLICATION PROTOCOL SPECIFICATION V1.1b3

    oraz https://www.modbustools.com/modbus.html

    Założenie : serwer MODBUS RTU nie musi posiadać obsługi wszystkich rozkazów MODBUS wymienionych
    w standardzie.

    /*****************************************************************************************************************

    Opis budowy ramki MODBUS RTU
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Każdą wiadomość rozpoczyna i kończy tzw. cisza na łączu. Jest to czas bezczynności,
    trwający 3,5 x czas pojedynczego znaku.

    Odstęp pomiędzy wysyłanymi znakami nie może być dłuższy niż 1,5 x czas pojedynczego znaku.

    Czas ten jest zależny od ustawienia transmisji:

    - BAUDRATE
    - ilość bitów danych danych (założenie - 8 bitów)
    - czy jest bit parzystości (założenie - brak)
    - ile jest bitów stopu (założenie - 1 bit)

    Najdłuższa ramka UART 12 bitów:

    | START | Bit 1 | Bit 2 | Bit 3 | Bit 4 | Bit 5 | Bit 6 | Bit 7 | Bit 8 | parzystość | STOP | STOP |

    przy założeniu założeniach podanych wyżej, długość ramki wynosi: 10 bitów

    | START | Bit 1 | Bit 2 | Bit 3 | Bit 4 | Bit 5 | Bit 6 | Bit 7 | Bit 8 | STOP |

    obliczenie czasu trwania jednej ramki UART:

    t = (1/BAUDRATE)[s]

    t3,5 = 3,5 * t = 3,5 * (1/BAUDRATE)

    Przykładowo dla BAUDRATE = 9600 i długości ramki 10 bitów:

    t = (1/9600) = 1041,6667 mikro sekundy
    t1,5 = 1,5 * 1041,6667 = 1562,5 mikro sekundy
    t3,5 = 3,5 * 1041,6667 = 3645,8333 mikro sekundy

    Maksymalna długość ramki MODBUS RTU dla RS232 / RS485 to: 256 bajtów

    - 1 bajt adres SLAVE
    - 1 bajt kod funkcji (rozkaz)
    - 252 bajty dane
    - 2 bajty suma kontrolna CRC

    Co reprezentują przesyłane wartości w polu "DANE" zależy od konkretnej funkcji, która ma być wykonana.
    Np. adres początkowy, liczbę zmiennych, offsets, dane do zapisu rejestrów itp.

    Dane mogą być 8 bitowe lub 16 bitowe.

    Dane 16 bitowe dzielone są na bajty i wysyłane w kolejności: Hi Lo

    Suma CRC jest 16 bitowa i wysyłana w kolejności: Lo Hi

    przykład ramki:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Ramki MODBUS RTU podzielone są na 3 rodzaje:

    - zapytanie, {adres slave, kod fukcji, dane, CRC}

    - odpowiedź, {adres slave, kod fukcji, dane, CRC}

    - odpowiedź na "wyjątek" - zwraca się kod błędu {adres slave, kod funkcji wyjątku, kod błędu }

    kod funkcji wyjątku = 0x80 + kod funkcji MODBUS np. 0x80 + 0x03 = 0x83
    kod błędu - opisane poniżej


    Kiedy klient wysyła zapytanie do serwera, to oczekuje poprawnej odpowiedzi.
    Mogą być 4 odpowiedzi:

    1. Jeśli serwer otrzyma zapytanie bez błędu komunikacji, to zwraca poprawną odpowiedź

    2. Jeśli serwer nie otrzyma zapytania z powodu błędu komunikacji, to nie zwraca żadnej odpowiedzi
    Klient stwierdzi, że został przekroczony TIME-OUT.

    3. Jeśli serwer otrzyma zapytanie ale sumy CRC nie będą się zgadzać, to nie zwraca żadnej odpowiedzi
    Klient stwierdzi, że został przekroczony TIME-OUT.

    4. jeśli serwer otrzyma zapytanie bez błędu komunikacji, ale nie może go obsłużyć, to zwróci
    odpowiedź z kodem błędu.

    Kody błędów:

    0x01 ILLEGAL FUNCTION serwer nie obsługuje kodu funkcji zawartego w zapytaniu
    0x02 ILLEGAL DATA ADDRESS adres danych otrzymany w zapytaniu jest nie poprawny lub podany
    adres z ilością rejestrów do odczytu jest nie poprawny.
    Np. serwer ma 100 rejestrów (adresy od 0 do 99), a w zapytaniu
    podajemy adres 101 lub podajemy adres 90 a ilość rejestrów
    do odczytu 20.

    0x03 ILLEGAL DATA VALUE dana (dane) zawarte w zapytaniu nie są dopuszczalne dla serwera
    Np. przekroczona wartość jakiejś nastawy

    0x04 SERVER DEVICE FAILURE Wystąpił nieodwracalny błąd, gdy serwer próbował wykonać
    żądaną akcję

    0x05 ACKNOWLEDGE opis str. 48 dokumentu źródłowego
    0x06 SERVER DEVICE BUSY opis str. 48 dokumentu źródłowego
    0x08 MEMORY PARITY ERROR opis str. 48 dokumentu źródłowego
    0x0A GATEWAY PATH UNAVAILABLE opis str. 49 dokumentu źródłowego
    0x0B GATEWAY TARGET DEVICE opis str. 49 dokumentu źródłowego
    FAILED TO RESPOND


    Typy danych w MODBUS (Teoria)

    W protokole MODBUS zdefiniowano 2 rodzaje danych
    - cewki
    - rejestry

    Każdy rodzaj danych ma przypisane zakresy adresów.

    UWAGA: TO JAKIE DANE I W JAKICH ADRESACH BĘDĄ WYKOŻYSTANE DANE OKREŚLONE JEST PRZEZ TWÓRCĘ "SLAVE"

    Cewki - reprezentują bity - mogą reprezentować stany fizyczne wejść, wyjść
    Rejestry - 16 bitowe - mogą być tylko odczytywane lub odczytywane i zapisywane.
    Jakie mają znaczenie to zależy od twórcy

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    TAK NAPRAWDĘ TO OD NAS ZALEŻY JAK SOBIE ZORGANIZUJEMY PAMIĘĆ, ALE MUSIMY SIĘ TRZYMAĆ ZASAD
    I PRZEDEWSZYSTKIM OPISAĆ M A P Ę P A M I Ę C I, CZYLI OKREŚLIĆ CO ZA CO ODPOWAIDA
    A TO WSZYSTJKO ZALEŻY OD TEGO CO DANY UKŁAD MA ROBIĆ.



    Opisy kodów funkcji MODBUS - nie wszystkie są wymienione

    Kody funkcji mogą przyjmować wartość od 1 do 127

    Kody funkcji dzielimy na:
    - Public Function Codes - kody funkcji publiczne zakres 1 - 64 i 111 - 127
    - User-Defined Function Codes - definiowane przez użytkownika zakres 65 - 72 i 100 - 110
    - Reserved Function Codes - kody zastrzeżone


    KODY PUBLICZNE - najbardziej przydatne (moim zdaniem) a i tak nie wszystkie się wykorzystuje

    0x01 Read Coils - odczyt wyjść bitowych
    0x02 Read Discrete Inputs - odczyt wejść bitowych
    0x03 Read Holding Registers - odczyt rejestrów z podanego zakresu
    0x04 Read Input Register - odczyt rejestrów wejściowych
    0x05 Write Single Coil - zapis pojedynczego bitu
    0x06 Write Single Register - zapis pojedynczego rejestru
    0x07 Read Exception status - odczyt statusu wyjątku urządzenia SLAVE
    0x08 Diagnostic - test diagnostyczny
    0x0F Write Multiple Coils - zapis bitów z podanego zakresu
    0x10 Write Multiple Registers - zapis rejestrów z podanego zakresu
    0x11 Report Server ID - identyfikacja urządzenia SLAVE
    0x17 Read/Write Multiple Registers

    Pozostałe kody w tabeli na stronie 11 podanego wcześniej dokumentu.

    Przykłady jak wyglądają ramki dla konkretnych kodów funkcji: źródło https://www.modbustools.com/modbus.html

    Przykład kod funkcji 0x03

    Zapytanie z MASTER: HEX

    Slave Address 01
    Function 03
    Starting Address Hi 00
    Starting Address Lo 00
    Quantity of Registers Hi 00
    Quantity of Registers Lo 02
    Error Check Lo C4
    Error Check Hi 0B

    Total Bytes 8

    Wyliczenie adresu początkowego : Adres, który chcemy odczytać - Adres pierwszego rejestru
    czyli 4001 - 4001 = 0 dlatego :
    Starting Address Hi 0x00
    Starting Address Lo 0x00

    jeśli chcielibyśmy czytać od adresu 4020 to robimy obliczenie : 4020 - 4001 = 19 (0x13) i wtedy byłoby:
    Starting Address Hi 0x00
    Starting Address Lo 0x13

    Odpowiedź od SLAVE: HEX

    Slave Address 01
    Function 03
    Byte Count 04
    Data Hi 00
    Data Lo 06
    Data Hi 00
    Data Lo 05
    Error Check Lo DA
    Error Check Hi 31

    Total Bytes 9



    Przykład kod funkcji 0x16

    Zapytanie z MASTER: HEX

    Slave Address 11
    Function 10
    Starting Address Hi 00
    Starting Address Lo 01
    Quantity of Registers Hi 00
    Quantity of Registers Lo 02
    Byte Count 04
    Data Hi 00
    Data Lo 0A
    Data Hi 01
    Data Lo 02
    Error Check Lo C6
    Error Check Hi F0

    Total Bytes 13


    Wyliczanie sumy CRC

    Sumę CRC wylicza się z:
    - Adresu SLAVE
    - kodu funkcji
    - danych

    np: HEX
    Slave Address 11
    Function 10
    Starting Address Hi 00
    Starting Address Lo 01
    Quantity of Registers Hi 00
    Quantity of Registers Lo 02
    Byte Count 04
    Data Hi 00
    Data Lo 0A
    Data Hi 01
    Data Lo 02

    Wynikiem obliczeń jest :
    HEX
    Error Check Lo C6
    Error Check Hi F0


    ******************************************************************************************************************/

    i jeszcze funkcja do obliczania CRC na podstawie http://www.modbus.org
    wynik 16 bitowy - przy czym starszy bajt to Lo CRC a młodszy bajt to Hi CRC


    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    _________________
    Artur



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 lis 2024, o 11:41 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27402
    Lokalizacja: Szczecin
    Pomógł: 1043

    No to kolega ślicznie pojechał z opisem i teorią modbusa, brawo.

    Jedyne co podpowiem to odnośnie samego początku, bo napisałeś troszkę może nieprecyzyjnie:

    Artur_26 napisał(a):
    Każdą wiadomość rozpoczyna i kończy tzw. cisza na łączu. Jest to czas bezczynności,
    trwający 3,5 x czas pojedynczego znaku.


    Wynikałoby z tego opisu że po pierwsze ta cisza to składnik ramki a gorsze, że musi wystąpić dwa razy, chyba że źle rozumiem twoje słowa.

    CISZA w modbus rtu to rzeczywiście 3,5 znaku ale nie ma to nic wspólnego z samą ramką. To chodzi o CZAS między ramkami, i to czas MINIMALNY, nie powinien być krótszy niż 3,5 znaku, za to może być czas ciszy swobodnie dłuższy niż 3,5 znaku.

    Oznacza to że np przy 9600 minimalny czas >= 3,5ms musi być zapewniony między ramkami

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 lis 2024, o 15:17 
    Offline
    Użytkownik

    Dołączył(a): 25 maja 2014
    Posty: 92
    Lokalizacja: Krosno
    Pomógł: 0

    Cześć,
    Mirku dziękuję za sprostowanie, faktycznie napisałem to dość nie precyzyjnie, bo faktycznie z mojego opisu wynika, że w skład ramki wchodzi ten odstęp:)
    Tak dokładnie chciałem przekazać, że czas pomiędzy ramkami nie może być krótszy niż 3,5 znaku.
    Generalnie chciałem przekazać jak na poniższym rysunku:

    Obrazek

    Dzięki:)

    Pozdrawiam
    Serdecznie

    _________________
    Artur



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO