新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > Windows CE设备与PLC串行通信的实现

Windows CE设备与PLC串行通信的实现

作者: 时间:2012-03-26 来源:网络 收藏

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系统设备与组成的串口通信的实现

由上面的分析可知,Windows CE系统对串行通信提供了强有力的支持。通过在应用程序中使用多线程并结合其串行通信API就可以很方便的实现全双工或半双式形式的串行通信。针对 提供的串行通信功能较简单,编程不方便的特点,需要在Windows CE设备一端设计出更灵活并适合于通信的通信方式来完成其的通信要求。具体到数控切纸中应用中,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指令可自定义通信协议,通信过程简单,系统实时性高。对嵌入式系统来说通常要采用在该协议下完成的串行通信。



评论


相关推荐

技术专区

关闭