在研制某大型醫(yī)療設(shè)備控制系統(tǒng)時(shí),其內(nèi)部共有26個(gè)大小不一的進(jìn)步電機(jī)需要控制。由于大部分的電機(jī)和控制器需要嵌人治療設(shè)備內(nèi)部,而且這些電機(jī)都驅(qū)動(dòng)有對(duì)應(yīng)的機(jī)械運(yùn)動(dòng)裝置,所以要求盡量減少上位主控機(jī)與各控制器之間的連線。若采用傳統(tǒng)的集中式或集散式控制方式將無(wú)法滿(mǎn)足現(xiàn)場(chǎng)的要求。在對(duì)這些受控電機(jī)的控制任務(wù)進(jìn)行了仔細(xì)分析后發(fā)現(xiàn),系統(tǒng)的實(shí)時(shí)性要求也不是太高。為此我們采用了LonWorks現(xiàn)場(chǎng)總線技術(shù)來(lái)實(shí)現(xiàn)對(duì)這些步進(jìn)電機(jī)的控制。
一、主控機(jī)相關(guān)控制任務(wù)描述
系統(tǒng)主體結(jié)構(gòu)如圖1所示。所有受控的步進(jìn)電機(jī)及其控制器都將安裝放置于治療設(shè)備內(nèi),它們通過(guò)一條78K速率的雙絞線與主機(jī)相連。主機(jī)內(nèi)插一塊PCLTA-20 LON網(wǎng)并行適配器(網(wǎng)卡),用于連接各測(cè)控節(jié)點(diǎn)。為了能直接對(duì)16位數(shù)據(jù)模式的LON網(wǎng)卡進(jìn)行開(kāi)發(fā),選擇了16/32位數(shù)據(jù)模式兼容的操作系統(tǒng)WIN/98。主控機(jī)的主要任務(wù)是根據(jù)操作員的命令設(shè)置和下發(fā)各步進(jìn)電機(jī)的運(yùn)動(dòng)數(shù)據(jù),收集步進(jìn)電機(jī)運(yùn)動(dòng)過(guò)程中反饋的數(shù)據(jù)并以圖形化方式加以顯示。由于這些步進(jìn)電機(jī)的運(yùn)動(dòng)都是獨(dú)立的,不存在相互影響的關(guān)系,故可以分別對(duì)它們進(jìn)行控制。主控機(jī)在工作過(guò)程中完成以下任務(wù):
1.開(kāi)始工作時(shí)對(duì)各測(cè)控節(jié)點(diǎn)及電機(jī)驅(qū)動(dòng)器進(jìn)行狀態(tài)檢測(cè)和初始化設(shè)置
2.設(shè)定步進(jìn)電機(jī)工作于程控方式還是手動(dòng)方式以及電機(jī)方向
3.若是程控方式,需接受操作員設(shè)定的步進(jìn)電機(jī)穩(wěn)速頻率和步進(jìn)值并下傳給各測(cè)控節(jié)點(diǎn)。
4.接收并顯示測(cè)控節(jié)點(diǎn)回送的由電機(jī)軸角編碼器檢測(cè)到的步進(jìn)電機(jī)實(shí)際步進(jìn)值
二、Lonworks測(cè)控節(jié)點(diǎn)結(jié)構(gòu)及功能描述
Lonworks測(cè)控節(jié)點(diǎn)是以Neuron-3150芯片為核心構(gòu)造的測(cè)控單元,配之以64K的Flash-ROM.收發(fā)器采用78K bps雙絞線收發(fā)器。網(wǎng)絡(luò)采用自由拓?fù)浣Y(jié)構(gòu)。每個(gè)Lonworks測(cè)控節(jié)點(diǎn)可以提供11個(gè)可編程多功能I/O端口。其結(jié)構(gòu)如圖2所示。
在工作過(guò)程中Lonworks測(cè)控節(jié)點(diǎn)的主要功能是按主控機(jī)下發(fā)的控制命令和運(yùn)動(dòng)數(shù)據(jù)產(chǎn)生步進(jìn)電機(jī)的方向控制信號(hào)和頻率可變的步進(jìn)脈沖,同時(shí)還要不斷讀人由電機(jī)軸角編碼器回送的電機(jī)實(shí)際運(yùn)動(dòng)數(shù)據(jù)并轉(zhuǎn)發(fā)給主控機(jī)。Lonworks測(cè)控節(jié)點(diǎn)的工作過(guò)程的主要部分如下:
1.系統(tǒng)啟動(dòng)時(shí)對(duì)電機(jī)驅(qū)動(dòng)器狀態(tài)和自身工作狀態(tài)進(jìn)行自檢并報(bào)送主機(jī)
2.接受主機(jī)下發(fā)的步進(jìn)電機(jī)控制參數(shù)。包括當(dāng)前設(shè)定的穩(wěn)速頻率值和當(dāng)前設(shè)定的步進(jìn)值。并按照步進(jìn)值產(chǎn)生具有合適上升速率和下降速率的頻率脈沖。
3.在給步進(jìn)電機(jī)發(fā)步進(jìn)脈沖的同時(shí)記錄電機(jī)軸角編碼器回饋的電機(jī)實(shí)際轉(zhuǎn)動(dòng)值,并在本次步進(jìn)運(yùn)動(dòng)完成后上傳給主控機(jī)。
4.檢測(cè)有關(guān)的開(kāi)關(guān)量狀態(tài)并據(jù)此進(jìn)行相關(guān)的操作。具體開(kāi)關(guān)量有:
(1)電機(jī)手動(dòng)/自動(dòng)運(yùn)行設(shè)置開(kāi)關(guān)K1
(2)手動(dòng)方式下步進(jìn)電機(jī)方向設(shè)置開(kāi)關(guān)K2
(3)手動(dòng)方式下步進(jìn)電機(jī)點(diǎn)動(dòng)開(kāi)關(guān)K3
(4)步進(jìn)電機(jī)所帶機(jī)械裝置運(yùn)動(dòng)零點(diǎn)限位開(kāi)關(guān)狀態(tài)ZERO
(5)步進(jìn)電機(jī)所帶機(jī)械裝置運(yùn)動(dòng)終點(diǎn)限位開(kāi)關(guān)狀態(tài)TERMINI,
(6)步進(jìn)電機(jī)及其驅(qū)動(dòng)器故障狀態(tài)ERROR
三、程序結(jié)構(gòu)與實(shí)現(xiàn)方法
(一)主機(jī)應(yīng)用程序結(jié)構(gòu)
主機(jī)應(yīng)用程序用VC6.0開(kāi)發(fā)。主機(jī)應(yīng)用程序的主要任務(wù)是將控制臺(tái)上輸人的步進(jìn)數(shù)據(jù)發(fā)送給指定的控制節(jié)點(diǎn)以及接收控制節(jié)點(diǎn)在電機(jī)運(yùn)動(dòng)過(guò)程中回饋的實(shí)際運(yùn)動(dòng)位置數(shù)據(jù)并加以顯示。
考慮到系統(tǒng)對(duì)主機(jī)應(yīng)用程序的實(shí)時(shí)性要求及不同節(jié)點(diǎn)與主機(jī)所傳輸數(shù)據(jù)的多樣性,在開(kāi)發(fā)中采用了一些特殊的處理方法。
首先是沒(méi)有采用常規(guī)的網(wǎng)絡(luò)變量來(lái)定義和傳輸數(shù)據(jù)包。因?yàn)榫W(wǎng)絡(luò)變量不僅一次最多只能傳輸31個(gè)字節(jié),而且使用中的限制較多,不符合本應(yīng)甩的具體要求。所以主控機(jī)與各測(cè)控節(jié)點(diǎn)間的通信采用了顯式報(bào)文方式,但實(shí)現(xiàn)過(guò)程較網(wǎng)絡(luò)變量方法復(fù)雜。
另外的一個(gè)特點(diǎn)是為了提高主機(jī)對(duì)節(jié)點(diǎn)的響應(yīng)速度,沒(méi)有采用DDE方式,而是采用了通過(guò)HOST程序直接對(duì)PCLTA-20卡驅(qū)動(dòng)程序進(jìn)行調(diào)用的方法。Lonworks網(wǎng)卡的驅(qū)動(dòng)程序沒(méi)有給出具體的功能調(diào)用,而商家提供的API開(kāi)發(fā)系統(tǒng)又價(jià)格昂貴。經(jīng)仔細(xì)分析PCLTA-20的網(wǎng)卡驅(qū)動(dòng)程序WLDV. DLL;我們發(fā)現(xiàn)WLDV. DLL還是提供了四個(gè)最基本的功能調(diào)用,分別是:打開(kāi)網(wǎng)卡Idv open(),關(guān)閉網(wǎng)卡ldv close(),從網(wǎng)卡中讀取數(shù)據(jù)ldv_read(),和向網(wǎng)卡寫(xiě)數(shù)據(jù)ldv_write()??梢岳眠@四個(gè)基本函數(shù)進(jìn)行二次開(kāi)發(fā)。針對(duì)WLDV. DLL中的四個(gè)基本函數(shù)所進(jìn)行的二次開(kāi)發(fā)最終也是以動(dòng)態(tài)鏈接庫(kù)DLL形式存在的,名為Host. dll,它的主要作用是為上位機(jī)收集電機(jī)信息和下達(dá)上位機(jī)對(duì)電機(jī)的控制命令。主機(jī)應(yīng)用程序與它們之間的關(guān)系可以簡(jiǎn)單的用圖3表示。 Host. dll通過(guò)構(gòu)造的三個(gè)函數(shù)與應(yīng)用程序進(jìn)行交互,它們分別是
void Send(SEND_DATA buf ):
應(yīng)用程序調(diào)用此函數(shù)向下層LON網(wǎng)的節(jié)點(diǎn)發(fā)送電機(jī)的控制信息。
BOOL ReadShare (RCV DATA*readLon):
應(yīng)用程序調(diào)用此函數(shù)獲取下層LON網(wǎng)發(fā)送上來(lái)的信息;
BOOL OperateConfg (up date dv eon*pDvConfig):
下層LON網(wǎng)上各節(jié)點(diǎn)的配置信息保存在一個(gè)名為lonmo-tor. ini的文件中,應(yīng)用程序調(diào)用此函數(shù)可發(fā)更改下層節(jié)點(diǎn)的配置信息并將之保存在lonmotor. ini文件中,應(yīng)用程序?qū)ο聦拥呐渲貌僮靼ㄌ砑?,刪除節(jié)點(diǎn),更換網(wǎng)卡等。如果Windows系統(tǒng)意外崩潰,應(yīng)用程序還可調(diào)用該函數(shù)從下層節(jié)點(diǎn)提取信息,從而重建lonmo-tor. ini文件。
_0 output triggeredc ount sync(10_4)fiqout_ctrl_0;
(二)測(cè)控節(jié)點(diǎn)應(yīng)用程序的設(shè)計(jì)
測(cè)控節(jié)點(diǎn)應(yīng)用程序用Neuron C語(yǔ)言編寫(xiě)。其主要功能是接受上位主控機(jī)的步進(jìn)指令,然后根據(jù)各輸入的控制信息實(shí)現(xiàn)對(duì)步進(jìn)電機(jī)的控制,即輸出按照設(shè)定轉(zhuǎn)速和運(yùn)動(dòng)距離而產(chǎn)生的步進(jìn)脈沖頻率和脈沖個(gè)數(shù)。同時(shí)在電機(jī)運(yùn)動(dòng)過(guò)程中還需不斷對(duì)由電機(jī)軸角編碼器回送的電機(jī)實(shí)際運(yùn)動(dòng)值進(jìn)行記錄,一者為避免丟步,二者向主控機(jī)報(bào)送數(shù)據(jù),主控機(jī)據(jù)此了解實(shí)際的步進(jìn)數(shù)。
編寫(xiě)測(cè)控節(jié)點(diǎn)應(yīng)用程序的主要困難點(diǎn)有以下幾個(gè)方面:(1)必須按照控制臺(tái)任意設(shè)定的電機(jī)轉(zhuǎn)速產(chǎn)生穩(wěn)速過(guò)程步進(jìn)頻率以及起始/停止過(guò)程相應(yīng)的漸升/漸降頻率。(2)在向步進(jìn)電機(jī)輸出脈沖的同時(shí)還需要記錄回饋的電機(jī)實(shí)際步進(jìn)值。為此我們采用了NEURON I/O對(duì)象中的FREQUENCY和TRIGGERED C OUNT對(duì)象相結(jié)合的方法。用FREQUENCY對(duì)象來(lái)產(chǎn)生各種步進(jìn)頻率脈沖;而用TRIGGERED COUNT對(duì)象記錄實(shí)際的步進(jìn)脈沖數(shù)。各I/O對(duì)象定義如下: