新聞中心

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

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

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

          (2) 通過dde協議的服務名,主題名和項目名來訪問具體某個項目的數據

          先定義dde的服務名和主題名

        tchar szapp[] = text("mbplus"); //服務名
        tchar sztopic4[]=text("plc4"); //主題名
        tchar szwidth[]=text("400401"); //項目名
        tchar vlwidth[16]; //儲存從dde服務器返回的數據
        hsz hszwidth; //項目的dde標識

          //項目名的命名規則具體可以查看mbplus程序的說明,這里400401表示的是項目在plc中的地址,這是一個//16位的整形數

        hconv4=ddeconnecttotopic(idinst,szapp,sztopic4,hsztopic4);
        if( hconv4 != null )
        {
        ddeautorequest(idinst,hconv4,szwidth,hszwidth);
        }

          此處的ddeconnecttotopic和ddeautorequest為自定義的函數

        hconv ddeconnecttotopic(dword idddeinst, lpctstr szapp, lpctstr
        sztopic, hsz * hsztopic)
        {
        hsz
        hszapp=ddecreatestringhandle(idddeinst,szapp,cp_winunicode);
        *
        hsztopic=ddecreatestringhandlew(idddeinst,sztopic,cp_winunicode);
        return ddeconnect(idddeinst,hszapp,*hsztopic,null);
        }

          使用ddecreatestringhandle來獲取服務器和主題名的字符句柄,使用ddeconnect來建立指定服務下的指定的主題的連接。之后使用ddeautorequest函數來向dde服務器請求置頂項目名的數據,在數據發生變化后dde服務器會自動將新的數據發送給客戶端,客戶端在回調函數中就可以獲取到新的數據,具體方法見下文。如果某個主題下有多個項目需要處理,都用ddeautorequest來處理即可,此函數的實現如下:

        void ddeautorequest(dword idddeinst, hconv hconv, lpctstr
        szitem, hsz * hszitem)
        {
        *hszitem=ddecreatestringhandle(idddeinst,szitem,cp_winunicode);
        hddedata hdata=ddeclienttransaction
        (null,0,hconv,*hszitem,cf_text,xtyp_advstart| xtypf_ackreq,5000,
        null);
        }

          接下來就可以通過dde的回調函數來獲取數據了。

        hddedata callback ddecallback(uint utype,uint ufmt,hconv
        hconv,hsz hsz1,hsz hsz2,hddedata hdata,
        dword dwdata1,dword dwdata2)
        {
        switch( utype )
        {
        case xtyp_advdata: //處理dde數據
        if( ufmt != cf_text )
        return dde_fnotprocessed;
        memset(szbuffer,0,64); //初始化緩沖區
        datalen=ddegetdata(hdata,null,64,0);//獲取數據的長度
        ddegetdata(hdata,(unsigned char* )szbuffer,datalen,0);//獲取數據
        if( hsz1==hsztopic4 hsz2 == hszwidth ) //判斷數據對應于那個數據項,并作出具體處理
        {
        _atoflt(fltval,szbuffer); //dde的數據以字符串形式創送過來的,這里將它轉換成數值
        ptele1101->msgblock1.stripwidth=fltval.f; //將數字存入緩沖區
        }
        return ( hddedata )dde_fack;
        }
        return 0;
        }

          本例中dde回調函數要處理的dde項目不止一個,任意一個dde項目的值發生變化時,回調函數都會被自動調用一次,具體實現時只需要用if語句對hsz1和hsz2進行逐一比較即可處理所有的項目。緩沖區ptele1101用于存儲通過以太網發送到板型儀的數據,下文中將詳細介紹。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 梁山县| 邵阳县| 张北县| 沅江市| 抚顺县| 筠连县| 临邑县| 子洲县| 太和县| 龙山县| 东源县| 剑河县| 呼图壁县| 安陆市| 辰溪县| 崇阳县| 长沙市| 利川市| 蒙城县| 泰顺县| 苏尼特右旗| 南陵县| 五台县| 斗六市| 湛江市| 徐州市| 安塞县| 鹤岗市| 昭通市| 辽宁省| 平昌县| 军事| 罗源县| 思茅市| 航空| 许昌市| 开阳县| 黄平县| 泾源县| 浮山县| 家居|