单轴常用批量控制功能库V1.1.0阶段完整版

本次更新基本定型,各功能易用性大幅提升。

一、头文件定义

可参考之前的文章此处仅放置代码。

《信捷POU - C语言轴控“外挂”&批量引用轴的解决新方案》

#ifndef	_SuperAxisArray_H
#define	_SuperAxisArray_H

    BMC_AXIS_REF *Axis[3];

    Axis[0] = &BMC_Axis000;
    Axis[1] = &BMC_Axis001;
    Axis[2] = &BMC_Axis002;
/*
    Axis[3] = &BMC_Axis003;
    Axis[4] = &BMC_Axis004;
    Axis[5] = &BMC_Axis005;
    Axis[6] = &BMC_Axis006;
    Axis[7] = &BMC_Axis007;
    Axis[8] = &BMC_Axis008;
    Axis[9] = &BMC_Axis009;
    Axis[10] = &BMC_Axis010;
    Axis[11] = &BMC_Axis011;
    Axis[12] = &BMC_Axis012;
    Axis[13] = &BMC_Axis013;
    Axis[14] = &BMC_Axis014;
    Axis[15] = &BMC_Axis015;
    Axis[16] = &BMC_Axis016;
    Axis[17] = &BMC_Axis017;
    Axis[18] = &BMC_Axis018;
    Axis[19] = &BMC_Axis019;
    Axis[20] = &BMC_Axis020;
    Axis[21] = &BMC_Axis021;
    Axis[22] = &BMC_Axis022;
    Axis[23] = &BMC_Axis023;
    Axis[24] = &BMC_Axis024;
    Axis[25] = &BMC_Axis025;
    Axis[26] = &BMC_Axis026;
    Axis[27] = &BMC_Axis027;
    Axis[28] = &BMC_Axis028;
    Axis[29] = &BMC_Axis029;
    Axis[30] = &BMC_Axis030;
    Axis[31] = &BMC_Axis031;
*/
#endif

二、程序内用到的结构体定义

代码如下:

//上升沿下降沿采集函数结构体
typedef struct Edge_Trige_Struct{	
    BOOL	Ex	    //状态采集
    BOOL	Status	//状态保存
    BOOL	Q	    //边沿输出
}

//使能&轴状态信息精简输出结构体
typedef struct AxisPowerStatusStruct{
    BOOL	            PowerStatus	    //使能状态
    UINT	            PowerErrCode	//使能错误码
    BMC_AXIS_ACTINFO	AxisAct	        //轴反馈信息
    BMC_AXIS_STATUS	    AxisStatus	    //轴状态机
}

//轴控指令参数结构体(共40字,LREAL 4字的整数倍以便映射地址偏移)
typedef struct ManParameterStruct{
    LREAL	Velocity	        //速度
    LREAL	Acceleration	    //加速度
    LREAL	Deceleration	    //减速度
    LREAL	Jrek	            //加加速度
    LREAL	AbsolutePosition	//绝对定位目标点
    LREAL	RelativePosition	//相对定位目标点
    LREAL	PositionSetting	    //设定的位置
    UINT	VStopMode	        //速度模式停止类型0:减速停机;1:急停;2:急停并关使能
    UINT	VContinuousMode	    //速度模式持续更新0:不更新1:更新
    UINT	EStopMode	        //急停模式停止类型0:减速停机;1:急停;2:急停并关使能
    INT	    mem10	            //占位
    INT    	mem11	            //占位
    INT	    mem12	            //占位
    INT	    mem13	            //占位
    INT	    mem14	            //占位
    INT	    mem15	            //占位
    INT	    mem16	            //占位
    INT	    mem17	            //占位
    INT	    mem18	            //占位
}

//轴控命令结构体(10个bool,以便映射偏移)
typedef struct ManCtrlStruct{
    BOOL	Forward	        //正转
    BOOL	Backward	    //反转
    BOOL	MoveAbsolute	//绝对定位
    BOOL	MoveRelative	//相对定位
    BOOL	EStop	        //急停
    BOOL	SetPosition	    //设置位置(写0)
    BOOL	mem6	        //占位
    BOOL	mem7	        //占位
    BOOL	mem8	        //占位
    BOOL	mem9	        //占位
}

