本文以简易运动为例,描述多轴运动的程序封装。具有一定的参数价值。适用于信捷XDH PLC。
很容易移植到具有Ethercat 总线的PLC,使用ST语言的情况。
1.建立结构体
2.在全局变量表建立全局变量
(1)DRVA_PAR_array是类型为BMC_A_DRVA,长度为3的数组
BMC_A_DRVA_BODY函数的参数要用它。
(2)stp_PAR_array是类型为BMC_A_Stop,长度为3的数组
BMC_A_Stop_BODY函数的参数要用它。
(3)T_MoveOK_array是类型为BMC_A_Stop,长度为3的数组
TMR_A_FB_BODY函数的参数要用它。
3.建立pou C (FB),名称为POU_Move
3.1 在变量声明区添加变量Station_No,具体如下
类别 名称 类型 注释
VAR_INPUT Station_No INT 工位号
3.2 在函数体体里添加语句,完成后如下
void POU_Move_BODY(POU_Move* self)
{
#define SysRegAddr_HD_D_HM_M
#include "D:\XINJE\SuperAxisArray.h"//轴的实际的存放头文件地址,要不然报错
int i = self->Station_No-1;
if(0==pou_Move_State_array[i].State)
{
DRVA_PAR_array[i].Axis=Axis[i];
DRVA_PAR_array[i].Execute = true;
BMC_A_DRVA_BODY(&DRVA_PAR_array[i]);
pou_Move_State_array[i].State = 1;
}
if(1==pou_Move_State_array[i].State)
{
if ( 0==i && M[2610] || 1==i && M[2630] || 2==i && M[2650] )//如果无压力传感器屏蔽这部分
//M2610,M2630,M2650是三工位的压力超过设定值的标志位
{
BMC_A_Stop_BODY ( &stp_PAR_array[i] );
stp_PAR_array[i].Axis = Axis[i];
stp_PAR_array[i].Execute = true;
} //如果无压力传感器屏蔽这部分
if ( 0==i && (M[2610]|| Axis[i]->Status.StandStill )
|| 1==i && (M[2630]|| Axis[i]->Status.StandStill )
|| 2==i && (M[2650]|| Axis[i]->Status.StandStill ) )
//如果压力超过或者马达处于静止状态
{
T_MoveOk_array[i].TimeBase = 1;//设定定时器单位
T_MoveOk_array[i].Circle = 5; //设定值定时长度
T_MoveOk_array[i].Enable = true;//全局变量给定时器的线圈通电
TMR_A_FB_BODY ( &T_MoveOk_array[i] ); //取(定时器)功能快变量的地址给功能块做参数
if ( T_MoveOk_array[i].QStatus )
{
pou_Move_State_array[i].State = 2;
}
}
}
if(2==pou_Move_State_array[i].State)
{
DRVA_PAR_array[i].Axis=Axis[i];
DRVA_PAR_array[i].Execute = false;//在这里取消使能,要不然只能动一次。
BMC_A_DRVA_BODY(&DRVA_PAR_array[i]);
pou_Move_State_array[i].external_cond = false;//将外步条件赋值为false
pou_Move_State_array[i].State=3;//完了赋值1个虚的State号(前面只有0,1,2这三个State)
//这两行是双保险,防止程序乱跑
}
}
4.在梯形图里调用
说明:a.看起来比较麻烦,但实现了调用程序的解耦,调用的时候赋值给外部条件为true;
但这样监视起来比较直观。
b.在其它pou里先给DRVA_PAR_array[i].Pos,DRVA_PAR_array[i].Vel,DRVA_PAR_array[i].Pos.ACCtIME赋值。
然后 pou_Move_State_array[i].external_cond = true;