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

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

        午夜精品一区二区三区成人,中文字幕av一区二区,亚洲AVAV天堂AV在线网阿V,肥臀浪妇太爽了快点再快点,国产网友愉拍精品视频手机,国产精品无码a∨麻豆,久久中文字幕一区二区,a级国产乱理伦片在线观看al
        首頁 新聞 工控搜 論壇 廠商論壇 產(chǎn)品 方案 廠商 人才 文摘 下載 展覽
        中華工控網(wǎng)首頁
          P L C | 變頻器與傳動 | 傳感器 | 現(xiàn)場檢測儀表 | 工控軟件 | 人機(jī)界面 | 運動控制
          D C S | 工業(yè)以太網(wǎng) | 現(xiàn)場總線 | 顯示調(diào)節(jié)儀表 | 數(shù)據(jù)采集 | 數(shù)傳測控 | 工業(yè)安全
          電 源 | 嵌入式系統(tǒng) | PC based | 機(jī)柜箱體殼體 | 低壓電器 | 機(jī)器視覺
        控制卡應(yīng)用編程技巧幾招(1)
        深圳市雷賽智能控制股份有限公司
        收藏本文     查看收藏
        聲明一下,寫下這些編程技巧,即不是什么祖?zhèn)髅丶膊皇鞘裁幢貧⒄谢蚪^招,在此只為方便同仁們在編程控制軟件時,對此可以進(jìn)行適當(dāng)?shù)恼遄谩R韵抡宫F(xiàn)的編程思想及奉上的源代碼都非常簡易,但并不是隨手寫寫,可都是經(jīng)過實踐的。若沒有成功經(jīng)驗作后盾,我也就沒有必要在此打字練五筆了。
        事實上,正如一個編程大師所言(Michael Abrash),當(dāng)你的軟件正常而且有效率的運行起來時,好像一切都是那么顯而易見。故,在此,我仍堅持那句編程口號,將事情變得越簡單越好,越簡單就越有效率,越穩(wěn)定。
        在以下的介紹中,我將盡可能的展示本人的編程思想,最大可能的給出知其然也知其所然的解釋。若你有更好的見解,希望能得到你的指正。人長大了明顯標(biāo)志就是變得不太負(fù)責(zé),而且不敢承認(rèn)自己還需要努力,害怕面對自己的錯誤。若是這樣,放心,我還沒長大。因為我無法保證我能面面俱到。
        關(guān)于源代碼的閱讀,需要讀者有一定的C++編程基礎(chǔ),至少對以下表示形式不會產(chǎn)生誤解:
        const char *pString; //
        指定pString邦定的數(shù)據(jù)不能被修改
        char * const pString; //
        指定pString的地址不能被修改
        const char * const pString; //
        含上面兩種指定功能
        當(dāng)然,隨便提醒一下,這些源代碼若需要加入你的軟件工程當(dāng)中,還需要作一些調(diào)整和修改,因此,這些源代碼實質(zhì)上稱為偽代碼也可以,之所以展現(xiàn)它們,是讓程序員們有個可視化的快感,特別是那些認(rèn)為源代碼就是一切的程序員。
        同時,為了提高針對性,大部分控制卡調(diào)用的函數(shù)會明確指出是邦定哪些卡的,實際應(yīng)用時,程序員可自行選擇,以體現(xiàn)一下自己的智商是可以寫寫軟件的。

        留個電話:0755-26434329 E_mail: support@leisai.com
        有更濃興趣的上這個QQ號嗎也行:372161225

        一、 控制卡類的單一實例實現(xiàn)
        把控制卡類作一個類來處理,幾乎所有C++程序員都為舉雙手表示贊同,故第一個什么都沒有的偽代碼就此產(chǎn)生,如下表現(xiàn):
        class CCtrlCard
        {
        public:
        Function
        public:
        attrib
        }

        于是,用這個CctrlCard可以產(chǎn)生n多個控制卡實例,只要內(nèi)存足夠。然而,針對現(xiàn)實世界,情況并不那么美好。通常情況下,PC機(jī)內(nèi)只插同種類型的控制卡12張,在通過調(diào)用d1000_board_initd3000_board_init函數(shù)時,它們會負(fù)責(zé)返回有效卡數(shù)nCards,然后從0-nCards*4 - 1自行按排好軸數(shù)。初始化函數(shù)就是C++newmalloc的操作,取得系統(tǒng)的資源,但是控制卡的資源與內(nèi)存不一樣,取得資源后必需要釋放才可以再次獲取,即控制卡資源是唯一的。
        既然控制卡資源是唯一的,那么最好Cctrlcard產(chǎn)生的實例也是唯一的,這樣,我們可以方便的需要定義一個全局變量即可:
        CctrlCard g_Dmcard;
        在其它需要調(diào)用的地方,進(jìn)行外部呼叫:
        extern CctrlCard g_DmcCard;

        以上方法實在太簡單了,很多人都會開心起來。實質(zhì)上,方法還有很多,即然可以產(chǎn)生n多對實例,我們的核心是只要保證調(diào)用board_init函數(shù)一次即可,故也可以單獨定義一個InitBoard函數(shù):
        class CctrlCard
        {
        public:
        static int InitBoard(); //
        定義一個靜態(tài)函數(shù),以表警示

        }
        int CctrlCard::InitBoard()
        {
        return d1000_board_init();
        }

        還有一種方法,情況稍加復(fù)雜,但表達(dá)的功能也要強一些,以下展現(xiàn)可以稍微安慰一下代碼狂。

        Class CctrlCard
        {
        public:
        CctrlCard(); //
        請注意這個構(gòu)造函數(shù)的定義
        }

        CctrlCard::CctrlCard()
        {//
        呵呵,也很明了
        static int n(0); //
        注意,是個靜態(tài)變量

        n++; //
        每次調(diào)用CctrlCard生成實例時,都會計數(shù)一次
        assert( n == 1 ); //
        DEBUG版本下,只有n==1的情況下可以通過
        //
        否則,會出現(xiàn)致命錯誤,還好,它會告訴你錯在哪個文件,
        //
        哪一行,呵呵,是個好東東啊。
        }
        通過強行報警處理,當(dāng)你有g_DmcCard這個實例時,其它的所有控制卡的定義都只能是以引用或指針的方式進(jìn)行了,不會再產(chǎn)生新有效的實例了,對于由小組編程的項目軟件,而你又恰好負(fù)責(zé)編程控制卡這一塊的話,以上的顯性報警,會讓其它人心領(lǐng)神會。當(dāng)然,你也可以將上面的方法加入到InitBoard當(dāng)中去,可以避你的無意識的多次調(diào)用了。

        附:無意識的多次調(diào)用經(jīng)常發(fā)生,特別是那些對MFC機(jī)制不明確的程序員,在多文檔框架下,不知道這個CctrlCard::InitBoard函數(shù)到底是應(yīng)該放在CmainFrameOnCreate里面,還是應(yīng)該放在CchildFrameOnCreate,或者是CviewOnInitUpdate里面進(jìn)行調(diào)用。
        在一言難盡MFC的情況下,我建議兩個小方法:
        No.1
        CctrlCard的函數(shù)置于CmainframeOnCreate或者Capp::Initstance內(nèi)調(diào)用
        No.2
        InitBoard函數(shù)稍加改造成這樣:
        Int CctrlCard::InitBoard()
        {
        static int n(-1000);//
        注意,-1000是控制卡函數(shù)不可能返回的值
        if( n == -1000 )
        n = d1000_board_init();
        return n;//
        這樣,即使多次調(diào)用也不樣怕了,呵呵,雕蟲小技也可以除蟲啊
        }

        必須額外聲明一下,我們不是不重視資源的釋放,而是作為一個C++程序員寫下這些代碼是基本的義務(wù)(這也是我為什么要交待讀者必須要有一定的C++基礎(chǔ)):
        class CctrlCard
        {
        public:
        ~CctrlCard()
        {//
        定義析構(gòu)函數(shù),在此釋放資源,對此,我不想再轉(zhuǎn)到讀者的眼球了
        d1000_board_close();
        }
        }

        二、 數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)類型的定義,部分相關(guān)聲明
        調(diào)用控制卡驅(qū)動函數(shù)時,經(jīng)常會有如下形式:
        單軸相對運動 d1000_start_t_move( axis, pulse, start, speed, accel );
        單軸絕對運動 d1000_start_ta_move( axis, pulse, start, speed, accel );
        兩軸相對插補 d1000_start_t_line( axisArray, distArray, start, speed, accel );
        兩軸絕對插補 d1000_start_ta_line( axisArray, distArray, start, speed, accel );
        圓弧相對插補 d3000_start_t_arc( axisArray, C1, C2, E1,E2, dir, start, speed, accel );
        圓弧絕對插補 d3000_start_ta_arc( axisArray, C1, C2, E1,E2, dir, start, speed, accel );

        以上的調(diào)用,很多重復(fù)枯燥,又不直觀,難于理解,并且在面向客戶時,常常是指每分多少米,或者每秒多少毫米,很少有人問每秒多少脈沖,移動多少脈沖作距離,故需要單位之間的換算。顯然,對于這些問題,我想,C++程序員應(yīng)該找到用武之地了,所以我們一步一步來,慢慢統(tǒng)一各個問題。實質(zhì)上,在以下的幾個技巧,也需要在此澄清一些概念。
        我們先來幾個宏定義提高一下情緒:
        # define MAX_AXIS 4 //
        最多軸數(shù)
        # define XCH 0 //
        定義X軸的值
        # define YCH 1
        # define ZCH 2
        # define UCH 3
        ..(其它以次類推)

        # define M_ABS 0x01 //
        定義一個絕對標(biāo)志位
        # define M_INP 0x02 //
        定義一個插補位

        接下來深入一點點,再來幾個結(jié)構(gòu)定義:

        typedef struct tag_ARC
        {
        tag_ARC( double ox=0.0, double oy=0.0, double ex=0.0, double ey=0.0, int dir=0 ):
        ox(ox), oy(oy),
        ex(ex), ey(ey),
        dir(dir)//
        定義這樣一個構(gòu)造函數(shù)需要勇氣,看似不合理,但是好用麻
        {
        }
        double ox,oy;
        double ex,ey;
        int dir;
        }ARC;

        typedef struct tag_SPEED
        {
        tag_SPEED( double start=0.0, double speed=0.0, double accel=0.0, double decel=0.0,
        double scc=0.0 ) :
        start(start),
        speed(speed),
        accel(accel),
        decel(decel),
        scc(scc)
        {
        }

        double start;
        double speed;
        double accel;
        double decel;
        double scc;
        }SPEED;

        以上兩個ARCSPEED的結(jié)構(gòu)定義,把幾個參數(shù)變成一個參數(shù)。比如要實現(xiàn)的單軸驅(qū)動函數(shù),就變得非常明了:
        void Move( int nAxis, double fMM, const SPEED &speed, int nFlag = M_ABS );//
        往后我們再具體完善其實現(xiàn)。

        以上的結(jié)構(gòu)具有類的特性,但是由于其每個成員都可以給外部直接使用,故就不需要什么類的public及其析構(gòu)函數(shù)的定義了。之所以全都采用double的數(shù)據(jù)類型,是面向客戶習(xí)慣及單位計算方便的。
        接下來是對控制卡常用的單位計算及部分常用變量的聲明:
        class Cctrlcard
        {
        public:
        (其它略去)
        public:
        //
        屬性
        mutable int ORGIN; //
        指定原點狀態(tài)位
        mutable int LIMIT_A, LIMIT_B; //
        指定左右限位狀態(tài)位
        private:
        //
        以下的屬性不給外部訪問的
        struct tag_AXIS{//
        單軸屬性
        double fUnitPM; //
        脈沖當(dāng)量
        long nRP; //
        每轉(zhuǎn)脈沖數(shù)
        double fJourey; //
        行程
        };
        tag_AXIS m_axis[MAX_AXIS];
        };

        定義ORGINLIMIT_A, LIMIT_B為變量,是有兩個意義:
        No.1
        當(dāng)你訪問它們的狀態(tài)時,不需要每次調(diào)用d1000_get_axis_status函數(shù),你可以這樣:
        Int nStatus = d1000_get_axis( XCH );
        If( nStatus & g_DmcCard.ORGIN == g_dmcCard.ORGIN )
        If( nStatus & g_DmcCard.LIMIT_A == g_DmcCard.LIMIT_A )
        If( nStatus & g_DmcCard.LIMIT_B == g_DmcCard.LIMIT_B );
        No.2
        你可以擴(kuò)展不同的卡,當(dāng)外部調(diào)用的程序邏輯已被確定時,當(dāng)你需要從DMC1000控制卡升級到DMC3000控制卡時,只需要給ORGIN等狀態(tài)位指定不同的值即可。指定狀態(tài)位的值也有一個小小的技巧,以ORGIN為例,在DMC1000控制卡,其位值在2位,則可以這樣:
        ORGIN = 1<<2;
        DMC3000控制卡,其值在第9位,則這樣:
        ORGIN = 1<<9;
        方法都很簡單,關(guān)鍵是要想得到。

        對于tag_AXIS定義,引出幾個函數(shù)的聲明,專門為其服務(wù):
        void SetUP( nit nAxis, double fMM, double nPulse, double fMax );//
        設(shè)定當(dāng)量
        double P2M ( int nAxis, long nPulse ); //
        脈沖轉(zhuǎn)成毫米 pulse to metric
        long M2P( int nAxis, double fMM ); //
        毫米轉(zhuǎn)成脈沖 mitric to pulse

        現(xiàn)在,我們再回過頭來完成Move函數(shù)的實現(xiàn),以便獲得一點點成就感,同時也展示一下以上的大堆表述是有其意義的。

        void Move( int nAxis, double fMM, const SPEED &speed, int nFlag = M_ABS )
        {
        ( nFlag & M_ABS == M_ABS ) ?
        d1000_start_ta_move( nAxis, //
        絕對
        M2P( nAxis, fMM),
        M2P( nAxis, speed.start ),
        M2P( nAxis, speed.speed),
        Speed.accel ): //
        注意是冒號,?:是一個表達(dá)式
        d1000_start_t_move( nAxis, //
        相對
        M2P( nAxis, fMM),
        M2P( nAxis, speed.start ),
        M2P( nAxis, speed.speed),
        Speed.accel );
        }

        是不是很簡單呢,當(dāng)外部調(diào)用時,客戶的觀念就直接面對Metric即可,如:

        Move( XCH, 10.0, SPEED(5,10,0.1), M_ABS );//
        達(dá)到絕對位置10.0毫米處。

        以上羅嗦了一大堆,對于剛開始C++編程的程序員來說應(yīng)該是收益不小,對于高手,則希望能夠體會一下我的良苦用心。在以下的技巧介紹當(dāng)中,我將變得很簡易。一般來講,程序員的基礎(chǔ)不是太差的話,至少能夠在1分鐘內(nèi)明白是什么道理。
         

        狀 態(tài): 離線

        公司簡介
        產(chǎn)品目錄

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

        關(guān)于我們 | 聯(lián)系我們 | 廣告服務(wù) | 本站動態(tài) | 友情鏈接 | 法律聲明 | 不良信息舉報
        工控網(wǎng)客服熱線:0755-86369299
        版權(quán)所有 中華工控網(wǎng) Copyright©2022 Gkong.com, All Rights Reserved

        主站蜘蛛池模板: 国产精品偷伦在线观看| 亚洲国产精品一区二区第一页| 成 人 色 网 站免费观看| 午夜成人无码免费看网站| 99九九视频高清在线| 麻豆精品久久久久久久99蜜桃| 欧美日本精品一本二本三区| 男女18禁啪啪无遮挡激烈网站| 亚洲精品麻豆一区二区| 制服 丝袜 亚洲 中文 综合| 亚洲精品中文字幕日本| 超碰伊人久久大香线蕉综合| 成人午夜视频一区二区无码| 日韩午夜午码高清福利片| 久热久热中文字幕综合激情| 亚洲一区二区三区自拍偷拍| 日韩中文字幕国产精品| 性欧美牲交在线视频| 亚洲精品网站在线观看不卡无广告| 亚洲国产在一区二区三区| 日韩狼人精品在线观看| 老司机精品一区在线视频| 熟妇啊轻点灬大JI巴太粗| 久久精品不卡一区二区| 国产成人剧情AV麻豆果冻| 亚洲丰满熟女一区二区蜜桃| 亚洲精品一二三伦理中文| 亚洲av永久无码精品水牛影视 | 亚洲AV日韩AV一区二区三曲| 91麻豆亚洲国产成人久久| 精品福利国产| 一区二区免费高清观看国产丝瓜| 宝贝腿开大点我添添公口述视频| 推油少妇久久99久久99久久| 人人妻人人澡AV天堂香蕉| 精品亚洲成av人在线观看| 黑人玩弄漂亮少妇高潮大叫| 小泽玛利亚一区二区在线观看| 精品综合久久久久久97| 国内精品久久黄色三级乱| 中文字幕人妻无码一夲道|