<style id="7i3y3"></style>

      <sub id="7i3y3"><i id="7i3y3"></i></sub>

        午夜精品一区二区三区成人,中文字幕av一区二区,亚洲AVAV天堂AV在线网阿V,肥臀浪妇太爽了快点再快点,国产网友愉拍精品视频手机,国产精品无码a∨麻豆,久久中文字幕一区二区,a级国产乱理伦片在线观看al
        首頁 新聞 工控搜 論壇 廠商論壇 產品 方案 廠商 人才 文摘 下載 展覽
        中華工控網首頁
          P L C | 變頻器與傳動 | 傳感器 | 現場檢測儀表 | 工控軟件 | 人機界面 | 運動控制
          D C S | 工業以太網 | 現場總線 | 顯示調節儀表 | 數據采集 | 數傳測控 | 工業安全
          電 源 | 嵌入式系統 | PC based | 機柜箱體殼體 | 低壓電器 | 機器視覺
        多類型運動控制卡編程方法探討
        深圳市雷賽智能控制股份有限公司
        收藏本文     查看收藏
        運動控制卡發展越來越訊速,不同類型的控制卡亦多種多樣,使軟件項目經理具備越來越靈活的方案選擇。而對于軟件開人員,對不同的類型卡的性能測試工作無疑也越來越麻煩,通常各類型的控制卡其驅動庫函數各不一樣,都需要用戶自己進行整理封裝。本文的目的就是通過C++方式編程,探討一下實現多類型卡編程方式,以供開發人員參考。

        一、利用C++虛擬函數機制
        除了手動去單個修改替換以前卡的驅動函數之外,此方法最易被C++程序員所想起,其方法是,首先需要建立一個通用的基類(父),然后不同卡封裝的類通過重寫基類的虛擬函數來實現,代碼看上去大致如下:
        class CDviece//
        用戶根據自己的設置建立的基類
        {
        public:
        virtual int InitBoard(); //
        在此僅以初始化函數為例
        … (
        )
        };

        class CDmc1000Card: public CDviece //
        設該卡為雷賽的DMC1000
        {
        public:
        virtual int InitBoard()
        {
        return dmc1000_init_board();
        }//
        改進基類的InitBoard函數
        …(
        其它改寫略去)
        }

        class COMS: public CDviece //
        設該卡為美國的OMS
        {
        public:
        virtual int InitBoard()
        {

        }
        …(
        其它改寫略去)
        }

        在程序中,若想設備使用DMC1000控制卡,可定義如下:
        CDviece *pMineDviece = new CDmc1000Card;
        改為OMS控制卡則一樣:
        CDviece *pMineDviece = new COMS;
        而其它代碼調用InitBoard函數可以不去改動,照常使用:
        if( pMineDviece->InitBoard() )
        {
        …(Do s.th)
        }

        使用此方法,需要根據當前設備配置情況,完整的寫好CDviece的所有函數,同樣,從CDviece派生的控制卡類,也需要將父類虛擬函數全部改寫完畢,對函數返回值,參數都需要進行規范,同時,修改完成之后,將整個軟件工程全部編譯一次。
        利用虛擬函數方法,會帶來虛擬函數表的成本開銷,隨著CDivece需要的函數增加,其成本會相應的增加,事實上,MFC的消息機制就是以代碼的方法實現了虛擬函數的機制,只不過虛擬函數的處理是通過C++編譯器來完成的。
        并且,CDviece的需求發生變化時,其派生類的函數相應的也要發生變化,這一點是程序員需要注意的。

        二、利用DLL動態庫實現
        COM組件編程過來的人,很容易想到DLL的實現方案。看重這一點是的只要主程序框架寫得正確,改變DLL即可實現主程序不編譯,即可獲得不同類型卡的選擇。
        事實上,這是一種美好的愿望,要實現起來并不容易,而且很需要程序員有熬夜的精神。大致偽代碼實現如下:

        class CDviece
        {
        private:
        HANDLE dllHandle;
        public:
        typedef int( *P_InitBoard)(void );
        P_InitBoard InitBoard;
        …(
        其它所有定義及聲明略去)

        int InitFunction( char *dllFileName )//
        調用DLL文件
        {
        dllHandle = LoadLibaray( dllFileName );
        InitBoard = (P_InitBoard)FindFunction(dllHandle, “Init_Board”);
        … (
        其它略去)
        }
        }
        由于不同卡的函數名都不一樣,故需要程序員按照CDviece所需函數進行另一DLL的編寫,若需要DMC1000控制卡時,則需要生成一個MDMC1000.dll如下:

        int InitBoard()
        {
        return dmc1000_board_init();
        }
        …(
        其它略去)

        生成OMS控制卡的MOMS.dll如法炮制:
        int InitBoard()
        {
        }
        …(
        其它略去)

        在代碼中調用DMC1000控制卡,使用如下:
        CDviece mineDviece;
        mineDviece.LoadLibaray(“Mdmc1000.dll”);
        if( mineDviece.InitBoard() )
        {
        …(Do s.th)
        }
        使用OMS控制卡如下:
        mineDviece.LoadLibaray(“Moms.dll”);
        …(
        其它略去)

        看似簡單,實質上略去的部分將是程序員的一場惡夢,想一想那一大堆的定義和聲明,一碰到CDviece的變動,哪怕是最小的函數返回值或參數變動,則其它相應的所有DLL都需跟全部編譯。這無疑給軟件項目的整個維護帶來極大的難度。

        三、利用模板類實現
        探討到現在,本人比較推薦的就是使用此方法,它較虛擬函數相比無額外成本的開銷,更不有因為虛擬函數帶來的效率問題。
        DLL方法相比,定義聲明,及變動性都非常良好,整個維護的成本也較低。
        其編程特點即是,通過模板定義一個空殼類,然后根據需要可以邦定不同類型的控制卡。其偽代碼實現方法如下:

        //
        定義一個空殼類
        template
        class CDviece: public CARD
        {
        public:
        CDviece(){}
        ~CDviece(){}
        }//
        簡單吧,了無秘密可言

        以下定義DMC1000封裝類:
        class CDmc1000Card //
        無需繼承
        {
        public:
        int InitBoard( void )
        {
        return dmc1000_board_init();
        }
        …(
        其它略去)
        }

        以下定義OMS封裝類:
        class COMS
        {
        public:
        int InitBoard( void )
        {
        }
        }

        在程序中應用時,調用DMC1000控制卡如下:

        typedef CDviece DEVIECE;
        DEVIECE mineDviece;
        if( mineDviece.InitBoard() )
        {
        …(Do s.th)
        }
        當然,DEVIECE的定義也可以如下形式:
        class DEVIECE: public CDviece
        {
        public:
        DEVIECE(){}
        ~DEVIECE(){}
        }
        調用OMS控制卡如下:
        typedef CDvieceDEVIECE;
        …(
        其它同上)

        可以看到,此方法還是讓人感到興奮的。即使參數或聲明發生變化或忘記定義,那就讓編譯器來查錯吧!
        順帶提一下,由于控制卡封裝時,總有一些數據結構是通用的,對此解決方法也很簡單,實現如下:
        struct tag_CARD
        {
        …(
        定義通用數據,如每轉脈沖數,最大速度值,行程范圍等等之類)
        }
        再改變一下CDmc1000Card如下形式:
        class CDmc1000Card: public tag_CARD //
        其它不變,OMS的定義同理

        四、設立一個卡類型變量
        此方法最為簡單,缺點是需要同時鏈接全部的控制卡驅動庫函數,且在程序安裝時,還需要考慮各種控制卡的驅動程序或其相應的動態庫是否存在。其偽代碼形式下如:
        enum{ NOCARD=0,DMC1000=1, OMS=2 …};
        class CCtrlCard
        {
        public:
        int m_nCardType;//
        記錄控制卡類型變量

        CCtrlCard():NOCARD(0){}
        ~CCtrlCard(){}

        int InitBoard( int nCardType )
        {
        m_nCardType = nCardType;
        switch( nCardType ){
        case DMC1000:
        if( d1000_board_init() <= 0 )
        m_nCardType = NOCARD;//
        初始化失敗
        else{
        }
        break;
        case OMS:

        break;
        default:
        m_nCardType = NOCARD;
        }
        return m_nCardType;
        }
        //
        其它省略
        };

        調用時偽代碼形式如下:
        CCtrlCard card;
        if( card.InitBoard( DMC1000 ) != DMC1000 )
        //
        初始化失敗
        else
        //
        找到控制卡
         

        狀 態: 離線

        公司簡介
        產品目錄

        公司名稱: 深圳市雷賽智能控制股份有限公司
        聯 系 人: 梁邦敏
        電  話: 755-26401178
        傳  真:
        地  址: 深圳市南山區登良路天安南油工業區2棟3樓
        郵  編: 518000
        主  頁:
         
        該廠商相關技術文摘:
        CNC解釋庫調用接口詳述
        DMC1000控制卡不能響應系統消息
        DMC2000脈沖速度初始化故障
        DMC2000運動控制卡常見軟件問題的解決方案
        DMC2200驅動程序特殊安裝方法
        DMC3000控制卡,與CNC之G代碼的邦定關系
        DMC3000控制卡的多任務編程
        多線程與控制卡編程
        發現步進電機定位不準怎么辦
        過程控制編程之簡要探討
        控制卡應用編程技巧幾招(2)
        更多文摘...
        立即發送詢問信息在線聯系該技術文摘廠商:
        用戶名: 密碼: 免費注冊為中華工控網會員
        請留下您的有效聯系方式,以方便我們及時與您聯絡

        關于我們 | 聯系我們 | 廣告服務 | 本站動態 | 友情鏈接 | 法律聲明 | 不良信息舉報
        工控網客服熱線:0755-86369299
        版權所有 中華工控網 Copyright©2022 Gkong.com, All Rights Reserved

        主站蜘蛛池模板: 色一乱一伦一图一区二区精品 | 国产精品区一二三四久久| 91福利视频一区二区| 亚洲女同精品中文字幕| 免费大片黄国产在线观看| 欧美妇人实战bbwbbw| 国产羞羞的视频一区二区| 国产AV影片麻豆精品传媒| 国产无码高清视频不卡| 国内揄拍国产精品人妻门事件| 伊在人间香蕉最新视频| 国产一区一一区高清不卡| 房东老头揉捏吃我奶头影片| 亚洲色婷六月丁香在线视频| 人人澡超碰碰97碰碰碰| 国产999久久高清免费观看| 黑巨人与欧美精品一区| 亚洲香蕉在线| 在线午夜精品自拍小视频| 国产成人啪精品午夜网站| 妺妺窝人体色WWW看人体| 国产免费一区二区三区在线观看| 亚洲精品国产字幕久久麻豆| 午夜成人性爽爽免费视频| 一区二区三区放荡人妻| 狠狠噜天天噜日日噜无码| 日韩高清不卡免费一区二区| 亚洲AV熟妇在线观看| 国语偷拍视频一区二区三区| 日本一卡2卡3卡四卡精品网站| 97欧美精品系列一区二区| 午夜福利92国语| 亚洲 自拍 另类 制服在线| 亚洲国产精品久久综合网| 桃花岛亚洲成在人线AV| 亚洲AV无码专区国产乱码电影| 亚洲精品久久一区二区三区四区| 四虎在线成人免费观看| 日韩国产av一区二区三区精品 | 国产极品粉嫩尤物一线天| 精品一区二区三区在线成人|