Główna > Programowanie

Modbus - kilka pytań?

(1/3) > >>

epawel:
Witam.
Od paru dni bawię się komunikacją Modbus między sterownikiem 750-880, a czujnikiem temperatury. Problem mam czysto programowy. Na podstawie przykładu ze strony stworzyłem testowy progam.
--- Kod: ---PROGRAM modbusRTU
VAR
(* deklaracja zmiennych zgodnie z pdf wago*)
start: BOOL;
MODBUS_EXTENDED_MASTER1: MODBUS_EXTENDED_MASTER;
error: enumMB_ERROR;
zapytanie: typModbusExtendedQuery;
odpowiedz: typModbusResponse;

queryFinished: F_TRIG;
queryPending : SEMA;

krok: BYTE;

temp AT %MB10 : WORD;
hum AT %MB11 : WORD;
mode_s : WORD;
temp_set AT %MB12 : WORD;
time_h AT %MB13: WORD;
time_m AT %MB14: WORD;
time_ AT %MB15: WORD;

END_VAR
--- Koniec kodu ---


--- Kod: ---MODBUS_EXTENDED_MASTER1(
ENABLE:=TRUE ,
ASCII_Mode:= ,
bCOM_PORT:= 2,
cbCOM_BAUDRATE:= 960,
cpCOM_PARITY:= 0,
csCOM_STOPBITS:= 1,
cbsCOM_BYTESIZE:= 8,
cfCOM_FLOW_CONTROL:= 4,
tTIME_OUT:=t#500ms ,
(*wymagane parametry uruchomieniowe*)

Response:=odpowiedz,
StartFunction:=start ,
ExtQuery:=zapytanie ,

MB_Error=>error ,
bInterfaceError=> );

queryFinished(CLK := start);
queryPending(CLAIM := start, RELEASE := queryFinished.Q);

IF queryFinished.Q THEN
CASE krok OF

0:
temp:=odpowiedz.Data[0];
hum:=odpowiedz.Data[1];
mode_s:=odpowiedz.data[2];
time_h:=odpowiedz.data[5];
time_m:=odpowiedz.data[6];
krok:=krok+1;

1:
temp_set:= odpowiedz.Data[0];
krok:=0;

END_CASE;
END_IF;

IF NOT queryPending.BUSY THEN
zapytanie.SlaveAddress:=50;
CASE krok OF

0:
(*przygotowanie zapytania*)
zapytanie.FunctionCode:=4; (* 4 - read input register*)
zapytanie.Read_Quantity:=8; (* ile rejestrow czytamy*)
zapytanie.Read_StartAddress:=4; (* adres rejestru *)

1:
zapytanie.FunctionCode:=4; (* 4 - read input register*)
zapytanie.Read_Quantity:=8; (* ile rejestrow czytamy*)
zapytanie.Read_StartAddress:=51; (* adres rejestru *)

END_CASE;
start := TRUE;
END_IF;

--- Koniec kodu ---
Wysyłam dwa zapytania (0,1) do regulatora, za każdym razem czytając po 8 rejestrów. Następnie odczytane dane przypisuje do określonych zmiennych. Problem polega na tym, że wykonuję zapytanie 0, przypisuje dane do określonych zmiennych(temp, hum, mode itp), potem wysyłam zapytanie 1, i w tym czasie nadpisują mi się dane w tablicy i zmieniają wartości odczytane w kroku 0. I nie bardzo wiem jak sobie z tym poradzić. Wszelkie podpowiedzi mile widziane. Pozdrawiam.

zim:
Witaj,

Zerknij sobię w zakładkę Resources->PLC Configuration->Modbus-Master[FIX] masz tam piękny kreator do używania z Modbusem.

Praktycznie zero pisania kodu podstawiasz zmienne pod adresy z z głowy.

Zrobiłem za jego pomocą komunikacje z rekuperatorem thessla green airpack.

W razie pytań chętnie pomogę.

Pzd

admin:
epawel - czy zapytania działają, jak wykonujesz je osobno, usuwając jeden z kroków?  Trochę dziwi różnica w wielkości liter:

hum:=odpowiedz.Data[1];
mode_s:=odpowiedz.data[2];

zim - przejrzałem wczoraj menu Resources ->PLC Configuration... i nie znajduję Modbus-Master[FIX] i kreatora.  Jaki masz sterownik i wersję CoDeSys'a?

Pozdrawiam,

epawel:
Dziękuje za zainteresowanie tematem, dzięki temu ponownie przeanalizowałem kod. Zmieniłem deklarację zmiennych, mianowicie adresy pod którymi się mają one znajdować, " zwiększyłem' odstępy pomiędzy poszczególnymi adresami. Problem ustał. Odczyt działa poprawnie, lecz nie do końca to rozumiem.

--- Kod: ---temp AT %MB10 : WORD;
hum AT %MW0 : WORD;
mode_s : WORD;
temp_set AT %MB12 : WORD;
time_h AT %MB20: WORD;
time_m AT %MB14: WORD;
time_ AT %MB15: WORD;
--- Koniec kodu ---

admin - nie miałem jeszcze okazji pogratulować świetnej roboty i pracy włożonej w projekt - gratulacje!
zim - dziękuje za odpowiedź, takiej zakładki u mnie niestety nie ma.
Pozdrawiam.
Paweł.
 

admin:
Cześć,

nie zwróciłem uwagi na deklarację zmiennych, a tu rzeczywiście, definiujesz zmienne typu WORD, które zajmują 2 bajty.  Więcej w tym temacie jest na:

http://www.edom-plc.pl/index.php/pl/wiecej-o-plc/funkcje/183-adresowanie-zmiennych-w-pamieci

W skrócie - zmienna typu WORD zapisana pod %MW0 zajmuje tę samą przestrzeń pamięci, co 2 zmienne typu BYTE zapisane pod %MB0 i %MB1;

Pozdrawiam!

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

Idź do wersji pełnej