发表于:2003/3/26 21:05:00
#0楼
RS-232通信作为中间件在Ethernet上的应用
孔祥成
中国科学院高能物理研究所 、北京918信箱-8,100039 、kongxc@ihep.ac.cn
摘 要 运用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设备做准备,这里CreateFile函数原形是这样的:
HANDLE CreateFile(LPCTSTR lpszName, DWORD fdwAccess, DWORD fdwShareMode, LPSECURITY_ATTRIBUTES lpsa, DWORD fdwCreate, DWORD fdwAttrsAndFlags, HANDLE hTemplateFile)
然后对232进行初始化:232通信波特率 = 指定波特率;目前115.2 kbps是PC机的最高速率。
232通信协议 = 指定现场总线通信协议(RS-485/422);它们是几位数据位、几位停止位、奇/偶/无校验方式。
完成上面的定义后调用232口初始化函数 ,它们的函数原形是:
BOOL SetCommState(
HANDLE hFile, // handle of communications device
LPDCB lpDCB // address of device-control block structure
);
BOOL SetupComm(
HANDLE hFile, // handle of communications device
DWORD dwInQueue, // size of input buffer
DWORD dwOutQueue // size of output buffer
);
最后是系统设备与应用程序之间通信的消息定义及线程的建立,它们的函数原形是这样的:
BOOL SetCommMask(
HANDLE hFile, // handle of communications device
DWORD dwEvtMask // mask that identifies enabled events
);
HANDLE CreateThread (
SEC_ATTRS SecurityAttributes,
ULONG StackSize,
SEC_THREAD_START StartFunction,
PVOID ThreadParameter,
ULONG CreationFlags,
PULONG ThreadId
);
一待程序完成了所有初始化任务,建立了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( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
LPCTSTR lpszSocketAddress = NULL );
第二,对于一般基于消息驱动、网络传输容错能力强的用户,中间件也支持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 事件驱动
为了满足232口重发的需要和防止对计算机232通信端口的超载使用,以及,满足Windows抢占式消息处理机制的要求,所有发送是由Windows定时器巡检后安排的,同时还要对上一次的发送后所得到的响应进行校验确认,如正常,可从FIFO列队中抽出第一条继续发送,如不正常,要进行上一次重发动作。
4 结束语
该中间件编程技术与实现策略对其他网关技术的实现,具有启发意义,同时由于是用C++开发,其源代码应该可以方便地移植到其它系统中。232口复用中间件的实现,使得下级硬件IO层扩充与诊断的方便性与上层人机界面层编程软件的选择的多样性相得益彰,其控制系统变得相当得开放与灵活,Visual C++、LabView、Delphi、SCADA产品WizCon等开发出的应用都通过Ethernet/IP协议与该中间件联接,各自独立而远程地工作着,去完成指定的任务。也正因为RS-232串口是计算机最为广泛的、最为廉价的配置,系统成本得到有效降低。
参考文献:
1 Visual C++ Online Help, Microsoft Corp.
孔祥成
中国科学院高能物理研究所 、北京918信箱-8,100039 、kongxc@ihep.ac.cn
摘 要 运用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设备做准备,这里CreateFile函数原形是这样的:
HANDLE CreateFile(LPCTSTR lpszName, DWORD fdwAccess, DWORD fdwShareMode, LPSECURITY_ATTRIBUTES lpsa, DWORD fdwCreate, DWORD fdwAttrsAndFlags, HANDLE hTemplateFile)
然后对232进行初始化:232通信波特率 = 指定波特率;目前115.2 kbps是PC机的最高速率。
232通信协议 = 指定现场总线通信协议(RS-485/422);它们是几位数据位、几位停止位、奇/偶/无校验方式。
完成上面的定义后调用232口初始化函数 ,它们的函数原形是:
BOOL SetCommState(
HANDLE hFile, // handle of communications device
LPDCB lpDCB // address of device-control block structure
);
BOOL SetupComm(
HANDLE hFile, // handle of communications device
DWORD dwInQueue, // size of input buffer
DWORD dwOutQueue // size of output buffer
);
最后是系统设备与应用程序之间通信的消息定义及线程的建立,它们的函数原形是这样的:
BOOL SetCommMask(
HANDLE hFile, // handle of communications device
DWORD dwEvtMask // mask that identifies enabled events
);
HANDLE CreateThread (
SEC_ATTRS SecurityAttributes,
ULONG StackSize,
SEC_THREAD_START StartFunction,
PVOID ThreadParameter,
ULONG CreationFlags,
PULONG ThreadId
);
一待程序完成了所有初始化任务,建立了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( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
LPCTSTR lpszSocketAddress = NULL );
第二,对于一般基于消息驱动、网络传输容错能力强的用户,中间件也支持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 事件驱动
为了满足232口重发的需要和防止对计算机232通信端口的超载使用,以及,满足Windows抢占式消息处理机制的要求,所有发送是由Windows定时器巡检后安排的,同时还要对上一次的发送后所得到的响应进行校验确认,如正常,可从FIFO列队中抽出第一条继续发送,如不正常,要进行上一次重发动作。
4 结束语
该中间件编程技术与实现策略对其他网关技术的实现,具有启发意义,同时由于是用C++开发,其源代码应该可以方便地移植到其它系统中。232口复用中间件的实现,使得下级硬件IO层扩充与诊断的方便性与上层人机界面层编程软件的选择的多样性相得益彰,其控制系统变得相当得开放与灵活,Visual C++、LabView、Delphi、SCADA产品WizCon等开发出的应用都通过Ethernet/IP协议与该中间件联接,各自独立而远程地工作着,去完成指定的任务。也正因为RS-232串口是计算机最为广泛的、最为廉价的配置,系统成本得到有效降低。
参考文献:
1 Visual C++ Online Help, Microsoft Corp.