前言 今天没有外出,刚好早上在公司写计划书。想起之前网友有在找Codesys的回零参数功能块。老功能的需求了,利用中午就封装一个吧,有需要的直接CV大法拿走,不用谢。正文 我们都知道在使用原版的CODESYS或者二开的定制版,都是常规采用驱动页面下的SDO的配置方式去实现上电后下发的参数。当然有一些实际项目的应用场合需要变更回零模式或者回零的速度。以下今天分享就是这个需求而产生的功能块。1.Code Show
TYPE HomePara_DUT : STRUCT SiHomingMethod : SINT ; UdiHomingAcc : UDINT ; UdiHomeSpeedFast : UDINT ; UdiHomeSpeedSlow : UDINT ; END_STRUCTEND_TYPE
FUNCTION_BLOCK Fb_ChangeHomeParaVAR_INPUT PtAxis : POINTER TO AXIS_REF_SM3 ; sHomePara : HomePara_DUT ; xExecute : BOOL ;END_VARVAR_OUTPUT bDone : BOOL := FALSE ; wErrorID : WORD := 16#0000 ;END_VARVAR ReadStatus : MC_ReadStatus; WriteParameter : MC_WriteParameter; iStep : INT := 0 ;END_VARCASE iStep OF 0 : WriteParameter.Execute := FALSE ; wErrorID := 16#0000 ; //无错误 IF xExecute THEN iStep := 10 ; END_IF ; 10: IF NOT ReadStatus.Disabled THEN wErrorID := 16#0010 ; //轴状态机不允许 iStep := 90 ; //功能块错误流程 ELSE iStep := iStep + 10 ; END_IF ; 20: IF ((sHomePara.SiHomingMethod > 0) AND (sHomePara.SiHomingMethod <= 35)) AND (sHomePara.UdiHomingAcc <> 0) AND (sHomePara.UdiHomeSpeedFast <> 0) AND (sHomePara.UdiHomeSpeedSlow <> 0) THEN iStep := iStep + 10 ; ELSE wErrorID := 16#0100 ; //回零参数有异常 iStep := 90 ; //功能块错误流程 END_IF; 30: WriteParameter.ParameterNumber := - DWORD_TO_DINT( (SHL(TO_DWORD(1),24) + SHL(TO_DWORD(16#6098),8) + 0 ) ); WriteParameter.Value := SINT_TO_LREAL(sHomePara.SiHomingMethod); WriteParameter.Execute := TRUE ; IF WriteParameter.Done THEN WriteParameter.Execute := FALSE ; iStep := iStep + 10 ; ELSIF WriteParameter.Error THEN WriteParameter.Execute := FALSE ; wErrorID := 16#1000 ; //回零模式写入失败 iStep := 0 ; END_IF ; 40: WriteParameter.ParameterNumber := - DWORD_TO_DINT( (SHL(TO_DWORD(4),24) + SHL(TO_DWORD(16#609A),8) + 0 ) ); WriteParameter.Value := UDINT_TO_LREAL(sHomePara.UdiHomingAcc); WriteParameter.Execute := TRUE ; IF WriteParameter.Done THEN WriteParameter.Execute := FALSE ; iStep := iStep + 10 ; ELSIF WriteParameter.Error THEN WriteParameter.Execute := FALSE ; wErrorID := 16#2000 ; //回零加速度写入失败 iStep := 0 ; END_IF ; 50: WriteParameter.ParameterNumber := - DWORD_TO_DINT( (SHL(TO_DWORD(4),24) + SHL(TO_DWORD(16#6099),8) + 1 ) ); WriteParameter.Value := UDINT_TO_LREAL(sHomePara.UdiHomeSpeedFast); WriteParameter.Execute := TRUE ; IF WriteParameter.Done THEN WriteParameter.Execute := FALSE ; iStep := iStep + 10 ; ELSIF WriteParameter.Error THEN WriteParameter.Execute := FALSE ; wErrorID := 16#3000 ; //回零快速写入失败 iStep := 0 ; END_IF ; 60: WriteParameter.ParameterNumber := - DWORD_TO_DINT( (SHL(TO_DWORD(4),24) + SHL(TO_DWORD(16#6099),8) + 2 ) ); WriteParameter.Value := UDINT_TO_LREAL(sHomePara.UdiHomeSpeedSlow); WriteParameter.Execute := TRUE ; IF WriteParameter.Done THEN WriteParameter.Execute := FALSE ; iStep := iStep + 10 ; ELSIF WriteParameter.Error THEN WriteParameter.Execute := FALSE ; wErrorID := 16#4000 ; //回零快速写入失败 iStep := 0 ; END_IF ; 70: bDone := TRUE ; IF NOT xExecute THEN bDone := FALSE ; iStep := 0 ; END_IF ; 90: IF NOT xExecute THEN bDone := FALSE ; iStep := 0 ; END_IF ;END_CASE ;ReadStatus( Axis := PtAxis^, Enable := NOT ReadStatus.Error, Valid => , Busy => , Error => , ErrorID => , Disabled => , Errorstop => , Stopping => , StandStill => , DiscreteMotion => , ContinuousMotion => , SynchronizedMotion => , Homing => , ConstantVelocity => , Accelerating => , Decelerating => , FBErrorOccured => ); WriteParameter( Axis := PtAxis^, Execute := , ParameterNumber := , Value := , Done => , Busy => , Error => , ErrorID => );
功能块经过实际的测试过的,测试平台雷赛LeadsysStudio和原版Codesys。有需要的也可以自行封装成库。结尾 随着Codesys在国产控制器的大浪潮中,希望我的分享能帮助到你们。(点个关注,不迷路。) |