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

MODBUS RTU - Komunikacja Modbus RTU sterownika GE FANUC PAC Systems RX3i

20 Sie 2014 13:59 4725 24
  • Poziom 7  
    Witam,

    mam problem z komunikacją za pomocą protokołu MODBUS RTU (jako Master). Używam sterownika GE RX3i z jednostką centralną CPE310. Chcę skonfigurować połączenie z falownikiem (slave) za pomocą portu 2 ( RS485).

    poniżej przesyłam dane dotyczące komunikacji, którą chcę wykonać

    MODBUS RTU (Master)
    port 2 (RS485)
    szybkość trasnsmisji: 9600
    data bits: 8
    flow control: none
    parity: none
    stop bits: 1
    2-wire

    Korzystam z materiałów które dodałam w załączniku. Jest to przykład komunikacji dla portu 1 (rs232) , ja natomiast chcę komunikować się poprzez port 2 (rs485) i tutaj pojawia się problem, podczas kompilacji wyświetla się błąd. Dodam że połączenie sterownika z falownikiem jest prawidłowe. Wydaj mi się że błąd musi być ze strony programowej (podanie nieprawidłowych parametrów w bloku BLKMOV bądź CALL MB P1)


    Czy ktoś wie jak rozwiązać mój problem? Jakie parametry podać przy tej komunikacji?
    Proszę o pomoc.

  • Specjalista Automatyk
    akinoMM napisał:
    ja natomiast chcę komunikować się poprzez port 2 (rs485) i tutaj pojawia się problem, podczas kompilacji wyświetla się błąd.
    Wystarczy zmienić port na 2, w przykładzie (M_BUS rung 15) i w konfiguracji portu wybrać Serial I/O oraz wymagane parametry komunikacji. Zakładam, że rack masz 0 i slot 2 dla CPU.
    Jaki błąd masz podczas kompilacji?
    Może wrzuć swój fragment kodu to się zerknie.

    akinoMM napisał:
    Dodam że połączenie sterownika z falownikiem jest prawidłowe.
    Skąd ta pewność :D? Poprawnie przeszłaś z 4-wire na 2-wire?
  • Poziom 7  
    oczywiście zmieniłam port i parametry, jednak nie jestem pewna czy są one właściwe. W załączniku fragment kodu.

    Jeżeli chodzi o podłączenie do sterownika to zrobiłam przejściówkę według schematu (załącznik RS485.pdf str 7)
  • Poziom 7  
    Konfiguracja sterownika wygląda nastepująco:
    rack 0
    slot 0 dla CPU

  • Specjalista Automatyk
    Nie wiem, który zrzut bardziej aktualny, ale w jednym masz:
    Status z funkcji 4358, czyli 16#1106 - Bad Buffer offset – “C” block Input 5 not a good value need space for 150.
    W drugim offset poprawiony i błąd 261, 16#105, czyli Timeout – response was not received within timeout period.

    Jeśli timeout to sprawdziłbym:
    - parametry transmisji, ew. czy timeout 500ms nie jest za krótki,
    - adres falownika,
    - poprawność połączenia (A+A', B+B' mają dać odpowiednio A i B, nie wiem jaki falownik, ale różnie producenci oznaczają linie i nie zawsze prawidłowo, więc możesz spróbować zamienić A z B miejscami)
    - jeśli długi kabel lub zakłócenia to wstawiłbym rezystory na końcach,

    Czy próbowałaś się połączyć z falownikiem jakimś programem bezpośrednio np. z komputera przy użyciu Modbus Tester? Możliwe, że chcesz przeczytać za dużo rejestrów na raz lub akurat te potrzebują funkcji 4, a nie 3.
  • Poziom 7  
    Sprawdziłam parametry transmisji i poprawność połączenia.
    W załączniku Print Screen ustawień portów, moje pytanie brzmi czy port 1 może być tak ustawiony ?

    Nie próbowałam się połączyć z programem za pomocą Modbus Tester.
    Używam modułu ABB Drives Modbus Adapter Module RMBA-01 który ma mi umożliwić komunikację z ACS800


    Poza tym pojawił mi się błąd podczas startu programu : Reference memory address is out of range. Czy dobrze rozumiem, że błąd ten jest w rack 0 slot 0 (Loc 0.0) ?

  • Specjalista Automatyk
    akinoMM napisał:
    W załączniku Print Screen ustawień portów, moje pytanie brzmi czy port 1 może być tak ustawiony ?
    Jeśli go do niczego nie używasz to nie ma znaczenia :D
    akinoMM napisał:
    Nie próbowałam się połączyć z programem za pomocą Modbus Tester.
    Polecam spróbować, bo wtedy wyeliminujesz przynajmniej jeden koniec połączenia.
    akinoMM napisał:
    Poza tym pojawił mi się błąd podczas startu programu : Reference memory address is out of range. Czy dobrze rozumiem, że błąd ten jest w rack 0 slot 0 (Loc 0.0) ?
    Dobrze rozumiesz. Prawdopodobnie b_offs = 9000 wyłazi Ci poza skonfigurowany rozmiar pamięci %R.
  • Poziom 7  
    Rozmiar pamięci ustawiony mam na %R9999 więc to nie może być to.

    Ok spróbuję połączyć się wykorzystując Modbus Tester.
  • Poziom 7  
    Ok komunikacja działa poprawnie. Dostałam na wyjściu 16#0001 Succes.

    Teraz jak chcę odczytać wartości przesłane z napędu, np. prędkość, to wpisuję kod 40102 . Moje pytanie brzmi gdzie mam odczytać tą wartość? Domyślam się że jest to zapisywane do konkretnego rejestru , tylko którego ?

    Dodano po 1 [minuty]:

    odczytałam pierwsze 100 rejestrów i nie znalazłam wyniku który wyświetla mi częstotliwość

  • Specjalista Automatyk
    akinoMM napisał:
    Ok komunikacja działa poprawnie. Dostałam na wyjściu 16#0001 Succes.
    Gdzie był błąd?

    Adres 40102 jest to rejestr 102 odczytany przy użyciu funkcji 3, więc za mało rejestrów odczytałaś.
    Wg dokumentacji do karty, 40102 to jest Grupa 01 Parametr 02, co z kolei w dokumentacji falownika oznacza 01.02 Speed w %. Częstotliwość wyjściowa w Hz jest w 01.03 (z dokładnością 1Hz = 100).
  • Poziom 7  
    Tak masz rację chodziło mi o prędkość 01.02. ale to i tak nie ma znaczenia, bo odczytałam 150 rejestrów a i tak nie mam tego co powinnam.

    W załączniku przesyłam print screen

    Wygląda tak że:
    W bloku BLKMOV w IN6 wpisuję adres rejestru gdzie ma być odczytana wartość, a w IN4 wpisuję liczbę odczytanych wartości ( jeżeli wpisuję 1 to jest ok, czyli czyta mi jedną wartość i przepisuje na rejestr %R201, ale jak wpiszę do IN4 liczbę 16 żeby czytało 16 wartości to występuje błąd) W załączniku jest przykład jak odczytuję 1 wartość przepisaną do rejestru %R201, wyświetla się wartość w rejestrze %R201 i %R202 ale te wartości nie są zgodne z danymi falownika, nawet próbowałam zmieniać z Hex na Dec ale to nie to

  • Specjalista Automatyk
    akinoMM napisał:
    bo odczytałam 150 rejestrów a i tak nie mam tego co powinnam
    Jakimś programem z komputera?
    akinoMM napisał:
    jak wpiszę do IN4 liczbę 16 żeby czytało 16 wartości to występuje błąd
    Jaki błąd?
    Podejrzewam, że falownik pozwala czytać tylko ciągłe obszary danych i zaczynające się od początku obszaru.
    Spróbuj powoli, zacząć od 1-2 rejestrów od adresu 100 lub 101.
    Ja jednak byłbym za przetestowaniem całości z Modbus tester'a i podglądnięcia ramek, a później w PLC już pójdzie łatwo.
  • Poziom 7  
    Zastosowałam program ModBusView do komunikacji, udało mi się przepisać przykładowe sygnały (od 40101 do 40110 ) na rejestry %R201 do %R210. Okazało się po odczytaniu zadanych wartości że na rejestr %R201 jest przepisywana wartość syganłu 40102 a na rejestr %R202 sygnał 40101. Czyli dwa sygnały sąsiadujące ze sobą są odwrotnie zapisywane w programie (załącznik)
    W komunikacji tej korzystałam z portu 1 (Rs232) bo taki też miałam w komputerze. W tym przypadku program działa, jednak kiedy zamieniam port na port 2 aby komunikować się z falownikiem mogę odczytać tylko jeden sygnał, poza tym wartość tego sygnału nie jest zgodna z wartością zadaną na panelu falownika

  • Specjalista Automatyk
    akinoMM napisał:
    Czyli dwa sygnały sąsiadujące ze sobą są odwrotnie zapisywane w programie (załącznik)
    Spróbuj użyć komendy 8006 (DWORD swap) zamiast 8002.
    akinoMM napisał:
    kiedy zamieniam port na port 2 aby komunikować się z falownikiem mogę odczytać tylko jeden sygnał, poza tym wartość tego sygnału nie jest zgodna z wartością zadaną na panelu falownika
    Jaki jest wtedy status i state funkcji?
  • Poziom 7  
    Mam ustawione na 8006.

    status: 16#0001
    state : 16#0000

    czyli jest Success, tak jak by wszystko było dobrze. Zastanawiam się nad komunikacją po kablu z falownikiem, bo jak zmieniam np. prędkość to dane odczytywane się nie zmieniają ( czyli odczytuje jakieś dane ale po zmianie parametrów nie ma reakcji)

  • Specjalista Automatyk
    akinoMM napisał:
    Mam ustawione na 8006.
    Na obrazkach, które podesłałaś masz 8002, więc już nie wiem, który wariant używasz.
    8002 - odczytuje rejestry jako liczby całkowite 16-bitowe (wg mnie tak też falownik przysyła i tak powinny być odczytywane)
    8006 - odczytuje rejestry jako liczby 32-bitowe z zamianą (używane do odczytywania rejestrów REAL lub DWORD)
    akinoMM napisał:
    jak zmieniam np. prędkość to dane odczytywane się nie zmieniają ( czyli odczytuje jakieś dane ale po zmianie parametrów nie ma reakcji)
    Po RS232 jest dobrze, a po RS485 się nie zmienia? Szczerze mówiąc, to się trochę pogubiłem w Twoich próbach i opisach.
  • Poziom 7  
    Używam wariantu z 8006. Ale ok w takim razie muszę użyć 8002 tak jak piszesz.

    Port 1 (rs232) używałam do komunikacji z ModBusView, aby sprwdzić działanie programu.

    Port 2 (rs485) używam do komunikacji z falownikiem.

    Dodano po 3 [minuty]:

    Jeżeli zamienię na 8002 to występuje błąd : 3 4 , Bad CRC received

  • Specjalista Automatyk
    Prawdopodobnie pojawiają się zakłócenia na linii.
    Jak długi jest kabel do falownika? Masz rezystory włączone na końcach linii?
    Jeśli posiadasz konwerter 485/232 to możesz podsłuchać transmisję PLC<>falownik, a dla porządku przetestować port 2 z ModBusView.
  • Poziom 7  
    kabel do falownika ma 2 m . Nie mam rezystorów na końcach. Przetestowałam port 2 (rs485) z ModBusView podłączając sterownik(port 2 rs485) z komputerem (port rs232) poprzez konwerter rs232 na rs485. Komunikacja się powiodła, nie mam błędów. Ale wartości które wpisuję w programie ModBusView do odpowiednich rejestrów nie są przekazywane do sterownika. W rejestrach wyświetlane są takie same wartości jak w przypadku podłączenia do falownika. Wynika stąd że falownik nie przesyłał odpowiedzi na sygnały przeze mnie zadane

  • Specjalista Automatyk
    1) Zobacz czy przy podłączonej wtyczce tylko po stronie portu 2 PLC (a po drugiej całkiem rozłączone) przypadkiem nie będzie tak samo. Oznaczałoby to, że źle połączyłaś 4 na 2-wire i sterownik sam sobie odpowiada. Sprawdź też czy na pewno w konfiguracji portu jest 2-wire.
    2) Jak już masz konwerter to możesz przechwycić do pliku to, co wysyła sterownik i podglądnąć w hex czy ramka jest prawidłowa (np. HyperTerminal lub Putty).
  • Poziom 7  
    Ok w konfiguracji portu miałam 4-wire i tu był mój błąd, ale po zamianie na 2-wire dostałam błąd 1 5 = Timeout. (to jest przy połączeniu rs485 (sterownik) z rs232 (komputer) )

    sprawdziłam połączenia port 1 (rs232) z komputerem (rs232) za pomocą ModbusView i wszystko działa prawidłowo.

    przy połączeniu port 1 (rs232) z falownikiem ( 2-wire) przy pomocy konwertera , komunikacja nie odpowiada błąd 1 5 =Timeout

    przy komunikacji : port 2 (rs485) z komputerem (rs232) za pomocą konwertera komunikacja kończy się sukcesem w przypadku kiedy mam ustawioną konfigurację portu : 4-wire. Zaznaczam że korzystam z konwertera rs-232 na 2-wire 485 więc powinien tu już być błąd.

    przy komunikacji port 2 (rs485) z falownikiem (2-wire) komunikacja konczy się sukcesem kiedy mam ustawione w konfiguracji 4-wire, kiedy zmieniam konfigurację na 2-wire wtedy dostaję błąd 1 5 =Timeout

    Podsumowując komunikacja jest prawidłowa i przepływ sygnałów również tylko w wypadku kiedy korzystam z portu 1 (rs232) i ModBusView

  • Specjalista Automatyk
    Tak jak już pisałem, wydaje mi się, że za dużo rzeczy próbujesz robić na raz i w efekcie nie eliminujesz poszczególnych składowych.

    1. Spróbuj nawiązać komunikację z falownikiem przy pomocy komputera, programu i konwertera 232/485 (będziesz mieć pewność, że falownik poprawnie skonfigurowany i poprawnie działający kabel RS485)

    2. Dopiero, gdy uda się 1) :D Podłącz układ do portu 1 sterownika (będziesz mieć pewność, że program poprawny)

    3. Dopiero, gdy uda się 2) :D Podłącz falownik do portu 2 (w tym miejscu problemem może być tylko konfiguracja portu 2 lub niepoprawnie zrobiona wtyczka po stronie PLC)
  • Poziom 7  
    Witam,

    przepraszam za tak długą zwłokę czasową z odpowiedzią. Powodem był moduł CPU, który odmówił mi posłuszeństwa i musiałam czekać na wymianę jego w serwisie na nowy.
    Obecnie udało mi się nawiązać komunikację Modbus rtu poprzez port 2 (rs485) podłączony do komputera za pomocą konwertera rs485 - rs232.
    Problemem była prędkość transmisji danych, przy ustawieniu prędkości 19200 otrzymuję odpowiedź (jednak po długim czasie około 1 minuty) natomiast przy prędkości 38400 komunikacja lepsza (odpowiedź otrzymuję po 2-3 sekundach)
    Zaznaczam że komunikacja ta nie jest całkowicie bezbłędna, ponieważ w czasie kiedy czekam na odpowiedź (na przepisanie poszczególnych wartości na rejestry) program wysyła mi ciągle komunikat o błędach CRC (kod 0304) po czym następuje nadpisanie odpowiednich rejestrów itd.
    Po odczytaniu ramki danych modbus rtu również wartości wyświetlane w ramce nie są takie jak oczekiwane.

    Dziękuję za dotychczasową pomoc.

    Mam jeszcze takie pytanie do Pana : Czy udało się Panu w rzeczywistości przeprowadzić tego typu komunikację bezbłędnie ?
  • Specjalista Automatyk
    Jeśli na 19200 otrzymujesz odpowiedź po ok 1 min. to masz coś źle.

    Jeśli masz jakiś sterownik z MODBUS i RS485/RS232 to użyj go do testów jako slave. W poszczególne rejestry, które chcesz odczytywać wpisz konkretne wartości (np. rej 100 -> 100, rej 101 -> 101 itd.). Odczytaj te wartości na komputerze z poziomu programu np. Modbus Tester - będziesz mieć pewność, że wiesz co i jak czytać ze slave (jeśli byś miała konwerter RS232/RS-485 to mogłabyś przetestować bezpośrednio komunikację ze slave po 485) .

    Następnie z poziomu "dużego" CPU poprzez RS485 mogłabyś sprawdzić sobie program komunikujący się ze slave. Jeśli działa to wtedy dopiero działać z falownikiem (ustawiając odpowiednie adresy w programie, prędkości, parzystości itp.)

  • Specjalista Automatyk
    Będę pewnie nudny, ale jeśli nie będziesz robić po małym kroku, to nie dojdziesz co jest źle :)

    Czy w konfiguracji RX jako master z portu 2 poprzez konwerter 485/232 do PC poprawna jest ramka z zapytaniem i co ile się wysyła? Jak już pisałem wcześniej:
    Markos80 napisał:
    ...możesz przechwycić do pliku to, co wysyła sterownik i podglądnąć w hex czy ramka jest prawidłowa (np. HyperTerminal lub Putty).

    akinoMM napisał:
    Czy udało się Panu w rzeczywistości przeprowadzić tego typu komunikację bezbłędnie ?
    Tak. Wiele razy.