//X输入点映射bool结构体
typedef struct IN_PUT_Struct{
    BOOL	X_0	    //X0
    BOOL	X_1	    //X1
    BOOL	X_2	    //X2
    BOOL	X_3	    //X3
    BOOL	X_4	    //X4
    BOOL	X_5	    //X5
    BOOL	X_6	    //X6
    BOOL	X_7	    //X7
}

//bool映射Y点结构体
typedef struct OUT_PUT_Struct{
    BOOL	Y_0	    //Y0
    BOOL	Y_1    	//Y1
    BOOL	Y_2    	//Y2
    BOOL	Y_3    	//Y3
    BOOL	Y_4	    //Y4
    BOOL	Y_5    	//Y5
    BOOL	Y_6    	//Y6
    BOOL	Y_7	    //Y7
}

三、批量使能POU

1.参数定义区

VAR_INPUT	BOOL	                    Start	        //使能信号
VAR_INPUT	INT	                        Num_Of_Axis	    //需使能轴数
VAR	        BMC_A_Power    	            APwoer[32]	    //指令背景数据
VAR_OUTPUT	BOOL	                    StartDone	    //所有轴启动成功
VAR_OUTPUT	AxisPowerStatusStruct    	AxisInfo[32]	//轴信息

2.代码区

void F_Axis_Enable_BODY(F_Axis_Enable* self)
{
#define SysRegAddr_HD_D_HM_M
#include"D:\XINJE\SuperAxisArray.h"//调用头文件

    int i,j,k,cunt0;
    BMC_AXIS_REF Axis_Temp;
    
    for ( i = 0; i < self->Num_Of_Axis; i++ )//批量控制
    {
        BMC_A_Power_BODY ( &self->APwoer[i] );
        self->APwoer[i].Axis = Axis[i];
        self->APwoer[i].Enable = self->Start;
        
        Axis_Temp = *Axis[i];
        self->AxisInfo[i].PowerErrCode = self->APwoer[i].ErrCode;
        self->AxisInfo[i].PowerStatus = self->APwoer[i].PwrStat;
        self->AxisInfo[i].AxisAct = Axis_Temp.Act;
        self->AxisInfo[i].AxisStatus = Axis_Temp.Status;
    }
    
    cunt0 = 0;
    for(j=0;j<self->Num_Of_Axis;j++)//统计使能成功的轴
    {
    	
    	if(self->APwoer[j].PwrStat == 1)
        {
            cunt0 = cunt0 + 1;
        }
        
        if(cunt0 == self->Num_Of_Axis)
        {
            self->StartDone = 1;
        }
        else
        {
            self->StartDone = 0;
        }
    }
}

四、批量手动控制POU

1.参数定义区

VAR_INPUT	INT	                      Num_Of_Axis    	//使能轴数
VAR_INPUT	ManCtrlStruct             ManCtrl[32]		//控制命令结构体数组
VAR_INPUT	ManParameterStruct        ManPara[32]		//控制参数结构体数组
VAR	        BMC_A_VelMove             AVelmove[32]		//速度指令参数结构体数组
VAR	        BMC_A_Stop                AStop[32]		    //停止指令参数结构体数组
VAR	        BMC_A_Write               AWrite[32]		//位置写指令参数结构体数组
VAR	        Edge_Trige_Struct         F_Trige[32]		//下降沿函数参数结构体数组
VAR	        Edge_Trige_Struct         R_Trige[32]		//上升沿函数参数结构体数组

2.代码区

