培訓資料分類
熱門人氣資料 / Download More
發(fā)布時間: 2017 - 01 - 17
控制卡應用編程技巧幾招(1) 聲明一下,寫下這些編程技巧,即不是什么祖?zhèn)髅丶?,也不是什么必殺招或絕招,在此只為方便同仁們在編程控制軟件時,對此可以進行適當?shù)恼遄?。以下展現(xiàn)的編程思想及奉上的源代碼都非常簡易,但并不是隨手寫寫,可都是經(jīng)過實踐的。若沒有成功經(jīng)驗作后盾,我也就沒有必要在此打字練五筆了。 事實上,正如一個編程大師所言(Michael Abrash),當你的軟件正常而且有效率的運行起來時,好像一切都是那么顯而易見。故,在此,我仍堅持那句編程口號,將事情變得越簡單越好,越簡單就越有效率,越穩(wěn)定。 在以下的介紹中,我將盡可能的展示本人的編程思想,最大可能的給出知其然也知其所然的解釋。若你有更好的見解,希望能得到你的指正。人長大了明顯標志就是變得不太負責,而且不敢承認自己還需要努力,害怕面對自己的錯誤。若是這樣,放心,我還沒長大。因為我無法保證我能面面俱到。 關于源代碼的閱讀,需要讀者有一定的C++編程基礎,至少對以下表示形式不會產(chǎn)生誤解: const char *pString; //指定pString邦定的數(shù)據(jù)不能被修改 char * const pString; //指定pString的地址不能被修改 const char * const pString; //含上面兩種指定功能 當然,隨便提醒一下,這些源代碼若需要加入你的軟件工程當中,還需要作一些調(diào)整和修改,因此,這些源代碼實質(zhì)上稱為偽代碼也可以,之所以展現(xiàn)它們,是讓程序員們有個可視化的快感,特別是那些認為源代碼就是一切的程序員。 同時,為了提高針對性,大部分控制卡調(diào)用的函數(shù)會明確指出是邦定哪些卡的,實際應用時,程序員可自行選擇,以體現(xiàn)一下自己的智商是可以寫寫軟件的。  一、 控制卡類的單一實例實現(xiàn) 把控制卡類作一個類來處理,幾乎所有C++程序員都為舉雙手表示贊同,故第一個什么都沒有的偽代碼就此產(chǎn)生,如下表現(xiàn): class CCtrlCard { public: …Function public: …attrib }  于是,用這個CctrlCard可以產(chǎn)生n多個控制卡實例,只要內(nèi)存足夠。然而,針對現(xiàn)實世界,情況并不那么美好。通常情況下,PC機內(nèi)只插同種類型的...

控制卡應用編程技巧

控制卡應用編程技巧幾招(1)

?聲明一下,寫下這些編程技巧,即不是什么祖?zhèn)髅丶膊皇鞘裁幢貧⒄谢蚪^招,在此只為方便同仁們在編程控制軟件時,對此可以進行適當?shù)恼遄?。以下展現(xiàn)的編程思想及奉上的源代碼都非常簡易,但并不是隨手寫寫,可都是經(jīng)過實踐的。若沒有成功經(jīng)驗作后盾,我也就沒有必要在此打字練五筆了。?

事實上,正如一個編程大師所言(Michael Abrash),當你的軟件正常而且有效率的運行起來時,好像一切都是那么顯而易見。故,在此,我仍堅持那句編程口號,將事情變得越簡單越好,越簡單就越有效率,越穩(wěn)定。?

在以下的介紹中,我將盡可能的展示本人的編程思想,最大可能的給出知其然也知其所然的解釋。若你有更好的見解,希望能得到你的指正。人長大了明顯標志就是變得不太負責,而且不敢承認自己還需要努力,害怕面對自己的錯誤。若是這樣,放心,我還沒長大。因為我無法保證我能面面俱到。?

關于源代碼的閱讀,需要讀者有一定的C++編程基礎,至少對以下表示形式不會產(chǎn)生誤解:?

const char *pString; //指定pString邦定的數(shù)據(jù)不能被修改?

char * const pString; //指定pString的地址不能被修改?

const char * const pString; //含上面兩種指定功能?

當然,隨便提醒一下,這些源代碼若需要加入你的軟件工程當中,還需要作一些調(diào)整和修改,因此,這些源代碼實質(zhì)上稱為偽代碼也可以,之所以展現(xiàn)它們,是讓程序員們有個可視化的快感,特別是那些認為源代碼就是一切的程序員。?

同時,為了提高針對性,大部分控制卡調(diào)用的函數(shù)會明確指出是邦定哪些卡的,實際應用時,程序員可自行選擇,以體現(xiàn)一下自己的智商是可以寫寫軟件的。?

?一、?控制卡類的單一實例實現(xiàn)?

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

class CCtrlCard

{

public:

…Function

public:

…attrib

}

?于是,用這個CctrlCard可以產(chǎn)生n多個控制卡實例,只要內(nèi)存足夠。然而,針對現(xiàn)實世界,情況并不那么美好。通常情況下,PC機內(nèi)只插同種類型的控制卡1到2張,在通過調(diào)用d1000_board_init或d3000_board_init函數(shù)時,它們會負責返回有效卡數(shù)nCards,然后從0-nCards*4 - 1自行按排好軸數(shù)。初始化函數(shù)就是C++的new或malloc的操作,取得系統(tǒng)的資源,但是控制卡的資源與內(nèi)存不一樣,取得資源后必需要釋放才可以再次獲取,即控制卡資源是唯一的。?

既然控制卡資源是唯一的,那么最好Cctrlcard產(chǎn)生的實例也是唯一的,這樣,我們可以方便的需要定義一個全局變量即可:

CctrlCard g_Dmcard;

在其它需要調(diào)用的地方,進行外部呼叫:?

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();

}

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

?Class CctrlCard

{

public:

CctrlCard(); //請注意這個構造函數(shù)的定義?

}

?CctrlCard::CctrlCard()

{//呵呵,也很明了?

static int n(0); //注意,是個靜態(tài)變量?

?n++; //每次調(diào)用CctrlCard生成實例時,都會計數(shù)一次?

assert( n == 1 ); //在DEBUG版本下,只有n==1的情況下可以通過?

//否則,會出現(xiàn)致命錯誤,還好,它會告訴你錯在哪個文件,?

//哪一行,呵呵,是個好東東啊。?

}

通過強行報警處理,當你有g_DmcCard這個實例時,其它的所有控制卡的定義都只能是以引用或指針的方式進行了,不會再產(chǎn)生新有效的實例了,對于由小組編程的項目軟件,而你又恰好負責編程控制卡這一塊的話,以上的顯性報警,會讓其它人心領神會。當然,你也可以將上面的方法加入到InitBoard當中去,可以避你的無意識的多次調(diào)用了。?

?附:無意識的多次調(diào)用經(jīng)常發(fā)生,特別是那些對MFC機制不明確的程序員,在多文檔框架下,不知道這個CctrlCard::InitBoard函數(shù)到底是應該放在CmainFrame的OnCreate里面,還是應該放在CchildFrame的OnCreate,或者是Cview的OnInitUpdate里面進行調(diào)用。?

在一言難盡MFC的情況下,我建議兩個小方法:?

No.1 將CctrlCard的函數(shù)置于Cmainframe的OnCreate或者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++程序員寫下這些代碼是基本的義務(這也是我為什么要交待讀者必須要有一定的C++基礎):?

class CctrlCard

{

public:

~CctrlCard()

{//定義析構函數(shù),在此釋放資源,對此,我不想再轉(zhuǎn)到讀者的眼球了?

d1000_board_close();

}

}

?二、?數(shù)據(jù)結(jié)構及數(shù)據(jù)類型的定義,部分相關聲明?

