TwinCAT3 PLC多轴编程的方法
生活随笔
收集整理的這篇文章主要介紹了
TwinCAT3 PLC多轴编程的方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
測試共有13個軸,前10個軸包含基本功能,后3個軸包含獨有功能。
方法一
定義每個軸的基本功能,包括上電、下電、走相對、走絕對、讀位置、讀狀態、復位、停止等。
在Axis_Base_PTP中定義變量:
M_PowerOn方法代碼:
METHOD M_PowerOn : BOOL VAR_INPUTbExcute : BOOL; END_VARVAR_OUTPUTbStatus : BOOL; (* B *)bBusy : BOOL; (* V *)bActive : BOOL; (* V *)bError : BOOL; (* B *)dErrorID : UDINT; (* E *) END_VAR IF bExcute THENmcPower(Axis:= REF, Enable:= TRUE, Enable_Positive:= TRUE, Enable_Negative:= TRUE, Override:= AxisPara.rOverride, BufferMode:= , Options:= , Status=> bStatus, Busy=> bBusy, Active=> bActive, Error=> bError, ErrorID=> dErrorID); END_IFM_MoveRela方法代碼:
METHOD M_MoveRela : BOOL VAR_INPUTbLimit_1 : BOOL;bLimit_2 : BOOL;rDistance : REAL;rVelocity : REAL;bExcute : BOOL; END_VARVAR_OUTPUTbDone : BOOL; (* B *)bBusy : BOOL; (* V *)bActive : BOOL; (* V *)bError : BOOL; (* B *)dErrorID : UDINT; (* E *) END_VAR IF rDistance>0 THENmcHalt(Axis:= REF, Execute:= bLimit_1, Deceleration:= AxisPara.Deceleration, Jerk:= , BufferMode:= , Options:= , Done=> , Busy=> , Active=> , CommandAborted=> , Error=> , ErrorID=> ); IF NOT bLimit_1 THENmcMoveRela(Axis:= REF, Execute:= bExcute, Distance:= rDistance, Velocity:= rVelocity, Acceleration:= AxisPara.Acceleration, Deceleration:= AxisPara.Deceleration, Jerk:= , BufferMode:= , Options:= , Done=> bDone, Busy=> bBusy, Active=> bActive, CommandAborted=> , Error=> bError, ErrorID=> dErrorID);END_IFELSIF rDistance<0 THENmcHalt(Axis:= REF, Execute:= bLimit_2, Deceleration:= AxisPara.Deceleration, Jerk:= , BufferMode:= , Options:= , Done=> , Busy=> , Active=> , CommandAborted=> , Error=> , ErrorID=> ); IF NOT bLimit_2 THENmcMoveRela(Axis:= REF, Execute:= bExcute, Distance:= rDistance, Velocity:= rVelocity, Acceleration:= AxisPara.Acceleration, Deceleration:= AxisPara.Deceleration, Jerk:= , BufferMode:= , Options:= , Done=> bDone, Busy=> bBusy, Active=> bActive, CommandAborted=> , Error=> bError, ErrorID=> dErrorID); END_IF END_IF對于附加功能的軸11,繼承Axis_Base_PTP,獨有的方法M_TurnInOut另外添加。
Axis_Base_PTP繼承自基類并定義變量:
M_TurnInOut方法代碼:
METHOD M_TurnInOut : BOOL VAR_INPUTbTurnIn : BOOL;bTurnOut : BOOL;bLimit1 : BOOL; END_VARVAR_OUTPUT END_VAR
軸12、13等同理,省略。
在Main函數中定義變量:
//定義接口及繼承關系Axis : ARRAY[1..10] OF Axis_Base_PTP;Axis11 : Axis11_PTP;Axis12 : Axis12_PTP;Axis13 : Axis13_PTP;//選擇電機軸號iAxisNum AT%I* : UINT;(*電機軸號*)//定義電機運行相對距離參數rDistance AT%I* : REAL;(*運動距離*)rVelocity AT%I* : REAL;(*運動速度*)//定義結構體AxisPara:ST_AxisPara;(*軸參數結構體*)AxisStatus:ST_AxisStatus;(*軸狀態結構體*) PoweronStatus:ST_PoweronStatus; (*上電模塊結構體*)PoweroffStatus:ST_PoweroffStatus;(*下電模塊結構體*) MoveAbsStatus:ST_MoveAbsStatus; (*絕對運動模式結構體*)MoveRelaStatus:ST_MoveRelaStatus;(*相對運動模式結構體*) StopStatus:ST_StopStatus;(*停止模塊結構體*)ResetStatus:ST_ResetStatus;(*復位模塊結構體*)ReadPosStatus:ST_ReadPosStatus;(*讀取軸位置結構體*)HomeStatus:ST_HomeStatus;(*尋參模塊結構體*)LimitStatus:ST_LimitStatus;(*限位開關狀態*)//定義指令bComPowerOn AT%I* : BOOL;(*上電命令*)bComPowerOff AT%I* : BOOL;(*下電命令*)bComMoveRela AT%I* : BOOL;(*相對位置指令*)bComStop AT%I* : BOOL;(*停止指令*)bComMoveAbs AT%I* : BOOL;(*絕對位置指令*)bComRest AT%I* : BOOL;(*復位指令*)bComReadPos AT%I* : BOOL;(*讀取當前位置指令*)bComReadStatus AT%I* : BOOL;(*讀取電機狀態指令*)bHome AT%I* : BOOL;(*電機13尋參指令*)bGlassForward AT%I* : BOOL;(*電機12更換保護玻璃前進*)bGlassBack AT%I* : BOOL;(*電機12更換保護玻璃后退*)bTurnIn AT%I* : BOOL;(*電機11轉入*)bTurnOut AT%I* : BOOL;(*電機11轉出*) CASE iAxisNum OF1:Axis[1].M_PowerOn(bExcute:=bComPowerOn,bStatus=>PoweronStatus.bStatus,bBusy=>PoweronStatus.bBusy,bActive=>PoweronStatus.bActive,bError=>PoweronStatus.bErr,dErrorID=>PoweronStatus.dErrID);Axis[1].M_PowerOff(bExcute:=bComPowerOff,bStatus=>PoweroffStatus.bStatus,bBusy=>PoweroffStatus.bBusy,bActive=>PoweroffStatus.bActive,bError=>PoweroffStatus.bErr,dErrorID=>PoweroffStatus.dErrID);Axis[1].M_MoveAbs(bLimit_1:=LimitStatus.Axis_1_Limit_1,bLimit_2:=LimitStatus.Axis_1_Limit_2,rDistance:=rDistance,rVelocity:=rVelocity,bExcute:=bComMoveAbs,bDone=>MoveAbsStatus.bDone,bBusy=>MoveAbsStatus.bBusy,bActive=>MoveAbsStatus.bActive,bError=>MoveAbsStatus.bErr,dErrorID=>MoveAbsStatus.dErrID);Axis[1].M_MoveRela(bLimit_1:=LimitStatus.Axis_1_Limit_1,bLimit_2:=LimitStatus.Axis_1_Limit_2,rDistance:=rDistance,rVelocity:=rVelocity,bExcute:=bComMoveRela,bDone=>MoveRelaStatus.bDone,bBusy=>MoveRelaStatus.bBusy,bActive=>MoveRelaStatus.bActive,bError=>MoveRelaStatus.bErr,dErrorID=>MoveRelaStatus.dErrID);Axis[1].M_Stop(bExcute:=bComStop,bDone=>StopStatus.bDone,bBusy=>StopStatus.bBusy,bActive=>StopStatus.bActive,bError=>StopStatus.bErr,dErrorID=>StopStatus.dErrID);Axis[1].M_Reset(bExcute:=bComRest,bDone=>ResetStatus.bDone,bBusy=>ResetStatus.bBusy,bError=>ResetStatus.bErr,dErrorID=>ResetStatus.dErrID);Axis[1].M_ReadPosition(bExcute:=bComReadPos,bValid=>ReadPosStatus.bValid,bBusy=>ReadPosStatus.bBusy,bError=>ReadPosStatus.bErr,dErrorID=>ReadPosStatus.dErrID,lPosition=>ReadPosStatus.lPosition);Axis[1].M_ReadStatus(bExcute:=bComReadStatus,bValid=>AxisStatus.Axis_Valid,bBusy=>AxisStatus.Axis_Busy,bError=>AxisStatus.Axis_Err,dErrorID=>AxisStatus.Axis_ErrID,bErrorStop=>AxisStatus.Axis_ErrorStop,bDisabled=>AxisStatus.Axis_Disabled,bStopping=>AxisStatus.Axis_Stopping,bStandStill=>AxisStatus.Axis_StandStill,bDiscreteMotion=>AxisStatus.Axis_DiscreteMotion,bContinuousMotion=>AxisStatus.Axis_ContinuousMotion,bSynchronizedMotion=>AxisStatus.Axis_SynchronizedMotion,bHoming=>AxisStatus.Axis_Homing,bConstantVelocity=>AxisStatus.Axis_ConstantVelocity,bAccelerating=>AxisStatus.Axis_Accelerating,bDecelerating=>AxisStatus.Axis_Decelerating);2:Axis[2].M_PowerOn(bExcute:=bComPowerOn,bStatus=>PoweronStatus.bStatus,bBusy=>PoweronStatus.bBusy,bActive=>PoweronStatus.bActive,bError=>PoweronStatus.bErr,dErrorID=>PoweronStatus.dErrID);Axis[2].M_PowerOff(bExcute:=bComPowerOff,bStatus=>PoweroffStatus.bStatus,bBusy=>PoweroffStatus.bBusy,bActive=>PoweroffStatus.bActive,bError=>PoweroffStatus.bErr,dErrorID=>PoweroffStatus.dErrID);Axis[2].M_MoveAbs(bLimit_1:=LimitStatus.Axis_2_Limit_1,bLimit_2:=LimitStatus.Axis_2_Limit_2,rDistance:=rDistance,rVelocity:=rVelocity,bExcute:=bComMoveAbs,bDone=>MoveAbsStatus.bDone,bBusy=>MoveAbsStatus.bBusy,bActive=>MoveAbsStatus.bActive,bError=>MoveAbsStatus.bErr,dErrorID=>MoveAbsStatus.dErrID);Axis[2].M_MoveRela(bLimit_1:=LimitStatus.Axis_2_Limit_1,bLimit_2:=LimitStatus.Axis_2_Limit_2,rDistance:=rDistance,rVelocity:=rVelocity,bExcute:=bComMoveRela,bDone=>MoveRelaStatus.bDone,bBusy=>MoveRelaStatus.bBusy,bActive=>MoveRelaStatus.bActive,bError=>MoveRelaStatus.bErr,dErrorID=>MoveRelaStatus.dErrID);Axis[2].M_Stop(bExcute:=bComStop,bDone=>StopStatus.bDone,bBusy=>StopStatus.bBusy,bActive=>StopStatus.bActive,bError=>StopStatus.bErr,dErrorID=>StopStatus.dErrID);Axis[2].M_Reset(bExcute:=bComRest,bDone=>ResetStatus.bDone,bBusy=>ResetStatus.bBusy,bError=>ResetStatus.bErr,dErrorID=>ResetStatus.dErrID);Axis[2].M_ReadPosition(bExcute:=bComReadPos,bValid=>ReadPosStatus.bValid,bBusy=>ReadPosStatus.bBusy,bError=>ReadPosStatus.bErr,dErrorID=>ReadPosStatus.dErrID,lPosition=>ReadPosStatus.lPosition);Axis[2].M_ReadStatus(bExcute:=bComReadStatus,bValid=>AxisStatus.Axis_Valid,bBusy=>AxisStatus.Axis_Busy,bError=>AxisStatus.Axis_Err,dErrorID=>AxisStatus.Axis_ErrID,bErrorStop=>AxisStatus.Axis_ErrorStop,bDisabled=>AxisStatus.Axis_Disabled,bStopping=>AxisStatus.Axis_Stopping,bStandStill=>AxisStatus.Axis_StandStill,bDiscreteMotion=>AxisStatus.Axis_DiscreteMotion,bContinuousMotion=>AxisStatus.Axis_ContinuousMotion,bSynchronizedMotion=>AxisStatus.Axis_SynchronizedMotion,bHoming=>AxisStatus.Axis_Homing,bConstantVelocity=>AxisStatus.Axis_ConstantVelocity,bAccelerating=>AxisStatus.Axis_Accelerating,bDecelerating=>AxisStatus.Axis_Decelerating);……………………13:Axis13.M_PowerOn(bExcute:=bComPowerOn,bStatus=>PoweronStatus.bStatus,bBusy=>PoweronStatus.bBusy,bActive=>PoweronStatus.bActive,bError=>PoweronStatus.bErr,dErrorID=>PoweronStatus.dErrID);Axis13.M_PowerOff(bExcute:=bComPowerOff,bStatus=>PoweroffStatus.bStatus,bBusy=>PoweroffStatus.bBusy,bActive=>PoweroffStatus.bActive,bError=>PoweroffStatus.bErr,dErrorID=>PoweroffStatus.dErrID);Axis13.M_MoveAbs(bLimit_1:=LimitStatus.Axis_13_Limit_1,bLimit_2:=LimitStatus.Axis_13_Limit_2,rDistance:=rDistance,rVelocity:=rVelocity,bExcute:=bComMoveAbs,bDone=>MoveAbsStatus.bDone,bBusy=>MoveAbsStatus.bBusy,bActive=>MoveAbsStatus.bActive,bError=>MoveAbsStatus.bErr,dErrorID=>MoveAbsStatus.dErrID);Axis13.M_MoveRela(bLimit_1:=LimitStatus.Axis_13_Limit_1,bLimit_2:=LimitStatus.Axis_13_Limit_2,rDistance:=rDistance,rVelocity:=rVelocity,bExcute:=bComMoveRela,bDone=>MoveRelaStatus.bDone,bBusy=>MoveRelaStatus.bBusy,bActive=>MoveRelaStatus.bActive,bError=>MoveRelaStatus.bErr,dErrorID=>MoveRelaStatus.dErrID);Axis13.M_Stop(bExcute:=bComStop,bDone=>StopStatus.bDone,bBusy=>StopStatus.bBusy,bActive=>StopStatus.bActive,bError=>StopStatus.bErr,dErrorID=>StopStatus.dErrID);Axis13.M_Reset(bExcute:=bComRest,bDone=>ResetStatus.bDone,bBusy=>ResetStatus.bBusy,bError=>ResetStatus.bErr,dErrorID=>ResetStatus.dErrID);Axis13.M_ReadPosition(bExcute:=bComReadPos,bValid=>ReadPosStatus.bValid,bBusy=>ReadPosStatus.bBusy,bError=>ReadPosStatus.bErr,dErrorID=>ReadPosStatus.dErrID,lPosition=>ReadPosStatus.lPosition);Axis13.M_ReadStatus(bExcute:=bComReadStatus,bValid=>AxisStatus.Axis_Valid,bBusy=>AxisStatus.Axis_Busy,bError=>AxisStatus.Axis_Err,dErrorID=>AxisStatus.Axis_ErrID,bErrorStop=>AxisStatus.Axis_ErrorStop,bDisabled=>AxisStatus.Axis_Disabled,bStopping=>AxisStatus.Axis_Stopping,bStandStill=>AxisStatus.Axis_StandStill,bDiscreteMotion=>AxisStatus.Axis_DiscreteMotion,bContinuousMotion=>AxisStatus.Axis_ContinuousMotion,bSynchronizedMotion=>AxisStatus.Axis_SynchronizedMotion,bHoming=>AxisStatus.Axis_Homing,bConstantVelocity=>AxisStatus.Axis_ConstantVelocity,bAccelerating=>AxisStatus.Axis_Accelerating,bDecelerating=>AxisStatus.Axis_Decelerating);Axis13.M_Home(bExcute:=bHome,bCalibrationCam:=Axis_13_CaliCam,bDone=>HomeStatus.bDone,bBusy=>HomeStatus.bBusy,bActive=>HomeStatus.bActive,bError=>HomeStatus.bErr,dErrorID=>HomeStatus.dErrID); END_CASE運行時,先輸入iAxisNum,再執行命令即可。
方法二
定義軸基本功能,同上。區別在于Main主函數:
在Main中添加Action
ACT_PowerOn方法代碼,其余類似。
Main函數代碼:
//定義接口及繼承關系Axis : ARRAY[1..10] OF Axis_Base_PTP;Axis11 : Axis11_PTP;Axis12 : Axis12_PTP;Axis13 : Axis13_PTP;cmdPowerOn AT%I* : ARRAY[1..13] OF BOOL;cmdPowerOff AT%I* : ARRAY[1..13] OF BOOL;cmdMoveRela AT%I* : ARRAY[1..13] OF BOOL;cmdMoveAbs AT%I* : ARRAY[1..13] OF BOOL;cmdReset AT%I* : ARRAY[1..13] OF BOOL;cmdStop AT%I* : ARRAY[1..13] OF BOOL;cmdReadPos AT%I* : ARRAY[1..13] OF BOOL;cmdReadStatus AT%I* : ARRAY[1..13] OF BOOL;cmdHome AT%I* : BOOL;cmdGlassForward AT%I* : BOOL;cmdGlassBack AT%I* : BOOL;cmdTurnIn AT%I* : BOOL;cmdTurnOut AT%I* : BOOL;主函數調用Action方法進行輪詢:
ACT_PowerOn(); ACT_PowerOff(); ACT_MoveAbs(); ACT_MoveRela(); ACT_Reset(); ACT_Stop(); ACT_ReadPos(); ACT_ReadStatus();運行時,需針對每個軸的每個指令進行下發。
方法三
利用面向對象中的接口和繼承方法。借鑒示例。
首先定義接口及屬性方法,定義一個基類實現接口中的屬性和方法,若需要再定義類繼承基類。
Main函數;
運行時,通過接口切換調用不同軸模塊。
優缺點比較
方法一:上位機調用變量較少,主程序復雜;
方法二:上位機調用變量較多,主程序簡單;
方法三:上位機調用變量較少,主程序軸聯動復雜;
總結
以上是生活随笔為你收集整理的TwinCAT3 PLC多轴编程的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小技巧大用处:微信小程序状态栏设置全攻略
- 下一篇: 选择降薪45%,从互联网到国企