博文

台达AX8运动控制器应用笔记

约 2 分钟

ABC 功能块变量

FUNCTION_BLOCK FB_ABC
VAR_INPUT
	Axis         : REFERENCE TO AXIS_REF_SM3 ;
	bAxisEnable  : BOOL ;
	rAxisAcc     : REAL ;
	rAxisDec     : REAL ;
	rAxisJerk    : REAL ;
	rAbsPos      : REAL ;
	rAbsVel      : REAL ;
	rRelDis      : REAL ;
	rRelVel      : REAL ;
	rJogVel      : REAL ;
	rVel         : REAL ;
	UdtDir       : MC_DIRECTION ;
	rSetPos      : REAL ;
	bSetPosRel   : BOOL ;
END_VAR
VAR_OUTPUT
	bHomeDone   : BOOL;
END_VAR
VAR
	iAxisCMD    : INT;
	Enable      : MC_Power;
	Stop        : MC_Stop;
	Reset       : MC_Reset;
	Home        : MC_Home;
	MoveAbs     : MC_MoveAbsolute;
	MoveRel     : MC_MoveRelative;
	MoveVel     : MC_MoveVelocity;
	Jog         : MC_Jog;
	SetPos      : MC_SetPosition;
	//管理层信息
	Status      : MC_ReadStatus;
	ErrorCode   : MC_ReadAxisError;
	ActPos      : MC_ReadActualPosition;
	ActVel      : MC_ReadActualVelocity;
	ActTrq      : MC_ReadActualTorque;
	ReadFBError : SMC_ReadFBError;

END_VAR

ABC 功能块程序

ACT_Power();
ACT_Stop();
ACT_Reset();
ACT_Home();
ACT_Jog();
ACT_MoveAbs();
ACT_MoveRel();
ACT_MoveVel();
ACT_SetPos();

ACT_Status();
ACT_ErrorCode();
ACT_ActPos();
ACT_ActVel();
ACT_ActTrq();
ACT_ReadFBError();

Enable.bRegulatorOn := bAxisEnable ;

CASE iAxisCMD OF
	1://JogP
		Jog.JogBackward := FALSE ;
		Jog.JogForward  := TRUE ;
	2://JogN
		Jog.JogForward  := FALSE ;
		Jog.JogBackward := TRUE ;
	3:
		MoveRel.Execute := TRUE;
		iAxisCMD        := 30 ;
	30:
		IF MoveRel.Done THEN
			MoveRel.Execute := FALSE;
			iAxisCMD        := 0 ;
		END_IF;
	4:
		MoveAbs.Execute := TRUE;
		iAxisCMD        := 40 ;
	40:
		IF MoveAbs.Done THEN
			MoveAbs.Execute := FALSE;
			iAxisCMD        := 0 ;
		END_IF;
	5:
		MoveVel.Execute := TRUE;
		iAxisCMD        := 50 ;
	50:
		IF MoveVel.InVelocity THEN
			MoveVel.Execute := FALSE;
			iAxisCMD        := 0 ;
		END_IF;
	6:
		SetPos.Execute := TRUE;
		iAxisCMD       := 60 ;
	60:
		IF SetPos.Done THEN
			SetPos.Execute := FALSE;
			iAxisCMD       := 0 ;
		END_IF;
	9:
		Reset.Execute := TRUE ;
		iAxisCMD      := 90 ;
	90:
		IF Reset.Done THEN
			Reset.Execute := FALSE ;
			iAxisCMD      := 0 ;
		END_IF
	10:
		bHomeDone       := FALSE ;
		Home.Execute    := TRUE ;
		iAxisCMD        := 100 ;
	100:
		IF Home.Done THEN
			bHomeDone  := TRUE ;
			iAxisCMD   := 0 ;
		END_IF
ELSE
	Reset.Execute   := FALSE ;
	Home.Execute    := FALSE ;
	Jog.JogBackward := FALSE ;
	Jog.JogForward  := FALSE ;
	MoveRel.Execute := FALSE ;
	MoveAbs.Execute := FALSE ;
	MoveVel.Execute := FALSE ;
	SetPos.Execute  := FALSE ;
END_CASE

ABC 功能块动作ACT_Power

