新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于DDE協議的Modbus Plus與Ethernet數據交換

        基于DDE協議的Modbus Plus與Ethernet數據交換

        作者: 時間:2012-08-14 來源:網絡 收藏

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

        ddepoke(idinst,hconv4,szwidth,text(“1020”));
        //寫數據到mb+,設置寬度為1020mm
        ddepoke為自定義函數,具體實現為:
        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) 與以太網交換數據,這里使用的是socket協議。前面提到了緩沖區ptele1101,這里存儲的是要傳送到板型儀的數據。這是一個結構指針,定義如下:

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

          這其中teleheader、tele1101block1、tele1101block2和tele1101block3也分別是一個結構,這里就不詳述了。

          本實例中使用另外一個線程來處理以太網的,這樣不會中斷處理dde數據的過程。

        dword dwthreadid;
        thread=createthread(null,0,(lpthread_start_routine )
        sockthread,null,0,dwthreadid);
        sockthread為線程的過程函數,具體實現如下:
        void sockthread()
        {
        int i=0;
        tchar buf[256];
        initwinsock();//初始化socket
        //創建并設置協議類型,地址和端口
        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);
        //綁定并監聽端口
        bind(socksrv,(sockaddr*)addrsrv,sizeof(sockaddr));
        listen(socksrv,5);
        sockaddr_in addrclient;
        int len=sizeof(sockaddr);
        while (1) //程序正常運行時,始終接收連接請求
        {
        sockconn=accept(socksrv,(sockaddr*)addrclient,len);
        zeromemory(buf,sizeof(buf));
        __try
        {
        while (1) //連接建立后每50秒交換一次數據
        {
        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為接收數據的緩沖區,也是一個結構,定義與ptele1101類似,此處不詳述。

          從mb+網來的數據在使用dde協議獲取后存入緩沖區ptele1101,發送到板型儀,從板型儀來的數據存入緩沖區ptele1102,相關數據再使用dde協議寫回到mb+網,這樣就實現了mb+網和以太網的

        4 結束語

          本文介紹的的方法編程實現起來比較容易,代碼量較少,能很好的解決異種網絡間的數據交換的需求,并在單機架平整機板型控制系統中得到了成功的應用,取得了滿意的效果。文中介紹的使用dde協議和socket協議處理數據的方式有較好的通用性,經過簡單修改既可以用于其他的系統。另外通過簡單的擴展,即可實現數據采集和分析的功能。可以廣泛應用于工業控制的各個領域。


        上一頁 1 2 3 4 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 泉州市| 定兴县| 长沙县| 元阳县| 柳江县| 盐源县| 开鲁县| 邛崃市| 阿图什市| 息烽县| 浑源县| 平谷区| 滦南县| 洮南市| 崇义县| 资溪县| 光泽县| 乡宁县| 阿拉善盟| 吐鲁番市| 石家庄市| 扎鲁特旗| 富民县| 资源县| 奉化市| 渭南市| 黎川县| 温宿县| 渑池县| 南昌市| 陇南市| 长春市| 拜城县| 罗山县| 隆子县| 崇明县| 昆山市| 建瓯市| 桐城市| 彭泽县| 临沂市|