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.pswp.cn/news/255938.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255938.shtml
英文地址,請注明出處:http://en.pswp.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給出了一個可變換屬性的列表:…