void F_Axis_Manual_BODY(F_Axis_Manual* self)
{
#define SysRegAddr_HD_D_HM_M
#include"D:\XINJE\SuperAxisArray.h"
    int i;
    for ( i = 0; i < self->Num_Of_Axis; i++ )
    {
        BMC_A_VelMove_BODY ( &self->AVelmove[i] );
        self->AVelmove[i].Axis = Axis[i];

        BMC_A_Stop_BODY ( &self->AStop[i] );
        self->AStop[i].Axis = Axis[i];
        
        BMC_A_Write_BODY ( &self->AWrite[i] );
        self->AWrite[i].Axis = Axis[i];
        
        self->R_Trige[i].Ex = self->ManCtrl[i].Forward || self->ManCtrl[i].Backward;
        R_Trige ( &self->R_Trige[i] );
        
        if ( self->R_Trige[i].Q )
        {
            self->AStop[i].Done = 0;
        }
        //速度控制部分
        self->AVelmove[i].Execute = self->ManCtrl[i].Forward || self->ManCtrl[i].Backward;
        if ( self->ManCtrl[i].Forward == 1 && self->ManCtrl[i].Backward == 0 )
        {
            self->AVelmove[i].Vel = self->ManPara[i].Velocity;
        }
        if ( self->ManCtrl[i].Forward == 0 && self->ManCtrl[i].Backward == 1 )
        {
            self->AVelmove[i].Vel = 0 - self->ManPara[i].Velocity;
        }
        self->AVelmove[i].Acc = self->ManPara[i].Acceleration;
        self->AVelmove[i].Deceleration = self->ManPara[i].Deceleration;
        self->AVelmove[i].Jerk = self->ManPara[i].Jrek;
        self->AVelmove[i].ContinuousMode = self->ManPara[i].VContinuousMode;
        self->AVelmove[i].BufferMode = 0;
                       
        self->F_Trige[i].Ex = self->AVelmove[i].Execute;
        F_Trige ( &self->F_Trige[i] );
        //停止部分
        self->AStop[i].Execute = self->F_Trige[i].Q;
        self->AStop[i].Deceleration = self->ManPara[i].Deceleration;
        self->AStop[i].Jerk = self->ManPara[i].Jrek;
        self->AStop[i].StopMode = self->ManPara[i].VStopMode;
        //写位置部分
        self->AWrite[i].Execute = self->ManCtrl[i].SetPosition;
        self->AWrite[i].Pos = self->ManPara[i].PositionSetting;
        self->AWrite[i].RelativeMode = 0;
    }
}

五、批量绝对定位POU

1.参数定义区

VAR_INPUT	INT	                      Num_Of_Axis	
VAR_INPUT	ManCtrlStruct             ManCtrl[32]		
VAR_INPUT	ManParameterStruct        ManPara[32]		
VAR	        BMC_A_MoveA    	          AMoveA[32]	

2.代码区

void F_Axis_Absolute_BODY(F_Axis_Absolute* self)
{
	#define SysRegAddr_HD_D_HM_M
	#include"D:\XINJE\SuperAxisArray.h"
    int i;
	for(i=0;i<self->Num_Of_Axis;i++)
    {
        BMC_A_MoveA_BODY ( &self->AMoveA[i] );
        self->AMoveA[i].Execute = self->ManCtrl[i].MoveAbsolute;
        self->AMoveA[i].Axis = Axis[i];
        self->AMoveA[i].Pos = self->ManPara[i].AbsolutePosition;
        self->AMoveA[i].Vel = self->ManPara[i].Velocity;
        self->AMoveA[i].Acc = self->ManPara[i].Acceleration;
        self->AMoveA[i].Deceleration = self->ManPara[i].Deceleration;
        self->AMoveA[i].Jerk = self->ManPara[i].Jrek;
    }
}

六、批量相对定位POU

1.参数定义区

VAR_INPUT	INT                         Num_Of_Axis		
VAR_INPUT	ManCtrlStruct               ManCtrl[32]		
VAR_INPUT	ManParameterStruct    	    ManPara[32]	
VAR	        BMC_A_MoveR                 AMoveR[32]		

2.代码区

