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),实现通讯的安全结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【剑指offer】——【python中return函数中的and和or表达式的返回值】

目录 1、# and 结果为真,返回最后一个表达式的结果,若结果为假返回第一个为假的表达式的结果 2、# or 结果为真,返回第一个为真的表达式的结果,若结果为假,返回最后一个表达式的结果 3、应用[剑指 Offer 64. 求12…n…

Spring Cloud构建微服务架构:消息驱动的微服务(入门)【Dalston版】

2019独角兽企业重金招聘Python工程师标准>>> 之前在写Spring Boot基础教程的时候写过一篇《Spring Boot中使用RabbitMQ》。在该文中,我们通过简单的配置和注解就能实现向RabbitMQ中生产和消费消息。实际上我们使用的对RabbitMQ的starter就是通过Spring C…

CXF 客服端调用报错

服务端已经发布了WSDL,现在在客服端生成web service客服端代码,在eclipse中新建一个project,然后new->web services->web service client生产客户端代码 在调用的时候报如下错误 解决:缺少axis相应的jar包,加入包…

20145225 《信息安全系统设计基础》第10周学习总结

cp1.c 进行复制文件的操作,需要有源文件和目的文件,第一次命令没有加入所以没有正常完成复制文件的操作fileinfo.c 用来实现显示文件信息。先判断命令是否有操作数,有的话才能继续进行下去,如果没有报错就打印出来相关文件信息&am…

做演员是圆梦 做生意学会面对现实

田朴珺是一位拥有多重身份的女性。她是一名演员,也是一位商人,还担任过电影《中国合伙人》的制片人。 作为演员,田朴珺的作品并不是很多,也一直不温不 火。但这并不代表她将放弃演艺生涯。她表示,如果机会合适&…

【深度学习】——模型评估指标MAP计算实例计算

目录 一、知识储备 1、IOU——交集面积与并集面积之比 2、混淆矩阵(TP、FP、FN、TN) 问题1:上面的TP等具体是如何计算得到的? 3、精度precision&召回率recall 二、ap计算实战 1、计算流程 1)准备数据&#xf…

第 52 章 Web Server Optimization

系统配置 Intel(R) Xeon(TM) CPU 3.00GHzMemory 4GEthernet adapter 1000M52.1. ulimit 查看 ulimit ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited pending signals …

hdu5489 Removed Interval dp+线段树优化

现在看这题居然直接秒了。。。去年看的时候还以为神题。。 设以第i项为结尾的lis前缀为f[i],以第j项为结尾的lis后缀为g[i],如果求出f[i]和g[j],然后枚举i,快速找到最大的满足a[j]>a[i]的g[j]就可以了。注意到如果将f[i]从后往…

JS原型链理解

1. 每个对象都有原型属性(__proto__)2. 对象的原型(__proto__)指向其构造函数(Constructor)的prototype属性3. 构造函数(Constructor)的prototype属性本身也是一个对象,其原型(__proto__)亦指向其构造函数的prototype4. 如此形成一个链式结构,而Construc…

【深度学习】——2021年FPN特征金字塔

#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/4/22 17:06 # Author : linlianqin # Site : # File : fpn.py # Software: PyCharm # description:其搭建的基本流程和resnet是一致的,只是将每一层的卷积结果保存了起来import torch impo…

NoSQL分类及ehcache memcache redis 三大缓存的对比

NoSQL分类 由于NoSQL中没有像传统数据库那样定义数据的组织方式为关系型的,所以只要内部的数据组织采用了非关系型的方式,就可以称之为NoSQL数据库。目前,可以将众多的NoSQL数据库按照内部的数据组织形式进行如下分类: Key/Value的…

52.4. APC Cache (php-apc - APC (Alternative PHP Cache) module for PHP 5)

$ apt-cache search php-apc php-apc - APC (Alternative PHP Cache) module for PHP 5$ sudo apt-get install php-apcapc cache 状态监控 http://pecl.php.net/package/APC 下载解包找到apc.php,放到web服务器上 原文出处:Netkiller 系列 手札 本文作者&#xff1…

乐视云计算基于OpenStack的IaaS实践

本文作者岳龙广,现在就职于乐视云计算有限公司,负责IaaS部门的工作。 从开始工作就混在开源世界里,在虚拟化方面做过CloudStack/Ovirt开发,现在是做以OpenStack为基础的乐视云平台。所以对虚拟化情有独钟,也对虚拟化/云…

【深度学习】——如何提高map值

目录 代码获取 map原理 map提高技巧 技巧总结: 实战: 1、效果不佳map55.55% 1)单独调整get_dr_txt.py中的self.iou 0.3 2)单独调整get_map,py中的minoverlap: 3)同时调整minoverlap和self.iou 本文是在faster_rcnn模型的…

每日站立会议个人博客(冲刺周)-Wednesday

时间未完成不知道如何获取具体标签里的内容正在做爬虫技术之获取标签里的内容将要做对运用爬虫技术获取的数据进行处理转载于:https://www.cnblogs.com/andibier/p/8075098.html

数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器(转)...

第1章 引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。通过数据切分来提高网站性能,横…

【深度学习】——纠错error: Unable to find vcvarsall.bat:关于安装pycocotools

1、安装包下载 大佬改写支持 Windows 的 COCO 地址:https://github.com/philferriere/cocoapi 下载后如下: 进入pythonAPI 先后运行: python setup.py build_ext --inplacepython setup.py build_ext install 出现以下标志时&#xff0c…

【小贴士】虚拟键盘与fixed带给移动端的痛!

前言今天来公司的主要目的就是研究虚拟键盘与fixed的问题,期间因为同事问起闭包与事件委托(阻止冒泡)相关问题,便穿插了一篇别的:【小贴士】工作中的”闭包“与事件委托的”阻止冒泡“,有兴趣的朋友可以去看…

[OJ] Wildcard Matching (Hard)

LintCode 192. Wildcard Matching (Hard)LeetCode 44. Wildcard Matching (Hard) 第二次刷还是被这题虐. 其实就是跪在一个地方, 就是关于mustFail的地方. 当*p && !*s的时候, 说明s已经被用完了, p还没有被穷尽, 这种情况下要直接退出所有的递归返回false, 因为s都匹配…

CSS3 -webkit-transition(属性渐变)

-webkit-transition:CSS属性(none|all|属性) 持续时间 时间函数 延迟时间 CSS属性(transition-property):要变化的属性,比如元素变宽则是width,文字颜色要变色这是color;W3C给出了一个可变换属性的列表:…