歡迎您光臨本站 登入註冊首頁

中級LabVIEW程式設計技巧與觀念

admin @ 2014-03-26 , reply:0

概述

   高科技??I需要好的生???渥?檫M攻市?齙睦?鰲6?綰慰刂粕?a??淶淖?踴?t是?Q定此????劣的要件之一。   在一??公司考……

    高科技??I需要好的生???渥?檫M攻市?齙睦?鰲6?綰慰刂粕?a??淶淖?踴?t是?Q定此????劣的要件之一。
    在一??公司考?]?裼煤畏N系??碸刂粕?a?C器,??穸?等障?C器都?裼玫?LC (Programmable Logic Controllers)系?(如三菱的FX2或A系列),或藉由PC介面(如ISA、PCI、GPIB等)?碸刂?C器的系?,是最??先考?]的??,因??煞N截然不同的控制系?需用不同的??及各有??劣,因此往往也很?下?Q定。
    ?初本公司在?Q定要?裼?LC系?或是PC-based系??????一番?暝??伸洞蟛糠止こ??的背景?K非?C械或控制科系出身,要想建立公司自行?展的技?基?,?o?是?裼?LC系?或是PC-based系?均需重新?W?。最後?Q定?裼?C-based 的系??磣髯?踴?刂疲?K使用????ational Instruments 公司的LabVIEW,主要著眼於其?展的??性???力比PLC系??淼拇螅??H可?全世界的???展而不?喔牧跡??蠱??霉????碓?V,?凡?C械??印?x器量?y、?路通?、影像?理…等均可??茫??酥?猓??芍г?ctive X的物件(objects)的插入????渺?V中,?而使LV的能力也越???大到令人咋舌的地步。
 
在LabVIEW程式??的技巧??念上,以下提供一些??人心得供大家?⒖跡?br /> 
if?⑹齙??法
在LabVIEW中?K?]有if的?法,?????T了text-based程式?言的人?碚f,???始?真有??手??,施展不?。解?Q的方法?樗?械?f判??⑹鼉?撓?ase????砣〈?純桑??揪陀???C?言的工程??很快就能上手了,但?是要花一小段?r??磉m???/p>

a=a+1的??法
有?]有搞????基本的??法?要???幔砍潭紉參疵饊?土稅桑?]?,它是很??危????始?r也???有些小困?_,因LabVIEW中,一????翟諞話闈樾蝸輪荒艹霈F在block diagram中一次,?⒁???抵底??導右會嵩龠B回自己本身是最直?的想法,但若如此,便???ata flow的方向相互?褂|的??S出??嗑?,解?Q的方法有?煞N:
1. 1.      使用local variable,如:
 
2. 2.      若是在?圈中便可使用shift register??兔?_成目的,如下?D所示,但?得shift register最好要?初值,否?t初值?㈩A???。
 

getch( )?kbhit( )?
???言有??的人一定很?涯鈽@???函式:getch( )?kbhit( ),????函式的功用差不多,差?是kbhit( )只???y到??是否有按?被按下,而getch( )?t除了kbhit( )的功用外,???骰乇話聰擄存I的ASCII code。????函式可?程式?和Hサ卻?承╂I?指令,非常好用也非常常用,例如:按下”y”或”Y”代表YES,”n”或”N”代表NO等等。
但一到LabVIEW中就??,?程式?絛?r想要即?r?取??有何?入?K不是很方便,常用的做法是?一??numeric control或string control,用滑鼠去移?擁?ontrol上及按滑鼠?,然後再由???入某些?,再按enter或移?踴?蟮?oolbar上按下一??勾勾的按?,才能?㈡I入的?值由程式?入,??噸?榱?渭?目的?程式??的???幼?如按下”y”或”n”)而言,似乎太麻?┝耍?歡?@????幼黠@然?是非常有需要的。
以下提供一????蔚?ubVI:getch( ).vi,具有C?言中getch( )的功能,如此便很容易加到一般程式中了。?程式?到??有按?被按下?r,??聰碌逆I值?鞽鯁峒唇Y束。因其中有用到一??read keyboard.vi的subVI,使用?r要注意在主程式呼叫getch( ).vi前,要先呼叫?Open Keyboard.vi,否?tgetch( ).vi中的Read Keyboard.vi??x不到??,而主程式?束前要呼叫Close Keyboard.vi。
 