調(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)用,很多重復枯燥,又不直觀,難于理解,并且在面向客戶時,常常是指每分多少米,或者每秒多少毫米,很少有人問每秒多少脈沖,移動多少脈沖作距離,故需要單位之間的換算。顯然,對于這些問題,我想,C++程序員應該找到用武之地了,所以我們一步一步來,慢慢統(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 //定義一個絕對標志位?

# define M_INP 0x02 //定義一個插補位?

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

?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)//定義這樣一個構造函數(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;

?

以上兩個ARC和SPEED的結(jié)構定義,把幾個參數(shù)變成一個參數(shù)。比如要實現(xiàn)的單軸驅(qū)動函數(shù),就變得非常明了:?

void Move( int nAxis, double fMM, const SPEED &speed, int nFlag = M_ABS );//往后我們再具體完善其實現(xiàn)。?

?以上的結(jié)構具有類的特性,但是由于其每個成員都可以給外部直接使用,故就不需要什么類的public及其析構函數(shù)的定義了。之所以全都采用double的數(shù)據(jù)類型,是面向客戶習慣及單位計算方便的。?

接下來是對控制卡常用的單位計算及部分常用變量的聲明:?

class Cctrlcard

{

public:

…(其它略去)

public:

//屬性?

mutable int ORGIN; //指定原點狀態(tài)位?

mutable int LIMIT_A, LIMIT_B; //指定左右限位狀態(tài)位?

private:

//以下的屬性不給外部訪問的?

struct tag_AXIS{//單軸屬性?

double fUnitPM; //脈沖當量?

long nRP; //每轉(zhuǎn)脈沖數(shù)?

double fJourey; //行程?

};

tag_AXIS m_axis[MAX_AXIS];

};

?

定義ORGIN,LIMIT_A, LIMIT_B為變量,是有兩個意義:?

No.1 當你訪問它們的狀態(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 你可以擴展不同的卡,當外部調(diào)用的程序邏輯已被確定時,當你需要從DMC1000控制卡升級到DMC3000控制卡時,只需要給ORGIN等狀態(tài)位指定不同的值即可。指定狀態(tài)位的值也有一個小小的技巧,以ORGIN為例,在DMC1000控制卡,其位值在2位,則可以這樣:?

ORGIN = 1<<2;

在DMC3000控制卡,其值在第9位,則這樣:?

ORGIN = 1<<9;

方法都很簡單,關鍵是要想得到。?

?

對于tag_AXIS定義,引出幾個函數(shù)的聲明,專門為其服務:?

void SetUP( nit nAxis, double fMM, double nPulse, double fMax );//設定當量?

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 ): //注意是冒號,?:是一個表達式?

d1000_start_t_move( nAxis, //相對?

M2P( nAxis, fMM),

M2P( nAxis, speed.start ),

M2P( nAxis, speed.speed),

Speed.accel );

}

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

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

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

?

控制卡應用編程技巧幾招(2)

發(fā)布日期:2009-3-9 0:42:58 ?瀏覽次數(shù):2416

?三、?插補和聯(lián)動函數(shù)?

當程序員決定需要幾軸進行插補時,盡量選擇最大插補軸數(shù),如在雕銑系統(tǒng)時,有時會用到兩軸插補,有時會進行三軸插補,在這個基礎上,為簡化編程,我的理論只使用三軸插補,當需要進行兩軸插補或聯(lián)動時,根據(jù)相對或絕對的坐標關系,將不運動軸填入0偏移或絕對位置即可。?

以下為XYZ三軸聯(lián)動和插補的函數(shù),由nFlag的M_INP位決定是否進行插補:?

?

void MoveXYZ( double fX, double fY, double fZ, const tag_SPEED &speed,

int nFlag = M_ABS )

{

short axisArray[]={ XCH, YCH, ZCH };

?

if( nFlag & M_INP == M_INP )

{//插補?

long distArray[]={ M2P(XCH, fX), M2P(YCH,fY), M2P(ZCH,fZ) };

long nStart, nSpeed;//計算新的矢量速度,參見DMC1000矢量速度的計算?

(…矢量速度計算在此略去)

?

( nFlag & M_ABS == M_ABS ) ?

d1000_start_ta_line( 3, axisArray, nStart, nSpeed, speed,accel )://絕對?

d1000_start_t_line(3, axisArray, nStart, nSpeed, accel );//相對?

}

else

{//聯(lián)動?

double fpos[]={ fX, fY, fZ};

for( int I(0); I<3; I++)//發(fā)三次單軸移動命令?

Move( axisArray[I], fpos[I], speed, nFlag );

}

}

在我給出的DMC3000控制卡類完整源代碼一文中,有其更完善的版本。通過以下的函數(shù)封裝,將插補和聯(lián)動,絕對位置,相對位置等等都很好的整合在一起,用戶在使用起來具體更準確的目標。?

?

四、?驅(qū)動軸狀態(tài)、位置讀取和設定?

對于驅(qū)動軸的狀態(tài),分為兩種:1、指脈沖輸出狀態(tài);2、指專用輸入信號電平狀態(tài)?

檢測脈沖輸出是否完成,可以寫成如下函數(shù),假設軟件總共只用到XYZ三軸:?

?int IsRunning( int nAxis = -1 )//默認為-1是有目的的?

{

if( nAxis != -1 )

return d1000_check_done( nAxis ) == 0 ;

//當nAxis == -1時,檢測三個軸是否有一個在運行,這種檢測在加工時常用?

return d1000_check_done( XCH ) == 0 ||

d1000_check_done( YCH ) == 0 ||

d1000_check_done( ZCH ) == 0;

}

?當用戶等待YCH脈沖發(fā)完,則用一個循環(huán)檢測即可:?

while( g_DmcCard.IsRuning( YCH ) ) ::DoEvents();

?別忘了,IsRuning是CctrlCard的成員函數(shù),而DoEvents函數(shù)在DMC1000不能響應系統(tǒng)消息的文章中有詳細實現(xiàn)和功能描述。?

在實際加工時,作插補時,常需要等待上次所有運動結(jié)束才開始新的運動。故有如下表現(xiàn):?

?

