日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TwinCAT3 PLC多轴编程的方法

發布時間:2024/1/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TwinCAT3 PLC多轴编程的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

測試共有13個軸,前10個軸包含基本功能,后3個軸包含獨有功能。

方法一

定義每個軸的基本功能,包括上電、下電、走相對、走絕對、讀位置、讀狀態、復位、停止等。

在Axis_Base_PTP中定義變量:

FUNCTION_BLOCK Axis_Base_PTPVARREF: AXIS_REF;mcMoveRela: MC_MoveRelative;mcPower: MC_Power;mcStop: MC_Stop;mcMoveAbs: MC_MoveAbsolute;mcReset: MC_Reset;mcReadPosition: MC_ReadActualPosition;mcReadStatus: MC_ReadStatus;mcHalt: MC_Halt;AxisPara:ST_AxisPara; END_VAR

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_IF

M_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繼承自基類并定義變量:

FUNCTION_BLOCK Axis11_PTP EXTENDS Axis_Base_PTP VAR_INPUT END_VARVAR_OUTPUTbMagnet_1 AT%Q* : BOOL;bMagnet_2 AT%Q* : BOOL; END_VARVARbIn : BOOL :=FALSE;bOut: BOOL :=FALSE;TON_0: TON;TON_1: TON;bTemp1: BOOL;bTemp2: BOOL;MC_MoveRelative_0: MC_MoveRelative;mcHaltChange_0: MC_Halt;END_VAR

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方法代碼,其余類似。

FOR i:=1 TO 13 DOAxis[i].M_PowerOn(bExcute:=cmdPowerOn[i],bStatus=>PoweronStatus.bStatus,bBusy=>PoweronStatus.bBusy,bActive=>PoweronStatus.bActive,bError=>PoweronStatus.bErr,dErrorID=>PoweronStatus.dErrID); END_FOR

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函數;

PROGRAM MAIN VARfbGenerator1 : FB_Generator;fbGenerator2 : FB_GeneratorEX;iGenerator : I_Generator;tCycletime: TIME :=T#3S;sVendor: STRING;change: BOOL :=TRUE;output: BOOL; END_VAR IF change THENiGenerator:=fbGenerator1; ELSEiGenerator:=fbGenerator2; END_IFoutput:=iGenerator.Flash(); iGenerator.Cycletime:=tcycletime; sVendor:=iGenerator.Vendor;

運行時,通過接口切換調用不同軸模塊。

優缺點比較

方法一:上位機調用變量較少,主程序復雜;
方法二:上位機調用變量較多,主程序簡單;
方法三:上位機調用變量較少,主程序軸聯動復雜;

總結

以上是生活随笔為你收集整理的TwinCAT3 PLC多轴编程的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。