资源描述
资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。
基于ARM的工业现场在线监控系统设计
高罗卿
( 常州轻工职业技术学院, 常州 213164)
摘要: 针对远程监控系统中, 对网络通讯服务和数据采集与逻辑控制的实时性问题进行了研究, 将系统分成两个模块, 一个是以太网通讯模块, 一个是根据实际工况需要设计的数据采集与控制模块。两个模块之间经过CAN总线通讯。该系统满足了现场的实际需要, 解决了以太网通讯和现场实时监控之间的矛盾, 也符合嵌入式系统模块化设计的理念, 易于扩展和修改。
关键词: 自动控制技术; 实时监控; 嵌入式系统; 以太网
TP2
Design of On-line Monitoring System of industrial field based on ARM
Gao Luoqing
(Changzhou institute of light industry technology, Changzhou 213164)
Abstract: For remote monitoring systems, network communications services and data acquisition and real-time logic control problem is studied. The system is divided into two modules, one Ethernet communication module, one is the data acquisition and control module based on the actual working conditions. The communication between the two modules through CAN bus. The system meets the needs of the actual working conditions, and resolved the conflict between the Ethernet communications and the real-time monitoring. The embedded system in line with the concept of modular design, easy to extend and modify.
Keywords: Automatic control technology, real-time monitoring, embedded system, ethernet
0 引言
随着工业现场控制的智能化的发展, 以太网应用于工业控制方面得到了广泛的应用。但由于在嵌入式设备上经过软件实现TCP/IP协议栈和小型的嵌入式系统, 消耗了处理器大部分的资源和处理时间, 使得现场监控的实时性得不到足够的保证。
1系统结构
图1 系统结构图
收稿日期: -9-20
作者简介: 高罗卿( 1981年-) , 女, 讲师。
E-mail:
本系统的结构图见图1。在本系统中, 远程监控室经过上位服务软件发送控制命令, 经过Internet与现场以太网通讯模块建立连接, 经过命令的解析和执行, 以太网通讯模块与采集控制模块经过CAN总线, 获取采集信息和分发控制命令, 然后以太网通讯模块将采集器的数据, 参数等有用信息, 上传给上位服务器端。
本系统的硬件结构图见图2。系统的MCU采用ARM7内核的芯片LPC2136, 该芯片具有256K的FLASH, 32K的RAM, 多种串行通讯接口。网络控制器采用的是Microchip公司的ENC28J60, 该芯片是带有行业标准串行外设接口( Serial Peripheral Interface, SPI) 的独立以太网控制器。它可作为任何配备有SPI 的控制器的以太网接口。
图2 系统硬件结构图
CAN总线采用的是Microchip公司推出的MCP2515, 是具有SPI接口的独立CAN控制器。它完全支持CAN V2.0B技术规范, 通信速率最高可达1 Mbps, 内含3个发送缓冲器、 2个接收缓冲器、 6个29位验收滤波寄存器和2个29位验收屏蔽寄存器。它的SPI接口时钟频率最高可达10 MHz, 可满足一个SPI主机接口扩展多路CAN总线接口的需要。
采集控制模块负责现场实时数据的采集和处理, 以及所需控制逻辑的实时执行, 然后将采集量的结果和控制逻辑的结果经过MCP2515的CAN总线上传给网络通讯模块。在网络通讯模块中, 将开辟一个虚拟的设备状态缓冲, 用于保存当前的采集控制模块的状态。网络通讯模块还可经过RS232总线与现场的智能设备通讯, 然后综合结果, 响应上位服务器端的命令和请求, 回复相应的数据。
2网络通讯模块
以太网控制器ENC28J60, 符合IEEE 802.3 的全部规范, 采用了一系列包过滤机制以对传入数据包进行限制。能够设置一些不同的过滤器, 自动拒绝不需要的数据包, 从而最大限度地降低主控制器的处理工作量。
提供了一个内部DMA 模块, 以实现快速数据吞吐和硬件支持的IP校验和计算。与主控制器的通信经过两个中断引脚和SPI 实现, 数据传输速率高达10 Mb/s。两个专用的引脚用于连接LED, 进行网络活动状态指示。与MCU的连接图见图3。
图3 ENC28J60与MCU的硬件连接图
ENC28J60 的工作频率为25 MHz。有一个8KB的缓冲器包含供以太网控制器使用的发送和接收存储器, 分成单独的接收和发送缓冲空间。 主控制器使用SPI 接口能够对发送和接收存储器的容量和位置进行编程。
本系统采用带有网络变压器的RJ-45接头HR911105A, 此接头还包含有两个指示灯, 用于和ENC28J60的LEDA和LEDB连接, 指示网络的连接和发送接收状态。连接图见图4。
图4 RJ-45的连接图
3系统软件设计
本系统的网络通讯部分软件采用了嵌入式操作系统UCOS-II和采用了源码开放的轻型网络协议栈LWIP, 具体的工作可分为3个步骤: 1, 嵌入式操作系统UCOS和网络协议栈LWIP的移植工作。2, ENC28J60的设备驱动开发。3, 网络上层端口服务程序的开发。
图5 系统软件的架构
3.1软件平台的移植
系统软件平台的移植工作主要有两个方面: 一个是操作系统UCOS的移植, 一个是协议栈LWIP的移植。LWIP协议栈把所有与硬件OS 编译器相关的部份放在/src/arch目录下, 因此LWIP在UCOS上的实现就是修改这个目录下的文件。
(1)与CPU或编译器相关的include文件
在/src/arch/include/arch目录下cc.h, cpu.h,
perf.h中有一些与CPU或编译器相关的定义。
(2)与操作系统相关部份
sys_arch.c中的内容是与OS相关的一些结构和函数主要能够分为四个部分:
sys_sem_t 数据结构及信号量函数
struct sys_sem_t sys_sem_new
sys_sem_free sys_sem_signal
sys_arch_sem_wait
sys_mbox_t 消息函数
sys_mbox_new sys_mbox_free
sys_mbox_post sys_arch_mbox_fetch
系统超时函数
struct sys_timeouts *sys_arch_timeouts(void)
创立新线程函数
void sys_thread_new(void (* thread)(void
*arg), void *arg)
(3)lib_arch中库函数的实现
u16_t htons(u16_t n) u16_t ntohs(u16_t n)
u32_t htonl(u32_t n) u32_t ntohl(u32_t n)
int strlen(const char *str)
int strncmp(const char *str1, const char *str2, int len)
void bcopy(const void *src, void *dest, int
len)
void bzero(void *data, int n)
前四个函数一般由用户自己实现, gcc的lib库里已经有了后四个函数。
3.2 ENC28J60的设备驱动开发
在软件平台的移植完成后, 主要的工作就是网络驱动程序的编写了, 驱动的移植主要就是完成ethernetif.c的工作。LWIP协议栈已经给好了驱动的接口。
struct netif {
struct netif *next;
struct ip_addr ip_addr;
struct ip_addr netmask;
struct ip_addr gw;
err_t (* input)(struct pbuf *p, struct netif *inp);
err_t (* output)(struct netif *netif, struct pbuf *p,struct ip_addr *ipaddr;
err_t (* linkoutput)(struct netif *netif, struct pbuf *p);
void *state;
#if LWIP_DHCP
struct dhcp *dhcp;
#endif
unsigned char hwaddr_len;
unsigned char hwaddr[NETIF_MAX_HWADDR_LEN];
u16_t mtu;
char name[2];
u8_t num;
u8_t flags;
};
其中主要就是:
err_t (* input)(struct pbuf *p, struct netif *inp); 这个是被驱动调用的,传递一个数据包给TCP/IP栈。
err_t (* output)(struct netif *netif, struct pbuf *p,struict ip_addr *ipaddr); 这个是被IP模块调用的, 向以太网上发送一个数据包, 函数要先经过IP地址获得解决硬件地址, 然后发包。
err_t (* linkoutput)(struct netif *netif, struct pbuf *p); 这个是直接发送数据包的接口。
相应的LWIP在ethernetif.c里面给了几个函数框架, 这个文件相当于一个硬件抽象层。
static void low_level_init(struct netif *netif); 网卡初始化函数。
static err_t low_level_output(struct netif *netif, struct pbuf *p); 链路层发送函数, 实现err_t (* linkoutput)接口。
static struct pbuf *low_level_input(struct netif *netif); 得到一整帧数据。
static err_t ethernetif_output(struct netif *netif, struct pbuf *p,struct ip_addr *ipaddr); 实现发送线程, 实现err_t (* output)接口。
static void ethernetif_input(struct netif *netif); 实现接收线程, 识别数据包是ARP包还是IP包。
err_t ethernetif_init(struct netif *netif); 初始化底层接口。
本文在写ENC28J60的驱动的时候, 重新建了个实际的网络硬件控制的文件ethernet.c, 在此文件里提供几个主要的函数:
void EMACInit( void ); 硬件的初始化。
void EMACPacketSend ( u8_t *buffer, u16_t length ); 用来将buffer里面的包复制到网络设备的发送缓冲里面, 发送。
u16_t EMACPacketReceive ( u8_t *buffer, u16_t max_length ); 用来将网络设备的接收缓冲里面的包数据复制到buffer里面。
u16_t EMACPacketLength ( u16_t max_length ); 获得包长度。
最后用ethernet.c里函数完成ethernetif.c里的框架。这样移植ENC28J60的驱动部分就会显得清晰很多。
3.3网络上层端口服务程序的开发
LWIP提供三种API接口函数: 1.RAW API。 2.lwip API。3.BSD API。
对于多任务系统而言, 因为lwip采用的是将TCP/IP协议放在一个单独的线程里面, 那个线程是tcpip_thread。采用RAW API回调技术, 就得把应用层程序写在tcpip_thread这个线程里面, 作为同一个任务运行。
而采用lwip API, 就能够将TCP/IP协议和应用层程序放在不同的任务里面, 经过调api_lib.c提供的函数, 编写相应的应用层代码。本文采用这种方式。
下面的程序是个简单的Websever的服务程序代码。
void TaskHttp (void *pdata){
u8_t datanum;
struct ip_addr ipaddr;
struct netconn *conn, *newconn;
pdata = pdata;
IP4_ADDR(&ipaddr, 192,168,0,88);
conn = netconn_new(NETCONN_TCP); //创立一个连接。
netconn_bind(conn, &ipaddr, 80); //绑定IP地址和服务端口号。
netconn_listen(conn); //监听
while(TRUE){
newconn = netconn_accept(conn); //等待这个连接的信号量。
if(newconn != NULL){
struct netbuf *newnetbuf;
newnetbuf = netconn_recv(newconn); //获得这个连接的指针。
if(newnetbuf != NULL){
char *pnow;
char *data;
int len=0;
netbuf_data(newnetbuf,&data,&len); //data指向数据处。
... //此间为对网络数据的处理。
netbuf_delete(newnetbuf); //使用完毕后删除这个结构。
}netconn_close(newconn); //使用完后关闭连接。
while(netconn_delete(newconn) != ERR_OK)
OSTimeDlyHMSM(0, 0, 1, 0); //系统延时
}}}
从底层到应用层,一般将底层数据接收作为一个线程,能够在一个任务里也能够直接在中断里解决。然后tcpip_thread是一个线程, 最后是应用层一个线程。
底层的邮箱投递活动是经过调用tcpip.c里的tcpip_input函数。这个函数向tcpip_thread投递消息。高层的投递是经过tcpip_apimsg函数来实现的。
4结束语
本设计经过实际使用, 能够满足工业现场在线监控的需求。数据采集与控制模块能够及时的处理采集的数据和最快的响应控制需求, 以太网通讯模块能够与各种总线接口通讯, 汇集上位系统所需的信息, 安全的处理与上位的通讯任务, 以保证与上位网络通讯的稳定性。模块化的设计便于后期方案的改进, 符合了现在嵌入式系统模块化设计的思想。
参考文献
[1]Jean J Labrosse.嵌入式实时操作系统μCOS-Ⅱ[M].北京:北京航空航天大学出版社, .
[2]Dunkel,Adam.Design and Implementation of the LwIP TCP/IP Stack[M].Swedish Institute of Computer Science, .1-42.
[3]傅成龙,严殊.基于uC/OS-Ⅱ与ARM平台的LwIP移植[J].西南科技大学学报, 24(3):72-74
[4]郑巨明,张和生.基于μC/OS-Ⅱ和LwIP的嵌入式以太网接口设计[J].计算机测量与控制, 17(11):2238-2242
展开阅读全文