关键字:无线通信卡 现场总线 Linux驱动
Abstract: This paper expatiate the realization technique of fieldbus wireless communication card based on Linux, and successfully solve the problem of communication with IO card. It provides the feasibility of realization of wireless extension of fieldbus by wireless communication card. Simple testing shows that system works orderly and achieves anticipative aim.
Key words: Wireless Communication Card;Fieldbus;Linux driver;
1.引言
使用无线连接设备的便利已经导致了在消费电子(商业)领域中无线技术被空前成功的应用。在此基础上基于无线技术的应用开始出现在各个领域。在工业或工厂底层环境中,使用无线技术的优势更是多方面的。
第一,在工业环境中往往需要大量的布线,采用无线技术不仅会使安装和维护的成本有效减少,而且会使设备的调整规划和重新配置更加的容易。
第二,无线技术的引入对于解决在有化学腐蚀、震动和移动部件等恶劣环境中对各种线缆的潜在损伤等问题显得更加有效。
第三,考虑到工厂设备中适应性和灵活性,固定系统可以通过无线技术和现有的移动子系统或移动机器人连接通信。
第四,对在工厂设备进行临时访问任务(如诊断或程序设计等)使用无线技术会更加简化(如使用无线手持设备)。
在解决工业环境及过程控制环境下的许多移动对象,如移动机器人与自治运输设备之间的协调;旋转对象,如机械臂;危险环境对象的监测与控制问题,如分布式控制等工业环境无线技术发挥极大的作用。将无线技术应用到现场总线中来解决传统现场总线存在的问题,正受到学术界和工业界的极大关注。
2.现场总线的无线接入方法
为了使无线技术能够无缝而更广泛地应用于工业现场,使现场设备无线接入到现存的现场总线,国内外相关领域的技术人员进行了一定的尝试。按在不同层上实现接入可以将接入方案分为三大类:用户层接入、数据链路层接入和物理层接入。
(1)用户层接入:在用户层设一个OPC服务器,通过OPC服务器进行有线网段与无线网段之间的数据交换。该方案其优点是简单易实现,双方可保持原有结构不动,两侧的“连接”可随时通过软件的控制建立或分离。缺点是中间环节太多,实时性得不到保证。
(2)物理层的接入:在某些站点的有线连接“下”面加装Modem。无线站点的信号经过此无线收发装置将帧格式转换后,联入有线网段接口,因此远端的无线站点被“视为”同质站点。这样,所有的有线、无线站点均采用原有现场总线协议,只是在最底层的某些物理连接上,无线连接代替了有线的连接。其缺点是此方法仅实现了点对点的连接,无线站点不具有“漫游接入”的能力。
(3)数据链路层的接入:此方法源自WLAN和以太网的联接方式,即在PHY层和DDL层之上加一个无线网关。该无线网关实现了无线网段数据与有线网段之间的数据格式转换和转发。原有的现场总线保持不动,加装一个无线网段的AP接入点。当两网段间有数据交换时,才会通过AP点经过协议转换把数据转发到另一端。
数据链路层的接入是现阶段最被关注的方法。其具体实现方法较多,但大多处于理论研究阶段或需要对原有的现场总线进行改造,而工业厂家又不想使现正运行的现场总线暂停工作。这使得现阶段的一些其无线接入技术在现场总线中应用变得困难。为了使无线现场设备能够应用于工业现场,又不改动现有的现场总线系统,目前较成熟的技术就是使用无线分散控制站来与原有的现场总线连接,实现现场设备的无线接入。无线分散控制站一般由IO模块控制卡、无线通信卡两部分组成。两块板卡通过IO模块控制卡上的双端口RAM交换数据,通过中断触发数据读写操作,从而达到通信效果。其关键技术就是如何实现无线通信卡的软件设计。
3.基于Linux的无线通信卡
在无线分散控制站中无线通信卡使用AT91RM9200控制器并通过USB接口加载符合802.11b协议的无线传输模块,其操作系统为Linux系统。
3.1基于Linux的无线通信卡的工作原理
无线通信卡运行着现场总线协议栈和功能块(MAI,MAO,MDI,MDO)等。根据所接入的现场总线的不同选用相应的协议栈。使用向IO模块控制卡发中断及响应IO模块控制卡中断的方式,通过IO模块控制卡来配置、读取和控制现场设备。无线通信卡与IO模块控制卡之间数据传输是直接通过读写IO模块控制卡上的双端口RAM实现的。另一方面,无线通信卡通过其上面的USB接口加载了符合802.11b协议的无线传输模块,能够通过该模块实现与有线网络相连,使其与相应的现场总线工作站通信,其结构示意图如图3-1所示:
图3-1无线通信卡的结构示意图
3.2基于Linux的无线通信卡的软件设计
无线分散控制站中无线通信卡软件开发基于Linux操作系统。由于Linux系统基于802.11b协议的无线驱动已经很成熟了,而基于Linux操作系统的协议栈软件移植也比较容易。因此,选择Linux系统会有效的提高无线通信卡的开发周期。
基于Linux的无线通信卡与有线的通信卡在协议栈和功能块方面大致相同,仅需将应用程序向Linux系统上移植即可。但由于采用了Linux系统在与IO模块控制卡通信的实现上就相对比较复杂了。与IO模块控制卡通信的程序流程图如下图3-2所示:
图3-2 与IO模块控制卡通信的程序流程图
3.3软件实现中关键性问题的解决
在Linux操作系统下对于中断及其它系统资源的操作有特定的规范,如内核模式操作和用户模式操作具有不同操作权限,内核空间与用户空间也不能随意互访。导致如协议栈无法直接对双端口RAM进行读写,也无法直接向I/O模块控制卡收发中断,在Linux系统下,只有在内核模式下才可以做到。那么,怎么样将数据写入到双端口RAM中,然后发送中断信号通知对方及如何响应对方的中断并从双端口RAM中读数是软件实现中的关键性问题。
3.3.1发中断与注册中断处理程序的实现
由于发中断与注册中断处理程序是对硬件直接操作,在Linux系统下用户程序无法直接对其硬件进行操作。因此,必须编写相应的内核模块,在内核模块中完成发中断与注册中断处理程序的操作。在用户程序中动态加载相应内核模块来达到用户程序发中断与注册中断处理程序的效果。其注册中断处理程序的内核模块关键性代码如下:
int init_module(void) //中断注册模块初始化
{ …… /* 初始化设置 */
AT91_SYS->AIC_SMR[25]|=0X20; //设置中断下跳沿触发
if (request_irq(n, interrupt_program, INTERRUPT," IRQ1",NULL))
// 请求分配中断号为n的快速中断处理
// interrupt_program为指向处理这个中断的中断处理程序的指针
{ ……/*没有申请成功 根据返回值进行出错处理 * / }
else
{ printk("<1> 注册中断成功 ! \n");
return 0;}
init_waitqueue_head(&my_queue);
}
void cleanup_module(void)
{ …… /* 释放资源 */
free_irq(n,NULL); //释放中断线n
}
在用户程序中发中断时,通过调用system(send_riq)来动态执行内核模块程序来控制发送中断的管脚的信号,从而实现在用户程序发中断的效果。其发中断的内核模块关键性代码如下:
AT91_SYS->PIOC_PER |= AT91C_PIO_PC15;//设置PC15IO使能
AT91_SYS->PIOC_OER |= AT91C_PIO_PC15;//设置PC15输出使能
//发送一个方波中断信号
AT91_SYS->PIOC_CODR |= AT91C_PIO_PC15;
for(i=1;i
AT91_SYS->PIOC_SODR |= AT91C_PIO_PC15;
3.3.2双端口RAM驱动的实现
由于用户程序不能直接对双端口RAM进行读写,因此必须根据用户程序的需要编写双端口RAM的驱动,以内核模块的形式动态加载到系统中去。Linux系统将所有设备都看做是文件,对设备的读写相当于对文件的读写。双端口RAM驱动模块加载后,用户程序就可以像读写文件一样,间接的对双端口RAM进行读写了。其双端口RAM驱动模块的主要实现过程如下:
static int write_dpram(struct file *file, const char *buf, u32 count, loff_t *f_pos)
{ …… /* 写初始化 */
copy_from_user(wMessage,buf,count);
…… /* 进行数据处理 */
for (i=0;i
{ writeb(wMessage[i], base+wadd);
wadd++; }
…… /*向IO模块控制卡发中断信号*/
}
static int read_dpram(struct file *file,char *buf,u32 count,loff_t *f_pos)
{ …… /*读函数则调用相应的readb( )和copy_to_user( )函数,与写函数同理*/}
static int open_dpram(struct inode *inode,struct file *file )
{ …… /*初始化*/
if (!request_mem_region(AT91_DPRAM,BUF_LEN*sizeof(u8),DEVICE_NAME))
{ …… /*未申请到该内存空间时进行相应处理*/} //申请使用内存空间
base =ioremap(AT91_DPRAM,BUF_LEN*sizeof(u8));//为设备内存区域分配虚拟地址
…… /* 设置DPRAM读写时序*/
}
static int release_dpram(struct inode *inode,struct file *file )
{ …… /* 释放相应资iounmap( )和release_mem_region();}
以上为DPRAM设备驱动的打开、读写、关闭函数的实现,然后通过以下标记化结构将其驱动的功能映射到前面的具体实现函数上:
static struct file_operations test_fops = {
read:read_dpram,
write:write_dpram,
open: open_dpram,
release:release_dpram
};
另外,在驱动程序初始化时必须通过register_chrdev( )注册。在加载该驱动前要使用system("mknod /dev/设备名 c 主设备号 次设备号")创建设备文件并为该设备分配设备号。该双端口RAM驱动是通用的,无论什么功能的板卡上面有双端口RAM并且是基于Linux的系统的都可以使用该驱动。
4. 测试
为了测试该无线通信卡的性能,该测试选用了符合EPA(Ethernet for Plant Automation)标准的现场总线系统进行无线扩展。EPA是我国第一个拥有自主知识产权的现场总线标准。所搭建的测试系统基本和有线EPA演示系统一致。包括一个EPA无线现场设备B(包括EPA无线通信卡和IO模块控制卡)和一个EPA无线接入网桥、一台PC机及一个灯箱,如图4-1所示。灯箱中的温度传感器与AI模块相连,将温度值传递给AI模块,并通过设备A发送到以太网上。设备B接收到此温度值后,将其与额定温度值相比较,如果低于额定温度值,则通过AO模块输出电流来控制灯箱内灯泡加热;如果高于额定温度值,则中断AO模块的输出电流,切断灯泡的电流输入,使灯箱内的温度下降,从而达到保持灯箱内温度恒定的目的。
图4-1测试系统示意图
实验证明,无线通信卡与IO模块控制卡之间数据传输稳定,这个系统运行效果良好,达到了预期目标,能够满足工业现场设备的通信要求。同时,并没有改变和影响原来的有线现场总线的正常工作。
5.小结
通过使用无线分散控制站和无线网桥实现现场总线的无线接入,目前是比较稳定、便捷的无限扩展方法。本文提出的无线分散控制站中无线通信卡的软硬件实现方法是一个通用的快捷开发方案。无线技术给工业带来很多益处如减少设备配置和安装时间。市场也提供了较成熟的无线技术如IEEE 802.11标准, IEEE 802.15.4 标准和蓝牙技术。但在工业现场无线技术仍不能被广泛使用。原因之一是无线信道的实时性和出错率达不到要求。随着合适的协议机制和传输调度的设计,并细致结合这些方案,无线技术必将会在工业现场总线中得到广泛使用。
主要参考文献:
[1]吴爱国,郭昕.现场总线CAN与无线以太网IEEE802.11的结合[J].组合机床与自动化加工技术,2004,(11): 61-62,64.
[2]侯维岩,许静,费敏锐,陈伯时.工业现场总线与无线通信的集成模式[J].自动化仪表,2003,24(12):10-14.
[3]高路,于海滨,王宏,徐皑冬.EPA网络体系结构[J].计算机工程, 2004,17(30):81-82.
[4]Alessandro Rubini. LINUX设备驱动程序(第二版)[M].中国电力出版社,2002.2.