基于Winsock的集装箱起重机分布式交互仿真训练系统的通信设计

2022-03-24 09:16:07 | 浏览次数:

摘要:根据集装箱起重机分布式交互半实物仿真驾驶训练系统的功能要求,设计了基于Winsock实现系统中数据交互的高速通信的方法。文中给出了设计思想和主要实现方法。实践证明,基于消息的异步套接字和多线程技术是一种较好地实现集装箱起重机分布式交互半实物仿真驾驶训练系统高速网络通信的方法。

关键词:系统结构;工作原理;网络通信;多线程

中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)16-21246-04

Design of Communication Based on Winsock in the DIS hardware–in-the-loopSimulation Training System of Container Crane

SONG Tie-cheng,XU Kai-yu,LIANG Gang

(Dept. of Communication and Information System Shanghai Maritime university, Shanghai 200135,China)

Abstract: This paper analyses the requirements of DIS hardware–in-the-loop Simulation training system of container crane. And a method is proposed to achieve high speed communication base on Winsock in the data interaction. The principal of this design and some important functions used in this application are introduced in this paper. Practice has proved that technology of asynchronous socket based on message and multithreads is a good way to achieve high-speed communication in DIS hardware–in-the-loop Simulation training system of container crane.

Key words: System construction;Operation principle; Communication; Multithreads

1 引言

集装箱起重机分布式交互半实物仿真驾驶训练系统是在已经研制成功的集装箱起重机半实物仿真驾驶训练系统[1]的基础上,根据港航企业综合训练的需要和港口码头起重机装卸作业实际要求,基于分布式仿真技术,改进现有单机仿真训练器,研制开发多数量多类型起重机的协同交互式综合训练器。增加产品的技术附加值,满足港航企业对协同培训的发展要求,提高产品的国际竞争力的需求进行研发的。

该仿真系统是基于DIS ( Distributed Interactive System)协议,结合起重机操作及操作监控的特点而进行研发的起重机操作的仿真系统。它构造了一个虚拟的起重机操作环境,以满足对学员进行训练的要求。整个仿真系统具有对由不同类型的多台起重机和一个教员平台构成,各仿真器结点分别模拟各种不同的实际装备。仿真过程开始后,各仿真器结点之间需要通过网络传送大量的实时信息,以协调和控制各仿真结点程序的运行。因此,各仿真结点之间网络的通信是集装箱起重机分布式交互半实物仿真驾驶训练系统中的关键技术之一。

网络通信有很多种实现方法,其中Winsock是一套开放的、支持多种协议的Windows环境下的网络编程接口。在实际的应用中,它已经成为Windows网络编程事实上的标准。根据集装箱起重机分布式交互半实物仿真驾驶训练系统的特点,采用了UDP协议,应用套接字和多线程技术来满足该系统中各仿真结点信息传递的实时、高效、交叉、对等性的要求[2]。

2 系统功能

整个系统分为学员系统(图1)、教员台控制系统、网络通信系统模块组成[3]。

当学员在驾驶室操作台进行操作时,相应信号经过PLC及信号采集系统转换后把信息送入计算机,计算机根据接受到的数据,运行相应的动力学模型,把计算结果输入视景系统,控制图形输出,实时反映出仿真图象。通过加入视点,实现多视点切换。图2为该视景系统的一个画面。

图1 学员系统工作原理 图2仿真驾驶训练系统部分视景画面

教员台控制系统包括教员台主机、视景监视屏、驾驶室操作监视器以及相关的输入输出设备,其核心是用VC++6.0编制的教员台控制系统程序。该系统可以完成以下主要功能:系统自检、系统参数设置、操作训练科目和难度设定、操作训练环境条件设定、系统控制及仿真过程监视、故障设置、仿真过程的记录和重演、自动评分和操作错误分析等等。

网络通讯系统由网络交换机、专用和通用以太网卡、网络线、视频分配器等配以相应的TCP/IP通讯协议组成。该系统将负责驾驶室系统、PLC逻辑控制系统和教员台系统之间各种数据信号、视频信号的传送。

