自学内容网 自学内容网

信捷 XDH PLC C语言 Ethercat 简易绝对运动 BMC_A_DRVA_BODY函数

本文以简易运动为例,描述多轴运动的程序封装。具有一定的参数价值。适用于信捷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;


原文地址:https://blog.csdn.net/weixin_39926429/article/details/143747431

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!