Код:
PROGRAM PLC_PRG_RS485
VAR
CurrentModule:INT:=1;
CNT:INT:=0; //счетчик, исп-ся для выявления задержек в опросе
//установки порта RS485, у СПК110 сдвиг номера на 1: на приборе 1-й, в программе 2-й
start:BOOL:=FALSE;
AllowWrite:BOOL:=TRUE;
settings:SysCom.COM_Settings;
settings2:SysCom.COM_SettingsEx;
ComHandle:SysCom.RTS_IEC_HANDLE;
res:SysCom.RTS_IEC_RESULT;
ret_res: INT;
conn:ComConn;
PortMode:RS_mode;
//Модули ввода/вывода
Mod1:MV110_8A_inputs;
Mod2:MV110_8A_inputs;
Mod3:MV110_8A_inputs;
Mod4:MY110_8R_outs;
Mod5:MY110_8R_outs;
Mod6:MK110_8dn_4R_outs; //МУ 8Д4Р, 4 выхода
Mod7:MK110_8dn_4R_inputs; //МУ 8Д4Р, 8 входов
Mod1_Enabl, Mod2_Enabl, Mod3_Enabl, Mod4_Enabl, Mod5_Enabl, Mod6_Enabl, Mod7_Enabl:BOOL:=FALSE;
END_VAR
Код:
IF Start = FALSE THEN
conn.PortNum:=2; //установки порта RS485, у СПК110 сдвиг номера на 1, 2-й ком-порт на приборе соответсвует 3-му программному.
conn.PortBaudrate:=115200;
conn.Port_ModeOn:=TRUE;
conn.Port_Mode:=RS_mode.RS_485; // режим RS485
conn.Port_CloseOn:=false;
conn(enable:= TRUE);
IF conn.Done=TRUE THEN
ComHandle:=conn.Handle;
Start:=TRUE;
CurrentModule:=1;
CNT:=0;
mod1.Addr:=1;
mod1.TimeOut:=T#500MS;
mod1.Handle:=ComHandle;
mod2.TimeOut:=T#500MS;
mod2.Handle:=ComHandle;
mod2.Addr:=2;
mod3.TimeOut:=T#500MS;
mod3.Handle:=ComHandle;
mod3.Addr:=3;
mod4.TimeOut:=T#500MS;
mod4.Handle:=ComHandle;
mod4.Addr:=4;
mod5.TimeOut:=T#500MS;
mod5.Handle:=ComHandle;
mod5.Addr:=5;
mod6.TimeOut:=T#500MS;
mod6.Handle:=ComHandle;
mod6.Addr:=6;
mod7.TimeOut:=T#500MS;
mod7.Handle:=ComHandle;
mod7.Addr:=6;
END_IF
END_IF
CASE CurrentModule OF
1:
//Опрашиваем модуль МВ8А по адресу 1
IF Mod1_Enabl=FALSE THEN
Mod1_Enabl:=TRUE;
END_IF
mod1(Enabl:=Mod1_Enabl);
IF mod1.done THEN
Mod1_Enabl:=FALSE;
mod1(Enabl:=Mod1_Enabl);
CurrentModule:=CurrentModule+1;
charr[1].ErrCode:=AI_Err_Codes(mod1.inpExcSCode1);
charr[2].ErrCode:=AI_Err_Codes(mod1.inpExcSCode2);
charr[3].ErrCode:=AI_Err_Codes(mod1.inpExcSCode3);
charr[4].ErrCode:=AI_Err_Codes(mod1.inpExcSCode4);
charr[5].ErrCode:=AI_Err_Codes(mod1.inpExcSCode5);
charr[6].ErrCode:=AI_Err_Codes(mod1.inpExcSCode6);
charr[7].ErrCode:=AI_Err_Codes(mod1.inpExcSCode7);
charr[8].ErrCode:=AI_Err_Codes(mod1.inpExcSCode8);
IF charr[1].ErrCode=0 THEN
charr[1].Value:=mod1.inp1;
ELSE
charr[1].Value:=0;
END_IF
IF charr[2].ErrCode=0 THEN
charr[2].Value:=mod1.inp2;
ELSE
charr[2].Value:=0;
END_IF
IF charr[3].ErrCode=0 THEN
charr[3].Value:=mod1.inp3;
ELSE
charr[3].Value:=0;
END_IF
IF charr[4].ErrCode=0 THEN
charr[4].Value:=mod1.inp4;
ELSE
charr[4].Value:=0;
END_IF
IF charr[5].ErrCode=0 THEN
charr[5].Value:=mod1.inp5;
ELSE
charr[5].Value:=0;
END_IF
IF charr[6].ErrCode=0 THEN
charr[6].Value:=mod1.inp6;
ELSE
charr[6].Value:=0;
END_IF
IF charr[7].ErrCode=0 THEN
charr[7].Value:=mod1.inp7;
ELSE
charr[7].Value:=0;
END_IF
IF charr[8].ErrCode=0 THEN
charr[8].Value:=mod1.inp8;
ELSE
charr[8].Value:=0;
END_IF
CNT:=0;
ELSE
CNT:=CNT+1;
END_IF
2:
//Опрашиваем модуль МВ8А по адресу 2
IF Mod2_Enabl=FALSE THEN
Mod2_Enabl:=TRUE;
END_IF
mod2(Enabl:=Mod2_Enabl);
IF mod2.done THEN
Mod2_Enabl:=FALSE;
mod2(Enabl:=Mod2_Enabl);
CurrentModule:=CurrentModule+1;
charr[9].ErrCode:=AI_Err_Codes(mod2.inpExcSCode1);
charr[10].ErrCode:=AI_Err_Codes(mod2.inpExcSCode2);
charr[11].ErrCode:=AI_Err_Codes(mod2.inpExcSCode3);
charr[12].ErrCode:=AI_Err_Codes(mod2.inpExcSCode4);
charr[13].ErrCode:=AI_Err_Codes(mod2.inpExcSCode5);
charr[14].ErrCode:=AI_Err_Codes(mod2.inpExcSCode6);
charr[15].ErrCode:=AI_Err_Codes(mod2.inpExcSCode7);
charr[16].ErrCode:=AI_Err_Codes(mod2.inpExcSCode8);
IF charr[9].ErrCode=0 THEN
charr[9].Value:=mod2.inp1;
ELSE
charr[9].Value:=0;
END_IF
IF charr[10].ErrCode=0 THEN
charr[10].Value:=mod2.inp2;
ELSE
charr[10].Value:=0;
END_IF
IF charr[11].ErrCode=0 THEN
charr[11].Value:=mod2.inp3;
ELSE
charr[11].Value:=0;
END_IF
IF charr[12].ErrCode=0 THEN
charr[12].Value:=mod2.inp4;
ELSE
charr[12].Value:=0;
END_IF
IF charr[13].ErrCode=0 THEN
charr[13].Value:=mod2.inp5;
ELSE
charr[13].Value:=0;
END_IF
IF charr[14].ErrCode=0 THEN
charr[14].Value:=mod2.inp6;
ELSE
charr[14].Value:=0;
END_IF
IF charr[15].ErrCode=0 THEN
charr[15].Value:=mod2.inp7;
ELSE
charr[15].Value:=0;
END_IF
IF charr[16].ErrCode=0 THEN
charr[16].Value:=mod2.inp8;
ELSE
charr[16].Value:=0;
END_IF
CNT:=0;
ELSE
CNT:=CNT+1;
END_IF
3:
//Опрашиваем модуль МВ8А по адресу 3
IF Mod3_Enabl=FALSE THEN
Mod3_Enabl:=TRUE;
END_IF
mod3(Enabl:=Mod3_Enabl);
IF mod3.done THEN
Mod3_Enabl:=FALSE;
mod3(Enabl:=Mod3_Enabl);
CurrentModule:=CurrentModule+1;
charr[17].ErrCode:=AI_Err_Codes(mod3.inpExcSCode1);
charr[18].ErrCode:=AI_Err_Codes(mod3.inpExcSCode2);
charr[19].ErrCode:=AI_Err_Codes(mod3.inpExcSCode3);
charr[20].ErrCode:=AI_Err_Codes(mod3.inpExcSCode4);
charr[21].ErrCode:=AI_Err_Codes(mod3.inpExcSCode5);
charr[22].ErrCode:=AI_Err_Codes(mod3.inpExcSCode6);
charr[23].ErrCode:=AI_Err_Codes(mod3.inpExcSCode7);
charr[24].ErrCode:=AI_Err_Codes(mod3.inpExcSCode8);
IF charr[17].ErrCode=0 THEN
charr[17].Value:=mod3.inp1;
ELSE
charr[17].Value:=0;
END_IF
IF charr[18].ErrCode=0 THEN
charr[18].Value:=mod3.inp2;
ELSE
charr[18].Value:=0;
END_IF
IF charr[19].ErrCode=0 THEN
charr[19].Value:=mod3.inp3;
ELSE
charr[19].Value:=0;
END_IF
IF charr[20].ErrCode=0 THEN
charr[20].Value:=mod3.inp4;
ELSE
charr[20].Value:=0;
END_IF
IF charr[21].ErrCode=0 THEN
charr[21].Value:=mod3.inp5;
ELSE
charr[21].Value:=0;
END_IF
IF charr[22].ErrCode=0 THEN
charr[22].Value:=mod3.inp6;
ELSE
charr[22].Value:=0;
END_IF
IF charr[23].ErrCode=0 THEN
charr[23].Value:=mod3.inp7;
ELSE
charr[23].Value:=0;
END_IF
IF charr[24].ErrCode=0 THEN
charr[24].Value:=mod3.inp8;
ELSE
charr[24].Value:=0;
END_IF
CNT:=0;
ELSE
CNT:=CNT+1;
END_IF
4:
//Опрашиваем модуль МУ8Р по адресу 3 - управление дискретными выходами
IF Mod4_Enabl=FALSE THEN
Mod4_Enabl:=TRUE;
END_IF
mod4(Enabl:=Mod4_Enabl, out1:=ChArrBit[1], out2:=ChArrBit[2], out3:=ChArrBit[3], out4:=ChArrBit[4],
out5:=ChArrBit[5], out6:=ChArrBit[6], out7:=ChArrBit[7], out8:=ChArrBit[8]);
IF mod4.done THEN
Mod4_Enabl:=FALSE;
mod4(Enabl:=Mod4_Enabl);
CurrentModule:=CurrentModule+1;
CNT:=0;
ELSE
CNT:=CNT+1;
END_IF
5:
//Опрашиваем модуль МУ8Р по адресу 5 - управление дискретными выходами
IF Mod5_Enabl=FALSE THEN
Mod5_Enabl:=TRUE;
END_IF
mod5(Enabl:=Mod5_Enabl, out1:=ChArrBit[9], out2:=ChArrBit[10], out3:=ChArrBit[11], out4:=ChArrBit[12],
out5:=ChArrBit[13], out6:=ChArrBit[14], out7:=ChArrBit[15], out8:=ChArrBit[16]);
IF mod5.done THEN
Mod5_Enabl:=FALSE;
mod5(Enabl:=Mod5_Enabl);
CurrentModule:=CurrentModule+1;
CNT:=0;
ELSE
CNT:=CNT+1;
END_IF
6:
//Опрашиваем модуль МУ8Д4Р по адресу 6 - управление 4 дискретными выходами
IF Mod6_Enabl=FALSE THEN
Mod6_Enabl:=TRUE;
END_IF
mod6(Enabl:=Mod6_Enabl, out1:=ChArrBit[17], out2:=ChArrBit[18], out3:=ChArrBit[19], out4:=ChArrBit[20]);
IF mod6.done THEN
Mod6_Enabl:=FALSE;
mod6(Enabl:=Mod6_Enabl);
CurrentModule:=CurrentModule+1;
END_IF
7:
//Опрашиваем модуль МУ8Д4Р по адресу 6 - 8 дискретных входов
IF Mod7_Enabl=FALSE THEN
Mod7_Enabl:=TRUE;
END_IF
mod7(Enabl:=Mod7_Enabl);
IF mod7.done THEN
Mod7_Enabl:=FALSE;
mod7(Enabl:=Mod7_Enabl);
CurrentModule:=CurrentModule+1;
ChArrDI[1].Value:=mod7.inp1;
ChArrDI[2].Value:=mod7.inp2;
ChArrDI[3].Value:=mod7.inp3;
ChArrDI[4].Value:=mod7.inp4;
ChArrDI[5].Value:=mod7.inp5;
ChArrDI[6].Value:=mod7.inp6;
ChArrDI[7].Value:=mod7.inp7;
ChArrDI[8].Value:=mod7.inp8;
CNT:=0;
ELSE
CNT:=CNT+1;
END_IF
ELSE
CurrentModule:=1;
END_CASE
IF CNT>100 THEN
CNT:=0;
CurrentModule:=CurrentModule+1;
END_IF