APP下载

基于Modbus/TCP协议实现人机界面与下位机通信

2014-08-12谭亚邓忠华

单片机与嵌入式系统应用 2014年8期
关键词:堆栈应用层人机界面

谭亚,邓忠华

(华中科技大学自动化学院,武汉 430074)

基于Modbus/TCP协议实现人机界面与下位机通信

谭亚,邓忠华

(华中科技大学自动化学院,武汉 430074)

在以通用伺服电机控制系统为下位机的基础上,开发了以实时内核μC/OS-II、DSP、CPLD控制模块为核心的软硬件平台。通过移植uIP协议栈到DSP,在通信应用层上将Modbus帧嵌入到TCP帧中,简单可靠地实现了Modbus/TCP协议。同时将Modbus/TCP协议与μC/OS-II实时内核进行整合,更好地保证了系统调度的实时性。

Modbus/TCP;工业以太网;uIP;μC/OS-II;TMS320F28335

引 言

随着工业以太网技术的快速发展,利用工业以太网与Internet连接可实现无缝集成的优势,嵌入式Internet技术已经在工控领域得到了广泛应用。工业以太网是基于IEEE802.3 (Ethernet)的强大的区域和单元网络。其具有价格低廉、稳定可靠、通信速率高、软硬件产品丰富、应用广泛以及支持技术成熟等优点,并且支持几乎所有流行的网络协议。目前,工业以太网技术在网络的视频传输、人机界面(HMI),以及触摸屏通信等方面都得到了及时的应用。

以太网技术应用于工业控制时,体现在应用层的是实时通信、用于系统组态的对象,以及工程模型的应用协议。目前,还没有统一的应用层协议,但受到广泛支持并已经开发出相应产品的主要有4种协议:HSE、Modbus TCP/IP、ProfINet、Ethernet/IP。

1 系统的硬件架构设计

通用伺服电机控制系统的硬件架构如图1所示。

图1 系统硬件架构图

系统由DSP控制模块、CPLD辅助控制模块、CAN通信模块、网络通信模块、码盘信号处理模块、电源模块、电平转换模块、D/A转换模块、I/O扩展模块、通道号显示模块等组成。其中,网络通信模块的硬件设计如图2所示。

图2 网络模块硬件设计原理图

采用TI公司工业控制领域先进的32位浮点DSP芯片TMS320F28335为主控芯片,网卡芯片采用台湾DAVICOM公司的DM9000A芯片,人机界面采用威纶通触摸屏。DSP主要完成对网卡芯片的收发控制、应用层数据处理、控制算法的实现等功能;网卡芯片实现下位机与人机界面之间数据的网络收发;威伦通触摸屏完成数据显示、参数设定,以及报警功能。

2 系统的软件设计

2.1 Modbus/TCP协议简介

Modbus/TCP协议由施耐德电气定义,并由Modbus-IDA支持,它是在TCP/IP网络上应用Modbus协议。Modbus/TCP协议是Modbus的派生产品,在OSI模型中,它位于第7层应用层,已成为工业自动化领域中网络信息传输的通用标准。Modbus TCP/IP通信设备连接在以太网上,默认使用TCP502端口。其数据帧格式如图3所示,由MBAP报文头、功能码和数据三部分组成,舍去了Modbus协议中的差错校验域,由TCP/IP协议来保证报文的正确性[6]。

图3 Modbus/TCP的消息帧结构

其中,MBAP报文头为7个字节,包括事务处理标识符、协议标识符、长度和单元标识符。由于Modbus/TCP的消息帧用于与人机界面之间的通信,其所需功能码主要包括:01(读单个或多个线圈)、03(读保持寄存器)、05(写单个线圈)、06(写单个寄存器)、16(写多个寄存器)等。

2.2 网卡驱动的编写

在DM9000A中,只有两个可以直接被处理器访问的寄存器,这里命名为INDEX端口和DATA端口。事实上,DM9000A中有许多控制和状态寄存器,但它们都不能直接被处理器访问,访问这些控制、状态寄存器的方法是:

① 将寄存器的地址写到INDEX端口;

② 从DATA端口读写寄存器中的数据。

其实,INDEX端口和DATA端口是由芯片上的CMD引脚来区分的,低电平时为INDEX端口,高电平时为DATA端口。芯片CMD引脚与DSP地址总线上的A2引脚相连,其16根数据线与DSP的数据总线相连,通过DSP总线接口来配置DM9000A的读写时序的方法,可以省去通过I/O口模拟总线时序来实现寄存器读写的麻烦。

#define DM9000_INDEX (*(volatile unsigned int *)0x200000)

