Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

MODBUS i 2150 Area Velocity Flow Module

27 Jul 2010 16:06 1758 10
  • Level 25  
    Witam.
    Próbuję nawiązać komunikację z urządzeniem Isco 2150 Area Velocity Flow Module ( http://www.houm.no/filestore/PDF/Vannforsynin...jteknologi/Teledyne_ISCO/2150_Flow_Module.pdf ). Teorię MODBUS'a przerobiłem, ale ciągle mam brak odpowiedzi od urządzenia.

    Czy ktoś ma jakieś doświadczenie w komunikacji z tym urządzeniem po MODBUS'ie ?

    Z tego co wyczytałem w instrukcji ( http://www.isco.com/pcfiles/PartPDF4/UP00142E.pdf , od strony 59 zaczyna się opis części związanej z modbusem), zaimplementowany protokół to MODBUS ASCII.

    W jaki sposób sprawdzić jaki adres ma urządzenie, z którym próbuję się skomunikować? Jakie mają być ustawienia transmisji? Z tego co wyczytałem o modbusie ascii to 7 bitów danych, 1 startu, no i 2 stopu jeżeli bez parity, a jeżeli z parity to jeden na niego i jeden na stop. Ale co z Baud-rate'em? No i czy te ustawienia są konieczne, czy mogę korzystać z 8 bitów danych, jednego stopu, i baud'a 9600?

    Jedyne co znajduje się w tej instrukcji to opis i adresy rejestrów, no i informacja:
    "4.2.1 Establishing Communication
    There are several different communications protocols supported
    in the 2100 series that require auto-baud rate detection. Because
    of this, each time a modbus connection is made, the module uses
    a polling mechanism to repeatedly send a command until a
    response is received. It may take up to 20 command retries
    before the module has identified the baud rate and a response is
    received."

    Jakby ktoś miał jakieś doświadczenia z tym urządzeniem i modbus'em to proszę o pomoc.
  • Helpful post
    Level 15  
    Witam
    Ściągnij sobie program do podgladu Modbusa, np. ze strony modbus.pl, jest tam bardzo dobry program napisany w javie z pomocą którego wykryjesz jaki jest IP dołączonego węzła ( działa na zasadzie Master Slave). Jeśli urządzenie to pracuje w trybie RTU to polecałbym pasywny skaner linii Modbus RTU ze strony wkmiecik.com ModInzRTU.
    Do ciągłego odczytu danych potrzeby jest driver MODBUS oraz program, klient odpytujący interesujący Cię węzeł
    Z opisu wynika że szybkość łącza jest określana automatycznie. Przeczytaj uważnie instrukcję - pdf, którą podałeś w poście. Wszystkie informacje jak się skomunikować z przeływomierzem masz dokładnie opisane.
  • Level 25  
    Urządzenie pracuje na MODBUS ASCII, niestety wszystkie programy z modbus.pl są do RTU.

    Chyba rozgryzłem już adresowanie tych modułów. One mogą być dołączane do siebie w taki stos, maxymalnie do 4. Pod adresem pierwszym są rejestry dające informacje o ilości modułów, a pod następnymi adresami ( 2+(N-1) ) są już rejestry poszczególnych modułów. Czyli jeżeli mam tylko jeden moduł podłączony, to powinienem ramki adresować na adres 2.

    Teraz mam problem z wyborem rejestrów. Wg tabeli 4-2 z wyżej zamieszczonej instrukcji, jeżeli chcę odczytać model number, znajduję się on w rejestrach od 1-4. Do odczytania ich mogę użyć funkcji 03 (Read Holding Registers) ? W jaki sposób powinienem podać adres pierwszego adresu? Jako 0, 1 czy 400001 ? Bo mam wrażenie że nie udaje mi się nawiązać kontaktu z tym urządzeniem, bo źle podaje numer rejestru, który chce oczytać.

    Ale czy to nie powinno być tak, że urządzenie zwróci mi ramkę z błędem, jeżeli źle podaje funkcje albo numery rejestrów?
  • Helpful post
    Level 15  
    W punkcie 4.2 (pdf) masz podany sposób na komunikacje ciągłą wykorzystaniem OPC i wizualizacji Wonderware (Intouch) w pakiecie tym znajdziesz driver do swojego przepływomierza. Po uruchomieniu OPC i skomunikowaniu się poprzez driver Modbusowy(ASCII) OPC wyrzuci Ci wszystko to co jest możliwe do odczytu z przepływomierza.
    Z rys 4-1 wynika, że do kompa z uruchomionym OPC-serverem mozna przypiąć kilka urządzeń jednocześnie podłączając je do oddzielnych portów komunikacyjnych (com)
    1) 1-4 Model number ( czyli muszą być cztery różne modele tego urządzenia)
    2) 5-23 Module name (nazwa modułu )
    3) 24a Identify module ( identyfikacja modułu)
    Wygląda to dość skomplikownie ale logicznie Aby dobrać się do danych musisz zapytać moduł o dane zapisane w rejestrach 1), 2) 3)
    Praktycznie to odpytaj kolejno od 1->10 w id oraz fun 3, rejestrem wybranym z tabeli
    Zwróc uwagę na index a,b,c,e,f
    W protokole Modbas ramka zapytań składa się [adr]-[fun][adrRej] [CRC] odpowiedz sklada się z [adr]-[fun][il bajtów zwracanych] [kolejnych odczytanych rejestrów][CRC] jeśli jest błąd w odczytanych przez slav'azapytaniu to w miejscu [fun] umieszczone jest 128 a w danych kod błędu.
  • Level 25  
    No więc tak.
    Buduję urządzenie, które będzie się komunikowało z tylko jednym takim przepływomierzem po RS485 właśnie za pomocą protokołu MODBUS ASCII. Urządzenie już działa i poprawnie komunikuje się po RS485, zostało mi ogarnięcie tego protokołu.

    Na razie chodzi mi o nawiązanie jakiegokolwiek połączenia z urządzeniem, byle by odpowiedziało. Z resztą już sobie jakoś poradzę (chyba :P ). Póki co wysyłam do niego ramki z poziomu swojego programu testowego, który wysyła na port com ramki, całość transmisji podglądam przez serial port analyzer'a.

    W instrukcji jest napisane, że urządzenie samo rozpozna baud rate'a (o ile dobrze to zrozumiałem). Ale co z ilością bitów danych, stopu i parzystością?

    Czy mógłbyś podać mi jakąś przykładową ramkę, którą mogę wysłać jako pierwszą, żeby otrzymać jakąkolwiek odpowiedź? Gdy urządzenie mi już odpowie, do z resztą się już powinienem uporać, bo jak do tej pory to nie wiem na jakim etapie popełniam błąd.
  • Helpful post
    Level 15  
    musisz mieć program-server, który złoży odpowiednio z zasadami protokołu Modbus ASCII ramkę, nie da się bez końcowego wyliczenia LRC (dla ASCII LRC a dla RTU CRC)wysłać poprawnego zapytania. Sprawdz coś takiego 0211CO2C
    Sprawdz czy firma, która wyprodukowała ten przepływomierz, poleca program driver etc.
  • Level 25  
    Witam, przepraszam że dopiero teraz odpisuję, ale nie było mnie w mieście.

    Ogólne zasady komunikacji znam, wiem że LRC trzeba wyliczać dla każdego zapytania.

    Wysyłam dokładnie coś takiego -> ":0211C02C.." (te kropki to 0x0D i 0x0A), czyli na porcie COM ląduje dokładnie coś takiego: 3A 30 32 31 31 43 30 32 43 0D 0A

    Niestety, urządzenie nadal nie odpowiada... :(
  • Helpful post
    Level 15  
    Witam ładujesz "to" z tablicy typ zmiennej char ?
    Code:
    void ramka()                   //procedura budująca wysyłaną ramkę
    
    {
       int i;
       ramka[0]=':';             //początek ramki
       ramka[1]='0';             //adres urządzenia slave
       ramka[2]='2';      
       switch(funkcja)         //numer funkcji
       {
          case 2:
          {
             ramka[3]='1';                                                     
             ramka[4]='1';
          }
          break;
          case 4:
          {
             ramka[3]='0';                                                     
             ramka[4]='4';                                          
          }
          break;
          default:
                 {
             ramka[3]='0';                                                     
             ramka[4]='4';
          }
               break;
       } 
       ramka[5]='0';                  //adres odpytywanych rejestrów HI
       ramka[6]='0';
       ramka[7]='0';              //adres odpytywanych rejestrów LO
       ramka[8]='0';
       ramka[9]='0';                     //ilość odpytywanych rejestrów HI
       ramka[10]='0';
       ramka[11]='0';                              //ilość odpytywanych rejestrów LO
       ramka[12]='A';
       oblicz_lrc();               //obliczenie lrc
       ramka[13]=koduj_znak((lrc & 0xf0)/0x10);      //kodowanie lrc na 2bajtach   
       ramka[14]=koduj_znak(lrc & 0x0f);             
       ramka[15]=13;                    //znaki końca ramki
       

    Funkcje lrc znasz, nie podaję. Metoda jest sprawdzona daje się tym na sztywno wysłać zapytanie. Spróbuj wysłać zapytanie o konkretny rejestr, bez zapytania o identyfikacje. Z pdf-u opsującego ten przepływomierz wynika, że trzeba wykonać zapytanie o określoną grupę ( jaką ?) 11 oznacza zapytanie identyfikujące urządzenie (tylko)
  • Level 25  
    Nie zupełnie, aplikacje piszę w C# i wrzucam to przez podanie String'a metodzie klasy SerialPort, Write().

    Ale chyba nie ma znaczenia, czego używam do reprezentowania zapytania w programie, bo na porcie COM ląduje to co napisałem: 3A 30 32 31 31 43 30 32 43 0D 0A (zaobserwowane SerialPort analyzerem).
  • Level 15  
    rozumiem, widzsz na debugu co jest słane do coma.
  • Level 25  
    Zastanawiam się, czy to nie jest kwestia ustawień portu COM. O ile BaudRate jest ustalany automatycznie, to co z bitami danych, stopu i parzystością? Aktualnie mam ustawione baudrate 9600, 8 bitów danych, jeden stopu i bez parzystości.