台达AX8运动控制器应用笔记
2020-05-02 本文已影响0人
TomatoTor
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这个版本,不然会出现,回零触发完成后一次,在次触发不会马上就完成位就有。


- 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的驱动了。

威纶通触摸屏有对应的Codesys V3的对应驱动。







这样就可以完全不用对变量进行绝对地址的操作
本交互操作参看《威纶通官网提供的联机手册》
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系列触摸屏的交互方式