Enable(
	Axis         := Axis,
	Enable       := TRUE,
	bRegulatorOn := ,
	bDriveStart  := TRUE,
	Status=> ,
	bRegulatorRealState=> ,
	bDriveStartRealState=> ,
	Busy=> ,
	Error=> ,
	ErrorID=> );

ABC 功能块动作ACT_Reset

Reset(
	Axis    := Axis,
	Execute := ,
	Done=> ,
	Busy=> ,
	Error=> ,
	ErrorID=> );

ABC 功能块动作ACT_Stop

Stop(
	Axis         := Axis,
	Execute      := ,
	Deceleration := REAL_TO_LREAL(rAxisDec)*10,
	Jerk         := REAL_TO_LREAL(rAxisJerk)*10,
	Done=> ,
	Busy=> ,
	Error=> ,
	ErrorID=> );

ABC 功能块动作ACT_Jog

Jog(
	Axis         := Axis,
	JogForward   := ,
	JogBackward  := ,
	Velocity     := REAL_TO_LREAL(rJogVel),
	Acceleration := REAL_TO_LREAL(rAxisAcc),
	Deceleration := REAL_TO_LREAL(rAxisDec),
	Jerk         := REAL_TO_LREAL(rAxisJerk),
	Busy=> ,
	CommandAborted=> ,
	Error=> ,
	ErrorId=> );

ABC 功能块动作ACT_MoveAbs

MoveAbs(
	Axis         := Axis,
	Execute      := ,
	Position     := REAL_TO_LREAL(rAbsPos),
	Velocity     := REAL_TO_LREAL(rAbsVel),
	Acceleration := REAL_TO_LREAL(rAxisAcc),
	Deceleration := REAL_TO_LREAL(rAxisDec),
	Jerk         := REAL_TO_LREAL(rAxisJerk),
	Direction    := UdtDir,
	Done=> ,
	Busy=> ,
	CommandAborted=> ,
	Error=> ,
	ErrorID=> );

ABC 功能块动作ACT_MoveRel

MoveRel(
	Axis         := Axis,
	Execute      := ,
	Distance     := REAL_TO_LREAL(rRelDis),
	Velocity     := REAL_TO_LREAL(rRelVel),
	Acceleration := REAL_TO_LREAL(rAxisAcc),
	Deceleration := REAL_TO_LREAL(rAxisDec),
	Jerk         := REAL_TO_LREAL(rAxisJerk),
	Done=> ,
	Busy=> ,
	CommandAborted=> ,
	Error=> ,
	ErrorID=> );

ABC 功能块动作ACT_Home

Home(
	Axis     := Axis,
	Execute  := ,
	Position := 0.0,
	Done=> ,
	Busy=> ,
	CommandAborted=> ,
	Error=> ,
	ErrorID=> );

ABC 功能块动作ACT_MoveVel

MoveVel(
	Axis         := Axis,
	Execute      := ,
	Velocity     := REAL_TO_LREAL(rVel),
	Acceleration := REAL_TO_LREAL(rAxisAcc),
	Deceleration := REAL_TO_LREAL(rAxisDec),
	Jerk         := REAL_TO_LREAL(rAxisJerk),
	Direction    := UdtDir,
	InVelocity=> ,
	Busy=> ,
	CommandAborted=> ,
	Error=> ,
	ErrorID=> );

ABC 功能块动作ACT_SetPos

SetPos(
	Axis     := Axis,
	Execute  := ,
	Position := REAL_TO_LREAL(rSetPos),
	Mode     := bSetPosRel,
	Done=> ,
	Busy=> ,
	Error=> ,
	ErrorID=> );

ABC 功能块动作ACT_Status

Status(
	Axis   := Axis,
	Enable := TRUE,
	Valid=> ,
	Busy=> ,
	Error=> ,
	ErrorID=> ,
	Disabled=> ,
	Errorstop=> ,
	Stopping=> ,
	StandStill=> ,
	DiscreteMotion=> ,
	ContinuousMotion=> ,
	SynchronizedMotion=> ,
	Homing=> ,
	ConstantVelocity=> ,
	Accelerating=> ,
	Decelerating=> ,
	FBErrorOccured=> );

ABC 功能块动作ACT_ErrorCode

