首先举个要实现的简单例子,有1000台电机启停控制,每台电机的控制方式均相同,按下启动按钮,启动电机,在启动输出秒后,无运行反馈信号,报合闸失败故障,若有运行信号,则正常运行,按下停止按钮,输出关闭,设备停止。
很多人的常规方法是这样考虑的,因为有启动计时,只能用FB来做,FB把功能写好后,有1000台电机就调用1000次相应的FB块,每个FB块对应一个电机数据。
现在我刚学到一个新方法,所以跟大家分享一下,其思路是这样的,
首先要建一个数据类型UDT(也就是结构变量),把一个电机所有用到的变量信息建到UDT里;
第二,建一个全局数据块DB1,在数据块中建立变量,类型为刚才建的UDT;
第三,建一个FC1块,建立临时变量,顺序和名称跟UDT中一致,然后再建IN型的变量,Num int型,电机数量,DBH,int型,数据块编号,RST,Bool型,复位,TIM_Base,Bool型,秒时基。
第四,编写FC块,首先打开DBH编号指定的数据块,然后初始化指针,开启循环,如下
L #DBH //传送DB块号
T #DBHT
OPN DB [#DBHT] //打开数据块
LAR1 P#DBX 0.0 //初始化指针
L #NUM //设置电机数量
Loop: T #COUNT
在循环内,首先调DB1中第一个电机的数据到FC的临时变量中,如下
L B [AR1,P#0.0] //读取Motor第一个字节内容
T LB 0
L W [AR1,P#2.0] //读取报警信息
T LW 2
L W [AR1,P#4.0]
只写部分哦
然后用FC中的临时变量写电机启动功能程序代码
写完成后,再把临时变量的值返还到DB1的第一个电机数据中,如下
L LB 0 // 返回信息
T B [AR1,P#0.0]
L LW 2
T W [AR1,P#2.0] //返回报警信息
L LW 4
T W [AR1,P#4.0] //返回屏蔽报警信息
L LW 6
T W [AR1,P#6.0] //返回信息
L #STATE
最后,指针偏移到下一个循环,如下
+AR1 P#50.0 //偏置字节数
L #COUNT
LOOP Loop
FC块编写完成
第五,在OB1中调用FC1,在相应的管脚上填入数据,如下
CALL FC1
NUM :=1000 //电机数量
DBH :=1 //数据块DB1 的编号1
RST :="RESET" //复位
TIM_BASE :="1秒时钟" //秒脉冲
接下来就是要把输入和输出信号跟DB1对接就可以了
这样就可以实现完成1000个电机的控制