本次更新基本定型,各功能易用性大幅提升。
一、头文件定义
可参考之前的文章此处仅放置代码。
《信捷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功能库分享
3.XDPPRO测试程序分享
4.结语
抛砖引玉,有问题未及时回复请联系V:Flovui