for( int I(0),step(0); I

{

DoEvents();

switch( m_nworkStatus ){

case Pause:

continue;

case Continue: m_nWorkStatus = Running;

case Running:

{

switch( step ){

case 0:

if( IsRunning() ) break;//檢測所有運動結(jié)束,否則繼續(xù)檢測?

MoveXYZ( data[I].x, data[I].y, data[I].z …… );

Step ++;

Break;

Case 1:

If( IsRunning() ) break;//同上?

I++; //準備下一段數(shù)據(jù),之所以放在此處,是需要考慮在運行過程中,有外部的暫停和繼續(xù)操作。?

Step = 0;//準備運行新的數(shù)據(jù)?

Break;

}

} break;

}

?

以上程序框架,有著非常廣闊的應用前景,非常簡單,可以讓程序員隨意控制,故而它又非常穩(wěn)定,比起線程的操作,它具體非常透明的可操作性。?此框架在雕刻,焊接,切割等許多場合都將成為經(jīng)典,當然,若你不曾深入了解它,則不會發(fā)現(xiàn)它的可愛之處。?

?

對于專用輸入信號狀態(tài)的檢測,幾乎沒有什么特別之處:?

int GetStatus( int nAxis )

{

return d1000_get_axis_status( nAxis );

}

?

位置的讀取和設定,對于DMC1000比較容易,故在此我將寫出DMC3000控制卡的這兩個函數(shù),當然用于DMC1000也是沒問題的。?

DMC3000控制卡的位置分為指令位置和物理位置(編碼器反饋的),所以函數(shù)需要有一個小小的選擇,先看看位置獲取函數(shù):?

?

Double GetPosition( int nAxis, BOOL bCmd = true )// bCmd == true時,讀取指令位置,否則為物理位置?

{

long pulse = (bCmd == true ) ?

d3000_get_command_pos( nAxis ):

d3000_get_encoder_pos(nAxis);

return P2M( nAxis, pulse );//脈沖轉(zhuǎn)成毫米然后返回?

}

?位置設定函數(shù)多了一點點動作:?

double SetPosition( int nAxis, double fMM, BOOL bCmd = true )

{

double pos = GetPosition( nAxis, bCmd );//先取得原來的位置?

( bCmd == true )?

D3000_set_command_pos( nAxis, M2P(nAxis, fMM )):

D3000_set_encoder_pos( nAxis, M2P(nAxis, fMM) );

Return pos;//返回舊的位置?

}

為什么這樣設計?當你用過CPen *pOldPen= pDC->SelectObject( &newPen );時,或者除了復位之外,你真正需要調(diào)用這個SetPosition函數(shù)時,你會發(fā)現(xiàn)這個設計,真是人情味實足。?

?

五、?復位,相對與絕對,?

在如今PC機開發(fā)控制卡軟件時代,設備上電不復位的幾乎沒有,在此談到復位這個問題確實有必要,實現(xiàn)上,復位動作因不同設備的工藝要求而定,故一般而言,控制卡提供的那個復位函數(shù)太過簡單,有點力不從心,所以,本人自己寫了個復位函數(shù),但是代碼寫起來將會占用很大的面版,故有此需要者,可以來電或E_mail索取。?

其基本思路是采用兩次找原點,第一次高速找,停止后退出,再次以較低的速度找原點。并且在執(zhí)行第二次復位時,會在離原點5毫米處減速(第一次執(zhí)行做不到)。?

?提供相對和絕對位置的概念是很有必要的,眾所周知,現(xiàn)在控制卡能作到最小單位為1個脈沖,當然,作為數(shù)字脈沖,到此已不能再小了,故為了提高精度,通常情況下要提高計算當量,即增加每轉(zhuǎn)脈沖數(shù),或減少每轉(zhuǎn)毫米數(shù)。?

不論怎么,我們將問題放大并明朗化,可以看看以下片段:?

?for( int I(0); I<10000; I++)// 走10000次?

move( 0.5 );//走相對0.5個脈沖的距離?

?結(jié)果是:1個脈沖也發(fā)不出,造成很大的累積誤差。?

若換成絕對方式:?

for( int I(0); I<10000; I++)

goto( I*0.5 );

?最后的誤差,最大也就是1個脈沖以內(nèi)。雖然還是有誤差,但總算達到可容忍的程序,再加上適當?shù)膹臀徊僮?,讓客戶至少不必再擔心這個巨大的累積誤差了。?

?實質(zhì)上,在整個軟件設計時最好采用絕對坐標系,即使要處理加工原點或工面起點等這些參數(shù),也要把它換算成絕對位置,唯手動移動設備可以例外。另外,在CNC系統(tǒng)中,除了有循環(huán)用到相對坐標系,其余都是用絕對坐標系為上策,實際上,在實現(xiàn)編程算法上,為統(tǒng)一起見,最好將相對的坐標關系全部轉(zhuǎn)成絕對的坐標關系,這樣也便于外部進行暫?;蚶^續(xù)的處理。?

?相信,到此為止,若你的設備在加工時有一定的誤差漂移,你會意識到自己應該是不是要檢查一下采用了什么坐標系了吧。?

?六、?輸出輸入及軟限位?

對于通用的I/O操作,沒有什么特別要說明的,只有兩點需要注意的,先給出兩個小函數(shù),以作參考:?

?int ReadBit( int nIO ); //讀指定通用輸入口的電平狀態(tài),返回1 或?0

int WriteBit( int nIO, int nStatus ); // 輸出電平到指定輸出端口?

?兩點注意:?

No.1 對于ReadBit若需要加入抗干擾處理,則寫一個函數(shù):?

?Int RealInput( int nIO, int nStatus, int di=50 )

{

if( ReadBit( nIO ) != nStatus )

return 0;

while( di -- );//耗上幾個CPU的周期時間,再讀一次?

return ReadBit( nIO ) == nStatus;

}

?

No.2 增加一個變量及函數(shù)擴展一下輸出功能:?

Long m_nOutStatus= 0x00000000;

再次改造一下WirteBit

void WriteBit( int nIO, int nStatus )

{

if( nStatus ){

m_nOutStatus |= (1<

}

else{

m_nOutStatus &= (~(1<

}

d1000_out_bit( nIO, nStatus );

}

添加的訪問輸出狀態(tài)函數(shù):?

int ReadOutbit( int nIO )

{

static int a;

a = 1<<(nIO-1);

a &= m_nOutStatus;

return a!=0;

}

?軟限位的思想原本是用于為客戶節(jié)省正負限位的光電開關成本而產(chǎn)生的,致使使用軟件限位正常的話,設備每個驅(qū)動軸只需要一個原點開關即可。當然,軟限位能正確運作是非常重要的,否則很容易撞壞設備。而其正確運行,就必須依賴正確的復位動作,以找到可靠的機械原點位置。?

軟件限位的基本算法非常簡單,特別是在一個絕對坐標系當中。其原理如下:?

?if( pos < minPos ) pos = minPos;

if( pos > maxPos ) pos = maxPos;


?實在沒有必要再詳說下去了。?

??編程技巧介紹至此算是一個了斷,若在未來的日子里,有更好的想法,我會拿出來給大家參考,請大家一起來支持這件事情,拿出自己的寶貴經(jīng)驗,算是給數(shù)控行業(yè)添加強有力的潤滑劑吧。?

?謝謝。

?

?抽像一點講,過程控制滲透在生活的各個角落。特別是在數(shù)控行業(yè),尤為明顯。早期在PLC時代,幾乎是一統(tǒng)天下。當大小不一的控制卡公司如雨后春筍般成長起來時,控制卡在過程控制逐步體現(xiàn)出強勁優(yōu)勢。?其編程手段往往邦定非常成熟的編程工具,如:CB,VC,Dephi,CB。故其推廣非常迅速. 很快擁有大量客戶群。?

但是,作為編程者,碰到同一程序需要控制多個同樣設備時(動作不一定同步),往往在Window多任務系統(tǒng)的影響下,很快想到多線程技術,其實多線程編程對系統(tǒng)依賴性較強,不同級別的處理,將導致程序的維護成本增加,并且還需要考慮線程之間的通訊,使編程起來較為麻煩。事實上,依靠過程編程的思想,會使程序獲得更簡單的做法。?

純粹從編程角度來看,過程控制編程應包含幾個要素,下面以C++偽碼方式來表示一個類,較易說明問題:?

?

/**************************

一個動作封裝類,包含一個?

設備的所有執(zhí)行動作?

**************************/

class CAction

{

public:

CAction():m_nWorkStep(-1000){}

~CAction(){}

public:

enum{ None, Inital, Start, Stop, Pause, Continue };//部分控制標記?

?

public:

int Control( int nStatus, void *pParam ); //要素2: 一定可以接受外部控制?

int Run( void *pParam ); //要素3: 絕對有一個不斷推動的執(zhí)行過程(這是整個過程編程的心臟所在)

?

public:

int m_nWorkStep; //要素1: 必須有一個工作執(zhí)行步?

private:

void * m_pMemberData; //要素4: 可選,邦定被操作的數(shù)據(jù)?

// ..其它輔助變量?

};

?

要素5:可選,為了能與外界用戶進行溝通,Control函數(shù)與Run函數(shù),須選擇一個參數(shù),滿足用戶的輸入輸出。但由于用戶可選項太多,故古人告訴我們,萬事皆空即是成功,對于C++而言,沒有比void *類型更有前途了(若想體會,需搭配類型轉(zhuǎn)換更有潛力)。早在一年前,本人寫過一個過程控制器編程,并有成功實例,但今次版本,更有精裝之特點。?

?

住下再參見一下Control函數(shù),及Run函數(shù)的一個小樣例,這將是程序員發(fā)揮強勁功能的場地所在。如下:?

?

int CAction::Control( int nStatus, void *pParam )

{//此處的設計需要一點技巧,當然完全取決程序員的經(jīng)驗,和對控制的理解?

switch( nStatus ){

case Inital:

m_pMemberData = pParam;//初始化邦定的用戶數(shù)據(jù)?

break;

case Start:

m_nWorkStep = 0; //一般令第0步作為開始較易理解?

break;

case Stop:

m_nWorkStep = -1000;//停止?

break;

case …//其它略去?

default: break;

}

return m_nWorkStep;//返回值可自定?

}

?

int CAction::Run( void *pParam )

{//以下為一個動作不斷返回,直至接受到停止指令?

switch( m_nWorkStep ){

case 0:

if( IsMove() ) break; //正在忙,不執(zhí)行?

Move(1600); //正向移動1600單位?

m_nWorkStep++; //跳至下一步?

break;

case 1:

if( IsMove() ) break; //正在忙,不執(zhí)行?

Move(-1600); //反向移動1600單位?

m_nWorkStep=0; //再回至第0步?

break;

case –1000: break;//停止?

default: break;//此句最好有,以便于理解?

}

return m_nWorkStep; //返回值可自定?

}

對于Run函數(shù)須謹記一點:不要有長時間的循環(huán)操作,更不要有死循環(huán),否則另外設備無法正確動作,因為另外的設備Run函數(shù)無法被激活執(zhí)行,心臟無法跳動,只好等死吧!?

當然,還須擔心一點:多個設備同時執(zhí)行時,其實時性會下降一點,若沒有特別高的要求,在現(xiàn)今CPU狂奔的時代,以上程序框架足已滿足90%的需求,還是有學習和理解的必要吧!?

?

?

以上的框架出來了,那么如何操作使設備驅(qū)動起來呢,不管在DOS亦或在Window系統(tǒng)環(huán)境里,以下的思路都一樣,參見偽代碼如下:?

?

const int nSize=10; //定義10臺設備對象?

CAction exeArray[nSize];

BOOL bRunning=FALSE;//控制整個驅(qū)動的標志?

?

Void OnRunAction()//啟動函數(shù)?

{

//初始化一下?

for( int i(0); i〈nSize; i++)

exeArray[i].Control( CAction::Inital, ( void *)userData );//userData由用戶選擇?

?

bRunning = true;//外部控制變量?

for( i=0; bRunning; i=(i+1)%nSize)//給予運行時間,即是驅(qū)動了?

{

exeArray[i].Run(( void *)userData); //不斷驅(qū)動Action設備(即激活心臟)?

DoEvents();//做其它事情,如系統(tǒng)消息檢測,以防止死機?

}

}

?

DoEvents函數(shù)功能的詳解可參見本人的〈〈DMC1000控制卡不能響應系統(tǒng)消息〉〉,上面有不同編程工具下的實現(xiàn)源代碼。?

?

void OnControlAction()

{

for( int i(0); i〈 nSize; i++)

exeArray[i].Control( Caction::(/*用戶想要的動作*/), ( void *)userData);

}

?

void OnOver()

{

bRunning = FALSE;//結(jié)束驅(qū)動?

}

?

注意:有很多程序員在不同編譯器下,需要不同的OnRunAction函數(shù)版本,以上實現(xiàn)最為簡單,但有一些較特殊。比如:在程序啟動時,就驅(qū)動所有設備,這點本人在VC6.0環(huán)境有過經(jīng)驗,可以分享一下,其它環(huán)境下,還需同胞們一起去努力發(fā)現(xiàn)。?

?

還有一點聲明,多線程技術也不是一無是處,在花費時間較頻繁的通訊編程方面,它的優(yōu)勢,還是有相當?shù)恼T惑力。

?

?

?

雷泰運動控制卡應用程序開發(fā)注意事項

概述:

??對于一些初次使用雷泰運動控制產(chǎn)品的客戶,由于對本公司產(chǎn)品的特點以及程序開發(fā)流程不夠熟悉,在應用程序的開發(fā)過程中,難免會疏漏一些細節(jié),從而產(chǎn)生各種問題,浪費很多寶貴的時間。

??如果在應用程序開發(fā)前,就可以考慮到那些既重要又容易疏漏的細節(jié),這樣可以避免很多不必要的問題產(chǎn)生,從而大大縮短程序的開發(fā)周期。本文總結(jié)以往的經(jīng)驗,以雷泰運動控制卡DMC2410B為例,為客戶在開發(fā)應用程序時的初始化過程給出了一些參考與建議(其他產(chǎn)品與此類似),其中包括運動控制卡的初始化、特殊參數(shù)的設置及各種信號的設置,如圖1虛線框內(nèi)所示,這些處理過程必須加載至應用程序的初始化過程中,不同編程環(huán)境下,應用程序的初始化過程略有不同,例如在VB6.0編程環(huán)境下,須在Form_Load()函數(shù)中做程序的初始化處理,而在VC6.0編程環(huán)境下,須在OnInitDialog()函數(shù)中做程序的初始化處理。

?

控制卡應用編程技巧?

?

圖1 DMC2410B控制卡應用程序開發(fā)流程

??圖1所示的控制卡初始化過程中,實線框內(nèi)所示的參數(shù)設置或特殊信號的設置必須在初始化過程中加以處理,而虛線框內(nèi)的信號在未選擇使用時,可以不用設置,而當選擇使用這些信號時,必須進行正確設置。下面對這些初始化過程的方法及必要性做出簡要的說明。

一、?初始化運動控制卡
相關函數(shù):WORD d2410_board_init (void)
函數(shù)功能:為控制卡分配系統(tǒng)資源并初始化控制卡;
??若在應用程序中未初始化控制卡,則系統(tǒng)無法為控制卡分配資源,導致控制卡無法正常使用,程序在運行時提示錯誤,彈出如圖2所示對話框:

控制卡應用編程技巧?


圖2 未初始化控制卡時的錯誤提示

?

??注意:程序在結(jié)束運行時,必須關閉運動控制卡,以釋放系統(tǒng)資源,否則控制卡將一直占用系統(tǒng)資源,導致再次運行該應用程序時產(chǎn)生錯誤。關閉控制卡的方法及說明如下:
相關函數(shù):Void d2410_board_close (void)

??函數(shù)功能:?釋放控制卡占用的系統(tǒng)資源。當程序結(jié)束時必須調(diào)用此函數(shù),它與d2410_board_init() 函數(shù)是一個相反的過程。


二、?脈沖參數(shù)設置
??脈沖參數(shù)包括指令脈沖類型、脈沖輸出有效電平以及方向控制邏輯電平,這些參數(shù)需根據(jù)電機驅(qū)動器的類型及參數(shù)來設置,若設置錯誤時,則會造成控制卡正常發(fā)出脈沖,而電機無法正常運轉(zhuǎn)、運轉(zhuǎn)方向錯誤或只能朝同一個方向運轉(zhuǎn)等現(xiàn)象。以下為脈沖參數(shù)設置的相關函數(shù)及說明:
相關函數(shù):Void d2410_set_pulse_outmode (WORD axis, WORD outmode )
函數(shù)說明:設置指定軸的脈沖輸出方式。

??參數(shù)說明:axis 指定軸號

Outmode 脈沖輸出方式選擇,其值如圖3所示:

控制卡應用編程技巧?

圖3 脈沖類型的選擇

?

三、?特殊信號的設置

??特殊信號包括限位信號、原點信號、急停信號等,對這些特殊信號未進行設置或設置錯誤時,會導致控制卡無法正常輸出脈沖、電機無法正常運轉(zhuǎn)、原點回歸錯誤等現(xiàn)象,下面分別對這些信號的設置及用途加以說明:

1. 限位信號的設置

??相關函數(shù):Void d2410_config_EL_MODE (WORD axis, WORD el_mode)
函數(shù)功能:設置限位信號的有效電平及制動方式。

參數(shù)說明:axis 指定軸號;

el_mode 限位信號的有效電平和制動方式:

??0-立即停、低電平有效;1-減速停、低電平有效;

??2-立即停、高電平有效;3-減速停、高電平有效;

??限位信號的有效電平需根據(jù)所使用的限位開關的類型進行設置,DMC2410B控制卡默認為低電平有效,若有效電平設置錯誤,則控制卡會認為相應軸遇到限位信號而停止輸出脈沖。

2. 原點信號的設置
相關函數(shù):Void d2410_set_HOME_pin_logic (WORD axis, WORD org_logic, WORD filter)
函數(shù)功能:設置原點信號的有效電平以及允許/禁止濾波功能。

參數(shù)說明:axis 指定軸號;

org_logic 原點信號的有效電平:0-低電平有效;1-高電平有效;

filter 允許/禁止濾波功能:0-禁止;1-允許;

??原點信號的有效電平需根據(jù)所使用的原點開關的類型進行設置,DMC2410B控制卡默認為低電平有效,若有效電平設置錯誤,則會導致回原點運動無法啟動、回原點方向相反、未遇到原點信號時回原點動作立即結(jié)束等現(xiàn)象。


3. 急停信號的設置

??相關函數(shù):Void d2410_config_EMG_PIN (WORD cardno, WORD enable, WORD emg_logic)
函數(shù)功能:急停信號設置。急停信號有效時會立即停止所有軸脈沖的輸出。

參數(shù)說明:cardno 卡號

enable 電平設置使能:0-電平設置無效;1-電平設置有效;

emg_logic 急停信號的有效電平:0-低電平有效;1-高電平有效;

??急停信號的有效電平需根據(jù)所使用的急停開關的類型進行設置,DMC2410B控制卡默認為低電平有效,若有效電平設置錯誤,則控制卡會認為收到急停信號而停止所有軸的脈沖輸出。
四、?伺服專用信號的設置

??伺服專用信號是針對伺服電機和驅(qū)動器而設置的,包括伺服使能信號、報警信號、誤差清除信號、零相信號、編碼器反饋輸入模式等,當無特殊要求時,可以選擇不用控制卡去控制這些信號,但若選擇使用這些信號時,必須在程序的初始化過程中進行正確的設置,否則會導致控制卡無法正常輸出脈沖、伺服電機無法正常運轉(zhuǎn)、編碼器反饋計數(shù)無法讀取或計數(shù)錯誤等現(xiàn)象,下面分別對這些信號的設置加以說明:


1. 伺服使能(Sevon)信號的設置

??伺服使能信號的有效電平是通過控制卡的撥碼開關進行設置,如圖4所示,DMC2410B控制卡默認為高電平有效,若此電平設置錯誤,則會出現(xiàn)控制卡正常輸出脈沖,而伺服電機的軸未鎖緊而無法運轉(zhuǎn)的情況,此信號端子可用軟件控制,其相關函數(shù)及說明如下:
相關函數(shù):Void d2410_write_SEVON_PIN (WORD axis, WORD on_off);
函數(shù)功能:輸出對指定軸的伺服使能端子的控制

參數(shù)說明:axis 指定軸號

on_off 設定伺服使能電平狀態(tài):0-低電平;1-高電平。

注意:其中SEVON 輸出口初始狀態(tài)可選, 當撥碼開關對應的位置為OFF后, 則SEVON 的電平邏輯會取反。

控制卡應用編程技巧4

圖4 伺服使能信號電平的設置

2. 伺服報警(Alarm)信號的設置

相關函數(shù):Void d2410_config_ALM_PIN (WORD axis, WORD alm_logic, WORD alm_action)
函數(shù)功能:設置伺服報警信號的邏輯電平及其工作方式

參數(shù)說明:axis 指定軸號

alm_logic ALM信號的有效電平:0-低電平有效;1-高電平有效;

alm_action ALM信號的制動方式:0-立即停止;1-減速停止;

ALM信號的有效電平需根據(jù)伺服驅(qū)動器進行設置,DMC2410B控制卡默認為低電平有效,若此電平設置錯誤,則控制卡會認為相應軸發(fā)出報警信號而停止輸出脈沖。

3. 伺服誤差清除(ERC)信號的設置

相關函數(shù):Void d2410_config_ERC_PIN (WORD axis, WORD enable, WORD erc_logic,

WORD erc_width, WORD erc_off_time)

函數(shù)功能:設置允許/禁止ERC 信號及其有效電平和輸出方式

參數(shù)說明:axis 指定軸號

enable: ?0-不自動輸出ERC 信號

1-自動輸出ERC 信號

erc_logic 設置ERC信號的有效電平:0-低電平有效;1-高電平有效;

erc_width ERC信號的有效輸出寬度:單位:us

erc_off_time ERC信號的關斷時間:單位:us

??伺服電機是根據(jù)位置誤差計數(shù)器運轉(zhuǎn)的,若將位置誤差計數(shù)器清零,則伺服電機立即停止運行,而誤差清除(ERC)信號便是用來清除位置誤差計數(shù)器的,若此信號的模式及有效電平設置錯誤,當控制卡正常輸出脈沖時,而伺服驅(qū)動器的位置誤差計數(shù)器一直處于清零狀態(tài),故電機無法運行。

?

4. 伺服零相(EZ)信號的設置

相關函數(shù):Void d2410_config_EZ_PIN (WORD axis, WORD ez_logic, WORD ez_mode)

函數(shù)功能:設置指定軸的?EZ信號的有效電平及其作用。

參數(shù)說明:axis 指定軸號

ez_logic EZ信號的有效電平:0-低電平有效;1-高電平有效;

ez_mode EZ信號的工作方式:0-EZ 信號無效;1-EZ 是計數(shù)器復位信號;

??EZ信號可以用來精確回原點運動及復位編碼器反饋位置計數(shù)器,若此信號的有效電平及工作方式設置錯誤,則控制卡會一直復位編碼器反饋位置計數(shù)器,導致無法讀取編碼器的反饋位置。

?

5. 編碼器反饋輸入模式的設置

相關函數(shù):Void d2410_counter_config (WORD axis, WORD mode)

函數(shù)功能:設置編碼器輸入口的計數(shù)方式。

參數(shù)說明:axis 指定軸號

??mode編碼器反饋輸入模式:

0-非?A/B相脈沖(脈沖+方向);

1-1倍?A/B相脈沖信號;

2-2倍?A/B相脈沖信號;

3-4倍?A/B相脈沖信號;

??DMC2410B控制卡的反饋位置計數(shù)器能接收兩種模式的脈沖輸入:非A/B相(脈沖+方向)模式和A/B相輸入模式,這需要根據(jù)編碼器的類型進行設置,若此模式設置錯誤,則會造成計數(shù)器無法計數(shù)或只能朝一個方向計數(shù)以及計數(shù)值錯誤等現(xiàn)象。

?總結(jié):

??綜上所述,若在應用程序的開發(fā)過程中未對控制卡進行正確初始化處理時,會給整個開發(fā)過程帶來很多不必要的麻煩,而細致全面的初始化過程則可以在程序開發(fā)的初期避免這些問題和麻煩的產(chǎn)生,從而使整個程序開發(fā)過程事半功倍!

??因此,建議大家自己創(chuàng)建一個初始化函數(shù),將上面描述的各項相關參數(shù)包容到其中,然后在應用程序里邊再調(diào)用,以方便當前項目開發(fā)和后續(xù)其他的項目開發(fā)。

?


相關資料推薦 / Download 查看更多
發(fā)布時間: 2018 - 01 - 11
人工智能工程師必備干貨如果要問當下互聯(lián)網(wǎng)什么最熱門?毫無疑問是人工智能。目前,世界上主要發(fā)達國家都已經(jīng)將人工智能作為國家級發(fā)展戰(zhàn)略。那么,踩在下一個時代的風口浪尖上,普通程序員如何向人工智能靠攏?為此特別推薦10款托管在碼云上的人工智能開源軟件,希望能夠給大家?guī)硪稽c點幫助和啟發(fā)。當然,如果你很喜歡以下提到的項目,別忘了分享給其他人。1、項目名稱:智能家居的架構項目簡介: 智能家居的概念(smart home , home auto)很早以前就有了,現(xiàn)在隨著硬件成本的下降,及 google 收購 nest 等,智能家居熱度升高。 本智能家居的架構,包括服務器端,web 網(wǎng)頁,android 手機客戶端,各種測試腳本,基本上基礎架構都已經(jīng)實現(xiàn),并可實際調(diào)試。由于精力有限智能控制部分還在合作開發(fā)中。2、項目名稱:Living-Robot 開源機器人項目簡介: 當我們在網(wǎng)上搜索開源機器人時,我們發(fā)現(xiàn)都是部分功能的代碼和 demo,我們不能找到一個完整的項目,直接下載到我們的樹莓派上,上電,然后就可以動、可以玩了。rtp 已經(jīng)做到這點了;事實上它已經(jīng)可以動并說話了,它是基于 ros 的完整的機器人代碼,找來1塊樹莓派,接上幾個電機和喇叭,ok,它已經(jīng)可以動、可以玩、可以愉快地添加自己的代碼了;雖然粗糙但是基本滿足這個需求了(子功能還需要各種完善)。什么是Living-Robot:想象一下當你養(yǎng)了一只兔子、或者一只蜥蜴作為寵物時,它們從來不會和你賣萌扮可愛,根本不會回答你任何或機智或愚蠢透頂?shù)膯栴};但是我們還是養(yǎng)了這樣的寵物;為什么?因為它是“活著的”的。 rtp 要人工創(chuàng)造這種 Living 的感覺,我們稱之為“Living-Robot”。3、項目名稱:深度學習人臉識別引擎 JAVA SDK項目簡介: 本項目是千搜科技第四代人臉識別引擎 java 接口...
發(fā)布時間: 2018 - 01 - 09
1、初始化參數(shù)  在接線之前,先初始化參數(shù)?! ≡诳刂瓶ㄉ希哼x好控制方式;將PID參數(shù)清零;讓控制卡上電時默認使能信號關閉;將此狀態(tài)保存,確保控制卡再次上電時即為此狀態(tài)。  在伺服電機上:設置控制方式;設置使能由外部控制;編碼器信號輸出的齒輪比;設置控制信號與電機轉(zhuǎn)速的比例關系。一般來說,建議使伺服工作中的最大設計轉(zhuǎn)速對應9V的控制電壓。  2、接線  將控制卡斷電,連接控制卡與伺服之間的信號線。以下的線是必須要接的:控制卡的模擬量輸出線、使能信號線、伺服輸出的編碼器信號線。復查接線沒有錯誤后,電機和控制卡(以及PC)上電。此時電機應該不動,而且可以用外力輕松轉(zhuǎn)動,如果不是這樣,檢查使能信號的設置與接線。用外力轉(zhuǎn)動電機,檢查控制卡是否可以正確檢測到步進伺服電機位置的變化,否則檢查編碼器信號的接線和設置  3、試方向  對于一個閉環(huán)控制系統(tǒng),如果反饋信號的方向不正確,后果肯定是災難性的。通過控制卡打開伺服的使能信號。這是伺服應該以一個較低的速度轉(zhuǎn)動,這就是傳說中的“零漂”?! ∫话憧刂瓶ㄉ隙紩幸种屏闫闹噶罨騾?shù)。使用這個指令或參數(shù),看電機的轉(zhuǎn)速和方向是否可以通過這個指令(參數(shù))控制。如果不能控制,檢查模擬量接線及控制方式的參數(shù)設置。確認給出正數(shù),電機正轉(zhuǎn),編碼器計數(shù)增加;給出負數(shù),電機反轉(zhuǎn)轉(zhuǎn),編碼器計數(shù)減小。如果電機帶有負載,行程有限,不要采用這種方式。測試不要給過大的電壓,建議在1V以下。如果方向不一致,可以修改控制卡或電機上的參數(shù),使其一致?! ?、抑制零漂  在閉環(huán)控制過程中,零漂的存在會對控制效果有一定的影響,最好將其抑制住。使用控制卡或伺服上抑制零漂的參數(shù),仔細調(diào)整,使電機的轉(zhuǎn)速趨近于零。由于零漂本身也有一定的隨機性,所以,不必要求伺服電機轉(zhuǎn)速絕對為零?! ?、建立閉環(huán)控制  再次通過控制卡將伺服使能信號放開,在控制卡上輸入一個較小的比例增益,至于多大算較小,這...
發(fā)布時間: 2018 - 01 - 06
圖像處理與機器視覺第一章 圖像增強的研究和發(fā)展現(xiàn)狀  圖像在采集過程中不可避免的會受到傳感器靈敏度、噪聲干擾以及模數(shù)轉(zhuǎn)換時量化問題等各種因素的影響,而導致圖像無法達到令人滿意的視覺效果,為了實現(xiàn)人眼觀察或者機器自動分析、識別的目的,對原始圖像所做的改善行為,就被稱作圖像增強。圖像增強包涵了非常廣泛的內(nèi)容,凡是改變原始圖像的結(jié)構關系以取得更好的判斷和應用效果的所有處理手段,都可以歸結(jié)為圖像增強處理,其目的就是為了改善圖像的質(zhì)量和視覺效果,或?qū)D像轉(zhuǎn)換成更適合于人眼觀察或機器分析、識別的形式,以便從中獲取更加有用的信息?! 〕S玫膱D像增強處理方式包括灰度變換、直方圖修正、圖像銳化、噪聲去除、幾何畸變校正、頻域濾波和彩色增強等。由于圖像增強與感興趣的物體特性、觀察者的習慣和處理目的密切相關,盡管處理方式多種多樣,但它帶有很強的針對性。因此,圖像增強算法的應用也是有針對性的,并不存在一種通用的、適應各種應用場合的增強算法。于是,為了使各種不同特定目的的圖像質(zhì)量得到改善,產(chǎn)生了多種圖像增強算法。這些算法根據(jù)處理空間的不同分為基于空間域的圖像增強算法和基于變換域的圖像增強算法?;诳臻g域的圖像增強算法又可以分為空域的變換增強算法、空域的濾波增強算法以及空域的彩色增強算法;基于變換域的圖像增強算法可以分為頻域的平滑增強算法、頻域的銳化增強算法以及頻域的彩色增強算法?! ”M管各種圖像增強技術已取得了長足的發(fā)展,形成了許多成熟、經(jīng)典的處理方法,但新的增強技術依然在日新月異地發(fā)展完善,不斷推陳出新,其中尤其以不引起圖像模糊的去噪聲方法(如空域的局部統(tǒng)計法)和新的頻域濾波器增強技術(如小波變換,K-L變換等)最為引人矚目。  第二章 圖像增強的基本方法  一般而言,圖像增強是根據(jù)具體的應用場景和圖像的模糊情況而采用特定的增強方法來突出圖像中的某些信息,削弱或消除無關信息,以達到強調(diào)圖像的整體或局...
發(fā)布時間: 2018 - 01 - 05
Python 圖像處理庫 Pillow 入門(含代碼)Pillow是Python里的圖像處理庫(PIL:Python Image Library),提供了了廣泛的文件格式支持,強大的圖像處理能力,主要包括圖像儲存、圖像顯示、格式轉(zhuǎn)換以及基本的圖像處理操作等。 1)使用 Image 類PIL最重要的類是 Image class, 你可以通過多種方法創(chuàng)建這個類的實例;你可以從文件加載圖像,或者處理其他圖像, 或者從 scratch 創(chuàng)建。要從文件加載圖像,可以使用open( )函數(shù),在Image模塊中: from PIL import Image im = Image.open("E:/photoshop/1.jpg")加載成功后,將返回一個Image對象,可以通過使用示例屬性查看文件內(nèi)容: print(im.format, im.size, im.mode)('JPEG', (600, 351), 'RGB')format 這個屬性標識了圖像來源。如果圖像不是從文件讀取它的值就是None。size屬性是一個二元tuple,包含width和height(寬度和高度,單位都是px)。 mode 屬性定義了圖像bands的數(shù)量和名稱,以及像素類型和深度。常見的modes 有 “L” (luminance) 表示灰度圖像, “RGB” 表示真彩色圖像, and “CMYK” 表示出版圖像。如果文件打開錯誤,返回 IOError 錯誤。只要你有了 Image 類的實例,你就可以通過類的方法處理圖像。比如,下列方法可以顯示圖像:im.show()2)讀寫圖像PIL 模塊支持大量圖片格式。使用在 Image 模塊的 op...
發(fā)布時間: 2017 - 12 - 25
當機器視覺遇到“人工智能-工業(yè)4.0”.....人們感知外界信息的80%是通過眼睛獲得的,圖像包含的信息量是最巨大的。機器視覺給機器人裝上了“眼睛”,成為工業(yè)4.0的重點,互促發(fā)展是技術的必然,更是時代的選擇。 工業(yè)4.0是什么?在人類歷史發(fā)展前期,生產(chǎn)力的增長幾不可察,生活水平的提升也非常緩慢。而從200多年前開始,生產(chǎn)力發(fā)生了飛躍性變化,這一翻天覆地的變化得益于工業(yè)革命。如果將工業(yè)的發(fā)展歷史分成4個時代,那么工業(yè)革命1.0使機器生產(chǎn)代替了手工勞動;工業(yè)革命2.0實現(xiàn)了流水線生產(chǎn);工業(yè)革命3.0實現(xiàn)了自動化生產(chǎn)。工業(yè)生產(chǎn)方式則依次經(jīng)歷了機械化、流水線生產(chǎn)、自動化。2013年4月,在漢諾威工業(yè)博覽會上,德國正式推出工業(yè)4.0的概念,旨在提升制造業(yè)的智能化水平。德國工業(yè)4.0是指利用物聯(lián)信息系統(tǒng)(Cyber—PhysicalSystem簡稱CPS)將生產(chǎn)中的供應,制造,銷售信息數(shù)據(jù)化、智慧化,最后達到快速、有效、個人化的產(chǎn)品供應。其實質(zhì)是“互聯(lián)網(wǎng)+制造”。在成產(chǎn)層面,“工業(yè)4.0”是生產(chǎn)設備間的互聯(lián)、設備和產(chǎn)品的互聯(lián)、虛擬與現(xiàn)實的互聯(lián),甚至是未來的萬物互聯(lián)。工業(yè)4.0理念的提出促進了智能工廠的實現(xiàn),生產(chǎn)方式必將迎來巨大改變。工業(yè)4.0--機器視覺是核心目前視覺技術在工業(yè)生產(chǎn)中的應用大致可分為兩類:質(zhì)量控制和輔助生產(chǎn)。其中,質(zhì)量控制主要是指對產(chǎn)品缺陷的檢測,識別不良品,此類設備在國內(nèi)外自動化生產(chǎn)線已有廣泛使用。輔助生產(chǎn)則是利用視覺技術給機器人提供動作執(zhí)行依據(jù),國內(nèi)市場尚待開發(fā)。工業(yè)機器人的發(fā)展,勢必引起機器視覺新增長。我國正處于工業(yè)機器人的發(fā)展拐點,市場潛力巨大,據(jù)國際機器人聯(lián)盟(IFR)估計,中國市場對工業(yè)機器人的發(fā)展占主導地位,2018年全球三分之一的工業(yè)機器人將會安裝在中國,這勢必會引發(fā)機器視覺的廣泛應用。機器視覺是人類視覺的延伸,與多種技術的融合逐步加深,將成...
發(fā)布時間: 2017 - 12 - 18
最新機器人視覺系統(tǒng)介紹,給機器人裝上“眼睛”機器視覺概述使機器具有像人一樣的視覺功能,從而實現(xiàn)各種檢測、判斷、識別、測量等功能。一個典型的機器視覺系統(tǒng)組成包括:圖像采集單元(光源、鏡頭、相機、采集卡、機械平臺),圖像處理分析單元(工控主機、圖像處理分析軟件、圖形交互界面),執(zhí)行單元(電傳單元、機械單元)機器視覺系統(tǒng)通過圖像采集單元將待檢測目標轉(zhuǎn)換成圖像信號,并傳送給圖像處理分析單元。圖像處理分析單元的核心為圖像處理分析軟件,它包括圖像增強與校正、圖像分割、特征提取、圖像識別與理解等方面。輸出目標的質(zhì)量判斷、規(guī)格測量等分析結(jié)果。分析結(jié)果輸出至圖像界面,或通過電傳單元(PLC等)傳遞給機械單元執(zhí)行相應操作,如剔除、報警等,或通過機械臂執(zhí)行分揀、抓舉等動作。機器視覺優(yōu)勢機器視覺系統(tǒng)具有高效率、高度自動化的特點,可以實現(xiàn)很高的分辨率精度與速度。機器視覺系統(tǒng)與被檢測對象無接觸,安全可靠。人工檢測與機器視覺自動檢測的主要區(qū)別有: 機器視覺的應用領域?識別標準一維碼、二維碼的解碼光學字符識別(OCR)和確認(OCV)?檢測色彩和瑕疵檢測零件或部件的有無檢測目標位置和方向檢測?測量尺寸和容量檢測預設標記的測量,如孔位到孔位的距離?機械手引導輸出空間坐標引導機械手精確定位 機器視覺系統(tǒng)的分類?智能相機?基于嵌入式?基于PC 機器視覺系統(tǒng)的組成?圖像獲取:光源、鏡頭、相機、采集卡、機械平臺?圖像處理與分析:工控主機、圖像處理分析軟件、圖形交互界面。?判決執(zhí)行:電傳單元、機械單元?光源---種類LED:壽命長/可以有各種顏色/便于做成各種復雜形狀/光均勻穩(wěn)定/可以閃光;熒光燈:光場均勻/價格便宜/亮度較LED高;鹵素燈:亮度特別高/通過光纖傳輸后可做成;氙燈:使用壽命約1000小時/亮度高,色溫與日光接近。(大部分機器視覺照明采用LED) ?光源---光路...
發(fā)布時間: 2017 - 12 - 12
西門子PLC通訊方式你知道多少?西門子作為最早進入中國市場的工控廠家,其市場占有率一直非常高。西門子PLC的品質(zhì)非常好,其網(wǎng)絡穩(wěn)定性、開放性深受工控人員的喜愛,而且編程軟件分類多,使用方便。在國內(nèi)工控界具有顯著地位。雖然大家對西門子PLC都有一定的了解,但要你說出西門子PLC各種通信方式的特點,相信很多人都不能完整答出。下面就是幾種常見的西門子通信方式? 一、PPI通訊PPI協(xié)議是S7-200CPU最基本的通信方式,通過原來自身的端口(PORT0或PORT1)就可以實現(xiàn)通信,是S7-200 CPU默認的通信方式。 二、RS485串口通訊第三方設備大部分支持,西門子S7 PLC可以通過選擇自由口通信模式控制串口通信。最簡單的情況是只用發(fā)送指令(XMT)向打印機或者變頻器等第三方設備發(fā)送信息。不管任何情況,都必須通過S7 PLC編寫程序?qū)崿F(xiàn)。當選擇了自由口模式,用戶可以通過發(fā)送指令(XMT)、接收指令(RCV)、發(fā)送中斷、接收中斷來控制通信口的操作。 三、MPI通訊MPI通信是一種比較簡單的通信方式,MPI網(wǎng)絡通信的速率是19.2Kbit/s~12Mbit/s,MPI網(wǎng)絡最多支持連接32個節(jié)點,最大通信距離為50M。通信距離遠,還可以通過中繼器擴展通信距離,但中繼器也占用節(jié)點。MPI網(wǎng)絡節(jié)點通常可以掛S7-200、人機介面、編程設備、智能型ET200S及RS485中繼器等網(wǎng)絡元器件。西門子PLC與PLC之間的MPI通信一般有3種通信方式:1、全局數(shù)據(jù)包通信方式2、無組態(tài)連接通信方式3、組態(tài)連接通信方式 四、以太網(wǎng)通訊以太網(wǎng)的核心思想是使用共享的公共傳輸通道,這個思想早在1968年來源于廈威爾大學。 1972年,Metcalfe和David Boggs(兩個都是著名網(wǎng)絡專家)設置了一套網(wǎng)絡,這套網(wǎng)絡把不同的ALTO計算機連接在一起,同時還連...
發(fā)布時間: 2017 - 12 - 11
盤點 | 機器人視覺工程師必須知道的工業(yè)相機相關問題1:工業(yè)相機的丟幀的問題是由什么原因引起的?經(jīng)常會有一些機器視覺工程師認為USB接口的工業(yè)相機會造成丟幀現(xiàn)象。一般而言,工業(yè)相機丟幀與工業(yè)相機所采用的傳輸接口是沒有關系的,無論是USB,還是1394、GigE、或者是CameraLink。設計不良的驅(qū)動程序或工業(yè)相機硬件才是造成丟幀的真正原因:設計不良的工業(yè)相機之所以會發(fā)生丟幀的現(xiàn)象,其實就是資料通道的堵塞,無法及時處理,所以新的圖像進來時,前一張可能被迫丟棄,或是新的圖像被迫丟棄。要解決這問題,需要設計者針對驅(qū)動程序與工業(yè)相機硬件資料傳輸?shù)拿總€環(huán)節(jié)進行精密的設計。2:工業(yè)相機輸入、輸出接口有哪些?在機器視覺檢測技術中,工業(yè)相機的輸入、輸出接口有Camera Link、IEEE 1394、USB2.0、Ethernet、USB3.0幾種;3:知道被測物的長、寬、高以及要求的測量精度,如何來選擇CCD 相機和工業(yè)鏡頭,選擇以上器件需要注意什么?首先要選擇合適的鏡頭。選擇鏡頭應該遵循以下原則:1).與之相配的相機的芯片尺寸是多大;2).相機的接口類型是哪種的,C 接口,CS 接口還是其它接口;3).鏡頭的工作距離;4).鏡頭視場角;5).鏡頭光譜特性;6).鏡頭畸變率;7).鏡頭機械結(jié)構尺寸;選擇CCD 相機時,應該綜合考慮以下幾個方面:1).感光芯片類型;CCD 還是CMOS2).視頻特點;包括點頻、行頻。3).信號輸出接口;4).相機的工作模式:連續(xù),觸發(fā),控制,異步復位,長時間積分。5).視頻參數(shù)調(diào)整及控制方法:Manual、RS232.同時,選擇CCD 的時候應該注意,l inch = 16mm 而不是等于25.4mm.4:CCD 相機與CMOS 相機的區(qū)別在哪里?(1) 成像過程...
發(fā)布時間: 2017 - 12 - 04
工業(yè)機器人視覺引導系統(tǒng)MVRobotVision機器人視覺引導系統(tǒng)是配合工業(yè)機器人工作的機器視覺系統(tǒng),提供高效精準的視覺引導功能,適應多維運動工業(yè)機器人對視覺系統(tǒng)輕便、高速、高精度的要求,配合工業(yè)機器人實現(xiàn)高效智能化的產(chǎn)線改造,為自動化產(chǎn)線,傳送帶分揀,組裝、自動碼垛卸垛以及其他復雜加工等機器人應用提供智能視覺引導解決方案。2D視覺引導MVRobotVision機器人2D視覺引導系統(tǒng)主要應用于流水線傳送跟蹤、精確定位、姿態(tài)調(diào)整三個方面。3D視覺引導MVRobotVision機器人3D視覺引導系統(tǒng)主要應用于工件分揀、碼垛與卸垛、輸送機分揀定位三個方面。系統(tǒng)特點柔性化定位工裝:節(jié)約在多品種情況下傳統(tǒng)的機械定位工裝設計成本,使工裝定位環(huán)節(jié)實現(xiàn)真正的柔性化。 智能形狀識別引擎,智能視覺學習訓練:系統(tǒng)內(nèi)嵌智能形狀識別引擎,能夠識別常見的基本幾何圖形。對于復雜形狀,系統(tǒng)可以進行模板學習訓練,進而實現(xiàn)復雜形狀的識別精準數(shù)據(jù):降低環(huán)境光影響,快速準確獲取掃描數(shù)據(jù);先進高效的數(shù)據(jù)分析,實現(xiàn)高速精確定位識別,精度可達0.1mm
下載次數(shù): 1341
人氣: 1341
所屬分類: 運動控制卡
技術分享
 