void F_Axis_Relative_BODY(F_Axis_Relative* self)
{
	#define SysRegAddr_HD_D_HM_M
	#include"D:\XINJE\SuperAxisArray.h"
    int i;
	for(i=0;i<self->Num_Of_Axis;i++)
    {
        BMC_A_MoveR_BODY ( &self->AMoveR[i] );
        self->AMoveR[i].Execute = self->ManCtrl[i].MoveRelative;
        self->AMoveR[i].Axis = Axis[i];
        self->AMoveR[i].Pos = self->ManPara[i].RelativePosition;
        self->AMoveR[i].Vel = self->ManPara[i].Velocity;
        self->AMoveR[i].Acc = self->ManPara[i].Acceleration;
        self->AMoveR[i].Deceleration = self->ManPara[i].Deceleration;
        self->AMoveR[i].Jerk = self->ManPara[i].Jrek;
    }
}

七、批量急停POU

1.参数定义区

VAR_INPUT	INT                        Num_Of_Axis		
VAR_INPUT	ManCtrlStruct              ManCtrl[32]		
VAR_INPUT	ManParameterStruct    	   ManPara[32]	
VAR	        BMC_A_Stop                 AStop[32]		

2.代码区

void F_Axis_E_Stop_BODY(F_Axis_E_Stop* self)
{
	#define SysRegAddr_HD_D_HM_M
	#include"D:\XINJE\SuperAxisArray.h"
    int i;
	for(i=0;i<self->Num_Of_Axis;i++)
    {
        BMC_A_Stop_BODY ( &self->AStop[i] );
        self->AStop[i].Execute = self->ManCtrl[i].EStop;
        self->AStop[i].Axis = Axis[i];
        self->AStop[i].Deceleration = self->ManPara[i].Deceleration;
        self->AStop[i].Jerk = self->ManPara[i].Jrek;
        self->AStop[i].StopMode = self->ManPara[i].EStopMode;
    }
}

八、X/Y映射POU

