MOTOMAN机器人网络控制的实现

    最初程序员在Unix系统下使用Berkeley Socket编写网络程序,随着Windows操作系统的普及,Microsoft、Sun等公司联合开发了Winsock接口API。它实质上是一种进 程间通信,将之从单机环境扩展到网络环境以适合于开发主机/客户机通信程序。网络通信的每一端称为一个端点,而Windows Socket为网络端点的抽象表示。编程时,程序在网络对话的每一端建立一个Socket(套接口),两个Socket之间可以应用面向连接的或者是无连 接的网络协议(不作介绍)。
    面向连接的网络协议不必指定本地协议端口,只需为Socket提供远程主机信息:IP地址和协议端口,Winsock可自动保 存本地IP地址和选择本地端口。面向连接的Winsock客户机/服务器模型如下图所示,服务器程序首先用Socket函数建立一个Socket,接着服务器调用bind函数将此Socket与本地协议端口联系起来。Listen函数将Socket置于侦听模式,对于客户端每个请求发 送一个确认信息,但在侦听的Socket实际上并不接受连接请求,为了真正接受和连接请求,必须调用Accept函数。客户端的程序也用Socket函数 建立一个Socket,客户端通过调用connect函数启动网络对话。在客户和服务器建立连接后,就可以调用write、read等函数进行进一步的通 信。
5 网络编程的实现
     程序分为两个应用例程:服务器端程序、客户端程序。我们在编程时采用了MFC类库,因为 MFC类提供了CSocket类,它封装了Windows Sockets API,支持同步操作,简化了Socket编程,因而降低了编程难度。
5.1 服务器例程
     其中服务器端程序主要实现:监听客户端的连接请求、为客户端的连接请求建立Socket队列、处理客户端发送来的数据,并进行分析判断,根据接受到的不同字符信号转向不同的函数体,完成相应的网络控制,并向相应的客户端发送应答信息。
     在应用程序中需要建立两个CSocket类的派生类:Clisten和CClient。Clisten类用于建立监听socket,以随时监测是否有客户 端的连接请求。CClient类用于一旦监测到有客户端的连接请求时,即为每一个客户端分别建立一个socket,以便通信中不发生混乱。程序代码如下:
CListen::Clisten(CserverdlhDlg *pdlg)
{//需要改写Clisten类构造函数
m_pdlg=pdlg;
}
void CserverdlgDlg::OnNet()
{//右键菜单“网络控制”的响应函数
m_pListening=new CListen(this);
if(m_pListening->Create(PORT))
- 3 -
{//建立监听socket
if(!m_pListening->Listen())
{
MessageBox("port error!","net message",MB_OK);
return;
}
}
}
以下代码利用ClassWizard生成的消息响应函数,利用了虚拟函数可以被重载的特点。
void CListen::OnAccept(int nError)
{
CClient *m_pSocket=new CClient(m_pdlg);
if(m_pdlg->m_pListening->Accept(*m_pSocket))
{// 为每一个客户端分别建立一个socket
m_pdlg->m_pList.AddTail(m_pSocket);
}
else
delete m_pSocket;
}
     为了处理客户端的请求,还必须重载CClient派生类的虚拟函数OnReceive(int nError),在函数体中添加代码,对客户发送来的信号进行分析判断,再进一步执行相应的函数,例如:用户发送来的代码为“1”,执行作业文件传输;代码为“2”,执行作业下载等。最后,用Send()函数向客户端回发信息,表明成功完成网络通信。
5.2 客户端例程
     客户端的程序主要实现的功能有:建立到服务器的连接、关闭与服务器的连接、向服务器发送数据(发送控制信息、传送作业文件)、从服务器接受数据等。
     在应用程序中建立一个CSocket类的派生类:CRequest类,用于建立socket,实现客户端与服务器端的连接通信。
CRequest::CRequest(CclientdlgDlg *pdlg)
{// 需要改写CRequest类构造函数
m_pdlg=pdlg;
}
void CclientdlgDlg::OnOpen()
{ //打开通讯口
//以下程序实现打开连接对话框,参见图3:服务器/客户端界面图:右图。
CConnectDlg dlg1;
if(dlg1.DoModal()==IDOK)
{
m_port=dlg1.m_Port;//协议端口
servername=dlg1.m_servername;//服务器IP地址
m_pSocket=new CRequest(this);
if(!(m_pSocket=ConnectServer()))
{
…//代码省略 - 4 -
}
}
}
CRequest* CclientdlgDlg::ConnectServer()
{
CRequest *pSocket=new CRequest(this);
if(!(pSocket->Create()))
{
…//代码省略
}
if(!pSocket->Connect(servername,m_port))
{
…//代码省略
}
return pSocket;//最后连接成功,返回接口对象指针
}
接着利用返回的接口对象指针pSocket来完成客户端信息的发送,编程时,首先建立发送对话框(参见图4),下段代码为响应对话框发送按钮控件程序。
void CSendDlg::OnSend()
{
UpdateData();//完成数据输入更新
CclientdlgDlg *pdlg=(CclientdlgDlg *)AfxGetApp->m_pMainWnd;
UpdateData(FALSE);
If(pdlg->m_pSocket)
{
char pMsg[1000];
sprintf(pMsg,”%s”,m_sendedit.GetBuffer(1000);
pdlg->SendMsg(pdlg->m_pSocket,pMsg);
}
}
建立主对话框成员函数CclientdlgDlg::SendMsg(CRequest *pRequest,char *pMsg)并在函数体中调用pRequest->Send(pMsg,strlen(pMsg))完成信息的发送。
6 主控计算机与机器人控制器通信编程
     主控计算机通过标准RS232C串行接口与机器人控制柜通信,MOTOCOM32通讯软件提供了一套动态连接的库函数,在服务器端的应用程序中调用这些库 函数,对机器人进行控制。这些库函数包括了机器人的主要操作功能,例如:状态读取函数用于读取机器人的位置值、当前程序名、运行方式、操作坐标、控制轴组 等状态信息以及文件的上传、下载等;系统控制函数可对机器人进行各种操作,包括伺服电源的通断、程序运行的起停、机器人以各种坐标方式按不同的速度进行目 标点或者增量运动。通过这些库函数的组合使用,实现对机器人系统的各种控制与操作,扩展了机器人的系统集成功能,利于实现机器人远程控制和网络控制。
6.1 动态连接库的调用
     为了程序能够调用动态连接库中的库函数,(1)主对话框的实现文件中必须包含:
- 5 -
“direct.h”、“motocom.h”头文件 (2)复制Motocom32.DLL、Motolk.DLL、Motolkr.DLL数据传输动态库到工程文件目录下 (3)点击工程菜单、设置子菜单,打开“link”项,在“Object/Library Module”里添加“motocom32.lib”。
6.2 通信的建立
     首先利用语句:nCid=BscOpen(adlg.jbi_path_name,1)取得通讯句柄nCid,在后续的语句中调用BscSetCom(nCid,1,9600,2,8,0)设置通讯口参数,最后进行通讯线路的连接: BscConnect(nCid)。这样就可以进行文件的上传(函数BscUpLoad(adlg.file_name,nCid))、下载(函数BscDownLoad(nCid,adlg.file_name))等操作了。
6.3 通讯线路的关闭
     在主对话框的OnDestroy()函数中调用关闭通讯口的函数BscClose(nCid),实现通讯的安全结束。

你可能感兴趣的:(MOTOMAN机器人网络控制的实现)