基于μC/OS-II的Modbus协议测试系统
扫描二维码
随时随地手机看文章
1 引言
Modbus 协议最初由Modicon 公司开发出来,1979 年末该公司成为施耐德自动化 (Schneider Automation)部门的一部分。现在Modbus 协议已经是工业领域全球最流行的协 议。Modbus 协议为应用层报文传输协议,仅定义了通讯消息结构,一个Modbus 信息帧包 括从机地址、功能码、数据区和数据校验码。Modbus 协议支持传统的RS-232、RS-422、 RS-485 和以太网设备。许多工业设备,包括PLC、DCS、智能仪表等都在使用Modbus 协 议作为它们之间的通讯标准。 为适应当前开发Modbus 设备过程中协议测试的需求以及Modbus 设备在线测试的需 要,本文提出并实现了基于ARM 嵌入式处理器、μC/OS 实时操作系统的Modbus 协议测试 系统,并给出了系统的软硬件设计。
2 系统结构
Modbus 协议测试系统硬件设计采用了工业级嵌入式处理器HMS30C7202 。 HMS30C7202 是Hynix 公司的高性能、低功耗32 位RISC 微处理器,它由ARM720T 内核 和其他一些外围接口电路组成,工作频率为70MHz,支持8KB 的数据与指令Cache、2KB 的SRAM、支持段式和页式存储的MMU、写缓冲器及AMBA 接口。
HMS307202 采用0.25μm 低功耗CMOS 工艺,片内电压2.5V,I/O 支持3.3V 电压,采用了256 管脚QFP/BGA 封装。 HMS30C7202 片上资源十分丰富,具有极高的集成度,非常适用于嵌入式系统应用,主要 应用于PDA、智能电话、个人音频设备等场合。 测试系统提供了RS-232 和以太网接口,用于实现和被测Modbus 设备的联接。系统 RS-232 接口芯片采用MAX3232。在嵌入式系统内部,将MAX3232 的接收输出端与 HMS30C7202 的通用IO 端口E24 相连。工作时,使用串行电缆将测试系统RS-232 串口和 被测设备的串口联接起来,在测试系统中通过运行测试软件实现对Modbus 协议的测试。系 统结构如图1 所示。
测试系统的系统软件采用μC/OS-II 实时操作系统,μC/OS-II 的前身是μC/OS,由美国 人Jean Labrosse 编写。μC/OS-II 是一种可剥夺型的实时多任务操作系统,其特点是可固化,可裁减,移植性好。μC/OS-II 功能强大,最多支持56 个用户任务,支持信号量、消息邮箱、 消息队列等多种常用的进程间通信机制。
现已成功移植到几乎所有知名的MCU 上,其稳定 性与可靠性已经得到检验[1]。 μC/OS-II 是一个可剥夺型抢占式实时多任务内核。μC/OS-II 大部分代码是用ANSI C 语 言编写的,仅包含一小部分汇编语言代码,使之可以提供给不同架构的微处理器使用。至今, 从8 位到64 位,μC/OS-II 已经在40 多种不同架构的微处理器上使用。
世界上已经有成千上 万的人在各个领域中使用μC/OS,这些领域包括:照相机行业、航空业、医疗器械、网络设 备、自动提款机以及工业机器人等。 由于μC/OS-II 仅仅是一个实时多任务的内核,移植μC/OS-II 到处理器平台以后,离实 际的应用还有一段距离。因此必须对μC/OS-II 进行必要的扩充,才能建立一个实用的实时 操作系统。扩充工作主要包括:建立文件系统、为外部设备建立驱动程序并规范相应的API 函数、创建图形用户接口(GUI)函数、建立其他实用的应用程序接口(API)函数等[2]。
图1 测试系统结构图[!--empirenews.page--]
3 软件设计
μC/OS-II下应用程序设计主要是根据系统的功能需要划分不同的任务和中断,并为每个 任务分配不同的优先级。一个任务通常是一个无限的循环,看起来像其它C的函数一样,有 函数返回类型,有形式参数变量,但任务是决不会返回的,因此返回参数类型必须定义为 void。为了使μC/OS-II能管理用户任务,用户必须在建立一个任务的时候,将任务的起始地 址与其它参数一起传给OSTaskCreate()或OSTaskCreateExt()。
中断和任务以及任务与任务之间的同步可通过信号量实现。下面以Modbus协议测试程 序中RTU模式下字符时间间隔的测量为例介绍μC/OS-II程序设计中任务和中断的划分。 Modbus的RTU模式中规定[3]:RTU模式下必须以连续的字符流发送整个报文帧,同一个 帧中两个字符之间的空闲时间Δt不能大于1.5个字符时间(称为t1.5),否则就认为报文帧不完 整;不同报文帧之间需要时长至少为3.5个字符的空闲时间,这个时间区间被称为t3.5。RTU 模式下的信息帧如图2所示。
图2 RTU模式的信息帧
为了记录RTU 帧中一个字符结束时间和另一个字符的起始时间,系统分别使用串口中 断Uart_ISR 和IO 中断PE24_ISR 分别对这两个时刻进行捕捉。这需要将HMS30C7202 的串 口中断时机设置为接收完一个字符后,将通用I/O 端口线PE24 设为允许中断、下降沿触发。
为了缩短关中断时间和中断处理时间,可将中断的处理放在任务中进行。在主任务中调 用OSTaskCreate函数分别建立串口接收处理任务Uart_Task和IO口处理任务PE24_Task。在 μC/OS-II中,有一个全局的系统时钟,维护着一个全局时间变量。在Uart_Task和PE24_Task这两个任务中分别通过读取当前全局时间变量来实现对字符起始时间和结束时间的连续测 量。系统利用μC/OS-II中信号量机制实现中断与任务之间的同步[3][4],信号量必须在系统启 动的时候初始化,利用信号量实现任务与中断同步的过程如图3所示。
图 3 利用信号量实现任务与中断同步[!--empirenews.page--]
串口处理任务Uart_Task、IO 口处理任务PE24_Task、串口中断程序Uart_ISR 和IO 口中断程序PE24_ISR 的部分代码如下所示:
由于μC/OS-II是一种可剥夺型实时内核,因此当中断程序结束后要重新进行任务的调 度。任务的调度工作是由调度器完成的,μC/OS-II任务调度所花的时间是常数,与应用程序 中建立的任务数无关,因此串中中断和IO口中断后的中断恢复时间是相同的,如果将通过 优化编程使两个中断的响应时间相等,则时间间隔Δt的测量结果将更加精确。
4 结语
做为一种源码开放的实时操作系统,μC/OS-II在计算机检测与控制等领域得到了广泛应 用。本文提出并实现了基于ARM嵌入式处理器和μC/OS-II的Modbus协议测试系统。实验结 果表明,测试系统实时性好、可靠性高,能很好地满足Modbus设备的开发调试以及Modbus 设备运行过程中的在线检测需求。