程式中有while ?圈的?束方法
一般而言,?程式?絛型晁?械某淌醬a後就自?詠Y束,??情形也就?]什?需要??的。所以以下??Τ淌街杏?hile ???o限?圈在程式?面的情形作??。
1. 1.      程式在?絛?r,按下上方tool bar中的?色?A形停止?。???方法看起?矸獎愕???上?K不理想,理由是你?K?]有真正在程式中??使程式?束的程式?,而是用LabVIEW本身去?止你的程式,程式的data flow?⑼V乖諛惆聰巒V規I那一刻的地方。
2. 2.      稍微改良的?便方法,是用一??Boolean Control(如stop)?磉B在?圈中的停止符?前,按下此control 即停止?圈,而?束程式。如下?D:
  
 要注意的是,?按下stop?r,程式?K不是?上停止,而是要等到下一次重??圈?r,做完?圈?鵲?幼韃??V埂?br />3. 3.      用一??Boolean Control(如stop)?磉B在?圈中的一??case,在true的情形中放?Functions> Application Control中的Stop,?按下此Control?r??迫此程式停止。
 
不?使用???方法要注意一?,就是其??用Stop???vi?斫K止程式的?,和用tool bar中的?色?A形停止?的效果是一?擁模?簿褪怯?abVIEW硬生生地?⒊淌澆K止,若在程式?束前有些所??束?幼鰨??珀P?某些介面?n案的stream或channel,或是??x器?C械手臂??w到某??B或位置等,那?就可能?o法?絛辛恕?br />4. 但若程式中有???(以上)的平行?圈均需停止才能?束程式的?,一般的方法?樵諞???圈的停止符?前?一??Boolean control,如2.中所述,而在其他?圈的停止符?前?上此Boolean control的local variable即可。如下?D所示:
 
此法看?砩?槔硐耄????上仍有其缺?,?是由於LV的while loop???楫??圈的停止符?收到停止???r,?K不??⒓賜V罐?圈,必?要?絛型晗亂淮卧譫?圈中的程式?後才??V罐?圈,?在某些情形下??l生?期外的?果。例如,我的程式中有???while loop,第一??每1秒重?一次,第二???t每1小?r重?一次,?我按下Boolean control同?r?????圈停止?息,希望立即?止程式?r,第一???圈最?牡那樾卧?秒?缺閫V沽耍??詼???圈可能要超?1小?r才停止!
那要如何解?Q???象呢?可以考?]使用上述3.的方法,或??⒖?ccurrence 的功能及使用方法中的?明。

Occurrence 的功能及使用方法
?程式在等待某?事件?生,如甲事件,然後立即去做乙事件,常用的??法?橛靡??while loop去等待甲事件的?生,若甲事件的?生了,?t?止此等待?圈去做乙事件,但?榱嗽鯗M程式效率,通常???等待?圈中??由?elay一段?r?,若delay的?r?短,如一秒以下,甲事件?生到乙事件?始的?r?差可能可以在容忍???齲???elay的?r??,如一小?r,那?甲事件?生到乙事件?始的?r?差?然不符合要求。??r就可以利用Occurrence 的功能了。
Occurrence 的icon在Functions> Advanced> Synchronization中可找到,是LabVIEW中同步控制的功能之一。??用下面的例子?碚f明,有???平行?圈,左?的每一秒??r一次,右?的每10秒??r一次,希望?stop?按下?r,????圈同?r?止。若用前述local variable的方法?碸刂疲?Y果是?第一???圈停止了,但第二???圈?s要等10秒才停止。而以下???程式?t可?到同?r?束的目的。?stop?按下?r,由第一???圈Set Occurrence?生一???息,?鞽齙諞???圈外由Generate Occurrence?生Occurrence的??,再?韉矯懇???圈中的wait on occurrence去?生true??已?止?圈。??б惶幔?褂?ait on occurrence可在其ms timeout(-1)的connector上?上一?底腫??elay的?r?,可不用再使用其他的delay功能。
 

平行?圈?絛?r的同步性
?程式中有???平行?圈同?r?行?r,大部分的情形是希望各平行?圈每次?始?r均能?蟯?劍?殺苊庖恍┏齪躅A期的??r?生。常用有?煞N方法?⑹鋈縵漏r
1. 1.      使用Wait Until Next ms Multiple?
在?圈中加入Wait Until Next ms Multiple的icon?K均?上相同的常?底??elay的?r??短,?K於程式?絛?r,同?r??輿@????圈,如此可?保之後各?圈每次?始?r均同步?始,如下?D所示?
 
