買書捐殘盟

2011年6月25日 星期六

紅綠燈控制

[功能說明]
1.當開關X20按下,開始控制。
2.綠燈號(Y2)亮,維持10秒鐘。
2.綠燈經10秒後,每1秒閃爍1次,共閃爍3次。
3.綠燈閃爍3次之後,切換黃燈號(Y1),維持5秒鐘,且綠燈熄滅。
4.黃燈經5秒後,切換紅燈號(Y0),維持10秒鐘,且黃燈熄滅。
5.反覆2~5步驟。

[程式碼]


[執行結果]

2011年6月23日 星期四

大賣場人員及汽車進出之檢測

功能說明:
人員方面的控制:
1.入口檢測器(X0)感測有人進入,則綠色指示燈(Y1)閃爍顯示。
2.出口減測器(X1)感測有人出去,則五秒後,綠色指示燈(Y1)熄滅。

車輛方面的控制:
1.入口檢測器(X2)感測有車進入,則綠色指示燈(Y4)閃爍顯示。
2.出口減測器(X3)感測有車出去,則五秒後,綠色指示燈(Y4)熄滅。
3.車子進入口處之後,於出口處之間10秒內未通過時,則迴轉紅燈(Y3)閃爍顯示及警示器(Y7)響
4.車子開出出口處後,迴轉紅燈(Y3)熄滅及警示器(Y7)停止發響

[PLC程式]

[執行結果]

2011年6月21日 星期二

餐廳等候鈴的設計

程式說明:
1.按下桌上的開關(X0),牆壁的指示燈(Y0)會亮

2. 當X0放開不按(off),指示燈Y0仍亮

3. 按下桌上的開關(X1),牆壁的指示燈(Y1)會亮

4. 當X1放開不按(off),指示燈Y1仍亮

5.若Y0,Y1燈均有亮,則操作盤的PL4(Y23)指示燈會亮

6.當按下開關(X20),則Y0,Y1及Y23指示燈熄滅


[執行結果]


2011年6月20日 星期一

可程式控制器(PLC)紅綠燈控制

功能:
每3秒鐘切換紅燈或綠燈。使用內建Timer記數切換。



[程式]







1.開關24 ON,計時器T1開始計時,紅燈亮起,3秒後紅燈滅,綠燈亮
2.同時刻,計時器T2開始計時,3秒後綠燈滅,紅燈亮,T1歸零
3.此控制由T1、T2交互控制燈號

2011年6月16日 星期四

可程式控制器,軟體模擬

過去筆者在求學時代,利用可程式控制器(PLC)來進行自動控制取代人力控制,早已不是新鮮事。不過一台小型PLC不便宜,初學者如果要入門學習PLC除了需要一部 PLC之外,大概也需要參加訓練班,取得教材、有教師指導才有辦法使用。

在網路尋找相關的PLC模擬程式,竟有以前使用的廠牌FX2-火狐狸二號,所以學習沒有太大阻力。PLC主要藉由a接點或b接點,並搭配timer,來進行簡易或複雜的程序控制,重拾過去所學,再次玩一玩,讓腦力激盪一下也不錯。


軟體的特色更具有教學區,對於初學者入門PLC,非常有幫助。如果以前有學過,更具溫故知新之效。隨堂更有測驗,可以考驗自己的程度。

2011年6月14日 星期二

採用滑動模式設計,應用於NXT馬達定位控制

根據前述(線性非時變,可變結構滑動模式的概念),茲嘗試建立滑動模式控制應用於NXT馬達定位控制,結果定位效果顯著且迅速。

相關參數簡述如下:
(一)滑動曲面函數S(X)=0.7X1+X2=0
   其中X1=期望值-實際量測值,X2=X1變化率
(二)當S‧X1>0,提供一正向驅動控制量,本例為Ud=2*err;
   當S‧X1<0,提供一正向驅動控制量,本例為Ud=-2*err;
   滑動模式控制量Ueq=-0.5*err;
(三)總驅動控制量U=Ud+Ueq
(四)紀錄X1、X2及馬達回應的encoder轉動值,儲存至NXT主機中(本例指定為DataLog.txt)。

[執行結果]



左圖為定位控制的觀測值,期望值為180度。由圖中可看出定位速度很快。













左圖為x1,x2的平面軌跡圖。
迅速滑向原點。















上述參數可由使用者自行更改,以求較佳控制,筆者僅略以此控制法則說明滑動模式非常適用。

