TwinCat3上面接了两个从站,都在正常工作中。我想做的是同时对两个从站发出数字量信息。
比方说,我的从站1上面有LED0-LED7,都是由主站TwinCat控制亮灭。从站2也有LED0-LED7,也由主站控制亮灭。我想在TwinCat上发送指令,让从站1的LED0和从站2的LED0同时熄灭,然后隔几秒,再同时点亮。这样的话,我就可以验证同步性。
当使用TwinCAT3进行PLC编程时,要使用一个专门的软件工具,称为TwinCAT3 PLC Control。下面是一个简单的示例程序,该程序可以实现描述的同步控制功能。该程序使用CoE协议将数字量信息发送到两个从站,以控制LED的状态。
PROGRAM MAIN
VAR
LED0_Station1 : BOOL; //从站1上的LED0状态
LED0_Station2 : BOOL; //从站2上的LED0状态
END_VAR
//周期任务,每1毫秒执行一次
TASK PLC_PRG
//定义同步对象
ECAT_Sync0 : ECAT.SYNC;
//定义数字量对象,用于发送数据
CoE_TxPDO_Station1 : ECAT.CoE_TxPDO;
CoE_TxPDO_Station2 : ECAT.CoE_TxPDO;
//定义数字量数据
TxData_Station1 : ARRAY[0..1] OF BYTE := [0,0];
TxData_Station2 : ARRAY[0..1] OF BYTE := [0,0];
//定义同步周期,单位为微秒
SyncPeriod : UDINT := 1000;
SyncOffset : UDINT := 0;
//定义LED控制逻辑
IF ECAT_Sync0.Active THEN
//在同步周期开始时,设置LED0状态
IF ECAT_Sync0.CycleCounter = 0 THEN
//控制从站1上的LED0
TxData_Station1[0] := 0; //LED0熄灭
CoE_TxPDO_Station1.Data := TxData_Station1;
CoE_TxPDO_Station1.Send();
LED0_Station1 := FALSE; //标记LED0状态为“熄灭”
//控制从站2上的LED0
TxData_Station2[0] := 0; //LED0熄灭
CoE_TxPDO_Station2.Data := TxData_Station2;
CoE_TxPDO_Station2.Send();
LED0_Station2 := FALSE; //标记LED0状态为“熄灭”
END_IF;
//在同步周期的中间,保持LED0状态不变
IF ECAT_Sync0.CycleCounter = SyncPeriod / 2 THEN
//什么也不做
END_IF;
//在同步周期结束时,设置LED0状态
IF ECAT_Sync0.CycleCounter = SyncPeriod - 1 THEN
//控制从站1上的LED0
TxData_Station1[0] := 1; //LED0点亮
CoE_TxPDO_Station1.Data := TxData_Station1;
CoE_TxPDO_Station1.Send();
LED0_Station1 := TRUE; //标记LED0状态为“点亮”
//控制从站2上的LED0
TxData_Station2[0] := 1; //LED0点亮
CoE_TxPDO_Station2.Data := TxData_Station2;
CoE_TxPDO_Station2.Send();
LED0_Station2 := TRUE; //标记LED0状态为“点亮”
END_IF;
END_IF;
END_TASK
END_PROGRAM