但注意,??K不表示各?圈所?絛械拇?狄慘?櫻?縞俠???ask A ?絛幸淮鎢M?r少於100ms,而Task B?絛幸淮鎢M?r大於100ms,可?定的Task A的?圈每?絛羞^一次必??00ms,Task B的?圈每?絛羞^一次必??00ms的整?當叮?虼擻鋅贍薌鄒?圈?絛辛?紗位蚨啻危??肄?圈只?絛辛艘淮味?選H粢?鬢?圈?絛械拇?狄蠶嗤?腦?,便需利用下面第2.中所?⑹齙墓δ芰恕?br />2. 2.      使用Rendezvous?
Rendezvous?榧?系亍??宵c的意思,???功能可在Functions> Advanced> Synchronization中找到,使用?r要先Generate Rendezvous?固定???檔霓?圈,而各?圈中?t要加入Wait at Rendezvous???icon。?程式?絛?r,即使有某?圈先?束,也??鵲絞褂眠@??Rendezvous的所有?圈均?束後,然後再一起同步重新?絛修?圈。注意,要?束程式前要?得Destroy Rendezvous。使用???方法便可?定各?圈每???圈必定同?r?始,且各?圈?絛械拇?狄慘歡ㄏ嗤?O旅媸且????蔚睦?櫻?勺⒁獾礁鬢?圈所?絛械拇?稻?嗤??肄?圈中delay的?r??短?K不??絆?到?圈?絛寫?擔?湊?鬢?圈等待的?r?必相同,就是耗?r最?的那???圈的等待?r?啦。
 

巢??f???的改良?
if…else的?法往往造成了??的???,如C?言中:
if (a==FALSE) b=TRUE
else if (c==FALSE) b=TRUE
else if (d==FALSE) b=FALSE ….;
????出?硭坪鹺??害 (因?e人要花??r?才能了解如何做??判??,但也有可?性不佳的缺?。尤其??在LabVIEW中,因其是graphic language之故,可?性更差(看起?磉?真是”巢??rdquo;啊)。例如下例,要看完?K了解程式如何??判?啵?峙亂?ㄉ弦歡?r?(因false的case中也可能藏有程式?),另一??缺?是程式??完後的VI?n??子駁?臻g。
 
?然有?r如同上?D的巢?罱Y???o法避免,但?判?嗟?l件增多?r,可考?]?????l件以Build Array的方法再加上case????碭??,自己再做??真值表??Q定各case中的?熱菁純傘O?D?橐????法的示意?D。
 
要注意的小地方是Boolean Array?K不能直接?上case???,要?⒅?D成?底軸岵趴梢裕?虼順淌街杏昧艘??Boolean Array To Number的功能。

State Machine 的?念及??法
先?我???碸純?tate Machine的????法吧。基本上一??State Machine也?不?是一???圈?燃由弦??case???而已。每??圈重做(iterate)一次?r,就只做?多case中的一??,再用enum type的constant?Q定下一次?圈重做?r所要?入的case。
下面?一????衛?櫻?f明有三件?序性的工作用State Machine方法所??出的?果。
  
 
  
  

 
 
State Machine依其用法可?作是sequence的?形,但是比?斡?equence的???具有更多的??性????,?⑹鋈縵攏?/p>

  1. 因使用enum type做?楦韃襟E的?明,因此可??tate machine中各case的title均??成文字?⑹觶?@也使得程式的?⑹魴約翱勺x性?好。
  2. 比?容易?⒘鞽?D??成程式,也可很容易?整流程中各步?的?序,?程式出?多??路??r(如若?YES?r去做task 1,?NO?r去做task 2之?或更??的情?r),只要在最後???ext state?r稍加改?即可,?Q??角度?碸矗?簿褪嗆莧菀走_成其它程式?言中的goto的效果,?s能保持程式???的完整性。
  3. 因?橛幸??error state?iT?理各state??淼?rror或exception的?息,使得程式???r,可集中也?容易?理Error Handler的?息。而??理完成?r,又可??窕氐僥囊??state去,或是走到close state?斫Y束???State Machine的?圈。
  4. 在最後有一??close state,也就是在此不?程式?絛杏?o???生,最?都??竭@??state?行一定?束程式的步?,使程式可以?利?束。如此一?恚?悴恢亂蟈e??生?r,因某些???幼?]有做而?生意想不到的?果或”??rdquo;在那?了。

[admin via 研發互助社區 ] 中級LabVIEW程式設計技巧與觀念已經有2728次圍觀

http://cocdig.com/docs/show-post-44711.html