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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于DDE協(xié)議的Modbus Plus與Ethernet數(shù)據(jù)交換

          基于DDE協(xié)議的Modbus Plus與Ethernet數(shù)據(jù)交換

          作者: 時(shí)間:2012-08-14 來(lái)源:網(wǎng)絡(luò) 收藏

            上面介紹的方法用于從dde服務(wù)器中獲取mb+網(wǎng)上的數(shù)據(jù),那么如何將數(shù)據(jù)寫(xiě)入到mb+網(wǎng)呢,同樣還是使用ddeml庫(kù)中提供的方法,具體如下:

          ddepoke(idinst,hconv4,szwidth,text(“1020”));
          //寫(xiě)數(shù)據(jù)到mb+,設(shè)置寬度為1020mm
          ddepoke為自定義函數(shù),具體實(shí)現(xiàn)為:
          void ddepoke(dword idinst, hconv hconv, tchar* szitem, tchar*
          szdata)
          {
          hsz hszitem=ddecreatestringhandlew(idinst,szitem,cp_winunicode);

          ddeclienttransaction((lpbyte)unicodetoansi(szdata),(dword)(lstrlenw(szdata)+1),hconv,
          hszitem,cf_text,xtyp_poke,3000,null);
          ddefreestringhandle(idinst,hszitem);
          }

            (3) 與以太網(wǎng)交換數(shù)據(jù),這里使用的是socket協(xié)議。前面提到了緩沖區(qū)ptele1101,這里存儲(chǔ)的是要傳送到板型儀的數(shù)據(jù)。這是一個(gè)結(jié)構(gòu)指針,定義如下:

          typedef struct
          {
          teleheader msgheader; //消息頭
          tele1101block1 msgblock1; //消息第一部分
          tele1101block2 msgblock2; //消息第二部分
          tele1101block3 msgblock3; //消息第三部分
          } tele1101, *ptele1101;
          ptele1101 ptele1101;

            這其中teleheader、tele1101block1、tele1101block2和tele1101block3也分別是一個(gè)結(jié)構(gòu),這里就不詳述了。

            本實(shí)例中使用另外一個(gè)線程來(lái)處理以太網(wǎng)的,這樣不會(huì)中斷處理dde數(shù)據(jù)的過(guò)程。

          dword dwthreadid;
          thread=createthread(null,0,(lpthread_start_routine )
          sockthread,null,0,dwthreadid);
          sockthread為線程的過(guò)程函數(shù),具體實(shí)現(xiàn)如下:
          void sockthread()
          {
          int i=0;
          tchar buf[256];
          initwinsock();//初始化socket
          //創(chuàng)建并設(shè)置協(xié)議類型,地址和端口
          socket socksrv=socket(af_inet,sock_stream,0);
          sockaddr_in addrsrv;
          addrsrv.sin_addr.s_un.s_addr=htonl(inaddr_any);
          addrsrv.sin_family=af_inet;
          addrsrv.sin_port=htons(5001);
          //綁定并監(jiān)聽(tīng)端口
          bind(socksrv,(sockaddr*)addrsrv,sizeof(sockaddr));
          listen(socksrv,5);
          sockaddr_in addrclient;
          int len=sizeof(sockaddr);
          while (1) //程序正常運(yùn)行時(shí),始終接收連接請(qǐng)求
          {
          sockconn=accept(socksrv,(sockaddr*)addrclient,len);
          zeromemory(buf,sizeof(buf));
          __try
          {
          while (1) //連接建立后每50秒交換一次數(shù)據(jù)
          {
          len=send(sockconn,(char *)ptele1101,sizeof(tele1101),0);
          len=recv(sockconn,(char *)ptele1102,sizeof(tele1102),0);
          if (0==len || socket_error==len)
          {
          len=wsagetlasterror();
          raiseexception(1,0,0,null);
          }
          sleep(50);
          }
          }
          __except(exception_execute_handler)
          {
          closesocket(sockconn);
          }
          }
          closesocket(socksrv);
          wsacleanup();
          }

            這里ptele1102為接收數(shù)據(jù)的緩沖區(qū),也是一個(gè)結(jié)構(gòu),定義與ptele1101類似,此處不詳述。

            從mb+網(wǎng)來(lái)的數(shù)據(jù)在使用dde協(xié)議獲取后存入緩沖區(qū)ptele1101,發(fā)送到板型儀,從板型儀來(lái)的數(shù)據(jù)存入緩沖區(qū)ptele1102,相關(guān)數(shù)據(jù)再使用dde協(xié)議寫(xiě)回到mb+網(wǎng),這樣就實(shí)現(xiàn)了mb+網(wǎng)和以太網(wǎng)的

          4 結(jié)束語(yǔ)

            本文介紹的的方法編程實(shí)現(xiàn)起來(lái)比較容易,代碼量較少,能很好的解決異種網(wǎng)絡(luò)間的數(shù)據(jù)交換的需求,并在單機(jī)架平整機(jī)板型控制系統(tǒng)中得到了成功的應(yīng)用,取得了滿意的效果。文中介紹的使用dde協(xié)議和socket協(xié)議處理數(shù)據(jù)的方式有較好的通用性,經(jīng)過(guò)簡(jiǎn)單修改既可以用于其他的系統(tǒng)。另外通過(guò)簡(jiǎn)單的擴(kuò)展,即可實(shí)現(xiàn)數(shù)據(jù)采集和分析的功能??梢詮V泛應(yīng)用于工業(yè)控制的各個(gè)領(lǐng)域。


          上一頁(yè) 1 2 3 4 下一頁(yè)

          評(píng)論


          相關(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); })();