ErrorCode(
	Axis   := Axis,
	Enable := TRUE,
	Valid=> ,
	Busy=> ,
	Error=> ,
	ErrorID=> ,
	AxisError=> ,
	AxisErrorID=> ,
	SWEndSwitchActive=> );

ABC 功能块动作ACT_ActPos

ActPos(
	Axis   := Axis,
	Enable := TRUE,
	Valid=> ,
	Busy=> ,
	Error=> ,
	ErrorID=> ,
	Position=> );

ABC 功能块动作ACT_ActVel

ActVel(
	Axis   := Axis,
	Enable := TRUE,
	Valid=> ,
	Busy=> ,
	Error=> ,
	ErrorID=> ,
	Velocity=> );

ABC 功能块动作ACT_ActTrq

ActTrq(
	Axis:= Axis,
	Enable:= TRUE,
	Valid=> ,
	Busy=> ,
	Error=> ,
	ErrorID=> ,
	Torque=> );

ABC 功能块动作ACT_ReadFBError

ReadFBError(
	Axis:= Axis,
	bEnable:= TRUE,
	bValid=> ,
	bBusy=> ,
	bFBError=> ,
	nFBErrorID=> ,
	pbyErrorInstance=> ,
	strErrorInstance=> ,
	tTimeStamp=> );

Motion 程序变量

PROGRAM Motion
VAR
	AxisBasicCtrl : ARRAY[0..9] OF FB_ABC ;
	PtAxis        : ARRAY[0..9] OF POINTER TO AXIS_REF_SM3 ;
	iAxisData     : INT;
END_VAR

Motion 程序内容

PtAxis[0] := ADR(SM_Drive_Virtual);
PtAxis[1] := ADR(SM_Drive_Virtual_1);
PtAxis[2] := ADR(SM_Drive_Virtual_2);
PtAxis[3] := ADR(SM_Drive_Virtual_3);
PtAxis[4] := ADR(SM_Drive_Virtual_4);
PtAxis[5] := ADR(SM_Drive_Virtual_5);
PtAxis[6] := ADR(SM_Drive_Virtual_6);
PtAxis[7] := ADR(SM_Drive_Virtual_7);
PtAxis[8] := ADR(SM_Drive_Virtual_8);

AxisBasicCtrl[0](Axis := PtAxis[0]^) ;
AxisBasicCtrl[1](Axis := PtAxis[1]^) ;
AxisBasicCtrl[2](Axis := PtAxis[2]^) ;
AxisBasicCtrl[3](Axis := PtAxis[3]^) ;
AxisBasicCtrl[4](Axis := PtAxis[4]^) ;
AxisBasicCtrl[5](Axis := PtAxis[5]^) ;
AxisBasicCtrl[6](Axis := PtAxis[6]^) ;
AxisBasicCtrl[7](Axis := PtAxis[7]^) ;
AxisBasicCtrl[8](Axis := PtAxis[8]^) ;

FOR iAxisData := 0 TO 9 BY 1 DO
	AxisBasicCtrl[iAxisData].bAxisEnable := g_bAxisEnable[iAxisData];
	AxisBasicCtrl[iAxisData].rAxisAcc    := g_rAxisAcc[iAxisData];
	AxisBasicCtrl[iAxisData].rAxisDec    := g_rAxisDec[iAxisData];
	AxisBasicCtrl[iAxisData].rAxisJerk   := g_rAxisJerk[iAxisData];
	AxisBasicCtrl[iAxisData].rAbsPos     := g_rAbsPos[iAxisData];
	AxisBasicCtrl[iAxisData].rAbsVel     := g_rAbsVel[iAxisData];
	AxisBasicCtrl[iAxisData].rRelDis     := g_rRelDis[iAxisData];
	AxisBasicCtrl[iAxisData].rRelVel     := g_rRelVel[iAxisData];
	AxisBasicCtrl[iAxisData].rJogVel     := g_rJogVel[iAxisData];
	AxisBasicCtrl[iAxisData].rVel        := g_rVel[iAxisData];
	g_bAxisPowerOn[iAxisData]            := AxisBasicCtrl[iAxisData].Enable.Status ;
	g_rAxisActVel[iAxisData]             := LREAL_TO_REAL(AxisBasicCtrl[iAxisData].ActVel.Velocity) ;
	g_rAxisActTrq[iAxisData]             := LREAL_TO_REAL(AxisBasicCtrl[iAxisData].ActTrq.Torque) ;