由于仿真训练系统在实际应用中,需要同时对多台不同类型起重机的操作及场景进行模拟,这就要求系统具备优异的兼容性、扩展性和计算能力。通过各仿真平台间的通信,实现系统的分布式,提高系统的性能。图3为仿真驾驶系统通信示意图。

图3 仿真驾驶系统通信示意图

3 系统中网络通信的实现

3.1 集装箱起重机DIS的通信特点

半实物仿真驾驶训练系统的数据通讯主要是通过网络交换机来完成的。该结构负责将各驾驶室操作台的经过A/D转换的操作信号和PLC产生的数据经网络交换机传递给教员控制系统、学员系统,以运行数学模型模块和进行图形驱动;将教员控制系统的命令和设定的参数传送给学员系统;教员控制系统通过切换接收学员系统传送的数据监控学员操作;学员系统也可以通过选择接收其他学员的操作数据察看操作情况;将吊具或集装箱的运动轨迹数据回传给教员台记录下来,以便重演。系统通讯结构图如图4所示。

图4 集装箱装卸桥半实物仿真驾驶训练系统通讯结构图

基于半分布式交互仿真系统的网络通信特点,在教员控制系统与学员系统间的通信采用了流式套接字。操作台与学员系统,及学员系统间采用了数据报套接字。

3.2 主要使用函数[5-6]

3.2.1 套接字建立函数

SOCKET WSASocket(int af,int type,int protocol,LPWSAPROTOCOL_INFO lpProtocolInfo,GROUP g, DWORD dwFlags);

对于UDP协议,应写为:

SOCKET m_sSend,m_recv;

m_sSend = WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0);

m_recv = WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0);

3.2.2 套接字绑定函数

int bind ( SOCKET s,const struct sockaddr* addr, int namelen)

需要注意两点:

(1)IP地址的填写。由于要使用的是广播通信方式,地址应设为INADDR_ ANY;

(2)端口号的分配。为两套接字指定特定端口,指定范围在1024一65536,可任意指定。端口号从一个16位无符号数(u_short类型数)主机字节顺序转换成网络字节顺序,需要使用htons( )函数。

SOCKADDR_IN addrSock;

addrSock.sin_addr.S_un.S_addr =htonl(INADDR_ANY);

addrSock.sin_family = AF_INET;

addrSock.sin_port = htons(8000);

if(SOCKET_ERROR == bind(m_sSend,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)))

{

AfxMessageBox("绑定失败!");

}

SOCKADDR_IN addrSock;

addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

addrSock.sin_family = AF_INET;

addrSock.sin_port =htons(7000);

if(SOCKET_ERROR==bind(m_recvt,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)))

{

AfxMessageBox("绑定失败!");

}

3.2.3数据发送与接收函数

int WSASendTo(SOCKET s ,LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags,const struct sockaddr Far*lpTo, int iToLen, LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);

int WSARecvFrom(SOCKET s ,LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags,const struct sockaddr Far*lpTo,int iToLen, LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);

需要注意的是,由于各仿真结点信息、传递的交叉性,要求发送函数具有发送广一播数据的能力。对接收函数没有特殊要求。

3.2.4设置套接字为非阻塞处理方式

在网络通信中,由于网络拥挤或其它原因,阻塞可能随时出现。Winsock对可能产生阻塞的函数提供了阻塞和非阻塞两种处理方式。在阻塞方式下,收发数据的函数在被调用后一直要到传送完毕或者出错才能返回;对于非阻塞方式,函数被调用后立即返回,当传送完毕后,由Winsock给程序发送一个事先约定好的消息。

在默认状态下,Socket以阻塞方式工作。由于系统对实时性要求较高,因此要求Socket以非阻塞方式工作。为了实现非阻塞通信,Winsock提供异步选择函数WSAAsynSelect ( )、套接字I/0控制函数ioctlsocket( )、事件选择函数WSAEventSelect()等几种方法。

