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

[執行結果]


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





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