|
'
' 汎用シミュレータ.bas
'
' マウス左クリック保持で一時停止
' マウス右クリックで打ち切り終了
'
' H26-08-29 lark12
'
'
width= 1100
height=660
SET BITMAP SIZE width, height
gx=width
gy=2
'左端,右端,下端,上端
set window -gx/20-50,gx,-gy,gy
'描画エリアの背景色着色範囲設定
set area color 1 !'黒
plot area : -gx,-gy;-gx,gy;gx,gy;gx,-gy
'座標描画
draw axes (50,0.1)
draw grid(50,0.1)
'------------------------------------------------------------
n=20 '出力信号数
dim p(n) '出力信号
dim po(n) '前回出力信号
dim p$(n) '出力信号名
dt=0.01 '計算ピッチ
dtx=dt*100 '表示ピッチ:1/100単位
'---------------------------------------------
do
'計算式記述subコール
call cal1 '一時遅れ
'call cal2 '連立方程式
'call cal3 'sin^2+cos^2=1に成る様子
'---------------------------------------------
call draw
t=t+dt
mouse poll xm,ym,left,right
if right=1 then stop '終了
do while left=1 'ポーズ
mouse poll xm,ym,left,right
loop
loop
'-----------------------------------------------
'計算式記述
sub cal1
'1次遅れ
ta=1 '時定数
k=1 'ゲイン
x=1 '入力信号
y=y+( k*x-y)/ta*dt '一時遅れ出力
z=0.63 '63%値
p(0)=x :p$(0)="x"
p(1)=y :p$(1)="y"
p(2)=z :p$(2)="z"
end sub
'----------------------------------------------------
sub cal2
'連立方程式
'解は a=0.1:b=0.2:c=0.3:d=0.4
'5*a+3*b-4*c+2*d=0.7
'4*a-3*b+4*c-2*d=0.2
'5*a+4*b+5*c-5*d=0.8
'2*a+10*b+10*c+9*d=8.8
'原始式を、下記の様に一時遅れの形に変形し、
'繰り返し計算し収束した値が解となる
a=a+( (0.7-(3*b-4*c+2*d) )/5 -a)*dt
b=b+( (0.2-(4*a+4*c-2*d) )/(-3) -b)*dt
c=c+( (0.8-(5*a+4*b-5*d) )/5-c)*dt
d=d+( (8.8-(2*a+10*b+10*c) )/9-d)*dt
p(0)=a :p$(0)="a"
p(1)=b :p$(1)="b"
p(2)=c :p$(2)="c"
p(3)=d :p$(3)="d"
end sub
'----------------------------------------------------
sub cal3
a=sin(t*2)
b=cos(t*2)
c=a^2+b^2 'が1になる様子
p(0)=a :p$(0)="a"
p(1)=b :p$(1)="b"
p(2)=c :p$(2)="c"
end sub
'----------------------------------------------------
sub draw
'出力信号グラフ、信号名の表示
local xd1,yd1,xd2,yd2
'表示記述
set draw mode hidden
set line width 2
'変数名表示エリアクリア
xd1=-100:yd1=-2
xd2=xd1+60:yd2=2
line(xd1,yd1)-(xd2,yd2),1,bf
'左端に出力信号名を、その値の大きさ位置に表示
for i=0 to n-1
col=mod(i,6)+3
line( tx-dtx,po(i))-(tx,p(i)),col
po(i)=p(i)
xd1=-100:yd1=p(i)
set text color col
set text font "MS 明朝",20
plot text,at xd1,yd1:p$(i)
next i
set text font "MS 明朝",11
tx=tx+dtx
'グラフが画面右端まで到達したら、画面更新
if tx>1100 then
'描画エリアの背景色着色範囲設定
set area color 1 !'黒
plot area : -gx,-gy;-gx,gy;gx,gy;gx,-gy
'座標軸描画
draw axes (50,0.1)
draw grid(50,0.1)
tx=0
end if
set text color 5
set text font "MS 明朝",20
plot text,at 850,-1.7:"横軸= sec"
plot text,at 850+80,-1.7,using"##.###":0.1
set draw mode explicit
end sub
'-------------------------------------------
|
|