Modbus RTU odczyt rejestrow

Pytania i odpowiedzi dotyczące sprzętu Unitronics

Moderatorzy: Marek Sikora, Mateusz Sikorski

Modbus RTU odczyt rejestrow

Postprzez lwilk » N, 14 paź 2012, 22:31

Witam,

programuje sterownik V1040, ktory pelni role mastera. Odczytuje 1 rejestr z 15 roznych urzadzen modbasowych slave. Jesli podprogram jest wywoływany nacisnieciem klawisza, to wszystko jest ok, natomiast jesli cyklicznie, to wyswietlaja sie nieprawidłowe wartosci. Chciałem sie dowiedziec jakie powinny byc warunki (ktore bity i jakie ich stany nalezy testowac) odczytu adresu slave, odczytu wartosci z urzadzenia modbus, zapisu wartości rejestru do pamieci oraz zwiekszania adresu urzadzenie slave. Wyprobowalem juz wiele mozliwosci i wciaz program nie dziala zgodnie z moim oczekiwaniem. Program przesyłam w zalaczeniu. Z gory dziekuje zapomoc.
LW
Załączniki
test1.zip
(177.22 KiB) Pobrane 813 razy
lwilk
 
Posty: 18
Dołączył(a): Pn, 1 paź 2012, 22:29

Re: Modbus RTU odczyt rejestrow

Postprzez Mateusz Sikorski » Pn, 15 paź 2012, 07:08

