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 程序內(nèi)容
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中對回零相關(guān)的字典進行賦值處理。(需注意的是,這種方式需要把原點信號Org接到驅(qū)動器的CN1的DIx里面,并設(shè)置為對應(yīng)的復(fù)歸原點信號0x0124)
驅(qū)動器的XML文件需要一定要選擇 Delta ASDA-A2-E EtherCAT(CoE) Drive Rev4_SM這個版本,不然會出現(xiàn),回零觸發(fā)完成后一次,在次觸發(fā)不會馬上就完成位就有。

驅(qū)動器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系列帶以太網(wǎng)口都有Codesys的驅(qū)動了。

導(dǎo)入XML即可
威綸通觸摸屏有對應(yīng)的Codesys V3的對應(yīng)驅(qū)動。

新建Symbols配置

勾選對應(yīng)的變量

生成代碼

找到生成的代碼XML文件

新建通訊設(shè)備

導(dǎo)入生成的xml文件

找到所需的變量即可
這樣就可以完全不用對變量進行絕對地址的操作
本交互操作參看《威綸通官網(wǎng)提供的聯(lián)機手冊》
Log:
2020.05.01 發(fā)布本文。
2020.05.03 更新斷電保持變量數(shù)組的使用方式和添加絕對地址方便與觸摸屏進行ModbusTCP交互。
2020.05.04 更新 威綸通 觸摸屏交互方式
2020.05.08 更新臺達A2-E回零設(shè)置
2020.05.11 更新臺達A2-E回零說明和針對XML的選擇
2020.07.02 更新臺達DOP100系列觸摸屏的交互方式