本文主要是介绍codesys【CAN总线】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1下载设备描述文件:
必须下载设备描述文件,要不然编程软件无法正确组态。
根据实际设备【品牌】去官网搜索下载。
以 DMA882-CAN 为例
CAN的设备描述文件是【.eds】的扩展名
安装设备描述文件。
2添加CAN总线:
1添加【CAN总线】:设置通讯速率 1Mbps
2添加【CAN主站】:设置站号【默认127】。(有SoftMotion的是有轴功能)
3在线》扫描设备
》复制所有设备到工程
3组态设备:
跟ECAT总线有区别,伺服下面不需要再挂载402轴。
1必须离线状态下,才能编辑
2组态PDO和SDO
PDO:周期性的刷新【寄存器表】的值。如0x606C电机速度,
你不加进去,功能块就无法知道电机速度。
SDO:相当于初始化寄存器一次。参考【0x2000】段寄存器
4使用:
FB块:Power实际操作的是0x6040和0x6041的值。
这个雷赛0x6041的默认值有故障,需要程序修改0x6041的值0x250
这里我使用了【禾川CAN库】用轴组批量控制轴。
不使用库也可以,参考0x6040的赋值操作 0x00》0x06》0x07》0x0F ,动作0x1F
FUNCTION_BLOCK FB轴CANVAR_IN_OUTcan轴输入: _3SCOS.CANRemoteDevice;//【CAN驱动器】//ecat实轴输入:SM3_Drive_ETC_DS402_CyclicSync.AXIS_REF_ETC_DS402_CS;//【ECAT】//axis: _3SCOS.CANRemoteDevice;//【CAN驱动器】//编码器轴:SM3_Basic.FREE_ENCODER_REF;//【ENCODE】
END_VARVAR_INPUTf齿轮比:REAL:=10000;// 齿轮比【圈脉冲】u1电源:BOOL:=FALSE;// h6040u1复位:BOOL:=FALSE;u1急停:BOOL:=FALSE;u1点正:BOOL:=FALSE;// 先按急停,再按点动u1点反:BOOL:=FALSE;u1回零:BOOL:=FALSE;lf零点偏置:LREAL:=1234;u1速度模式:BOOL:=FALSE;u1绝对模式:BOOL:=FALSE;u1相对模式:BOOL:=FALSE;u1力矩模式:BOOL:=FALSE;f速度:REAL:=10;// h6081f加速度:REAL:=10;// h6083f减速度:REAL:=10;// h6084f目标速度:REAL:=10;// h60FFf绝对坐标:REAL:=5;// h607Af相对坐标:REAL:=5;// h607Ai16力矩值:INT:=5;// h6071
END_VARVAR_OUTPUTb轴使能状态 :BOOL;b伺服通信状态 :BOOL;f轴当前位置 :LREAL;f轴当前速度 :lREAL;f轴当前力矩 :REAL;e轴运行状态 :SMC_AXIS_STATE;e轴故障代码 :MC_ERROR_CO;END_VARVAR//【输入5x】x6041:UINT;// 状态字x6061:SINT;// 模式x6064:DINT;// 电机位置x606C:DINT;// 电机速度x6077:INT;// 电机力矩//【输出9y】y6040:UINT;//控制字y6060:SINT;//模式y6081:UDINT;//【u32file】速度y6083:UDINT;//【u32file】加速y6084:UDINT;//【u32file】减速y607A:DINT;//【i32Targe】定位坐标y60FF:DINT;//【i32Targe】模式:速度y6071:INT;// 【i16Targe】模式:力矩y607C:DINT;//原点【刀具偏置】
//=====================================//AXIS: _3SCOS.CANRemoteDevice;// :=ADR(DMA882_CAN); Axis1: AXIS_REF_CO ; // 新建局部变量
//==============================================MC_Power_CO :MC_Power_CO;MC_Home_CO :MC_Home_CO;MC_Reset_CO :MC_Reset_CO;MC_Stop_CO :MC_Stop_CO;MC_MoveVelocity_CO :MC_MoveVelocity_CO;//【速度模式】MC_MoveAbsolute_CO :MC_MoveAbsolute_CO;//【绝对定位】MC_MoveRelative_CO :MC_MoveRelative_CO;//【相对定位】MC_Jog_CO :MC_Jog_CO;//【点动】先按stop再按点动TON_0: ton;//【刷新定位】u16线程count: UINT;
END_VAR
u16线程count:=u16线程count+1;axis1.pDevice:= ADR(can轴输入); //axis1.pDevice:= ADR(axis);
//【输入5x】
axis1.In.wStatusWord:=x6041; // 状态字
axis1.In.sActMode:=x6061; // 模式
axis1.In.dActPosition:=x6064;// 电机位置
axis1.In.dActVelocity:=x606C;// 电机速度
axis1.In.dActTorque:=x6077; // 电机力矩// 修改0x6041默认值0x0250
// IF gvl.h6041 = 16#0200
// OR gvl.h6041 = 16#8270
// OR gvl.h6041 = 16#0270//axis1.In.wStatusWordIF Axis1.In.wStatusWord =16#200 //【雷赛】默认0x0200,要改成 0x0250
OR (Axis1.In.wStatusWord AND 16#0F) =16#00 // 8670,【xxx0】
THENAxis1.In.wStatusWord := 16#250;// 准备
END_IF
//【程序处理】A00_功能块调用();
//【输出9y】y6040:=axis1.Out.wControlWord;//控制字y6060:=axis1.Out.sSetMode;//模式y6081:=axis1.Out.dProfileVel;//速度 '6082冲击速度'y6083:=axis1.Out.dProfileAcc;//加速y6084:=axis1.Out.dProfileDec;//减速y607A:=axis1.Out.dTargetPos;//【模式定位】'追踪定位'y60ff:=axis1.Out.dTargetVel;//【模式速度】y6071:=axis1.Out.dTargetTor;//【模式力矩】y607C:=axis1.Out.dHomeOffset;// 原点偏置//【显示结果】
b轴使能状态 :=axis1.bRegulatorRealState;//---轴使能状态
b伺服通信状态 :=Axis1.bCommunication; //---读取从站通信状态f轴当前位置 :=Axis1.fActPosition; //---读取伺服 反馈位置
f轴当前速度 :=Axis1.fActVelocity; //---读取伺服 反馈速度
f轴当前力矩 :=Axis1.fActTorque; //---读取伺服 反馈转矩e轴运行状态 :=Axis1.nAxisState; //---读取轴运行状态
e轴故障代码 :=Axis1.eErrorID[0]; //---读取当前的轴故障代码
5其他参考资料:
DMA882-CAN【驱动器】站127_dummyusage-CSDN博客
canopen协议详解【C#二次开发】_canopen通讯协议-CSDN博客
这篇关于codesys【CAN总线】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!