![華科機械綜合測試實驗球桿實驗報告_第1頁](http://file4.renrendoc.com/view/9411c2d162a157ecb02eb7c76424e8f1/9411c2d162a157ecb02eb7c76424e8f11.gif)
![華科機械綜合測試實驗球桿實驗報告_第2頁](http://file4.renrendoc.com/view/9411c2d162a157ecb02eb7c76424e8f1/9411c2d162a157ecb02eb7c76424e8f12.gif)
![華科機械綜合測試實驗球桿實驗報告_第3頁](http://file4.renrendoc.com/view/9411c2d162a157ecb02eb7c76424e8f1/9411c2d162a157ecb02eb7c76424e8f13.gif)
![華科機械綜合測試實驗球桿實驗報告_第4頁](http://file4.renrendoc.com/view/9411c2d162a157ecb02eb7c76424e8f1/9411c2d162a157ecb02eb7c76424e8f14.gif)
![華科機械綜合測試實驗球桿實驗報告_第5頁](http://file4.renrendoc.com/view/9411c2d162a157ecb02eb7c76424e8f1/9411c2d162a157ecb02eb7c76424e8f15.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
PAGEPAGE28球桿控制定位系統(tǒng)實驗報告實驗小組成員:周開城u200910555機械0902班張偉u200910571機械0902班一實驗目的(1)掌握對實際物理模型的建模方法。(2)掌握在Matlab中利用Simulink等工具對系統(tǒng)進行模型分析的方法。(3)掌握PID控制算法的原理和實際應用。(4)學習PID參數(shù)的調(diào)節(jié)方法。二實驗系統(tǒng)及實驗原理(一)球桿系統(tǒng)的特點球桿系統(tǒng)是一個典型的非線性系統(tǒng),理論上而言,它是一個真正意義上的非線性系統(tǒng),其執(zhí)行機構還具有很多非線性特性,包括:?死區(qū)?直流馬達和帶輪的傳動非線性。?位置測量的不連續(xù)性。?導軌表面不是嚴格的光滑表面,產(chǎn)生非線性阻力。這些非線性因素對于傳統(tǒng)意義上的測量和建模造成很大的影響,并對系統(tǒng)的控制性能造成非常大的影響,怎樣去設計一個魯棒的控制系統(tǒng),是現(xiàn)代控制理論的一個重要問題。固高科技提供的球桿系統(tǒng)既可以用于研究控制系統(tǒng)運行的非線性動力學,也可以用于研究控制系統(tǒng)的非線性觀測器等,是一個較為通用的實驗設備。因為系統(tǒng)機械結構的特點,球桿系統(tǒng)具有一個最重要的特性——不穩(wěn)定性,對于傳統(tǒng)的實驗方法,存在一些實驗的難處,不穩(wěn)定的系統(tǒng)容易對實驗人員產(chǎn)生危險或是不可預料的傷害,球桿系統(tǒng)相對而言,機械比較簡單,結構比較緊湊,安全性也比較高,是一個可以避免這些危險和傷害的實驗設備。采用智能伺服驅(qū)動模塊和直觀的Windows程序界面,是控制系統(tǒng)實驗的一個理想的實驗設備。(二)球桿系統(tǒng)如圖1所示,包括控制計算機、IPM100伺服驅(qū)動器、球桿本體和光電碼盤、線性傳感器、伺服電機和球桿裝置等部分,組成一個閉環(huán)系統(tǒng)。光電碼盤將杠桿臂與水平方向的夾角、角速度通過RS232接口與計算機通信。在控制系統(tǒng)中,輸入鋼球的控制位置和控制參數(shù),通過控制決策計算輸出電機轉(zhuǎn)動方向、轉(zhuǎn)動速度、加速度等,并由智能伺服驅(qū)動器產(chǎn)生相應的控制量,發(fā)出模擬信號使電機轉(zhuǎn)動,帶動杠桿臂運動從而控制球的位置。本系統(tǒng)為一個單輸入(電機轉(zhuǎn)角θ)、單輸出(鋼球位置x)系統(tǒng)。其中,θ由伺服電機的角度編碼器測定,輸出量x由軌道上電位器輸出的電壓信號獲得。系統(tǒng)的控制框,如圖1所示。整個機構運行如圖2所示:球桿系統(tǒng)主要由以下幾部分組成,如圖所示。(三)機械部分:機械部分包括底座、小球、橫桿、減速皮帶輪、支撐部分、馬達等。小球可以在橫桿上自由的滾動,橫桿的一端通過轉(zhuǎn)軸固定,另一端可以上下轉(zhuǎn)動,通過控制直流伺服電機的位置,帶動皮帶輪轉(zhuǎn)動,通過傳動機構就可以控制橫桿的傾斜角。直流伺服電機帶有增量式編碼器(1000P/R),可以檢測電機的實際位置,在橫桿上的凹槽內(nèi),有一線性的傳感器用于檢測小球的實際位置,兩個實際位置的信號都被傳送給控制系統(tǒng),構成一個閉環(huán)反饋系統(tǒng)。當帶輪轉(zhuǎn)動角度θ,橫桿的轉(zhuǎn)動角度為α,當橫桿偏離水平的平衡位置后,在重力作用下,小球開始沿橫桿滾動。(四)電氣部分球滾動時位移的測量:直線位移傳感器。線性軌道傳感器接+5V電壓。軌道兩邊測得的電壓作為IPM100控制卡A/D輸入口的信號。當小球在軌道上滾動時,通過不銹鋼桿上輸出的電壓信號的測量可得到小球在軌道上的位置。伺服輸出角度的測量:采用IPM100控制器,電機驅(qū)動齒輪轉(zhuǎn)動時通過電機實際位置轉(zhuǎn)換得到角度θ。(五)智能伺服驅(qū)動電機的運動通過IPM100智能伺服驅(qū)動器進行控制,IPM100是一個智能的高精度、全數(shù)字的控制器,內(nèi)嵌100W的驅(qū)動電路,適合于有刷和無刷電機。基于反饋控制原理,在得到傳感器信號后,對信號進行處理,然后給電機繞組施加適當?shù)腜WM電壓信號,這樣,一個相應的扭矩作用于電機軸,使電機開始運動,扭矩的大小決定于用戶程序中的控制算法。IPM100是一款智能的控制器,它除了板載的用于放大控制信號的驅(qū)動放大器和PWM調(diào)制電路,還有一個全數(shù)字的DSP處理芯片,內(nèi)存以及其它邏輯元件,有了這些,就可以實現(xiàn)先進的運動控制技術和PLC的功能,它產(chǎn)生實時的軌跡路徑,實現(xiàn)閉環(huán)伺服控制,執(zhí)行上位機的操作命令,完成板載IO信號的處理,所有這些都依照儲存器的程序指令或是主機的在線命令執(zhí)行,這種嵌入式的智能控制可以提供一個實時性非常好的控制效果,即使因為PC的非實時操作系統(tǒng)而產(chǎn)生延時的情況下。因為控制器可以獨立運行,也可以采用從動模式,本手冊介紹的球桿系統(tǒng)將采用兩種模式。IPM100安裝于控制箱內(nèi)部,通過RS232和上位計算機進行通訊,直流電源也置于控制箱內(nèi)部。(六)球桿系統(tǒng)的數(shù)學模型建立實際上使小球在導軌上加速滾動的力是小球的重力在同導軌平行方向上的分力同小球受到的摩擦力的合力??紤]小球滾動的動力學方程,小球在V型桿上滾動的加速度:(1-1)其中m——小球質(zhì)量;J——小球的轉(zhuǎn)動慣量;R——小球半徑;r——小球位置偏移;g——重力加速度;α——軌道桿與水平面之間的夾角;θ——電動機轉(zhuǎn)角;又有:由于實際摩擦力較小,忽略摩擦力,并由于較小,因此可以忽略此項的影響,其基本的數(shù)學模型轉(zhuǎn)換成如下方式:(1-2)當α<<1時,將上式線性化,得到傳遞函數(shù)如下
(1-3)但是,在實際控制的過程中,桿的仰角α是由電動機的轉(zhuǎn)角輸出來實現(xiàn)的。影響電動機轉(zhuǎn)角θ和桿仰角α之間關系的主要因素就是齒輪的減速比和非線性。因此,我們把該模型進一步簡化:θ(s)=L/d?α(s)(1-4)把(1-4)式代入(1-3)式,我們可以得到另一個模型:得到球桿系統(tǒng)從齒輪角度θ(s)和小球位置(R(s))的傳遞函數(shù):(1-5)因此,球桿系統(tǒng)實際上可以簡化為一個二階系統(tǒng)。(七)比例環(huán)節(jié)控制原理P控制分析對于具有比例控制作用的控制器,控制器的輸出u(t)與誤差作用信號e(t)之間的關系為:或者表示成拉普拉斯變換量的形式如下:式中Kp稱為比例增益。無論是哪一種實際機構,也無論是哪一種形式的操作功率,比例控制器實質(zhì)上是一種增益可調(diào)的放大器??刂葡到y(tǒng)如下圖所示:球桿系統(tǒng)P控制器原理圖可以得到單位負反饋系統(tǒng)的閉環(huán)傳遞函數(shù)為:可以看出是一個二階系統(tǒng)(忽略了各種阻力)。(八)比例積分控制器原理PD控制器的控制作用可以由下列方程定義:其傳遞函數(shù)為:式中Kp為比例增益,而Td稱為微分時間常數(shù),Kp,Td都可以調(diào)節(jié),微分控制作用也稱為速率控制,它是控制器輸出中與作用誤差信號變化率成比例的一部分,微分時間Td是速率控制作用超前于比例控制作用效果的時間間隔,微分控制作用具有預測的優(yōu)點,但是它也具有缺點,因為它放大了噪聲信號,并且還可能在執(zhí)行器中造成飽和效應。微分控制作用不能單獨使用,因為它僅僅在瞬態(tài)過程中才是有效的??刂葡到y(tǒng)如下圖所示:圖3-1球桿系統(tǒng)PD控制器原理圖可以得到單位負反饋系統(tǒng)的閉環(huán)傳遞函數(shù)為:(九)PID控制原理比例控制作用、積分控制作用和微分控制作用的組合叫做比例-加-積分-加-微分控制作用,這種組合具有三種控制作用的優(yōu)點,具有這種組合作用的控制器方程為:即其傳遞函數(shù)為:式中Kp為比例增益,Ti為積分時間,Td為微分時間??刂葡到y(tǒng)如下圖所示:圖4-1球桿系統(tǒng)PID控制器原理圖可以得到單位負反饋系統(tǒng)的閉環(huán)傳遞函數(shù)為:按照齊格勒-尼赫爾斯法則設計PID控制器,因為含有積分器,所以按照第二法設計,首先假設Ki=0,Kd=0,增加Kp直到呈現(xiàn)周期振蕩,取呈現(xiàn)周期振蕩的最小的Kp=Kcr,設周期振蕩的周期為Pcr,按下表計算PID參數(shù):控制器類型KpKiKdP0.5Kcr00PI0.45Kcr1.2/Pcr0PID0.6Kcr2/Pcr0.125Pcr(十)PID參數(shù)調(diào)節(jié)方法(1)經(jīng)驗法:又叫現(xiàn)場湊試法,即先確定一個調(diào)節(jié)器的參數(shù)值PB和Ti,通過改變給定值對控制系統(tǒng)施加一個擾動,現(xiàn)場觀察判斷控制曲線形狀。若曲線不夠理想,可改變PB或Ti,再畫控制過程曲線,經(jīng)反復湊試直到控制系統(tǒng)符合動態(tài)過程品質(zhì)要求為止,這時的PB和Ti就是最佳值。如果調(diào)節(jié)器是PID三作用式,那么要在整定好的PB和Ti的基礎上加進微分作用。由于微分作用有抵制偏差變化的能力,所以確定一個Td值后,可把整定好的PB和Ti值減小一點再進行現(xiàn)場湊試,直到PB、Ti和Td取得最佳值為止。顯然用經(jīng)驗法整定的參數(shù)是準確的。但花時間較多。為縮短整定時間,應注意以下幾點:①根據(jù)控制對象特性確定好初始的參數(shù)值PB、Ti和Td??蓞⒄赵趯嶋H運行中的同類控制系統(tǒng)的參數(shù)值,或參照表所給的參數(shù)值,使確定的初始參數(shù)盡量接近整定的理想值。這樣可大大減少現(xiàn)場湊試的次數(shù)。②在湊試過程中,若發(fā)現(xiàn)被控量變化緩慢,不能盡快達到穩(wěn)定值,這是由于PB過大或Ti過長引起的,但兩者是有區(qū)別的:PB過大,曲線漂浮較大,變化不規(guī)則,Ti過長,曲線帶有振蕩分量,接近給定值很緩慢。這樣可根據(jù)曲線形狀來改變PB或Ti。③PB過小,Ti過短,Td太長都會導致振蕩衰減得慢,甚至不衰減,其區(qū)別是PB過小,振蕩周期較短;Ti過短,振蕩周期較長;Td太長,振蕩周期最短。④如果在整定過程中出現(xiàn)等幅振蕩,并且通過改變調(diào)節(jié)器參數(shù)而不能消除這一現(xiàn)象時,可能是閥門定位器調(diào)校不準,調(diào)節(jié)閥傳動部分有間隙(或調(diào)節(jié)閥尺寸過大)或控制對象受到等幅波動的干擾等,都會使被控量出現(xiàn)等幅振蕩。這時就不能只注意調(diào)節(jié)器參數(shù)的整定,而是要檢查與調(diào)校其它儀表和環(huán)節(jié)。(2)衰減曲線法:是以4:1衰減作為整定要求的,先切除調(diào)節(jié)器的積分和微分作用,用湊試法整定純比例控制作用的比例帶PB(比同時湊試二個或三個參數(shù)要簡單得多),使之符合4:1衰減比例的要求,記下此時的比例帶PBs和振蕩周期Ts。如果加進積分和微分作用,可按表給出經(jīng)驗公式進行計算。若按這種方式整定的參數(shù)作適當?shù)恼{(diào)整。對有些控制對象,控制過程進行較快,難以從記錄曲線上找出衰減比。這時,只要被控量波動2次就能達到穩(wěn)定狀態(tài),可近似認為是4:1的衰減過程,其波動一次時間為Ts。(3)臨界比例帶法,用臨界比例帶法整定調(diào)節(jié)器參數(shù)時,先要切除積分和微分作用,讓控制系統(tǒng)以較大的比例帶,在純比例控制作用下運行,然后逐漸減小PB,每減小一次都要認真觀察過程曲線,直到達到等幅振蕩時,記下此時的比例帶PBk(稱為臨界比例帶)和波動周期Tk,然后按表3-4-3給出的經(jīng)驗公式求出調(diào)節(jié)器的參數(shù)值。按該表算出參數(shù)值后,要把比例帶放在比計算值稍大一點的值上,把Ti和Td放在計算值上,進行現(xiàn)場觀察,如果比例帶可以減小,再將PB放在計算值上。這種方法簡單,應用比較廣泛。但對PBk很小的控制系統(tǒng)不適用。(4)反應曲線法,前三種整定調(diào)節(jié)器參數(shù)的方法,都是在預先不知道控制對象特性的情況下進行的。如果知道控制對象的特性參數(shù),即時間常數(shù)T、時間遲延ξ和放大系數(shù)K,則可按經(jīng)驗公式計算出調(diào)節(jié)器的參數(shù)。利用這種方法整定的結果可達到衰減率φ=0.75的要求三實驗內(nèi)容及實驗過程(一)實驗步驟(1)認真觀察球桿控制定位系統(tǒng),指出系統(tǒng)的各個部分,打開后蓋,認知相關的電氣控制部分及機械傳動部分,并做好記錄。(2)安裝好后蓋,將電源線,通訊線與電源箱,電腦正常連接。(3)接通電源,打開測試軟件。(4)在matlab下打開QGTEST.MDL進入測試界面。(5)點擊運行(6)設置運動位置POS,觀察球桿運動情況。(7)切換伺服開關,運動,停止開關,測試硬件響應。(8)改變運動速度,加速度及位置,觀察運動情況。(9)打開各個示波器(10)用手輕撥鋼球,讓鋼球在滑道上緩慢滾動,觀察采集到鋼球的位置數(shù)據(jù)。(11)停止實時仿真,觀察各示波器數(shù)據(jù),并保存到相應的文件。(二)控制系統(tǒng)的搭建(1)通過改變?nèi)齻€輸入常量的值,改變曲柄的運動速度,加速度和最終停留位置Move_Abs的創(chuàng)建A在桌面上新建一個文件夾,如:“班號組號”。B打開matlab.點擊simulink圖標。新建一個文件。C將User-DefinedFunctions/S-Function拖入新建文件中,改名為Init。D將一個Source/Constant拖入新建文件中,并打開。E將Com輸出端連接Init輸入端。F將Port&Subsystems/EnabledSubsystem拖入新建文件中,并打開。G將其中的“In1—Out1”刪掉。H將User-DefinedFunctions/S-Function拖入EnabledSubsystem中,改名為move_absolute。I將三個Source/Const拖入新建文件中。J將文件mcqg.out,IPM100.CFG,Move_Abs.h,InitIPM_RAM.h,InitIPM_RAM.cpp,TMLcommn.dll,TML_lid.dll,TML_lib.h,TML_lib.lib,文件復制到班號組號中。K在Init框圖上點擊右鍵/S-FunctionParameters.將S-FunctionName改為InitIPM_RAM并確定。I在move_absolute??驁D上點擊右鍵/S-FunctionParameters.將S-FunctionName改為move_Abs.并確定。M將matlab的命令輸入窗口上的CurrentDirectory的路徑設為“班號組號”的路徑。N在命令輸入窗口中依次輸入mexMove_Abs.cpp,mexInitIPM_RAM.cpp。這是可以看到move_absolute框圖輸入端口為3個。輸出為零。O將三個Constant與move_absolute3個輸出端口相連。P保存新建文件取名為Move_Abs1.存入“班級組號”中。運行,觀察曲柄的運行速度,加速度和最終停留位置。(2)小球在球桿上位置數(shù)據(jù)采集Get_AD的創(chuàng)建A在桌面上新建一個文件夾,如:“班號組號”。B打開matlab.點擊simulink圖標。新建一個文件。C將User-DefinedFunctions/S-Function拖入新建文件中,改名為Init。D將一個Source/Constant拖入新建文件中,并打開。E將Com輸出端連接Init輸入端。F將Port&Subsystems/EnabledSubsystem拖入新建文件中,并打開。G將其中的“In1—Out1”刪掉。H將User-DefinedFunctions/S-Function拖入EnabledSubsystem中,改名為Get_ADI另將一個Source/Constant拖入子系統(tǒng)中。J在子系統(tǒng)中拖入一個示波器scop。K將Constant的值改為5.名稱改為AD_NO。L將AD_NO的輸出端與Get_AD的輸出端相連,將Get_AD的輸出端與示波器scop的輸入端相連。M在Get_AD框圖上點擊右鍵/S-FunctionParameters.將S-FunctionName改為Get_AD并確定。N將Get_AD.cpp,Get_AD.h復制到文件夾“班號組號”中。O在命令輸入窗口輸入mexGet_AD.cpp。P將所搭建的模塊另存到12中。取名為GetAD.用手使小球在球桿上移動,用示波器上顯示出小球運動位置的變化軌跡。(3)伺服控制stopandservo的創(chuàng)建A在桌面上新建一個文件夾,如:“班號組號”。B打開matlab.點擊simulink圖標。新建一個文件。C將User-DefinedFunctions/S-Function拖入新建文件中,改名為Init。D將一個Source/Constant拖入新建文件中,并打開。E將Com輸出端連接Init輸入端。F將Port&Subsystems/EnabledSubsystem拖入新建文件中,并打開。G將其中的“In1—Out1”刪掉。H將兩個User-DefinedFunctions/S-Function拖入EnabledSubsystem中,分別改名為stop和servo。I將兩個SignalRouting/ManualSwitch(分別取名為ManualSwitch1和ManualSwitch2)和4個Source/Constant拖入Sbsystem中。J將ManualSwitch1和ManualSwitch2的兩個輸入端分別與兩個Constant相連。K將ManualSwitch1的輸出端與stop相連。將ManualSwitch2的輸出端與servo相連。L與ManualSwitch1相連的兩個Constant分別取值-1,改名continue和3,改名為stop.與ManualSwitch2相連的兩個Constant分別取值0,改名POWEROFF和1,改名為POWERON。M將Stop.cpp,Stop.h,Servo.cpp,Servo.h復制粘貼到“班號組號”中。N在命令輸入窗口中一次輸入mexStop.cpp,mexServo.cpp。O將所搭建的模塊另存到“班號組號”中。取名為stoppandservo.運行:若將stop與-1連接,servo與1連接。則運行時,曲柄將運動到特定位置后停止運動;若在中途改變stop與3連接,則曲柄立即停止運動;若沒有上一步,將servo改為與0相連,則曲柄立即自然下垂到初始位置,再將servo改為與1相連,則曲柄立即又回到目標位置。(4)根據(jù)球桿系統(tǒng)的模型,建立PID控制器,控制球在球桿某個位置的simulink控制模型。A在桌面上新建一個文件夾,如:“班號組號”。B打開matlab.點擊simulink圖標。新建一個文件。C將User-DefinedFunctions/S-Function拖入新建文件中,改名為Init。D將一個Source/Constant拖入新建文件中,并打開。E將Com輸出端連接Init輸入端。F將Port&Subsystems/EnabledSubsystem拖入新建文件中,并打開。G將其中的“In1—Out1”刪掉。H創(chuàng)建子系統(tǒng)如下圖所示,離散PID控制器如下圖所示。圖(a)圖(b)圖(c)(三)實驗C代碼及相關函數(shù)說明(1)球桿模型c代碼Get_AD.cpp/*Copyright2003-2004TheMathWorks,Inc.*///*******************************************************************//****Tobuildthismexfunctionuse:mexMytst.cpp****//*******************************************************************#include"Get_AD.h"#defineWIN32//#ifndefWIN32//#error"OnlyWIN32versionisavailable"http://#endif#include"windows.h"#defineS_FUNCTION_LEVEL2#defineS_FUNCTION_NAMEGet_AD//Needtoincludesimstruc.hforthedefinitionoftheSimStructand//itsassociatedmacrodefinitions.#include"simstruc.h"#include"TML_lib.h"http://#include"TML_lib_compact.h"#pragmacomment(lib,"TML_lib.lib")#pragmawarning(disable:4761)#defineIS_PARAM_DOUBLE(pVal)(mxIsNumeric(pVal)&&!mxIsLogical(pVal)&&\!mxIsEmpty(pVal)&&!mxIsSparse(pVal)&&!mxIsComplex(pVal)&&mxIsDouble(pVal))//Function:mdlInitializeSizes===============================================//Abstract://ThesizesinformationisusedbySimulinktodeterminetheS-function//block'scharacteristics(numberofinputs,outputs,states,etc.).staticvoidmdlInitializeSizes(SimStruct*S){//NoexpectedparametersssSetNumSFcnParams(S,0);//ParametermismatchwillbereportedbySimulinkif(ssGetNumSFcnParams(S)!=ssGetSFcnParamsCount(S)){return;}//SpecifyI/O//if(!ssSetNumInputPorts(S,0))return;if(!ssSetNumInputPorts(S,1))return;ssSetInputPortWidth(S,0,DYNAMICALLY_SIZED);ssSetInputPortDirectFeedThrough(S,0,1);if(!ssSetNumOutputPorts(S,1))return;ssSetOutputPortWidth(S,0,DYNAMICALLY_SIZED);ssSetNumSampleTimes(S,1);//ReserveplaceforC++objectssSetNumPWork(S,1);ssSetOptions(S,SS_OPTION_WORKS_WITH_CODE_REUSE|SS_OPTION_EXCEPTION_FREE_CODE|SS_OPTION_USE_TLC_WITH_ACCELERATOR);}//Function:mdlInitializeSampleTimes=========================================//Abstract://Thisfunctionisusedtospecifythesampletime(s)foryour//S-function.Youmustregisterthesamenumberofsampletimesas//specifiedinssSetNumSampleTimes.staticvoidmdlInitializeSampleTimes(SimStruct*S){ssSetSampleTime(S,0,CONTINUOUS_SAMPLE_TIME);//INHERITED_SAMPLE_TIMEssSetOffsetTime(S,0,0.0);ssSetModelReferenceSampleTimeDefaultInheritance(S);}//Function:mdlStart=======================================================//Abstract://Thisfunctioniscalledonceatstartofmodelexecution.Ifyou//havestatesthatshouldbeinitializedonce,thisistheplace//todoit.#defineMDL_STARTstaticvoidmdlStart(SimStruct*S){//StorenewC++objectinthepointersvectorDoubleAdder*da=newDoubleAdder();//InputRealPtrsTypeuPtrs=ssGetInputPortRealSignalPtrs(S,0);ssGetPWork(S)[0]=da;}//Function:mdlOutputs=======================================================//Abstract://Inthisfunction,youcomputetheoutputsofyourS-function//block.Generallyoutputsareplacedintheoutputvector,ssGetY(S).staticvoidmdlOutputs(SimStruct*S,int_Ttid){//RetrieveC++objectfromthepointersvector//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//GetdataaddressesofI/OInputRealPtrsTypeu=ssGetInputPortRealSignalPtrs(S,0);real_T*y=ssGetOutputPortRealSignal(S,0);////CallAddTomethodandreturnpeakvalue//y[0]=da->AddTo(*u[0]);//shortval_ad;shortAD_No;WORDadr_AD;AD_No=*u[0];adr_AD=0;if(AD_No==2)adr_AD=0x23e;if(AD_No==5)adr_AD=0x241;if(adr_AD!=0){TS_GetIntVariable(adr_AD,val_ad);*y=400.00*((float)(unsignedshort)val_ad/65535.00);}//}//Function:mdlTerminate=====================================================//Abstract://Inthisfunction,youshouldperformanyactionsthatarenecessary//attheterminationofasimulation.Forexample,ifmemorywas//allocatedinmdlStart,thisistheplacetofreeit.staticvoidmdlTerminate(SimStruct*S){//RetrieveanddestroyC++object//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//deleteda;}//RequiredS-functiontrailer#ifdefMATLAB_MEX_FILE/*IsthisfilebeingcompiledasaMEX-file?*/#include"simulink.c"/*MEX-fileinterfacemechanism*/#else#include"cg_sfun.h"/*Codegenerationregistrationfunction*/#endifInitIPM_RAM.cpp/*Copyright2003-2004TheMathWorks,Inc.*///*******************************************************************//****Tobuildthismexfunctionuse:mexMytst.cpp****//*******************************************************************#include"InitIPM_RAM.h"#defineWIN32//#ifndefWIN32//#error"OnlyWIN32versionisavailable"http://#endif#include"windows.h"#defineS_FUNCTION_LEVEL2#defineS_FUNCTION_NAMEInitIPM_RAM//Needtoincludesimstruc.hforthedefinitionoftheSimStructand//itsassociatedmacrodefinitions.#include"simstruc.h"#include"TML_lib.h"http://#include"TML_lib_compact.h"#pragmacomment(lib,"TML_lib.lib")#pragmawarning(disable:4761)#defineIS_PARAM_DOUBLE(pVal)(mxIsNumeric(pVal)&&!mxIsLogical(pVal)&&\!mxIsEmpty(pVal)&&!mxIsSparse(pVal)&&!mxIsComplex(pVal)&&mxIsDouble(pVal))//Function:mdlInitializeSizes===============================================//Abstract://ThesizesinformationisusedbySimulinktodeterminetheS-function//block'scharacteristics(numberofinputs,outputs,states,etc.).staticvoidmdlInitializeSizes(SimStruct*S){//NoexpectedparametersssSetNumSFcnParams(S,0);//ParametermismatchwillbereportedbySimulinkif(ssGetNumSFcnParams(S)!=ssGetSFcnParamsCount(S)){return;}//SpecifyI/O//if(!ssSetNumInputPorts(S,0))return;if(!ssSetNumInputPorts(S,1))return;ssSetInputPortWidth(S,0,DYNAMICALLY_SIZED);ssSetInputPortDirectFeedThrough(S,0,1);if(!ssSetNumOutputPorts(S,1))return;ssSetOutputPortWidth(S,0,DYNAMICALLY_SIZED);ssSetNumSampleTimes(S,1);//ReserveplaceforC++objectssSetNumPWork(S,1);ssSetOptions(S,SS_OPTION_WORKS_WITH_CODE_REUSE|SS_OPTION_EXCEPTION_FREE_CODE|SS_OPTION_USE_TLC_WITH_ACCELERATOR);}//Function:mdlInitializeSampleTimes=========================================//Abstract://Thisfunctionisusedtospecifythesampletime(s)foryour//S-function.Youmustregisterthesamenumberofsampletimesas//specifiedinssSetNumSampleTimes.staticvoidmdlInitializeSampleTimes(SimStruct*S){ssSetSampleTime(S,0,INHERITED_SAMPLE_TIME);ssSetOffsetTime(S,0,0.0);ssSetModelReferenceSampleTimeDefaultInheritance(S);}//Function:mdlStart=======================================================//Abstract://Thisfunctioniscalledonceatstartofmodelexecution.Ifyou//havestatesthatshouldbeinitializedonce,thisistheplace//todoit.#defineMDL_STARTstaticvoidmdlStart(SimStruct*S){//StorenewC++objectinthepointersvector//DoubleAdder*da=newDoubleAdder();shortrtn;InputRealPtrsTypeuPtrs=ssGetInputPortRealSignalPtrs(S,0);//ssGetPWork(S)[0]=da;//FILE*pfile;DWORDnBaud=115200;BYTEnHostID=255;BYTEnRSType=SERIAL_RS232;BYTEnPort=1;WORDstart_address;//pfile=fopen("rtn.txt","wt");nPort=*uPtrs[0];rtn=TS_OpenSerialPort(nRSType,nPort,nHostID,nBaud);//fprintf(pfile,"TS_OpenSerialPort:%d\n",rtn);rtn=TS_SetupAxis(255,"IPM100.cfg");//fprintf(pfile,"TS_SetupAxis:%d\n",rtn);rtn=TS_SelectAxis(255);//fprintf(pfile,"TS_SelectAxis:%d\n",rtn);rtn=TS_Reset();Sleep(100);////1¤×÷·?ê?????_20060917//Downloadthe"Ex29RAM.out"fileonthedriveTS_DownloadProgram("mcqg.out",start_address);//Afterthefiledownload,executethedownloadedcodeTS_GOTO(start_address);//gotothestartaddressofthesetupprogram//Afterthis,youcanstartsendingon-linecommandstowardsthedrive//rtn=TS_Power(POWER_ON);//fprintf(pfile,"TS_Power:%d\n",rtn);//rtn=TS_MoveVelocity(2,0.64,MOVE_IMMEDIATE,FROM_REFERENCE);rtn=TS_MoveAbsolute(4420,5,1,UPDATE_IMMEDIATE,FROM_REFERENCE);//fprintf(pfile,"TS_MoveVelocity:%d\n",rtn);//fclose(pfile);Sleep(100);}//Function:mdlOutputs=======================================================//Abstract://Inthisfunction,youcomputetheoutputsofyourS-function//block.Generallyoutputsareplacedintheoutputvector,ssGetY(S).staticvoidmdlOutputs(SimStruct*S,int_Ttid){//RetrieveC++objectfromthepointersvector//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//GetdataaddressesofI/O//InputRealPtrsTypeu=ssGetInputPortRealSignalPtrs(S,0);real_T*y=ssGetOutputPortRealSignal(S,0);//CallAddTomethodandreturnpeakvalue//y[0]=da->AddTo(*u[0]);///*WORDadr_APOS=0x228;//addressoftheAPOSTMLvariable-measuredpositionlongi_APOS=0;//variablestoringtheactualpositionreadfromthedriveTS_GetLongVariable(adr_APOS,i_APOS);//readtheactualpositionif(i_APOS<(4420-10))*y=1;//*/////Sleep(50);*y=1;}//Function:mdlTerminate=====================================================//Abstract://Inthisfunction,youshouldperformanyactionsthatarenecessary//attheterminationofasimulation.Forexample,ifmemorywas//allocatedinmdlStart,thisistheplacetofreeit.staticvoidmdlTerminate(SimStruct*S){//RetrieveanddestroyC++object//TS_MoveAbsolute(0,3,0.1,UPDATE_IMMEDIATE,FROM_REFERENCE);//FROM_MEASURE//Sleep(200);//TS_MoveVelocity(0,0.1,MOVE_IMMEDIATE,FROM_REFERENCE);TS_Power(POWER_OFF);TS_CloseSerialPort();//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//deleteda;}//RequiredS-functiontrailer#ifdefMATLAB_MEX_FILE/*IsthisfilebeingcompiledasaMEX-file?*/#include"simulink.c"/*MEX-fileinterfacemechanism*/#else#include"cg_sfun.h"/*Codegenerationregistrationfunction*/#endifMove_AbS.cpp/*Copyright2003-2004TheMathWorks,Inc.*///*******************************************************************//****Tobuildthismexfunctionuse:mexMytst.cpp****//*******************************************************************#include"Move_Abs.h"#defineWIN32//#ifndefWIN32//#error"OnlyWIN32versionisavailable"http://#endif#include"windows.h"#defineS_FUNCTION_LEVEL2#defineS_FUNCTION_NAMEMove_Abs//Needtoincludesimstruc.hforthedefinitionoftheSimStructand//itsassociatedmacrodefinitions.#include"simstruc.h"#include"TML_lib.h"http://#include"TML_lib_compact.h"#pragmacomment(lib,"TML_lib.lib")#pragmawarning(disable:4761)#defineIS_PARAM_DOUBLE(pVal)(mxIsNumeric(pVal)&&!mxIsLogical(pVal)&&\!mxIsEmpty(pVal)&&!mxIsSparse(pVal)&&!mxIsComplex(pVal)&&mxIsDouble(pVal))//Function:mdlInitializeSizes===============================================//Abstract://ThesizesinformationisusedbySimulinktodeterminetheS-function//block'scharacteristics(numberofinputs,outputs,states,etc.).staticvoidmdlInitializeSizes(SimStruct*S){//Noexpectedparametersinti;ssSetNumSFcnParams(S,0);//ParametermismatchwillbereportedbySimulinkif(ssGetNumSFcnParams(S)!=ssGetSFcnParamsCount(S)){return;}//SpecifyI/Oif(!ssSetNumInputPorts(S,3))return;for(i=0;i<3;i++){ssSetInputPortWidth(S,i,1);//DYNAMICALLY_SIZEDssSetInputPortDirectFeedThrough(S,i,1);}if(!ssSetNumOutputPorts(S,0))return;//ssSetOutputPortWidth(S,0,DYNAMICALLY_SIZED);ssSetNumSampleTimes(S,1);//ReserveplaceforC++objectssSetNumPWork(S,1);ssSetOptions(S,SS_OPTION_WORKS_WITH_CODE_REUSE|SS_OPTION_EXCEPTION_FREE_CODE|SS_OPTION_USE_TLC_WITH_ACCELERATOR);}//Function:mdlInitializeSampleTimes=========================================//Abstract://Thisfunctionisusedtospecifythesampletime(s)foryour//S-function.Youmustregisterthesamenumberofsampletimesas//specifiedinssSetNumSampleTimes.staticvoidmdlInitializeSampleTimes(SimStruct*S){ssSetSampleTime(S,0,CONTINUOUS_SAMPLE_TIME);//INHERITED_SAMPLE_TIMEssSetOffsetTime(S,0,0.0);ssSetModelReferenceSampleTimeDefaultInheritance(S);}//Function:mdlStart=======================================================//Abstract://Thisfunctioniscalledonceatstartofmodelexecution.Ifyou//havestatesthatshouldbeinitializedonce,thisistheplace//todoit.#defineMDL_STARTstaticvoidmdlStart(SimStruct*S){//StorenewC++objectinthepointersvectorDoubleAdder*da=newDoubleAdder();InputRealPtrsTypeuPtrs=ssGetInputPortRealSignalPtrs(S,0);ssGetPWork(S)[0]=da;}//Function:mdlOutputs=======================================================//Abstract://Inthisfunction,youcomputetheoutputsofyourS-function//block.Generallyoutputsareplacedintheoutputvector,ssGetY(S).staticvoidmdlOutputs(SimStruct*S,int_Ttid){//RetrieveC++objectfromthepointersvector//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//GetdataaddressesofI/OInputRealPtrsTypeu=ssGetInputPortRealSignalPtrs(S,0);real_T*y=ssGetOutputPortRealSignal(S,0);////CallAddTomethodandreturnpeakvalue//y[0]=da->AddTo(*u[0]);//shortrtn;FILE*pfile;pfile=fopen("rtn.txt","wt");fprintf(pfile,"*u[0]:%ld\n",*u[0]);fprintf(pfile,"*u[1]:%f\n",*u[1]);fprintf(pfile,"*u[2]:%f\n",*u[2]);rtn=TS_MoveAbsolute(*u[0],*u[1],*u[2],UPDATE_IMMEDIATE,FROM_REFERENCE);//rtn=TS_MoveAbsolute(2000,5,0.01,UPDATE_IMMEDIATE,FROM_REFERENCE);fprintf(pfile,"TS_MoveAbsolute:%d\n",rtn);fclose(pfile);//}//Function:mdlTerminate=====================================================//Abstract://Inthisfunction,youshouldperformanyactionsthatarenecessary//attheterminationofasimulation.Forexample,ifmemorywas//allocatedinmdlStart,thisistheplacetofreeit.staticvoidmdlTerminate(SimStruct*S){//RetrieveanddestroyC++object//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//deleteda;}//RequiredS-functiontrailer#ifdefMATLAB_MEX_FILE/*IsthisfilebeingcompiledasaMEX-file?*/#include"simulink.c"/*MEX-fileinterfacemechanism*/#else#include"cg_sfun.h"/*Codegenerationregistrationfunction*/#endif(1)Get_ADA函數(shù)功能:采集AD數(shù)據(jù)(對于球桿系統(tǒng)為采集小球位置);B函數(shù)實現(xiàn)描述:定義AD采樣端口的值、地址、AD端口號等變量對他們賦初始值IPM100運動控制器有兩個10位的模擬量輸入端口,AD2和AD5,該函數(shù)中對AD端口號AD_No(系統(tǒng)默認為5)進行判斷并讀取該端口模擬量的值,并賦給變量val_ad。再通過讀取內(nèi)存中模擬量輸入端口對應地址單元內(nèi)的值,根據(jù)*y=400.00*((float)(unsignedshort)val_ad/65535.00)計算出小球的實際位置(單位毫米)。其中400為整個位移傳感器的長度(400毫米),65535(1111111111111111)B為小球位置為400mm時對應的值。備注:AD轉(zhuǎn)換結果有10位的分辨率,并左移6位。這樣AD轉(zhuǎn)換后的值在內(nèi)存中為16位。該函數(shù)的輸入是AD輸入通道模擬量經(jīng)轉(zhuǎn)換后在內(nèi)存中的值,輸出為計算出來的小球的實際位置。C使用說明:1個輸入:AD端口號1個輸出:經(jīng)過換算出來的小球的位置Y(2)Move_Abs函數(shù)功能:絕對運動命令:控制電機運動函數(shù)實現(xiàn)描述:輸入電機的目標位置、目標速度和目標加速度,使電機運動到設定的目標位置使用說明:3個輸入:設定運動的速度和加速度及目標位置(3)Stop函數(shù)功能:運動停止命令函數(shù)函數(shù)實現(xiàn)描述:讀入電機停車的方式(默認STOP_3系統(tǒng)以設定的加減速度使用說明:一個輸入:設定停止模式(4)Servo_on函數(shù)功能:電機伺服控制函數(shù)實現(xiàn)描述:讀
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代物流在醫(yī)療行業(yè)的應用與挑戰(zhàn)
- 水環(huán)境治理項目的技術經(jīng)濟分析
- 出租車駕駛員職業(yè)素養(yǎng)與團隊協(xié)作能力考核試卷
- 現(xiàn)代企業(yè)管理中知識產(chǎn)權保護策略
- 交通運輸設備修理進階課程考核試卷
- 現(xiàn)代物流與城市交通擁堵的相互影響
- 電信客服的未來發(fā)展趨勢
- 2025-2030年城市熱島效應監(jiān)測系統(tǒng)企業(yè)制定與實施新質(zhì)生產(chǎn)力戰(zhàn)略研究報告
- 2025-2030年可變形家居工具行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報告
- 2025-2030年可調(diào)角度牙科手術椅行業(yè)跨境出海戰(zhàn)略研究報告
- GB/T 4365-2024電工術語電磁兼容
- 高校體育課程中水上運動的安全保障措施研究
- 油氣勘探風險控制-洞察分析
- GB 12710-2024焦化安全規(guī)范
- 2022年中考化學模擬卷1(南京專用)
- 醫(yī)療機構質(zhì)量管理指南
- 2024-2025銀行對公業(yè)務場景金融創(chuàng)新報告
- 《醫(yī)療機構老年綜合評估規(guī)范(征求意見稿)》
- 2025屆鄭州市高三一診考試英語試卷含解析
- 2025年軍隊文職考試《公共科目》試題與參考答案
- 新《安全生產(chǎn)法》安全培訓
評論
0/150
提交評論