END_FOR

断电保持变量表

VAR_GLOBAL PERSISTENT RETAIN
	GVL.g_bAxisEnable : ARRAY[0..9] OF BOOL;
	GVL.g_rAxisAcc    : ARRAY[0..9] OF REAL;
	GVL.g_rAxisDec    : ARRAY[0..9] OF REAL;
	GVL.g_rAxisJerk   : ARRAY[0..9] OF REAL;
	GVL.g_rJogVel     : ARRAY[0..9] OF REAL ;
	GVL.g_rAbsPos     : ARRAY[0..9] OF REAL ;
	GVL.g_rAbsVel     : ARRAY[0..9] OF REAL ;
	GVL.g_rRelDis     : ARRAY[0..9] OF REAL ;
	GVL.g_rRelVel     : ARRAY[0..9] OF REAL ;
	GVL.g_rVel        : ARRAY[0..9] OF REAL ;
END_VAR

全局变量表

VAR_GLOBAL PERSISTENT

	g_bAxisEnable  AT %MB0: ARRAY[0..9] OF BOOL;
	g_rAxisAcc     AT %MW200: ARRAY[0..9] OF REAL;
	g_rAxisDec     AT %MW220: ARRAY[0..9] OF REAL;
	g_rAxisJerk    AT %MW240: ARRAY[0..9] OF REAL;
	g_rJogVel      AT %MW260: ARRAY[0..9] OF REAL ;
	g_rAbsPos      AT %MW280: ARRAY[0..9] OF REAL ;
	g_rAbsVel      AT %MW300: ARRAY[0..9] OF REAL ;
	g_rRelDis      AT %MW320: ARRAY[0..9] OF REAL ;
	g_rRelVel      AT %MW340: ARRAY[0..9] OF REAL ;
	g_rVel         AT %MW360: ARRAY[0..9] OF REAL ;

END_VAR

VAR_GLOBAL

	g_bAxisPowerOn AT %MB10 : ARRAY[0..8] OF BOOL ;
	g_rAxisActPos  AT %MW100  : ARRAY[0..8] OF REAL ;
	g_rAxisActVel  AT %MW120  : ARRAY[0..8] OF REAL ;
	g_rAxisActTrq  AT %MW140  : ARRAY[0..8] OF REAL ;

END_VAR

台达A2-E回零方式

采用标准的Cia402的方式,再SDO中对回零相关的字典进行赋值处理。(需注意的是,这种方式需要把原点信号Org接到驱动器的CN1的DIx里面,并设置为对应的复归原点信号0x0124) 驱动器的XML文件需要一定要选择 Delta ASDA-A2-E EtherCAT(CoE) Drive Rev4_SM这个版本,不然会出现,回零触发完成后一次,在次触发不会马上就完成位就有。 驱动器SDO添加 回零的模式和速度

  • Homing method 回零模式(0-35)

  • Homing Speeds (单位xxxx.x r/min)

Speed during search for switch (回零第一段-快速) Speed during search for zero (回零第二段-慢速)

这样就可以使用标准的MC_Home的指令进行回零操作。

触摸屏交互

台达DOP-100系列带以太网口都有Codesys的驱动了。 导入XML即可

威纶通触摸屏有对应的Codesys V3的对应驱动。 新建Symbols配置

勾选对应的变量

生成代码

找到生成的代码XML文件

新建通讯设备 导入生成的xml文件 找到所需的变量即可

这样就可以完全不用对变量进行绝对地址的操作 本交互操作参看《威纶通官网提供的联机手册》

Log: 2020.05.01 发布本文。 2020.05.03 更新断电保持变量数组的使用方式和添加绝对地址方便与触摸屏进行ModbusTCP交互。 2020.05.04 更新 威纶通 触摸屏交互方式 2020.05.08 更新台达A2-E回零设置 2020.05.11 更新台达A2-E回零说明和针对XML的选择 2020.07.02 更新台达DOP100系列触摸屏的交互方式

相关阅读

← 返回博文列表