用面向对象的思想开发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) 编辑 收藏 举报