Windows CE操作系统是微软公司针对嵌入式系统的特点如内存容量小、运行速度低、实时性要求高等,而设计出的一种紧凑、高效、模块化的嵌入式实时操作系统。 Windows CE可以提供桌面Windows绝大多数系统服务与功能,同时又保持系统体积很小的特点并可以支持应用程序的实时应用。它还支持数据库、 COM(Component Object Model)、Internet等功能的开发,可以使用标准的Windows控件来完成界面设计。支持众多的标准设备接口,并能够移植到多种嵌入式CPU 架构中。选择Windows CE作为嵌入式产品的操作系统较之现有嵌入式系统中软件结构上多采用DOS系统或者无操作系统而言,可以极大的提升了产品的功能,增加用户界面的美观程度,并大大减少了程序开发的工作量。基于上述优点在数控切纸机控制系统设计中可以把Windows CE的设备与PLC相结合使用,构成上下位机系统。如图1所示,上位机由PC104构成,通过在PC104上移植Windows CE系统使其成为Windows CE设备,这样就可以充分利用Windows CE强大的系统功能来完成控制系统中的控制功能程序开发和用户界面设计。下位机通过使用PLC来完成的各种电气控制功能。上下位机之间通过通信的方式来实现控制信息和机器状态信息的交换。高速、实时、稳定的通信是保证系统稳定运行、工作可靠的关键,在结合PLC的特点基础之上,具有普遍性高、编程简单、实时性好等特点的串行通信是上下位机通信形式的一种理想选择方案。下面就Windows CE下如何与PLC实现串行通信的这一问题进行详细的分析。
图1 上下位机系统结构
1 WINDOWS CE下实现串行通信的特点
Windows CE的设计目标就是为了满足嵌入式系统和移动设备的使用需要,所以其系统本身的通信功能比较强大。市场上主流的Windows CE的5.0版本主要提供了三种主要的通信形式:串行通信、网络(其中包括WinSock和TCP/IP)、电话API (TAPI)[1]。在工业控制领域串行I/O和网络通信的使用较多,其中串行通信几乎在所有嵌入式的设备中提供物理器件的支持,硬件电路实现也比较简单。通过研究TCP /IP网络通信和串行通信在ISO通信模型中的描述,如图2所示,可以看出串行通信模型比网络通信模型的实现要简单的多。操作系统只需要实现Data- link layer中的驱动程序和Serial API函数的封装即可,不需要其它的协议支持,这样就使串行通信应用程序的开发要相对简单,系统调用也较少。对于嵌入式环境来说,意味着需要更少的软、硬件资源的开销,也就等于提高了系统的快速性和实时性。
图2 Windows CE通信的ISO模型
1.1 Windows CE提供了完善的串行通信API支持
在Windows CE平台下提供了与桌面Windows平台一致的串行通信操作API[2]。使用这些API可以用于打开、关闭和操作串口,传输和接收数据,以及管理串行连接等。掌握和使用好下面的API函数是串行通信程序设计成败的关键,其中主要使用有API函数及功能如下表所示:
函数名 |
功能 |
CreateFile |
用于打开串口 |
SetCommState |
按定义的DCB结构配置通信设备 |
SetCommTimeOuts |
设置通信设备上所以读写操作的超时参数 |
ReadFile |
向串口读数据 |
WriteFile |
向串口写数据 |
SetCommMask |
设置通讯设备的事件掩码值 |
WaitCommEvent |
等待通信设备发生指定的事件 |
PurgeComm |
清空通信缓存及通信错误 |
CloseHandle |
关闭打开的串行口 |
表1 Serial Communication API[page]
1.2 使用多线程和通讯事件来的编程方法
对于桌面Windows来说,串行通信有查询、重叠I/O、及事件驱动的三种编程方法可供选择,由于Windows CE不支持重叠I/O方式,并且考虑到对于接收串口数据来说,由于串行通信数据到来的时刻通常是随机的,采用查询方式来读取串口的内容将非常浪费嵌入式系统宝贵的CPU时间和系统资源。所以需要采用多线程与通讯事件结合的方法,以提高程序的执行效率并减少系统的资源消耗。
当串行通信建立起来之后,创建一个线程专门进行串口的读操作。在该线程内部通过调用Windows CE平台提供的API函数WaitCommEvent来等待通信事件的发生,当串口上没有数据到来时,WaitCommEvent的内部操作会使该线程被操作系统挂起,从而不占用系统运行时间。当串行通信上有数据到来时,该线程又会被系统调度,转到运行模式接收串行的数据。这样从而实现自动高效的接收串行数据。
对于发送串行数据来说,发送什么数据和什么时刻进行发送都是根据使用的要求来设计,可以把串行通信设计成半双工或者全双工式。要在Windows CE下实现全双工通信需要再建立一个发送线程直接进行向串口发送数据即可,这就在桌面Windows平台下实现全双工通信的方式有所不同,在桌面 Windows下串行通信的全双工通信不能直接使用两个线程同时进行接收,只能通过重叠I/O的方式进行,否则会因为读“线程”的对串口资源的等待而造成 “写线程”发生“死锁”的现象。但在Windows CE下由于其线程调度机制的不同,不需要使用也不支持重叠I/O的方式,读写两个线程可以同时“并行”而并不会发生“死锁”[5]。具体的分析可以参考文献5的关于Windows CE线程调用的分析,在这里由于篇幅的关系就不做详述。通过上面的分析可以看出在Windows CE下实现串行通信全双工通信比桌面Windows 平台下编程更为简单,通信的实时性、效率也更高。
1.3 在Windows CE内部全部使用Unicode 编码,发送字符串时要进行编码转换
由于Windows CE的内核全部是采用Unicode编码来编写的,即不同于ANSI的单个字节进行编码的方式,所以通过串行通信发送字符串时,需要在两种编码之间进行转换。对于ASCII字符可以把单个字节的字符通过在高字节补零直接扩展为两个字节,对于非ASCII字符则可以通过调用Windows CE的API函数MultiByteToWideChar及WideCharToMultiByte来实现非Unicode字符向Unicode字符的转换。
2 Windows CE系统设备与PLC组成的串口通信的实现
由上面的分析可知,Windows CE系统对串行通信提供了强有力的支持。通过在应用程序中使用多线程并结合其串行通信API就可以很方便的实现全双工或半双式形式的串行通信。针对PLC 提供的串行通信功能较简单,编程不方便的特点,需要在Windows CE设备一端设计出更灵活并适合于PLC通信的通信方式来完成其的通信要求。具体到数控切纸中应用中,PC104是上位机即Windows CE设备,当与PLC进行通信时,由于操作命令和用户输入都由是上位机发起的,通过实现一种PC104发起PLC应答的半双工的串行通信方式就可以满足对数控切纸机的电气和运动控制的需要,并且较之全双工的通信方式也更节约系统资源。下面就对PLC端的串行通信形式和特点做一下说明。并对Windows CE设备与PLC结合进行通信的程序流程和通信协议进行详细的分析。
2.1 PLC端的通信协议的分析
对于PLC来讲,市场上主流PLC的都提供基本相近的通信功能,本文就举三菱公司的FX2n系列PLC对其的串行通信进行说明。根据使用的通信模块与协议不同FX2n系列PLC的串行通信可以有分为以下两种通信模式[3][4]:
1)专有协议的串行通信方式
在这种通信方式下,无须使用梯形图,通信发起端可以直接读写操纵PLC内部的单元,但必须通过PLC指定的通信协议(dedicated protocol),通信的效率较低,实时性不够,上下位机的独立性不够好。
2)无协议串行通信方式(RS指令方式)
这种通信方式使用专用通信模块FX2N-232-DB与PLC连接,在PLC的梯形图程序中采用RS指令方式来驱动串行通信。RS指令举例如下表所示:
RS |
D200 |
D2 |
D100 |
D1 |
通信指令 |
发送数据地址 |
发送个数 |
接收数据地址 |
接收个数 |
通过RS指令可自定义通信协议,通信过程简单,系统实时性高。对嵌入式系统来说通常要采用在该协议下完成的串行通信。[page]
2.2 双方通信程序的设计
根据对数控切纸机控制系统的机械、电气、开关量等控制要求,上下位机之间要就多种不同的数据、指令进行交互。并且这些数据、指令的数据位的长度不同。举其中的机器状态、机器参数、控制命令三种常见的指令为例。机器状态要求下位机不间断发送的机器的实时状态,一般包含数据量不大。机器参数往往是在开机发送或者重新设置了机器的参数时发送,机器参数的数据个数较多,但发送的次数较少。控制命令,只有操作者通过控制面板上的操作时才会发送,它发送的内容也不多,发送频率也较低。但由于使用Fx2n PLC的RS数据通信时,在每次进行通信时,必须知道本次要接收内容的个数。如果把不同类型的数据采用定长结构的发送方式,程序设计起来较为简单,但是其中包含了大量的无用数据,发送的效率较低。所以在进行PLC通信时,定义了下面的通信的协议形式:
本次通信标志 |
下次发送的个数 |
本次发送内容 |
结束标志 |
其中协议中具体含义如下表所示:
协议内容 |
含义 |
本次通信标志 |
AA:机器状态 AF:机器参数 AC:控制命令 |
下次发送的个数 |
用于PLC确定下次接收的个数 |
本次发送内容 |
DATA |
结束标志 |
FF |
表2 通信协议的格式
这样,通过在本次通信中加入下次通信的个数,在PLC端可以通过程序判定确定下次发送内容的个数,进行处理。这样可以提高发送的效率,保证数据的实时性。具体的发送流程如下图所示。
图3 通信流程图
2.3 对数据接收缓冲区的处理
通过研究Windows CE提供的驱动程序代码可以看出,驱动程序通过维护内部的软件缓冲区来保障当应用程序不能及时响应数据到来时,数据会先保存在驱动程序的数据缓冲区中,而不会发生数据丢失的现象。但是对于实时响应要求很高系统来说就是有害的。这样最新到来的数据不能被应用程序及时处理,而被堆放到了缓冲区的后部等待前面的数据处理完成后才能被处理,降低系统的实时性。为了减少驱动程序数据缓冲区对系统实时性的影响,可以通过在串行通信的程序中加入对串行API函数 PurgeComm的调用来及时清除缓冲区的内容,以保证新到的数据及时被应用程序处理,提高通信的实时性。
3 总结
本文详细分析了在Windows CE下进行串行通信的特点,并设计了Windows CE与PLC进行串行通信的程序流程和通信格式。实现了通过串行通信连接的由Fx2n PLC与PC104模块组成的上下位机控制系统,整套系统已经成功的应用到了高档数控切纸机的电气和运动控制。产品经过了用户的长期检验和国家的技术鉴定,合作企业三年内已经取得近600多万元的经济效益。充分证明了整个系统结构的可行性和可靠性。并且可以通过借助Windows CE的可移植性和强大的网络功能以及PLC通用性等特点,把这种通过串行通信连接构成的上下位机结构方式应用推广到其它类似的机电一体化产品中的控制系统应用之中。
参考文献:
[1] Microsoft Corporation, Platform Builder for Windows CE 5.0 Help [OL], 2004.
[2] Douglas Boling, Programming Windows CE [M], 2001.
[3] Mitsubishi Electric Corporation, FX2n series Programmable Controller User's Manual [M], 2001.
[4] 田书峰,李欣.单片机与三菱PLC无协议串行通讯的实现[J],微计算机信息,2005,(10).
[5] 陈向群,王雷等,Windows CE.NET 系统分析及实验教程[M],机械工业出版社,2002.
上一篇:嵌入式Linux实时技术改进与实现
下一篇:嵌入式实时操作系统PetOS设计与实现
推荐阅读最新更新时间:2024-05-02 21:58