#define DM9000_DATA(*(volatile unsigned int *)0x200004)

void iow(unsigned char reg, unsigned char data){

//向DM9000寄存器写数据(字节为单位)

DM9000_INDEX=reg;

//将寄存器地址写到INDEX端口

DELAY_US(1); //延时1 μs

DM9000_DATA=data;

//将数据写到DATA端口,寄存器

}

unsigned char ior(unsigned char reg){

//从DM9000寄存器读数据(字节为单位)

DM9000_INDEX=reg;

//将寄存器地址写到INDEX端口

DELAY_US(1);

return DM9000_DATA;

//将数据从寄存器中读出

}

对于网卡驱动部分,只需实现三个函数:dm9000x_inital()网卡初始化函数,初始化网卡的工作模式;dm9000x_sendpacket()网卡发送数据包函数,将网卡收到的数据放入全局缓存区uip_buf中,返回包的长度赋给uip_len;dm9000x_receivepacket()网卡接收数据包函数,将全局缓存区uip_buf里的数据(长度放在uip_len中)发送出去。

2.3 uIP协议栈的移植

uIP由瑞典计算机科学学院(网络嵌入式系统小组)的Adam Dunkels开发。其源代码由C语言编写,并完全公开。uIP协议栈去掉了完整的TCP/IP中不常用的功能,简化了通信流程,但保留了网络通信必须使用的协议,设计重点放在了IP/TCP/ICMP/UDP/ARP这些网络层和传输层协议上,保证了其代码的通用性和结构的稳定性。

2.3.1 uIP架构

uIP相当于一个代码库,通过一系列的函数实现与底层硬件和高层应用程序的通信,对于整个系统来说它内部的协议组是透明的,从而增强了协议的通用性[7]。uIP协议栈与系统底层和高层应用之间的关系如图4所示。

图4 uIP在系统中的位置

2.3.2 uIP协议在DSP上的移植

移植uIP时,首先需要配置一些选项,目的是适应具体的硬件平台。uipopt.h/uip-conf.h是配置文件,包括:本地的IP地址、网关地址、MAC地址、全局缓冲区的大小、支持的最大连接数、侦听数、ARP表大小、基本数据类型定义等[2]。

其次,将之前编写好的网卡驱动函数与tapdev.c文件中相应的函数关联起来。

接着,由于uIP协议栈需要使用时钟,为TCP和ARP的定时器服务。因此使用DSP的通用定时器0作时钟源,每10 ms让系统嘀嗒数sys_ticks加1,这样,50次计数(0.5 s)满后可以调用TCP的定时处理程序,10 s后可以调用ARP老化程序。

然后,根据实际所需的功能对源uIP协议进行相应的裁剪。关闭了IPV6、IP分片重装、UDP、ICMP,以及统计信息和日志记录等功能,以减少源代码的总量。

另外,针对C28xx系列DSP中char型数据为16位,与uIP源协议char型数据默认为8位之间所存在的不兼容问题,进行了改进。

2.4 μC/OS-II的移植

对μC/OS-II实时操作系统的移植,只需要根据现有的硬件平台修改其中与处理器相关的代码,包括OS_CPU.H、OS_CPU_A.ASM、OS_CPU_C.C三个文件[5]。

(1) OS_CPU.H

OS_CPU.H包括了用#define语句定义的与处理器相关的常数、宏,以及数据类型。其中,μC/OS-II内核为了处理临界段代码或者访问临界资源,定义了2个宏OS_ENTER_CRITICAL()、OS_EXIT_CRITICAL()来分别关中断和开中断。

这两个宏的实现方法如下:

#define OS_ENTER_CRITICAL() asm(" SETC INTM ")

#define OS_EXIT_CRITICAL() asm(" CLRC INTM ")

(2) OS_CPU_C.C

OS_CPU_C.C文件中有10个函数要根据用户的需要编写,其中最为重要的是函数OSTaskStkInit()。函数OSTaskStkInit()被OSTaskCreate()和OSTaskCreateExt()所调用,用于初始化任务的堆栈结构。初始化之后的堆栈,就像是刚刚发生过一次中断,所有的寄存器值均保存在堆栈中。中断发生时,TMS320F28335保存相关寄存器入栈的顺序为ST0、T、AL、AH、PL、PH、AR0、AR1、DP、ST1、DBGSTAT、PC和IER,并且其堆栈是从低地址往高地址递增的[3]。显然,用户在将寄存器压入堆栈时,必须严格依照同样的顺序。

(3) OS_CPU_A.ASM

μC/OS-II的移植要求用户编写4个简单的汇编函数,这也是移植过程的重点和难点。它们分别为:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。

