引言
随着工业以太网技术的快速发展,利用工业以太网与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协议由施耐德电气定义,并由ModbusIDA支持,它是在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口模拟总线时序来实现寄存器读写的麻烦。
假设网卡芯片的片选信号由DSP外部总线中的XZCS7引脚控制,则总线连接后网卡芯片的基地址为0x200000(22根地址总线),网卡芯片的寄存器读写可通过以下方法实现:
#defineDM9000_INDEX(*(volatile unsigned int *)0x200000)
#defineDM9000_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/uipconf.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/OSII的移植
对μC/OSII实时操作系统的移植,只需要根据现有的硬件平台修改其中与处理器相关的代码,包括OS_CPU.H、OS_CPU_A.ASM、OS_CPU_C.C三个文件[5]。
(1) OS_CPU.H
OS_CPU.H包括了用#define语句定义的与处理器相关的常数、宏,以及数据类型。其中,μC/OSII内核为了处理临界段代码或者访问临界资源,定义了2个宏OS_ENTER_CRITICAL()、OS_EXIT_CRITICAL()来分别关中断和开中断。
这两个宏的实现方法如下:
#defineOS_ENTER_CRITICAL()asm(" SETC INTM ")
#defineOS_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/OSII的移植要求用户编写4个简单的汇编函数,这也是移植过程的重点和难点。它们分别为:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。
其中,OSStartHighRdy()用来被OSStart()调用,使就绪态任务中优先级最高的任务开始运行。OSCtxSw()的作用是实现任务的任务级切换,其被OS_Sched()调用,主要完成的功能为:保存处理器寄存器,在当前任务控制块中保存当前任务的堆栈指针,载入将要重新开始运行的任务的堆栈指针,恢复新任务堆栈中处理器所有寄存器的值,返回中断。OSIntCtxSw()为任务中断级切换函数,其被OSIntExit()调用,完成的功能与OSCtxSw()函数基本一致,只是不必重复保存处理器寄存器。OSTickISR()在系统中实现时间的延时和超时功能,对用户要求提供一个周期性的时钟源,通常在DSP中使用通用定时器来实现。
2.5 软件模块的整合
有了先前的准备工作,现在把各个模块整合起来,uIP模块、网卡驱动模块、μC/OSII模块、Modbus/TCP应用层模块均已移植进来。现利用μC/OSII创建三个任务,即网络主任务(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与服务器通信的结果
结语
本文设计的基于Modbus/TCP协议的通用伺服电机控制系统,在套色印刷行业中的制袋机控制系统、张力控制系统等中得到了良好的应用。通过Internet可以实现实时远程工业控制,减少了人为的手动干预,操作人员不需要在现场就能远程控制工业设备,大大减轻了人力成本,提高了企业效益,并且对于未来实时远程工业控制的实现有着很强的参考价值与意义。