国产精品久久久久久久久软件,国产成人久久久精品二区三区,国产成人无码一区二区三区在线 ,大又大粗又爽又黄少妇毛片,国产精品成人aaaaa网站

首頁 新聞 工控搜 論壇 廠商論壇 產(chǎn)品 方案 廠商 人才 文摘 下載 展覽
中華工控網(wǎng)首頁
  P L C | 變頻器與傳動(dòng) | 傳感器 | 現(xiàn)場(chǎng)檢測(cè)儀表 | 工控軟件 | 人機(jī)界面 | 運(yùn)動(dòng)控制
  D C S | 工業(yè)以太網(wǎng) | 現(xiàn)場(chǎng)總線 | 顯示調(diào)節(jié)儀表 | 數(shù)據(jù)采集 | 數(shù)傳測(cè)控 | 工業(yè)安全
  電 源 | 嵌入式系統(tǒng) | PC based | 機(jī)柜箱體殼體 | 低壓電器 | 機(jī)器視覺
多類型運(yùn)動(dòng)控制卡編程方法探討
深圳市雷賽智能控制股份有限公司
收藏本文     查看收藏
運(yùn)動(dòng)控制卡發(fā)展越來越訊速,不同類型的控制卡亦多種多樣,使軟件項(xiàng)目經(jīng)理具備越來越靈活的方案選擇。而對(duì)于軟件開人員,對(duì)不同的類型卡的性能測(cè)試工作無疑也越來越麻煩,通常各類型的控制卡其驅(qū)動(dòng)庫(kù)函數(shù)各不一樣,都需要用戶自己進(jìn)行整理封裝。本文的目的就是通過C++方式編程,探討一下實(shí)現(xiàn)多類型卡編程方式,以供開發(fā)人員參考。

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

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

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

}
…(
其它改寫略去)
}

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

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

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

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

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

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

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

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

看似簡(jiǎn)單,實(shí)質(zhì)上略去的部分將是程序員的一場(chǎng)惡夢(mèng),想一想那一大堆的定義和聲明,一碰到CDviece的變動(dòng),哪怕是最小的函數(shù)返回值或參數(shù)變動(dòng),則其它相應(yīng)的所有DLL都需跟全部編譯。這無疑給軟件項(xiàng)目的整個(gè)維護(hù)帶來極大的難度。

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

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

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

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

在程序中應(yīng)用時(shí),調(diào)用DMC1000控制卡如下:

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

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

四、設(shè)立一個(gè)卡類型變量
此方法最為簡(jiǎn)單,缺點(diǎn)是需要同時(shí)鏈接全部的控制卡驅(qū)動(dòng)庫(kù)函數(shù),且在程序安裝時(shí),還需要考慮各種控制卡的驅(qū)動(dòng)程序或其相應(yīng)的動(dòng)態(tài)庫(kù)是否存在。其偽代碼形式下如:
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;
}
//
其它省略
};

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

狀 態(tài): 離線

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

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

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