无码中文字幕色专区_91av俱乐部_无码人妻h动漫_26uuu成人_91九色丨porny丨国产jk_青青视频在线播放_国内自拍第二页_国产又粗又长又爽又黄的视频_色哟哟免费网站_久久出品必属精品_a级黄色一级片_99日在线视频

首頁 新聞 工控搜 論壇 廠商論壇 產品 方案 廠商 人才 文摘 下載 展覽
中華工控網首頁
  P L C | 變頻器與傳動 | 傳感器 | 現場檢測儀表 | 工控軟件 | 人機界面 | 運動控制
  D C S | 工業以太網 | 現場總線 | 顯示調節儀表 | 數據采集 | 數傳測控 | 工業安全
  電 源 | 嵌入式系統 | PC based | 機柜箱體殼體 | 低壓電器 | 機器視覺
控制卡應用編程技巧幾招(1)
深圳市雷賽智能控制股份有限公司
收藏本文     查看收藏
聲明一下,寫下這些編程技巧,即不是什么祖傳秘籍,也不是什么必殺招或絕招,在此只為方便同仁們在編程控制軟件時,對此可以進行適當的斟酌。以下展現的編程思想及奉上的源代碼都非常簡易,但并不是隨手寫寫,可都是經過實踐的。若沒有成功經驗作后盾,我也就沒有必要在此打字練五筆了。
事實上,正如一個編程大師所言(Michael Abrash),當你的軟件正常而且有效率的運行起來時,好像一切都是那么顯而易見。故,在此,我仍堅持那句編程口號,將事情變得越簡單越好,越簡單就越有效率,越穩定。
在以下的介紹中,我將盡可能的展示本人的編程思想,最大可能的給出知其然也知其所然的解釋。若你有更好的見解,希望能得到你的指正。人長大了明顯標志就是變得不太負責,而且不敢承認自己還需要努力,害怕面對自己的錯誤。若是這樣,放心,我還沒長大。因為我無法保證我能面面俱到。
關于源代碼的閱讀,需要讀者有一定的C++編程基礎,至少對以下表示形式不會產生誤解:
const char *pString; //
指定pString邦定的數據不能被修改
char * const pString; //
指定pString的地址不能被修改
const char * const pString; //
含上面兩種指定功能
當然,隨便提醒一下,這些源代碼若需要加入你的軟件工程當中,還需要作一些調整和修改,因此,這些源代碼實質上稱為偽代碼也可以,之所以展現它們,是讓程序員們有個可視化的快感,特別是那些認為源代碼就是一切的程序員。
同時,為了提高針對性,大部分控制卡調用的函數會明確指出是邦定哪些卡的,實際應用時,程序員可自行選擇,以體現一下自己的智商是可以寫寫軟件的。

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

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

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

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

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

還有一種方法,情況稍加復雜,但表達的功能也要強一些,以下展現可以稍微安慰一下代碼狂。

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

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

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

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

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

二、 數據結構及數據類型的定義,部分相關聲明
調用控制卡驅動函數時,經常會有如下形式:
單軸相對運動 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 );

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

# define M_ABS 0x01 //
定義一個絕對標志位
# define M_INP 0x02 //
定義一個插補位

接下來深入一點點,再來幾個結構定義:

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)//
定義這樣一個構造函數需要勇氣,看似不合理,但是好用麻
{
}
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的結構定義,把幾個參數變成一個參數。比如要實現的單軸驅動函數,就變得非常明了:
void Move( int nAxis, double fMM, const SPEED &speed, int nFlag = M_ABS );//
往后我們再具體完善其實現。

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

定義ORGINLIMIT_A, LIMIT_B為變量,是有兩個意義:
No.1
當你訪問它們的狀態時,不需要每次調用d1000_get_axis_status函數,你可以這樣:
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
你可以擴展不同的卡,當外部調用的程序邏輯已被確定時,當你需要從DMC1000控制卡升級到DMC3000控制卡時,只需要給ORGIN等狀態位指定不同的值即可。指定狀態位的值也有一個小小的技巧,以ORGIN為例,在DMC1000控制卡,其位值在2位,則可以這樣:
ORGIN = 1<<2;
DMC3000控制卡,其值在第9位,則這樣:
ORGIN = 1<<9;
方法都很簡單,關鍵是要想得到。

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

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

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 ): //
注意是冒號,?:是一個表達式
d1000_start_t_move( nAxis, //
相對
M2P( nAxis, fMM),
M2P( nAxis, speed.start ),
M2P( nAxis, speed.speed),
Speed.accel );
}

是不是很簡單呢,當外部調用時,客戶的觀念就直接面對Metric即可,如:

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

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

狀 態: 離線

公司簡介
產品目錄

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

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

