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轴CAN

VAR_IN_OUT
	can轴输入: _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_VAR

VAR_INPUT
	f齿轮比:REAL:=10000;// 齿轮比【圈脉冲】
	u1电源:BOOL:=FALSE;// h6040
	u1复位: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;//		h6081
	f加速度:REAL:=10;//	h6083
	f减速度:REAL:=10;//	h6084
	
	f目标速度:REAL:=10;//  h60FF
	f绝对坐标:REAL:=5;// h607A
	f相对坐标:REAL:=5;// h607A
	i16力矩值:INT:=5;// h6071
END_VAR

VAR_OUTPUT
	b轴使能状态			:BOOL;
	b伺服通信状态		:BOOL;
	
	f轴当前位置			:LREAL;
	f轴当前速度			:lREAL;
	f轴当前力矩			:REAL;
	
	e轴运行状态			:SMC_AXIS_STATE;
	e轴故障代码			:MC_ERROR_CO;
	
END_VAR

VAR
	//【输入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.wStatusWord

IF Axis1.In.wStatusWord =16#200 		    //【雷赛】默认0x0200,要改成 0x0250
OR (Axis1.In.wStatusWord AND 16#0F) =16#00 	// 8670,【xxx0】
THEN
	Axis1.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博客

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部