网教网

搜索
查看: 77|回复: 0

CODESYS -- 编程进阶:面向对象的思维

[复制链接]

2

主题

3

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-4-21 10:35:52 | 显示全部楼层 |阅读模式
本文介绍基于codesys的新的编程思维,融合了传统plc的按流程编程和高级语言中的面向对象编程,可让程序的架构更加优美,阅读本文前需要对codesys有一定的应用经验。
首先介绍几种codesys中关键功能:
1、功能块(FUNCTION BLOCK)
      相比于传统的plc,codesys给予了功能块丰富扩展,
1.1 属性、方法、动作:
      这三类在PRG中也可以使用,可定义为private、internal(子类)、public权限。
      属性为内部变量的外部访问接口,可以在set、get中设置丰富的变化;方法使用类似函数,可定义输入、局部变量(使用上升沿、timer、counter等需注意);动作仅能使用FB中的变量,相当于给FB中的程序分类。
1.2 继承(EXTENDS)
      codesys FB最大的进步就是支持继承,这让我们的函数变得更加简洁,子类可继承父类的变量、方法、动作(private除外),目前不支持多重继承。
1.3 虚类(ABSTRACT)
     虚类无法实例化,是解决多重继承里命名冲突的问题,由于不支持多重继承,在这里意义并不大。
FB的写法,比如针对运动控制,可采用如下方法进行编写:
首先编写虚类ABSTRACT FB_MOTION,调用plcopen功能块,在其中实现轴的基本功能控制、状态监控,权限可以设置为internal;
其次编写FB_SAXIS,继承自FB_MOTION,在其中实现单轴的控制,并提供控制的入口;
再次编写FB_MAXIS,继承自FB_SAXIS,在其中实现多轴的同步、插补控制等,并提供控制的入口。



单轴的功能块



多轴控制功能块

2、接口(INTERFACE)
        接口是一种规范,支持多接口,与功能块、结构体联合使用,可达到很好的效果。
3、任务(TASK)
        codesys的任务类类比线程,可以设置不同的优先级、循环周期,实际的任务是否相互独立与CPU的线程数也有关系。
        在实际使用过程中,建议分多个任务:运动控制、通讯、设备逻辑控制、HMI,最优先级别为轴运动控制,通讯建议写成非阻塞模式,如果是阻塞模式,一定要独立线程。不同的POU之间可以通过属性实现内部变量的访问。


4、指针与引用(POINTER AND REFERANCE)
通过指针与引用能极大的提高程序编写效率,由于pointer可以直接加减,在使用时候尤其要注意避免使用空指针,这种情况会造成程序重启。
实际使用可结合for循环、sizeof等使用。
codesys有一类用于隐式检查的POU,支持除法检测、指针检测等。

关于程序的结构,提出以下思路:
在工业控制中,往往存在着复杂的IO点、复杂的执行机构、复杂的流程。在编写时,要结合面向对象和面向流程编程,如何让程序更加简洁优美,是一件很重要的事情。
1、运动控制:常采用总线,需要较快的刷新周期,建议采用独立的POU+独立任务,功能块采用面向对象方式编写,我们仅需要一个或多个for循环即可实现所有轴的功能。(这里不实现任何逻辑控制)。


2、流程编写:独立的线程,一般不需要太快的刷新周期,流程尽量写在函数中,mian函数只是对其调用。



Main函数
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表