<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 工業(yè)以太網(wǎng)技術(shù)在繼電器可靠性檢測系統(tǒng)中的應(yīng)用

          工業(yè)以太網(wǎng)技術(shù)在繼電器可靠性檢測系統(tǒng)中的應(yīng)用

          作者: 時間:2014-01-08 來源:網(wǎng)絡(luò) 收藏


          2)數(shù)據(jù)包套接字(Datagram Scoket)。該接口提供一個無連接服務(wù)。數(shù)據(jù)包以獨立包形式被發(fā)送,不提供無錯保證,數(shù)據(jù)可能丟失或重復(fù),并且接收順序混亂。數(shù)據(jù)包套接字比較適用于數(shù)據(jù)包或記錄型數(shù)據(jù)的傳輸,數(shù)據(jù)包的發(fā)送不能得到保證,而且不能排序到達。

          3)原始套接字(Raw Scoket)。該接口允許對較低層協(xié)議,如IP、ICMP直接訪問,主要用于新的網(wǎng)絡(luò)協(xié)議實現(xiàn)的測試等[6]。

          在進行網(wǎng)絡(luò)開發(fā)時,阻塞問題是網(wǎng)絡(luò)編程中十分重要的問題。由于在阻塞模式下,在I/O操作完成前,執(zhí)行操作的Winsock函數(shù)會一直等待下去,不會立即返回程序(將控制權(quán)交還給程序)。故用這種方式,服務(wù)器應(yīng)用程序?qū)⒑茈y同時通過多個建好連接的套接字進行通信。在此系統(tǒng)的應(yīng)用中,需要實現(xiàn)一臺服務(wù)器同時和六個套接字進行通信,因此結(jié)合對有限硬件資源的考慮,選擇了非阻塞類型的套接字,這也是一般協(xié)議開發(fā)中通常用到的套接字通信方式。

          3.2 通信的實現(xiàn)

          系統(tǒng)通信采用客戶機/服務(wù)器模式,利用VC的微軟基礎(chǔ)類(MFC)進行網(wǎng)絡(luò)開發(fā),MFC提供了兩種類型描述Windows Socket,分別是CAsynSocket和CSocket。其中CAsynSocket類封裝了Windows Sockets API,并將與Socket有關(guān)的Windows消息轉(zhuǎn)換為回調(diào)函數(shù)。CAsynSocket處于網(wǎng)絡(luò)更底層,其使用就更具靈活性,相應(yīng)要求編程者應(yīng)熟悉網(wǎng)絡(luò)底層細節(jié)。而CSocket類是CAsynSocket類的派生類,通過MFC中的CArchive類的對象提供了更高層次的抽象,它封裝了 Socket實現(xiàn)中的許多細節(jié)。這里我們采用CAsynSocket類實現(xiàn)系統(tǒng)中“一對多”的數(shù)據(jù)發(fā)送,通過在服務(wù)器中建立Winsock空間數(shù)組的方式來解決[7]。

          首先,構(gòu)造CAsyncSocket類型的對象,然后利用該對象創(chuàng)建內(nèi)嵌的Socket句柄。例如:

          CAsyncSocket m_listen;

          m_listen.Create(nPort);//服務(wù)器指定端口

          若是客戶端,需要用CAsyncSocket::Connect()函數(shù)連接服務(wù)器端的套接字。

          其次,若是服務(wù)器端的套接字,創(chuàng)建完成就可以偵聽端口,以便接收試圖連接到此端口的客戶端的套接字。接收了一個連接請求后就可以進行口令驗證或直接建立連接等工作。服務(wù)器偵聽的函數(shù)是CAsyncSocket::Listen(),接收客戶端套接字的函數(shù)是 CAsyncSocket::Accept()。

          繼而采用CAsyncSocket類的成員函數(shù)進行數(shù)據(jù)的收發(fā)。發(fā)送的函數(shù)是CAsyncSocket::send(),接收的函數(shù)是CAsyncSocket::Receive()。

          最后,通信結(jié)束后,通過CAsyncSocket::Close()函數(shù)銷毀對象。服務(wù)器與檢測裝置的通訊流程見圖3。


          圖 3 服務(wù)器與檢測裝置通信流程圖

          CAsyncSocket類對網(wǎng)絡(luò)回調(diào)函數(shù)做了較好的封裝。當有連接請求時,服務(wù)器端的套接字就會收到OnAccept消息,此消息觸發(fā)網(wǎng)絡(luò)回調(diào)函數(shù) OnAccept();當服務(wù)器接收了連接后,客戶端的套接字就會收到OnConnect消息,此消息觸發(fā)網(wǎng)絡(luò)回調(diào)函數(shù)OnConnect();當有數(shù)據(jù)傳來時,套接字會收到OnReceive消息,此消息觸發(fā)網(wǎng)絡(luò)回調(diào)函數(shù)OnReceive()。程序員也可以在CAsyncSocket類的派生類中重載以上回調(diào)函數(shù),實現(xiàn)特定的功能。

          3.3 數(shù)據(jù)傳輸及服務(wù)器功能

          服務(wù)器與檢測裝置在不同的狀態(tài)下需要傳輸大量的數(shù)據(jù),數(shù)據(jù)所代表的含義也各不相同,例如服務(wù)器通過以太網(wǎng)對檢測裝置的操作:簡單的有開始試驗、暫停試驗等,復(fù)雜的有設(shè)置檢測裝置工作參數(shù)、對號設(shè)置、讀取失效信息等。因此需要對服務(wù)器和檢測裝置傳輸?shù)臄?shù)據(jù)進行嚴格的定義,這里采?。?BR>
          Command+Length+Content

          Command:通信命令號,Length:文本字節(jié)長度,Content:文本字節(jié)內(nèi)容。

          如果傳輸內(nèi)容為簡單的控制數(shù)據(jù),則文本字節(jié)長度和文本字節(jié)內(nèi)容都為零,否則應(yīng)按具體的通信內(nèi)容進行添加。

          服務(wù)器內(nèi)部配置一預(yù)先定義的超時時間間隔,這個時間要足夠長,以使檢測裝置能夠作出正常的反應(yīng),超時事件將觸發(fā)服務(wù)器來處理錯誤。

          服務(wù)器操作界面的菜單項和檢測裝置基本一致,在文本顯示區(qū)顯示所有建立連接的檢測裝置的試驗狀態(tài)和數(shù)據(jù)。建立連接后,通過服務(wù)器對檢測裝置進行操作和在現(xiàn)場直接操作檢測裝置的效果是一樣的。

          4、實驗驗證

          為了驗證本方案的可行性,整個在宏發(fā)公司進行了長期的運行,通過網(wǎng)絡(luò)監(jiān)視軟件的分析,數(shù)據(jù)傳輸?shù)恼`碼率極低,在同一局域網(wǎng)內(nèi)數(shù)據(jù)傳輸?shù)耐禃r間大部分集中在100ms以內(nèi),達到了傳輸時間的要求,網(wǎng)絡(luò)傳輸中斷的情況基本沒有出現(xiàn)。

          因此,本文所提出的基于可靠性的通信方案,實時性較好,可靠性較高,能夠?qū)崿F(xiàn)服務(wù)器對現(xiàn)場設(shè)備的實時數(shù)據(jù)采集與監(jiān)控的功能,是切實可行的。且其開放性、可操作性也較高能夠適用于很多數(shù)據(jù)采集與監(jiān)控場合。

          繼電器相關(guān)文章:繼電器工作原理


          時間繼電器相關(guān)文章:時間繼電器



          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();