根据实际需要,系统采用了基于消息的异步套接字,实现非阻塞通信。

int WSAAsyncSelect(SOCKET s,HWND hWnd, unsigned int wMsg,long lEvent)

该函数为指定的套接字请求基于Windows消息的网络事件通知,并自动将该套接字设置为非阻塞模式。

注册事件并定义消息响应函数:

ON_MESSAGE(UM_SOCK,OnSock)

afx_msg long OnSock(WPARAM wParam, LPARAM lParam);

HWND hwnd =AfxGetMainWnd()-> GetSafeHwnd();

if(SOCKET_ERROR==WSAAsyncSelect(m_socket,hwnd,UM_SOCK,FD_READ))

{

AfxMessageBox("注册网络事件失败!");

}

4建立多线程机制[6]

4.1 建立多线程

在系统中,系统使用了两个套接字。一个套接字用于数据接收,另一个用于数据发送。基于集装箱起重机分布式交互半实物仿真驾驶训练系统的网络通信特点,该系统专门启动一个工作线程来监视数据的接收情况,以满足该系统网络通信的实时性和高效性,同时也提高了通信的可靠性。而在主线程中则根据需要使用另一个套接字来发送数据。

4.2 保持线程间的同步

在多线程处理时,线程之间经常会同时访问一些资源数据,从而导致资源操作上的冲突。在集装箱起重机分布式交互半实物仿真驾驶训练系统中,工作线程不断接收数据并写人数据缓冲区,而主线程也要从数据缓冲区中读取数据进行处理。显然,两线程都要访问同一数据区,为了避免访问冲突,必须进行必要的冲突控制。

进行冲突控制,通常采用通过设置互斥体对象、通过设置信号灯、通过设置事件对象和通过设置临界区等方法,这里只讨论设置事件方法。首先,调用函数CreateEvent创建事件对象:HANDLE CreateEvent ( );然后,在线程访问共享资源之前调用WaiteForSingle0bject,共享资源访问完毕后,调用SetEvent()将事件对象重新设置为有信号状态。

下面一段代码显示了创建接收数据工作线程和在工作线程中保持线程同步的程序片断:

HANDLE g_hEvent;

g_hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);

if( g_hEvent ==NULL)

{//事件创建失败!;

}

DWORDThreadld;

HANDLE ThreadHandle=CreateThread(NULL,0, receiver , this , 0 , &ThreadId );

if(!ThreadHandle)

{

AfxMessageBox(“创建失败!”);

}

DWORD WINAPI receiver(LPVOID lpParameter)

{ …

WaitForSingleObject(g_hEvent,INFINITE);

…//访问共享数据区

SetEvent(g_hEvent);

}

5 结束语

实践证明,基于消息的异步套接字和多线程技术是一种较好地实现集装箱起重机分布式交互半实物仿真驾驶训练系统高速网络通信的方法。目前,我们已经成功地应用该方法实现了仿真驾驶训练系统的高速网络通信,为该系统的研制成功奠定了坚实的基础。文章所讨论的基本内容,对其它分布式交互仿真系统也具有一定的参考价值。

参考文献:

[1] 蔡志刚.集装箱装卸桥仿真系统[J].计算机辅助工程,2007(02):65-67.

[2] 李志强,胡辉良.Winsock在坦克分布式交互仿真系统中的应用[J].电子计算机,2002,2(154):51-54.

[3] 李剑,梁岗,王重华.集装箱装卸桥仿真训练系统通信功能的实现[J].上海海运学院学报, 2002(03):58-61.

[4] 张煜,张新艳.仿真技术在港口集装箱装卸作业中的应用[J].武汉交通科技大学学报,2000,12(6):680-683.

[5] 曹衍龙,刘海英.Visual C++网络编成实用案例精选[M].北京:人民邮电出版社,2006:21-37.

[6] 孙鑫,余安萍.VC++深入详解[M].北京:电子工业出版社,2006:523-611.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。

推荐访问: 起重机 分布式 集装箱 交互 仿真