PDA

Просмотр полной версии : Помогите с примером



rslavar
18.04.2011, 14:31
Здравствуйте! Я нахожусь в затруднительной ситуации. Впервые сталкиваюсь с ПЛК, так же как и с языком ST. В кратчайшие сроки необходимо разработать проект по опросу плк около 30 модулей ввода МВ110-8ас и МВ110-16д Помогите с примером программы на ST для плк304 и пары модулей МВ110-8ас по 485, протокол ModBus RTU... Заранее благодарю!

Малышев Олег
19.04.2011, 09:18
Отдаю программу кусками... ну вообщем дальше сами разберетесь. Общий принцип именно такой.


VAR
ComHandle: SysCom.RTS_IEC_HANDLE;
Settings: SysCom.COM_Settings;
SettingsEx: SysCom.COM_SettingsEx;
res: SysCom.RTS_IEC_RESULT;
do_init:BOOL:=TRUE;
get1_modbus: MB_RD_HOLD_REGS; (*функция 03 - чтение параметра типа INT*)
set1_modbus: MB_WR_REGS; (*функция 03 - чтение параметра типа INT*)
TimeOut: TIME:=T#50MS;(*таймаут*)
Buffer: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)
end_var



IF do_init THEN
Settings.sPort := 1;
Settings.ulBaudrate := 115200;
Settings.byParity := 0;
Settings.ulTimeout := 0;
Settings.byStopBits := 1;
Settings.ulBufferSize := 0;

SettingsEx.byByteSize := 8;
SettingsEx.bBinary := TRUE;
SettingsEx.bDtrControl := FALSE;
SettingsEx.bRtsControl := FALSE;
SettingsEx.bOutxCtsFlow := FALSE;
SettingsEx.bOutxDsrFlow := FALSE;
SettingsEx.bDsrSensitivity := FALSE;
ComHandle := SysComOpen2(ADR(Settings), ADR(SettingsEx), ADR(res));

do_init:=FALSE;

END_IF

IF NOT do_init THEN

CASE rd_STATE OF
1: // MVA_8
get1_modbus(
Enable:=enabl , (* разрешение работы блока *)
Mode:=MB_RTU , (*режим передачи*)
DevAddr:=32 , (*адрес*)
FirstAddr:=MVA_adr[mva_iter] , (*номер регистра*)
Quantity:=2, (*количество регистров*)
ComHandle:=ComHandle ,(*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)
IF cmpl THEN
IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x1:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
x2:=BYTE_TO_WORD(BUFFER[3]) OR SHL(BYTE_TO_WORD(BUFFER[2]),8);
IF x2<>0 THEN
temp_ch[mva_iter]:=-300.0-WORD_TO_REAL(x2-16#F000);
ELSE
temp_ch[mva_iter]:=WORD_TO_REAL(x1)/10.0;
END_IF
ELSE
temp_ch[mva_iter]:=-300;
END_IF
mva_iter:=mva_iter+1;
IF mva_iter=5 THEN
mva_iter:=1;
rd_state:=rd_state+1;
END_IF
END_IF
2:
get1_modbus(
Enable:=enabl , (* разрешение работы блока *)
Mode:=MB_RTU , (*режим передачи*)
DevAddr:=8 , (*адрес*)
FirstAddr:=16#33 , (*номер регистра*)
Quantity:=16, (*количество регистров*)
ComHandle:=ComHandle ,(*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)

rslavar
19.04.2011, 10:40
Спасибо большое! Будем разбираться!

Николаев Андрей
19.04.2011, 11:18
http://www.owen.ru/catalog/44162596

Евгений Сергеевич
22.04.2011, 10:15
Для опроса модулей есть библиотека http://kipshop.ru/CoDeSys3.0/bibl/ModulsOwenLib.zip,
есть пример программы с уже реализованным кодом, который привел Олег, и описание как это все работает.
http://kipshop.ru/CoDeSys3.0/Sample/ip_codesys_plc304_opros_moduley.zip

rslavar
24.04.2011, 10:45
Спасибо большое всем, кто откликнулся!