void F_Image_Inout()
{
#define SysRegAddr_HD_D_HM_M_X_Y//宏定义增加X/Y

    INPUT_Body[0].X_0 = X[00];//数字前加0,例如011为八进制数11
    INPUT_Body[0].X_1 = X[01];//不使用for循环是为了方便改映射
    INPUT_Body[0].X_2 = X[02];
    INPUT_Body[0].X_3 = X[03];
    INPUT_Body[0].X_4 = X[04];
    INPUT_Body[0].X_5 = X[05];
    INPUT_Body[0].X_6 = X[06];
    INPUT_Body[0].X_7 = X[07];
    
    INPUT_Body[1].X_0 = X[010];
    INPUT_Body[1].X_1 = X[011];
    INPUT_Body[1].X_2 = X[012];
    INPUT_Body[1].X_3 = X[013];
    INPUT_Body[1].X_4 = X[014];
    INPUT_Body[1].X_5 = X[015];
    INPUT_Body[1].X_6 = X[016];
    INPUT_Body[1].X_7 = X[017];
    
    INPUT_Body[2].X_0 = X[020];
    INPUT_Body[2].X_1 = X[021];
    INPUT_Body[2].X_2 = X[022];
    INPUT_Body[2].X_3 = X[023];
    INPUT_Body[2].X_4 = X[024];
    INPUT_Body[2].X_5 = X[025];
    INPUT_Body[2].X_6 = X[026];
    INPUT_Body[2].X_7 = X[027];
    
    INPUT_Body[3].X_0 = X[030];
    INPUT_Body[3].X_1 = X[031];
    INPUT_Body[3].X_2 = X[032];
    INPUT_Body[3].X_3 = X[033];
    INPUT_Body[3].X_4 = X[034];
    INPUT_Body[3].X_5 = X[035];
    INPUT_Body[3].X_6 = X[036];
    INPUT_Body[3].X_7 = X[037];
    
    INPUT_Body[4].X_0 = X[040];
    INPUT_Body[4].X_1 = X[041];
    INPUT_Body[4].X_2 = X[042];
    INPUT_Body[4].X_3 = X[043];
    INPUT_Body[4].X_4 = X[044];
    INPUT_Body[4].X_5 = X[045];
    INPUT_Body[4].X_6 = X[046];
    INPUT_Body[4].X_7 = X[047];
    
    Y[00] = OUTPUT_Body[0].Y_0;
    Y[01] = OUTPUT_Body[0].Y_1;
    Y[02] = OUTPUT_Body[0].Y_2;
    Y[03] = OUTPUT_Body[0].Y_3;
    Y[04] = OUTPUT_Body[0].Y_4;
    Y[05] = OUTPUT_Body[0].Y_5;
    Y[06] = OUTPUT_Body[0].Y_6;
    Y[07] = OUTPUT_Body[0].Y_7;
    
    Y[010] = OUTPUT_Body[1].Y_0;
    Y[011] = OUTPUT_Body[1].Y_1;
    Y[012] = OUTPUT_Body[1].Y_2;
    Y[013] = OUTPUT_Body[1].Y_3;
    Y[014] = OUTPUT_Body[1].Y_4;
    Y[015] = OUTPUT_Body[1].Y_5;
    Y[016] = OUTPUT_Body[1].Y_6;
    Y[017] = OUTPUT_Body[1].Y_7;
    
    Y[020] = OUTPUT_Body[2].Y_0;
    Y[021] = OUTPUT_Body[2].Y_1;
    Y[022] = OUTPUT_Body[2].Y_2;
    Y[023] = OUTPUT_Body[2].Y_3;
    Y[024] = OUTPUT_Body[2].Y_4;
    Y[025] = OUTPUT_Body[2].Y_5;
    Y[026] = OUTPUT_Body[2].Y_6;
    Y[027] = OUTPUT_Body[2].Y_7;
    
    Y[030] = OUTPUT_Body[3].Y_0;
    Y[031] = OUTPUT_Body[3].Y_1;
    Y[032] = OUTPUT_Body[3].Y_2;
    Y[033] = OUTPUT_Body[3].Y_3;
    Y[034] = OUTPUT_Body[3].Y_4;
    Y[035] = OUTPUT_Body[3].Y_5;
    Y[036] = OUTPUT_Body[3].Y_6;
    Y[037] = OUTPUT_Body[3].Y_7;
    
    Y[040] = OUTPUT_Body[4].Y_0;
    Y[041] = OUTPUT_Body[4].Y_1;
    Y[042] = OUTPUT_Body[4].Y_2;
    Y[043] = OUTPUT_Body[4].Y_3;
    Y[044] = OUTPUT_Body[4].Y_4;
    Y[045] = OUTPUT_Body[4].Y_5;
    Y[046] = OUTPUT_Body[4].Y_6;
    Y[047] = OUTPUT_Body[4].Y_7;
}

九、案例主程序

1.全局变量定义

F_Axis_Enable            F_Axis_Enable_1		
F_Axis_Manual            F_Axis_Manual_1	
F_Axis_Absolute          F_Axis_Absolute_1		
F_Axis_Relative          F_Axis_Relative_1		
F_Axis_E_Stop            F_Axis_E_Stop_1		
ManCtrlStruct            MCtrl[32]//轴控命令结构体数组	
ManParameterStruct       MPara[32]//轴控参数结构体数组		
AxisPowerStatusStruct    AxisInfo[32]//轴使能&信息简化结构体数组			
BOOL                     start//批量使能命令	
INT	                     Num//使用的轴数	

2.梯形图调用

3.自由监控调试案例:手动正转

4.自由监控调试案例:轴状态监控

5、自由监控调试案例:输入输出映射

十、其他

1.测试配置清单

测试配置清单
软件版本XDPPRO 3.7.17b

PLC型号

XLH-30A32
PLC固件版本3.7.3a
伺服驱动器型号DS5C1-20P1-PTA
伺服驱动器固件版本3.7.9.2

2.POU功能库分享

单轴常用批量控制功能库V1.1.0

3.XDPPRO测试程序分享

信捷XDPPRO编程软件程序案例

4.结语

抛砖引玉,有问题未及时回复请联系V:Flovui

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贰佰肆拾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值