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 [Modbus TCP] Komunikacja. Szukam biblioteki modbusowej.

Wojciech. 12 Mar 2020 18:25 1326 4
REKLAMA
  • #1 18526661
    Wojciech.
    Poziom 37  
    Posty: 3595
    Pomógł: 319
    Ocena: 467
    Dzień dobry,

    Czy ktoś siedzi w temacie komunikacji Arduino Modbus TCP a urządzeniami przemysłowymi typu PLC itd?

    Generalnie szukam biblioteki modbusowej w której będą mógł ustawić przesunięcie adresowe, żeby np przy wysyłaniu rejestru zmiennej nie trafiał pod adres 0x4000x tylko załóżmy 0x4000x + 0x3000.

    Np biblioteka mudbus.h ma numeracje od 0x40001 i nie wiele bo tylko 126 pozycji.

    Ktoś ma jakieś pomysły?
  • REKLAMA
  • #2 18526748
    PTNW
    Poziom 13  
    Posty: 59
    Pomógł: 5
    Ocena: 15
    Witam,

    Nie rozumiem trochę pytania.
    1. adres 0X4xxx odpytuje sie FC3 i zapisuje FC6 lub 16
    2. adres 0X3xxx to Input Register i czyta się FC4
    Pytanie jest czy twoje urządzenie to Master czy Slave. Jeśli Master to do rejstru 0X3xxx nic nie zapiszesz bo to jest rejestr tylko do odczytu. Generalnie polecam stronę simplymodbus.ca Wiele wyjaśnia
  • REKLAMA
  • #3 18526900
    Wojciech.
    Poziom 37  
    Posty: 3595
    Pomógł: 319
    Ocena: 467
    @PTNW
    PTNW napisał:
    Nie rozumiem trochę pytania.


    Bazując na twoim przykładzie
    006B: The Data Address of the first register requested. (40108-40001 = 107 =6B hex)

    Tutaj wysyłamy dane pod rejestr 107 dziesiętnie, a ja chcę wysłać pod 40001+ 12289(0x3000). Zwykły offset, w symulatorach to nie problem, ale z biblioteką w arduino jest już problem.
  • REKLAMA
  • #4 18531482
    PTNW
    Poziom 13  
    Posty: 59
    Pomógł: 5
    Ocena: 15
    Witam,
    Rozumiem już co chcesz osiągnąć. Po pierwsze to co chcesz zrobić nie jest zgodne z standardem ModBus, gdyż rejestry powinny się kończyć na adresie 0x270E, a Ty chcesz wysłać (odebrać) coś z wyższego rejestru 0x3001. Symulatory pozwalają na to z prostego względu - w ramce ModBus za bajtem z nr funkcji podaje się szesnastobitowy adres. Czyli np. FC3 mówi już że chcemy odczytać wartość z HoldingRegister (4xxxx), natomiast kolejne dwa bajty to adres - w Twoim przypadku 0x3001. Inaczej rzecz ujmując to poza standardem możesz mieć adres Holding Register od 4 00000 (0x00) do 4 65535(0xFFFF). Może lepiej to wyjaśni przykład, który chcesz osiągnąć i działa na symulatorach.

    Ramka ModBus TCP którą wysyłasz:
    0001 0000 0006 01 03 3001 0002

    0001 - ID transakcji
    0000 - zawsze zera (ID protokołu)
    0006 - ilość bajtów następujących
    01 - adres slava
    03 - nr funkcji, czytanie Holding Register (4xxxx)
    3001 - adres rejestru 12 289 gdy liczymy od 400000 lub 12 290 gdy liczmy od 400001
    0002 - ilość rejestrów, które chcesz odczytać.

    Jak sam widzisz biblioteka nie działa, bo to co chcesz zrobić jest poza standardem ModBus.
  • #5 18532817
    Wojciech.
    Poziom 37  
    Posty: 3595
    Pomógł: 319
    Ocena: 467
    PTNW napisał:
    Rozumiem już co chcesz osiągnąć. Po pierwsze to co chcesz zrobić nie jest zgodne z standardem ModBus, gdyż rejestry powinny się kończyć na adresie 0x270E,

    Rzeczywiście, zgodnie ze standardem możemy użyć tylko 9999 rejestrów.
REKLAMA