无码中文字幕色专区_91av俱乐部_无码人妻h动漫_26uuu成人_91九色丨porny丨国产jk_青青视频在线播放_国内自拍第二页_国产又粗又长又爽又黄的视频_色哟哟免费网站_久久出品必属精品_a级黄色一级片_99日在线视频
欧美激情99| 亚洲乱亚洲高清| 国产日产精品_国产精品毛片 | 国产精品av一区二区| 国产福利电影在线播放| 精品国产一区二| 精品国产精品国产偷麻豆| 福利欧美精品在线| 国产99久久| 在线日韩成人| 日韩二区三区四区| 日本一区免费网站| 国产欧美午夜| 精品精品99| 亚洲午夜精品久久久久久app| 欧美+日本+国产+在线a∨观看| 99re国产精品| 午夜亚洲福利| 国产精品麻豆成人av电影艾秋 | 成人在线视频区| 久久青青视频| 日韩一级网站| 国产精品网站在线看| 久久三级中文| 欧美亚洲在线日韩| 蜜桃一区二区三区在线观看| 日本免费一区二区视频| 精品在线网站观看| 午夜国产欧美理论在线播放| 四虎在线精品| 婷婷综合六月| 欧美亚洲色图校园春色| 亚洲天堂av影院| 亚洲精选91| 色一区二区三区| 亚洲伊人精品酒店| 国产a亚洲精品| 久久亚洲欧洲| 精品久久影院| 蜜桃视频一区二区三区在线观看 | 成人日韩在线观看| 亚洲三级毛片| 亚洲天堂免费电影| 欧美一区二区三区免费看| 蜜桃精品在线| 美女视频一区在线观看| 亚洲一区二区三区免费在线观看| 精品欧美日韩精品| 香蕉久久久久久| 国产高清一区二区| 欧美xxxx性| 伊人久久亚洲美女图片| 精品视频网站| 欧美在线日韩| 男女男精品网站| 99久久精品费精品国产| 里番精品3d一二三区| 亚洲3区在线| 亚洲一区日韩在线| 欧美日韩精品免费观看视完整| 日韩欧美久久| 性色av一区二区怡红| 日韩av首页| 国产精品成人一区二区不卡| 首页国产欧美日韩丝袜| 久久精品青草| 成人国产综合| 麻豆国产精品一区二区三区| 日本中文字幕视频一区| 亚洲黄色在线| 亚洲免费播放| 女主播福利一区| 激情综合亚洲| 婷婷成人在线| 日韩精品一卡| 国产一区二区三区日韩精品| 欧美一级一区| 日韩精品视频一区二区三区| 制服诱惑一区二区| 五月婷婷亚洲| 成人av动漫在线观看| 久久亚洲精品中文字幕蜜潮电影| 国产精品久久久久蜜臀| 国产成人精品亚洲线观看| 久久久久黄色| 色综合狠狠操| 成人福利视频| 久久中文字幕二区| 国产综合婷婷| 国产精品毛片| 爽好多水快深点欧美视频| 亚洲综合色婷婷在线观看| 亚洲人成精品久久久| 日韩高清一区二区| 欧美精品国产白浆久久久久| 青草综合视频| 久久精品国产成人一区二区三区| 欧美三级第一页| 韩日一区二区| 国产精品国产三级在线观看| 综合激情网...| 日韩中文字幕一区二区三区| 亚洲二区三区不卡| 91精品在线免费视频| 婷婷综合六月| 尤物在线精品| 91精品国产经典在线观看| 国产极品嫩模在线观看91精品| 国产精品成久久久久| 久久免费国产| 伊人影院久久| 国产极品一区| 精品免费av在线| 日韩在线一区二区| 久久亚洲精品中文字幕| 久久青草久久| 日韩国产在线观看一区| 久久久久久久欧美精品| 精品中文字幕一区二区三区av| 丝袜美腿一区二区三区| 日韩激情啪啪| 韩国久久久久久| 好看的av在线不卡观看| 国产一卡不卡| 999久久久91| 国产日韩免费| 99久久精品网| 日韩不卡在线观看日韩不卡视频| 福利一区二区| 久久亚洲色图| 国产精品不卡| 日本a口亚洲| 成人欧美一区二区三区的电影| 免费精品视频| 国产精品成人一区二区不卡| 亚洲一区日韩| 日本精品在线中文字幕| 日韩精品视频在线看| 日韩欧美1区| 日本精品在线播放| 午夜日韩av| 国产不卡人人| 亚洲精品影院在线观看| 妖精视频成人观看www| 欧美日韩精品免费观看视完整| 亚洲国产不卡| 欧美一区在线观看视频| 国产精品久av福利在线观看| 日韩亚洲一区在线| 午夜电影亚洲| 国产精品一区二区美女视频免费看| 国产一区二区三区成人欧美日韩在线观看 | 视频一区视频二区中文| 色爱综合av| 久久麻豆视频| 国产女优一区| 欧美日韩尤物久久| 国产精品v日韩精品v欧美精品网站| 亚洲一区激情| 国内激情久久| 成人久久一区| 国产自产自拍视频在线观看| 国产日韩欧美一区| 日韩综合一区二区| 免费观看在线综合色| 亚洲激情中文| 亚洲福利久久| 99精品在线| 久久久噜噜噜| 999国产精品999久久久久久| 免费福利视频一区二区三区| 国产一区二区三区视频在线| 欧美国产不卡| 久久亚洲精品中文字幕| 国产精品毛片视频| 欧美日韩一区二区三区四区在线观看 | 日韩一级网站| 国产一区二区三区日韩精品| 国产精品qvod| 国产精品久久久久久久久久白浆 | 久久中文视频| 成人精品中文字幕| 日韩欧美精品一区| 精品国产欧美日韩一区二区三区| 国产精品一区二区三区www| 日韩精品第二页| 蜜桃av一区二区在线观看 | 亚洲黄页一区| 夜夜精品视频| 视频一区二区三区在线| 亚洲午夜国产成人| 日本亚洲三级在线| 久久精品99国产国产精| 久久99免费视频| 韩日一区二区| 国产精品亚洲一区二区三区在线观看| 亚洲一区资源| 久久精品国产99久久| 亚洲一区二区成人| 久久激情av|