[原始程式]
task main()
{
ResetRotationCount(OUT_A);
long readvalue=0;
long DesirePosition=180;
long err=0,prev_err=0;;
long cerr=0;
float S=0;
float Ud=0,Ueq=0;
int U=0;

byte fileHandle;
short bytesWritten;
DeleteFile("DataLog.txt");
CreateFile("DataLog.txt",10000,fileHandle);
string str_position;
string str_err;
string str_cerr;
string str_log;

while(!ButtonPressed(BTNCENTER,true))
{
str_position=NumToStr(readvalue);
str_err=NumToStr(err);
str_cerr=NumToStr(cerr);
str_log= str_position+" " +str_err+ " " +str_cerr;
WriteLnString(fileHandle,str_log,bytesWritten);

readvalue=MotorRotationCount(OUT_A);
err=DesirePosition-readvalue;
cerr=(err-prev_err);

S=0.7*(err)+(cerr);
prev_err=err;

if(S*err>0)
{
Ud=2*err;
}
if(S*err<0) { Ud=-2*err; } Ueq= -0.5*err; U=Ud+Ueq; if(U>100) U=100;
if(U<-100) U=-100; OnFwd(OUT_A,U); TextOut(0,LCD_LINE1,"degree="); NumOut(6*8,LCD_LINE1,readvalue); Wait(50); Off(OUT_A); ClearScreen(); } CloseFile(fileHandle); }

2011年6月13日 星期一

線性非時變系統,可變結構滑動模式的概念

可變結構對於系統參數變動有極佳、強健的控制特性,研究所曾學習此一控制方法。由於目前正投入研究segway的平衡控制,所以重拾以前所學。

滑動模式(Sliding Mode, SM)是可變結構(Variable Structure System, VSS)的一支學問,其控制的主幹,在於建立滑動曲面函數,迫使系統狀態,往特定的滑動曲面逼近,並誘使其不離開滑動曲面,直至逼近期望值。

滑動曲面函數定義為:





S(Xi)=C1X1+C2X2+....+Cn-1Xn-1+Xn=0
其中X即使用者定義的觀測變數,例如:
X1=期望值-實際測量值=誤差值,實際測量值可由感測器或儀表測得
X2=(當前時刻X1-前一時刻X1)/△T=誤差變化率
而C為常數係數,最高項次之係數為1

控制器根據系統觀測變數,提供輸入控制量,讓觀測的變數到達滑動區面函數,此一控制量稱之為到達模式控制量(reaching mode control,Ud)或(hitting) 。
當觀測變數到達或逼近滑動曲面後,為了使該觀測值不離開滑動曲面,更期望它沿著滑動曲面移動而滑向原點達到期望值,控制器必須提供足量的控制量(等效控制量,Ueq)來維持系統奔向期望值。如下圖即觀測變數沿著滑動曲面滑向原點示意圖。



(一)到達模式控制律(hitting law)
   條件:S‧X1>0
   Ud=α‧X1
   條件:S‧X1<0
   Ud=β‧X1
   其中α>0、β<0
(二)滑動模式控制律(sliding mode law)
   Ueq=γ‧X1
 (三)U=Ud+Ueq



由於現今的控制系統均採微電腦控制,所以離散時間的控制設計,觀測變數不可能準確落在滑動曲面上,當進入滑動曲面後,必然於曲面的兩側左右顫動(chatter),但仍會逐步進入期望值。

假設有一線性非時變系統如下:











可知該狀態方程式如下:







若假設某一系統微分方程式為x"(t)+2x'(t)+3x(t)=u(t),則狀態方程式表示如下:






其中x=x1、dx/dt=x2



若我假定滑動函數S:0.7(z1)+(z2)=0,此函數必通過z1,z2平面的原點。

滑動函數原常用x1,x2作為滑動函數之觀測變數,但易與系統狀態變數混淆,所以爰用z1,z2作為觀測變數。

[程式碼]
clear all
clc

%二階微分方程X'=AX+BU Y=CX+DU
a11=0;a12=1;a21=-2;a22=-3;
A=[a11 a12;a21 a22];
B=[0;1];
C=[1 0];
D=0;
U=0;
T=0.005; %取樣時間
T_End=20; %結束時間
X=[0;0]; %狀態變數X1
dot_X=[0;0];
R=10; %期望值(參考值)
cnt=1;
alpha=20;
beta=-20;
Theta=0;

%滑動函數參數S=C1*e+C2*ce
C1=0.7;
C2=1;

cond=-A(2,2)*C1-C1^2+A(2,1)/B(2,1);
[A,B,C,D]=c2dm(A,B,C,D,T); %微分方程轉換離散方程模型

for i=0:T:T_End
dot_X=A*X+B*U;
N=C*X+D*U;

Theta=Theta+N*T;

err(cnt)=R-Theta;

if (cnt==1)
cerr(cnt)=0;
else
cerr(cnt)=(err(cnt)-err(cnt-1))/T;
end

S=C1*err(cnt)+C2*cerr(cnt);

if (S*err(cnt)>0)
Ud=alpha*err(cnt);
end
if(S*err(cnt)<0)
   Ud=beta*err(cnt);
end
Ueq=cond*err(cnt);
U=Ud+Ueq;
X=dot_X;
cnt=cnt+1;
end

plot(err,cerr,'-');
axis([0 15 -15 0]);
hold on
X2=C1*[0 -15];
X1=[0 15];
plot(X1,X2,'r-');
hold off
grid
xlabel('X1');
ylabel('X2');
[模擬執行結果]



從模擬的結果觀察得知,觀測變數x1,x2(即滑動函數定義的變數)其移動軌跡在初值迅速逼近滑動函數,並在函數的兩側切換控制量,使其維持在滑動面直至期望值。