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

通信接口抽象层设计

在对CODESYS的运行时进行功能开发,其实是通过调用嵌入式操作系统的硬件驱动来操作硬件。针对不同的控制器外设,以及与控制器模块连接的不同功能模块,需要调用不同的硬件驱动,一种外设或一个模块需要编写一种接口,然后花费大量的时间去调试和维护这些接口。
如果能采用分层架构设计,专门设计一层通信接口层,就可以实现运行时和嵌入式操作系统的驱动程序分离,不同功能分开管理,就可以降低开发难度,减少维护成本。

面向对象的角度看通信接口

虽然不同的通信接口实现不同,调用的嵌入式驱动不同,但最大的作用无非就是发送和接口,可以将基本相同部分抽象出来成为一个通信接口抽象层。
从面向对象的角度看,通信接口抽象层是一个抽象类(abstract),将包括初始化,关闭,发送、接收等功能用函数指针的形式定义,而具体的外设或者扩展模块则在通信抽象层的基础上进行扩展,也就是定义实现这些函数指针。

通信接口层的数据结构

通信接口数据结构为netif,将使用一个接口链表统一管理所有接口。

 netif_list
 |
\|/  netif            netif              netif
+-----------+      +-----------+      +-----------+
|   next    | ---> |   next    | ---> |   next    | ---> NULL
+-----------+      +-----------+      +-----------+
| init_fn   |      | init_fn   |      | init_fn   |
+-----------+      +-----------+      +-----------+
| close_fn  |      | close_fn  |      | close_fn  |
+-----------+      +-----------+      +-----------+  
| send_fn   |      | send_fn   |      |  send_fn  |
+-----------+      +-----------+      +-----------+
| recv_fn   |      | recv_fn   |      |  recv_fn  |
+-----------+      +-----------+      +-----------+

具体说明如下:

变量 描述
next 链表指针
init_fn 初始化函数指针
close_fn 关闭函数指针
send_fn 发送函数指针
recv_fn 接收函数指针
update_fn 交互通信函数指针

有时,控制器和连接的其他模块的内部通信采用采用交互式通信,即控制器发送命令或者数据后会等待模块回复,回复中得到应答或者数据。因此还需要添加一个交互通信函数指针。

通信接口层的外部接口函数

用C语言来实现面向对象的编程方式,不仅需要定义相应的数据结构,还需要提供一些函数声明和实现,给其他源文件调用。

接口函数 描述
create_if 创建一个通信接口,并加入通信接口链表中
delete_if 从通信接口链表中删除一个通信接口
find_if 从通信接口链表中查找一个通信接口

小结

netif是对不同通信接口共同部分进行抽象而得到的接口层,外设或者扩展模块在抽象层基础上进行扩展,也就是面向对象中的继承,从而实现实际的通信功能。

posted on 2023-09-09 08:14  MichaelChen-99  阅读(321)  评论(0编辑  收藏  举报

导航