用面向对象的思想开发CODESYS运行时之一

runtime的IO驱动基本框架

从工控开发生态圈的热度看,CODESYS是当前开发控制器的首选,提供了PLC上位机编平台和软PLC内核,也就是runtime。用户在runtime的基础上进行二次开发,增加外设或者扩展模块就能实现自定义的PLC产品。

一般来说,遵循一套成熟的框架结构进行开发,从前期来看可以避免很多无谓的试错,减少开发时间,从而降低开发成本,于是乎分析CODESYS提供的最基本的开发框架就很有必要,可以说磨刀不误砍柴工。

IoDrv框架描述

CODESYS的runtime作为一个进程运行在处理器中,通过基于驱动来实现与处理器外围外设的数据交互,还可以通过内部总线通信与其他功能模块进行数据交互。开发这一类外设或模块的框架就是CODESYS的IoDrv框架。

+-----------------+            +-----------+
| CPU(OS)         |            | module    |
|    ------------ |     Bus    |-----------|
|    | runtime    | <--------> |           |
|    |            |    DATA    |           |
|    |----------  |            +-----------+
|    | Driver     |           
|    |----------  |           
|    | peripheral |           
+-----------------+

IO驱动框架的运行机理

CODESYS开发包中IoDrv的的运行机理是:

  1. 初始化:包括通信接口初始化
  2. 配置信息:从设备描述文件的背板结构开始,初始化背板、连接的模块及其通道
  3. 输入输出:轮询背板上所有的模块,交互数据信息,数据信息包括配置信息和实际数据
  4. 诊断:轮询背板上所有的模块,交互状态信息
  5. 退出:背板结构及其模块内存空间清理,通信接口关闭等操作

因此,IoDrv驱动框架中提供了包括Hook、UpdateConfig、ReadInputs、WriteOutputs、StartBusCycle等主要的接口。

接口 功能
Hook IoDrv数据结构本身的初始化和清空
UpdateConfig 获取上位机编程软件对外设或模块的配置参数
ReadInputs 在PLC任务开始时调用,将输入变量从缓冲区读到PLC任务中输入区
WriteOutputs 在PLC任务结束时调用,将输出变量从PLC任务输出区写到缓冲区
StartBusCycle 周期性执行,实现一些对外围设备的通信和诊断
ModuleDiagnosis 被StartBusCycle调用,用于模块诊断检测

开发基本思路

一般来说,初始化和退出一般放在Hook中;下载配置放在UpdateConfig中;输入输出分别在ReadInputs和WriteOutputs中;诊断放在ModuleDiag中。

针对数据通信是一发一收的形式的设备,本人比较倾向于将与模块进行数据交互的接口调用放入StartBusCycle中,可以实现数据从上位机到模块之间的互传,有时会专门创建一个任务来交互数据。

结论

通过分析CODESYS的runtime运行机理,在相应的接口实现中正确调用实际硬件的驱动程序,就可以实现runtime基于内部总线的通信功能,这是CODESYS运行时开发的基本思想,接下来将基于不同内部总线,实现runtime与外围扩展门口,包括IO和通信模块的,实现一个完整的PLC。

posted on 2023-07-27 19:21  MichaelChen-99  阅读(430)  评论(0编辑  收藏  举报

导航