2023 / 06 / 28
聯(lián)為智能教育主要從事計算機軟件技術咨詢;企業(yè)自動化技術培訓;教育設備研發(fā)生產(chǎn);自動化設備的研發(fā)、有著豐富的教學經(jīng)驗,教學設備齊全,老師手把手...
 
聯(lián)系方式
深圳市龍華區(qū)觀瀾街道桂香社區(qū)桂圓路23號聯(lián)為智能裝備數(shù)字產(chǎn)業(yè)園
1812977051@qq.com

15323438773 陳老師

0755-29495142

預約免費試聽
  • 您的姓名:
  • *
  • 公司名稱:
  • 地址:
  • 電話:
  • *
  • 傳真:
  • E-mail:
  • 郵政編碼:
  • 留言主題:
  • 詳細說明:
  • *
     
聯(lián)為智能教育專業(yè)打造自動化教育產(chǎn)、學、研一體化平臺,成為智能制造教育領導者。聯(lián)為plc培訓班精心打造專業(yè)培訓實操基地,專門為學員研發(fā)一批教學設備,包括機器人學習教學連線,plc培訓學習教學連線,工業(yè)機器人培訓、plc編程培訓等專業(yè)的教學設備,讓學員真正理論實踐一體,學以致用,從實踐交流中體會知識的精髓,來一場完美的職業(yè)轉(zhuǎn)身。
掃碼學習
深圳聯(lián)為智能教育感謝您的關注!
plc學習
在線直播間
plc培訓班
小胡老師
5
電話
  • 15323438773