其中,OSStartHighRdy()用来被OSStart()调用,使就绪态任务中优先级最高的任务开始运行。OSCtxSw()的作用是实现任务的任务级切换,其被OS_Sched()调用,主要完成的功能为:保存处理器寄存器,在当前任务控制块中保存当前任务的堆栈指针,载入将要重新开始运行的任务的堆栈指针,恢复新任务堆栈中处理器所有寄存器的值,返回中断。OSIntCtxSw()为任务中断级切换函数,其被OSIntExit()调用,完成的功能与OSCtxSw()函数基本一致,只是不必重复保存处理器寄存器。OSTickISR()在系统中实现时间的延时和超时功能,对用户要求提供一个周期性的时钟源,通常在DSP中使用通用定时器来实现。

2.5 软件模块的整合

有了先前的准备工作,现在把各个模块整合起来,uIP模块、网卡驱动模块、μC/OS-II模块、Modbus/TCP应用层模块均已移植进来。现利用μC/OS-II创建三个任务,即网络主任务(NET_MAIN_TASK)、网卡数据包接收任务(ETH_RE_TASK),以及周期时钟任务(PERIO_TASK)。通过这三个任务之间相互协调,实现了数据从链路层到应用层或从应用层到链路层的传递[4]。程序中三个主要任务之间的关系和各自的功能如图5所示。

图5 软件模块整合流程图

3 实验结果

实验时,选用基于TCP/IP协议的OnceModbus上位机调试软件来模拟人机界面。下位机服务器的IP地址为192.168.101.16/502,图6为PC客户端对服务器ping通信的结果,结果显示通信良好,丢包率为0。

图6 对服务器ping通信的结果

图7为OnceModbus上位机调试软件与下位机服务器的通信结果,结果显示调试软件从服务器准确无误地读取8个寄存器的值。

图7 OnceModbus与服务器通信的结果

结 语

[1] 张益南,王文海.嵌入式Modbus/TCP协议的研究与实现[J].组合机床与自动化加工技术,2008(2):26-29.

[2] 刘春凤,张代远. μC/OS-II下协议栈uIP的移植与应用[J].计算机技术与发展,2012,22(9): 143-145.

[3] 陈立强,吴祖堂,刘瑜.嵌入式操作系统在TMS320F28335平台上的移植[J].计算机技术与发展,2013,23(6):7-11.

[4] 陈禾.基于μC_OSⅡ和TCP_IP协议的网络测控平台的研究与设计[D].重庆:重庆大学,2005.

[5] Jean J Labrosse.嵌入式实时操作系统μC/OS-II[M].2版.邵贝贝,等译.北京:北京航空航天大学出版社,2003:280-332.

[6] Modbus-IDA. MODBUS Messaging on TCP/IP Implementation Guide V1.0b [EB/OL].[2014-02-25].http://www.modbus.org.

[7] W Richard Stevens.TCP/IP详解卷1:协议[M].范建华,胥光辉,张涛,等译.北京:机械工业出版社,2009.

谭亚(硕士研究生),主要研究方向为计算机集成与网络技术;邓忠华(教授),主要研究方向为套印智能控制、电气传动系统数字化控制、复杂非线性系统建模与控制等。

Implementation of Human-machine Interface Communication with PLC Based on Modbus/TCP Protocol

Tan Ya,Deng Zhonghua

(College of Automation, Huazhong University of Science and Technology, Wuhan 430074,China)

Taking general servo motor control system as the lower computer, the software and hardware platform based on real-time kernel μC/OS-II,DSP and CPLD controller is developed.By transplanting uIP protocol stack to DSP, the Modbus frame is embedded to the TCP frame in the communication application layer,the Modbus/TCP protocol is simply and reliably realized.Meanwhile, the Modbus/TCP protocol and the real-time kernel μC/OS-II are integrated in order to ensure the real-time scheduling of system.

Modbus/TCP; Industrial Ethernet; uIP; μC/OS-II; TMS320F28335

TP273

A

2014-02-25)

猜你喜欢

堆栈应用层人机界面
基于行为监测的嵌入式操作系统堆栈溢出测试*
基于堆栈自编码降维的武器装备体系效能预测
基于分级保护的OA系统应用层访问控制研究
CBTC系统车载人机界面的设计与实现
基于PLC与人机界面的经编机电子横移控制系统研究
新一代双向互动电力线通信技术的应用层协议研究
物联网技术在信息机房制冷系统中的应用
CTCS-3级列控车载人机界面的系统设计与实现
达人机界面DOP-B10VS511
Current advances in neurotrauma research: diagnosis, neuroprotection, and neurorepair