当前位置:
RS-232通信作为中间件在Ethernet上的应用
回复 | 人气 | 打印
cablelink 个人主页 给TA发消息 加TA为好友 发表于:2003-05-14 16:40:00 楼主
自认为是篇工控模型创新的好文章、好思想。看过的请跳转;欢迎拍砖 摘 要 运用Visual C++ API将计算机232口作为中间件与Ethernet联接起来,在串行总线控制系统中,结合232/485、232/CAN或者其他232接口转换器,使232变成低成本的、强大的数据输入输出接口。 关键词 RS-232, 中间件,Ethernet, Win Socket, TCP, UDP 1 前言 RS-232串口是计算机最为广泛的普通外设,其应用在各种系统中都不乏典型案例,本文将阐述一种基于Ethernet的控制系统利用232口作为数据输入输出接口的方法。 在实际工程中,如果计算机某一232口通过232/485、232/CAN或者其他232接口转换器已经作为数据输入输出接口被某一应用使用,其他应用则同时无法共享给项资源,而控制系统可能还有其他包括对系统特定通道进行测量、诊断等的应用,则无法通过该232口实现对下级设备访问控制的可能,这就需要能有一个中间件软件结合Ethernet IP技术实现对计算机232口的复用,使得多种应用同时拥有对下级系统的控制能力。 2 中间件的任务和目标 中间件的任务就是对计算机232串口通信进行科学的管理。为了有效而实时地管理好多个上位机对232口的任务请求,FIFO机制及信息帧数据的校验与重发功能必须现实。 2.1 FIFO机制的实现 FIFO机制是通信应用领域常见的信息处理手段,该机制的引入,是当然的。中间件实现就是将一个或多个应用发送的信息帧数据按时间先后顺序进行列队,同时完成该上位机的IP地址及通信端口号的记录,以便在完成该信息帧数据发送后得到下级接点的响应信息帧数据能够被正确的传送到各自的主宿。 2.2 满足信息帧数据校验与重发要求 实际通信中的信息帧数据可能因各种干扰而被破坏,这可以通过信息帧自身的效验代码得到确认,如果信息帧数据经过确认已经损坏,这就需要重新发送。这是的实际通信中重要特征,加上通信中的人为的短帧机制,一个完整的收发周期,一般控制在毫秒(ms)量级,在无须其他干预手段的情况下,就能完全解决通信可靠性的问题。 中间件的任务也必须具备满足信息帧数据校验与重发要求,经过计算,确认收到了损坏了的数据帧,或者在指定时间内,未得到下位接点响应,立即重发;如再不能完成通信,再重发。 中间件运用了两次重发,实践证明是完全可以满足实际要求的。 3 主要功能模块 3.1 232口的数据收发 编程中选择了Windows多进程机制,主要是为了方便同步数据帧的关系,直接使用MS-ActiveX高级函数,对编程的自由度有相当制约。 首先调用CreateFile()函数为启动232设备做准备,然后对232进行初始化:232通信波特率 = 指定波特率;目前115.2 kbps是PC机的最高速率。 232通信协议 = 指定现场总线通信协议(RS-485/422);它们是几位数据位、几位停止位、奇/偶/无校验方式。 完成上面的定义后调用232口初始化函数,它们的函数原形是: BOOL SetCommState();BOOL SetupComm(); 最后是系统设备与应用程序之间通信的消息定义及线程的建立,它们的函数原形是这样的: BOOL SetCommMask();HANDLE CreateThread (); 一待程序完成了所有初始化任务,建立了232口读写事件完成情况的观察线程,再在通信观察线程程序中简单引用Windows消息传送机制函数SendMessage即可将线程与应用程序连接起来,完成232口通信数据最为重要的读出任务。 假定在SetCommMask()函数中设定了EV_RXFLAG标记; 232口事件观察线程StartFunction() { while(1){ //重复循环 WaitCommEvent(&dwEvtMask); if(dwEvtMask & EV_RXFLAG){ SendMessage(); } //其它232通信标记处理 } //while...... } 一待应用窗口得到线程传送的232口可以读取的消息,就可以对232口进行读操作。它们的伪代码如下: COMSTAT ComStat; //定义变量 Char tempbuf[1024];//定义缓冲区变量 ClearCommError(&ComStat); ReadFile (tempbuf, ComStat.cbInQue); 然后,处理从232口读到的数据tempbuf。处理的任务主要是Ethernet层数据的数据的效验、分检与发送;然后消除FIFO列队中的第一列的数据。 3.2 Ethernet层数据的收发及数据分检发送 中间件的任务显然是为了满足多个应用对下级设备访问请求的,所以她是一个TCP/IP和UDP/IP的服务器的设计问题。它的设计中还应该包含网络安全的设计,至少要拒绝非法用户的访问,保证现场的安全。 首先,对于基于可靠连接TCP/IP多次调用WinSock API Create()函数产生多个用于提供多个TCP/IP用户请求的接口,其Create函数原形为:BOOL Create(); 第二,对于一般基于数据寻检、网络传输容错能力强的用户,中间件新开发支持了UDP/IP传输机制,其Create函数中的nSocketType 参量设为SOCK_ DGRAM ; lEvent 参量仅设为FD_READ | FD_WRITE。 在UDP机制的情况下,用户数量不受限制,一旦端口接受到数据,ReceiveFrom()函数调用可得到发送给数据的IP地址与端口。不论TCP还是UDP,一旦用户的访问请求确认为合法用户的请求,桥接器可以将该用户命令串添加到FIFO列队,同时记录用户IP地址与端口,以便在得到下级接点响应后准确传递。 在系统运用中,无论是TCP方式还是UDP方式,根据网络的实际可靠性选择其一,就近的、仅仅要求信号查询且等级不高的,建议使用UDP方式;可靠连接的TCP方式下,该软件最大提供了10个同时连接的合法用户。 3.3 OnTimer判别接收超时并实现重发 为了满足系统实时性的要求,FIFO列队为空的状态下,中间件一旦接收到通信消息,立即发送到232口,并为了满足232口重发的需要在FIFO列队中进行记录;或者响应进行了校验确认并返回给各自的主宿,FIFO列队不为空,立即抽出第一条继续发送;其它所有的发送在FIFO列队不为空的情况下都是由Windows定时器巡检后安排的,发送后所得到的响应进行校验确认,如三次都不正常,可删除FIFO列队中的第一条,再继续FIFO列队的发送过程。 4 结束语 该中间件经过实际考验,运行稳定性好,通信实时性强,在基于网络化的系统中发挥了重要的作用。其编程技术与实现策略对其他网关技术的实现,具有启发意义,同时由于是用C++开发,其源代码应该可以方便地移植到其它系统中。232口复用中间件的实现,使得下级基于串口通信的硬件IO层扩充与诊断的方便性与上层人机界面层编程软件的选择的多样性相得益彰,其控制系统变得相当得开放与灵活,Visual C++、LabView等开发出的应用都通过Ethernet/IP协议与该中间件联接,各自独立而远程地工作着,去完成指定的任务。也正因为RS-232串口是计算机最为广泛的、最为廉价的配置,系统成本得到有效降低。
分享到: 关注收藏 邀请回答 回复 举报

周点击排行
周回复排行
最新求助
Advertisement