[CodeSys] CODESYS-轴初始化功能块封装——纯干货分享

[复制链接]
查看34962 | 回复0 | 2024-10-24 14:27:11 | 显示全部楼层 |阅读模式


    开放性与标准化:CODESYS一直致力于提供基于开放标准的编程环境,促进设备之间的互操作性和跨平台兼容性。随着工业4.0的发展,开放性和标准化将成为CODESYS持续发展的关键驱动力。

    软件平台化:CODESYS正朝着软件平台的方向发展,不仅仅是一个编程工具,而是一个集成了可视化、运动控制等功能的综合性平台。这使得CODESYS能够在工业自动化中扮演更重要的角色。

    安全性与认证:随着工业网络安全需求的增加,CODESYS正在加强其产品的安全性,并寻求相关的国际安全标准认证,如EN 61508的SIL认证,这将有助于提升其产品的市场竞争力。

    技术创新与应用:CODESYS不断推出新技术和解决方案,如虚拟控制方案,这些创新有助于引领行业的发展趋势,并满足不断变化的市场需求。

    本地化与国际化:CODESYS在中国等国际市场上的发展策略表明,该公司正在积极地适应不同地区的市场需求,比如加大对中国市场的投入和支持,这将有助于扩大其全球市场份额。

    生态系统建设:类似于智能手机操作系统Android的发展模式,CODESYS也在构建自己的生态系统,吸引更多的硬件制造商和开发者参与到其平台上来,从而形成一个更加丰富和多元的技术社区。

    合作与联盟:与其他企业合作参加展览和技术交流活动,显示了CODESYS正在努力拓展其业务网络,增强与合作伙伴之间的关系,并共同推动行业的进步。

    数字化转型:面对数字化转型的大潮,CODESYS强调了其在软件助力创新战略中的作用,通过平台开放、代码共享等方式支持企业的数字化进程。

综上所述,CODESYS的发展趋势是朝着更加开放、安全、智能化的方向前进,同时也注重本地化服务和生态系统建设,以更好地服务于工业自动化领域。

一、功能块封装
在CODESYS中,功能块(Function Block, FB)是一种重要的编程组件,它允许用户封装一组相关的功能,并且可以带有内部状态。功能块的设计目的是为了提高代码的复用性、可读性和模块化程度。以下是如何在CODESYS中创建一个功能块的基本步骤:创建功能块的基本步骤




    定义功能块类型:



      打开CODESYS开发环境。

      在项目树中选择“程序”或“库”,然后右键选择“新建” -> “功能块类型”来创建一个新的功能块类型。

    定义接口:



      在功能块类型的接口部分定义输入(INPUT)、输出(OUTPUT)和静态(STATIC)变量。这些变量定义了功能块与其他部分的交互方式。

    定义内部状态:



      在功能块类型中添加动态(DYNAMIC)变量。这些变量在功能块调用之间保留值,因此它们可以用来保存状态信息。

    编写逻辑:



      在功能块类型的主体部分编写逻辑代码。这里可以使用任何支持的语言,如ST(Structured Text)、IL(Instruction List)、FBD(Function Block Diagram)等。

    测试功能块:



      创建一个实例,在测试程序中实例化这个功能块类型,并调用它来验证其行为是否符合预期。



二、轴初始化功能块封装



MC_Power_0(Axis:=AXIS , Enable:= TRUE , bRegulatorOn:= EN_POW, bDriveStart:=TRUE , Status=> , bRegulatorRealState=>POWR_DONE , bDriveStartRealState=> , Busy=>BUSY_RELAY[1] , Error=>ERROR_RELAY[1]  , ErrorID=> ERROR_ID_REALAY[1]);
MC_Home_0(Axis:= AXIS, Execute:=EX_HOME , Position:= HOME_POS, Done=> DONE, Busy=>BUSY_RELAY[2] , CommandAborted=> , Error=>ERROR_RELAY[2] , ErrorID=> ERROR_ID_REALAY[2] );

MC_Reset_0(Axis:= AXIS,Execute:= EX_RESET, Done=> , Busy=>BUSY_RELAY[3] ,Error=>ERROR_RELAY[3]  ,ErrorID=> ERROR_ID_REALAY[3] );
MC_Stop_0(Axis:=AXIS , Execute:= EX_STOP , Deceleration:= , Jerk:= , Done=> , Busy=>BUSY_RELAY[4] , Error=> ERROR_RELAY[4] , ErrorID=> ERROR_ID_REALAY[4]);

MC_Jog_0(Axis:= AXIS, JogForward:=JOG_UP , JogBackward:=JOG_DOWN , Velocity:=JOG_VEL, Acceleration:=JOG_ACC , Deceleration:=JOG_dec , Jerk:=JOG_JERK , Busy=>BUSY_RELAY[5] , CommandAborted=> , Error=>ERROR_RELAY[5]  , ErrorId=>  ERROR_ID_REALAY[5]);

MC_ReadActualPosition_0(Axis:=AXIS , Enable:= TRUE , Valid=> , Busy=>BUSY_RELAY[6] , Error=>ERROR_RELAY[6]  , ErrorID=>  ERROR_ID_REALAY[6], Position=> POS_VAL );

MC_ReadActualVelocity_0(Axis:=AXIS  , Enable:= TRUE, Valid=> , Busy=>BUSY_RELAY[7] , Error=>ERROR_RELAY[7]  , ErrorID=> ERROR_ID_REALAY[7] , Velocity=> VEL_VAL);

MC_ReadAxisError_0(Axis:=AXIS  , Enable:= TRUE, Valid=> , Busy=>BUSY_RELAY[8] , Error=>ERROR_RELAY[8] , ErrorID=> ERROR_ID_REALAY[8] , AxisError=> ERROR, AxisErrorID=>ERROR_ID , SWEndSwitchActive=> );

(*   轴报错字符串输出*)               

FOR i:=1 TO 8 BY 1 DO
IF ERROR_ID_REALAY<>ERROR_ID_REALAY[1] AND ERROR_RELAY THEN

        ERROR_STRING:=SMC_ErrorString(ErrorID:=ERROR_ID_REALAY , Language:=ERROR_ID_REALAY_1 );                                    J:=i;END_IF

IF  ERROR_RELAY[J]= FALSE  THEN
           ERROR_STRING:=SMC_ErrorString(ErrorID:=ERROR_ID_REALAY ,

Language:=ERROR_ID_REALAY_1 );        

END_IF

END_FOR;
FOR i:=1 TO 8 BY 1 DO

IF ERROR_RELAY THEN

ERROR_ST:=TRUE;

CASE i OF1 :ERROR_ST_content:='power';2 :ERROR_ST_content:='home';3 :ERROR_ST_content:='reset';4 :ERROR_ST_content:='stop';5 :ERROR_ST_content:='jog';6 :ERROR_ST_content:='pos_val';7 :ERROR_ST_content:='vel_val';8 :ERROR_ST_content:='axis_error';END_CASEJJ:=i;

END_IF

IF ERROR_RELAY[JJ] = FALSE THEN

ERROR_ST:=FALSE;ERROR_ST_content:='';

END_IF

END_FOR
三、可视化页面(简单页面展示效果用的)



四、效果展示



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则