Witam Panie Łukaszu,
nie wiem dlaczego próbuje Pan czytać wartość numeru slave, skoro sam Pan je definiuje ( Net #1 w podprogramie dotyczącym odczytu Modbus).
Poniżej przesyłam Panu moją propozycję:

Algorytm:

Net#1 - sprawdzenie czy adres slave nie jest większy niż 114 - jeśli tak to powrót do slave 100
Net#2 - bit MB0 (normalnie wyłączony) powoduje próbę odczytu rejestru 52 ze slave MI99 (domyślnie 100) i zapis do rejestru MI8. W przypadku udanego odczytu następuje przepisanie rejestru MI8 do rejestru MI130 (ponieważ w MI129 wpisana jest wartość 130), zainkrementowanie rejestru MI129 oraz MI99. Na końcu następuje załączenie MB0, który przez 1 skan programu utrzyma wartość 1 a w następnym zresetuje się. Dzięki takiemu zabiegowi, będziemy mieli ciągły odczyt rejestru ze wszystkich slave'ów.
Net#3 - w przypadku nie połączenia się ze slave'm nastąpi zapis wartości 9999 do konkretnego rejestru od MI130-MI144.
Mateusz Sikorski
Elmark Automatyka S.A.
Mateusz Sikorski
 
Posty: 564
Dołączył(a): Śr, 13 lip 2011, 08:08

Re: Modbus RTU odczyt rejestrow

Postprzez lwilk » Pn, 15 paź 2012, 08:16

Witam Panie Mateuszu,
Dziekuje za pomoc, choc nie rozwiazało to mojego problemu. Po zmianie zgodnie z załączonym schematem wartości wszystkich odczytywanych rejestrów MI130 - MI144 mają wartosc 9999, mimo iz mam podłączone urzadzenie modbasowe.
lwilk
 
Posty: 18
Dołączył(a): Pn, 1 paź 2012, 22:29

Re: Modbus RTU odczyt rejestrow

Postprzez Mateusz Sikorski » Pn, 15 paź 2012, 08:58

Witam Panie Łukaszu,

zapomniałem o dodaniu przed blok odczytu rejestru Modbus styku normalnie zamkniętego MB4 (odpowiedzialny za zajętość połączenia Modbus).
Skoro zapisuje Panu wartość 9999 do każdego rejestru to znaczy, że Modbus Status (MI 10) jest inny niż 0, co pokazuje błąd połączenia. Proszę o usunięcie z MI10 stałej wartości 0, sterownik sam będzie wpisywał tam 0 w przypadku poprawnej komunikacji
Mateusz Sikorski
Elmark Automatyka S.A.
Mateusz Sikorski
 
Posty: 564
Dołączył(a): Śr, 13 lip 2011, 08:08

Re: Modbus RTU odczyt rejestrow

Postprzez lwilk » Pn, 15 paź 2012, 10:05

Panie Mateuszu,

dziekuje za pomoc, mam jeszcze taki problem, że wartość rejestru odczytana z urzadzenia o adresie slave M100(17) jest zapisywana nie tak jakbym oczekiwał do M130 tylko do M131. Wszystkie adresy sa przestawione o 1.
Załączniki
Nawadnianie.zip
(381.14 KiB) Pobrane 730 razy
lwilk
 
Posty: 18
Dołączył(a): Pn, 1 paź 2012, 22:29

Re: Modbus RTU odczyt rejestrow

Postprzez Mateusz Sikorski » Pn, 15 paź 2012, 10:43

Witam Panie Łukaszu,

możliwe, że zapis do rejestru MI8 jest opóźniony, dlatego trochę zmodyfikowałem Panu program (z jednej gałęzi zrobiłem dwie niezależne wprowadzając dodatkowy bit pomocniczy MB11).
Załączniki
Nawadnianie1.zip
(380.37 KiB) Pobrane 702 razy
Mateusz Sikorski
Elmark Automatyka S.A.
Mateusz Sikorski
 
Posty: 564
Dołączył(a): Śr, 13 lip 2011, 08:08

Re: Modbus RTU odczyt rejestrow

Postprzez lwilk » Wt, 16 paź 2012, 00:41

Witam,

Przetestowałem Pana program, ale w dalszym ciagu odczytywane rejestry sa przesuniete o 1, tzn. jak powinno byc zapisane do M130, to zapisuje do M31 i tak cale 15 rejestrow MI130-144. Dodatkowo w Pana programie przy przekroczeniu z M144 i zmianie na M130, nastepuje przed odczytaniem z MODBUSA zapis do MI130 poprzednio odczytanej wartości z MI144. Pozniej jest inkrementacja adresu z MI130 na MI131 i dopiero odczyt z modbasa. Za kazdym razem nie jest nadpisana zawartość rejestru z pierwszego adresu slave (17). Prosze o dalsza pomoc, poniewaz w dalszym ciagu nie pracuje poprawnie. Dziekuje i pozdrawiam.
LW
lwilk
 
Posty: 18
Dołączył(a): Pn, 1 paź 2012, 22:29

Re: Modbus RTU odczyt rejestrow

Postprzez Mateusz Sikorski » Wt, 16 paź 2012, 11:26

Witam Panie Łukaszu,

wychodzi na to, że jest opóźnienie w odczycie rejestru w protokole Modbus. Proponuję zastosować jeden z Timerów, który po upływie określonego czasu wykona zapis "Store Indirect MI" (przykład w programie). Proszę skracać nastawę tego Timera do momentu generowania błędów (u mnie było to 0,4s).
Ważną rzeczą jest także zmniejszenie czasu czekania na odpowiedź Modbus Slave w bloku "Modbus Configuration" [ Time out (units of 10 msec) ]. Można także zmienić liczbę prób do jednej (po prostu jak raz nie dostanie odpowiedzi to wpisze wartość 9999 i zacznie sprawdzać kolejne Slave'y).

Napisałem w tej sprawie jeszcze do producenta, może on podsunie szybsze rozwiązanie tego problemu.
Załączniki
Nawadnianie.zip
(378.07 KiB) Pobrane 717 razy
Mateusz Sikorski
Elmark Automatyka S.A.
Mateusz Sikorski
 
Posty: 564
Dołączył(a): Śr, 13 lip 2011, 08:08

Re: Modbus RTU odczyt rejestrow

Postprzez lwilk » Wt, 16 paź 2012, 11:30

Witam,
Dziękuje za odpowiedz, czy mógłbym jeszcze zerknac na Pana program, aby zobaczyć jak Pan to rozwiązał?
Dziekuje i pozdrawiam.
LW
lwilk
 
Posty: 18
Dołączył(a): Pn, 1 paź 2012, 22:29

Re: Modbus RTU odczyt rejestrow

Postprzez Mateusz Sikorski » Wt, 16 paź 2012, 12:02

Witam,
program przesłany w załączniku w wiadomości powyżej. Proszę zwrócić uwagę na komparator wartości MI99(100) z wartością 102 (u Pana było chyba 114).
Mateusz Sikorski
Elmark Automatyka S.A.
Mateusz Sikorski
 
Posty: 564
Dołączył(a): Śr, 13 lip 2011, 08:08

Re: Modbus RTU odczyt rejestrow

Postprzez Mateusz Sikorski » Wt, 16 paź 2012, 13:00

Witam Panie Łukaszu,

w załączniku przesyłam Panu program, który najszybciej radzi sobie z opóźnieniem odczytu w Modbus. Opóźnienie to jest standardowe i zależy od baud rate, ilości przesyłanych informacji, itp.
Po odczycie z jednego Slave, należy zatrzymać wysyłanie dalszych zapytań (set MB0).Gdy bit zajętości sieci Modbus MB4 zmieni się z 1 na 0 (styk -|N|-) to będzie znaczyło, że wartość ze Slave'a została wpisana do MI8. Dalej po wpisaniu tej wartości i zainkrementowaniu dwóch zmiennych należy zresetować MB0 w celu ponownego wysłania zapytania do następnego Slave'a.
Załączniki
Nawadnianie2.zip
(378.91 KiB) Pobrane 760 razy
Mateusz Sikorski
Elmark Automatyka S.A.
Mateusz Sikorski
 
Posty: 564
Dołączył(a): Śr, 13 lip 2011, 08:08

Re: Modbus RTU odczyt rejestrow

Postprzez lwilk » Śr, 17 paź 2012, 01:13

Witam Panie Mateuszu,
dziekuje za pomoc, juz wszystko działa prawidłowo. Odczytuje 22 moduły z magistrali MODBUS i zawartości odczytywanych rejestrów sa wpisywane prawidłowo.
Chciałem sie jeszcze dowiedzieć, czy istnieje rozkaz do zapisywania/czytania poszczególnych bitów z rejestrów MI. Ewentualnie jak MB zapisac/czytac poprzez adresowanie pośrednie.
Dziekuje i pozdrawiam
LW
lwilk
 
Posty: 18
Dołączył(a): Pn, 1 paź 2012, 22:29

Re: Modbus RTU odczyt rejestrow

Postprzez Mateusz Sikorski » Śr, 17 paź 2012, 06:34

Witam Panie Łukaszu,

owszem istnieją rozkazy do zapisywania/odczytywania konkretnego bitu z rejestru MI - są to po kolei bloki "Set bit" lub "Reset bit" / "Test bit" (jak również "RLO Bit" lub "Toggle Register Bit") z zakładki Logic.

Co do adresowania pośredniego rejestru, który chce Pan "obrabiać" to należało by użyć bloku "Load" oraz "Store" z zakładki Vector. Pozwoliło by to Panu najpierw pobierać wartość z konkretnego rejestru (adresowanie pośrednie), następnie obróbka go za pomocą bloków, o których wspomniałem na początku i na końcu wpisanie wartości obrobionej do danego rejestru za pomocą bloku "Store".
Mateusz Sikorski
Elmark Automatyka S.A.
Mateusz Sikorski
 
Posty: 564
Dołączył(a): Śr, 13 lip 2011, 08:08


Powrót do Unitronics



Kto przegląda forum

Użytkownicy przeglądający to forum: Google [Bot] i 1 gość

cron