6
二維碼
回到頂部
曰本女人牲交全视免费播放,人妻少妇看A偷人无码精品,日本在线不卡一区二区,国产网站在线免费观看 ,日韩在线三级视频,91社区在线观看精品,国产成人精品三级在线观看,人人爽人人添人人超,精品欧洲AV无码一区二区男男,综合久久久久久中文字幕
伊人久久综合色| 少妇高潮喷水惨叫久久久久电影| 久久久国产精品亚洲一区| 中文字幕亚洲专区| 一本大道久久东京热av| 亚洲精品二区中文字幕| 国产精品无码免费播放| 亚洲欧洲国无码成人片| 无码人妻一区二区精品视频| 三级中文字幕永久在线| 在线观看免费a∨网站| 国产肉体xxxx裸体xxxx| 亚洲va国产va天堂va久久| 亚洲人成在线播放无码| 一本久道久久综合狠狠躁AV| 成人综合伊人五月婷久久| 99国产精品无码专区| 精品国产自在久久现线拍| 亚洲精品XXXXXBB| 99久久无码一区人妻| 国产成人无码AV一区二区在线观看 | 亚洲最大av无码网站最新| 狠狠97人人婷婷五月| 热久久伊人中文字幕无码| 大尺度AV无码污污免费网站| 色综合久久久网| 亚洲av鲁丝一区二区三区| 欧美黑人乱大交| 免费又粗又长又爽又黄| 欧美成人高清A级全部免费观看| 亚洲AV无码一区二区乱孑伦AS | 粗大猛烈进出高潮视频大全| av加勒比无码一区播放| 免费在线观看的黄色网址| 草草久久久无码国产专区| 国产牲交视频免费无遮挡| 久久久这里只有精品加勒比| 人人人看国产免费公开视频| 无码国产精成人午夜视频一区二区 | 毛片视频在线免费观看| 亚洲中文字幕精品久久久久久动漫 |