抖音粉丝群1
『7x24小时有问必答』

AI浪潮下的计算机行业——从业者现状与未来展望
前言    今天没有外出,刚好早上在公司写计划书。想起之前网友有在找Codesys的回零参数功能块。老功能的需求了,利用中午就封装一个吧,有需要的直接CV大法拿走,不用谢。正文    我们都知道在使用原版的CODESYS或者二开的定制版,都是常规采用驱动页面下的SDO的配置方式去实现上电后下发的参数。当然有一些实际项目的应用场合需要变更回零模式或者回零的速度。以下今天分享就是这个需求而产生的功能块。1.Code Show


    1.1 HomePara_DUT
TYPE HomePara_DUT :    STRUCT        SiHomingMethod   : SINT ;        UdiHomingAcc     : UDINT ;        UdiHomeSpeedFast : UDINT ;        UdiHomeSpeedSlow : UDINT ;    END_STRUCTEND_TYPE


    1.2 Fb_ChanegHomePara
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         => );


    1.3 测试程序


功能块经过实际的测试过的,测试平台雷赛LeadsysStudio和原版Codesys。有需要的也可以自行封装成库。结尾    随着Codesys在国产控制器的大浪潮中,希望我的分享能帮助到你们。(点个关注,不迷路。)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?获取邀请码

x
您需要登录后才可以回帖 登录 | 获取邀请码

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

Copyright 2010-2015. All rights reserved. 

微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码