DSbasic 入門してみる(3)往復運転
これまでの(1)、(2)の記事で、DSbasicで自動運転を行うための準備体操が終わりました。
今回から、いよいよ実際の自動運転処理を試してみます。
往復運転
まず最初は、検知区間②~③を行ったり来たりする単純な往復運転を自動化してみよう!
この往復運転については、Yaasanさんのブログでサンプルプログラムを提供してくれています。
これはもうパクって参考にさせてもらうしかないですよね!
記事内の「s88test.zip」がそうです。ただ、私とやーさんのS88構成は異なりますので、それを修正してみよー。
と気軽に始めたものの、全然意図した動きにならない。。。
具体的には以下のような挙動に悩まされました。
- 在線時、s88getのIF条件が繰り返し実行されてしまう。
よく考えたら当たり前の挙動なんだけど、2つのif文をwhile で永久ループさせているため、end if までの処理が在線検知している間ずっとループしちゃってる。
●以下はダメな例
screen(7)
s88startpwr 1
print "START S88 Control -Shuttle-"
acc 31,1
acc 41,1
sleep 10000dir 51,1
fnc 51,0,1
fnc 51,1,1
fnx 51,2
spd 51,200while 1
if s88get(2)=1 then
print "S88.2 Detected"
spd 51,0
sleep 10000dir 51,2
fnx 51,2
spd 51,200
end ifif s88get(3)=1 then
print "S88.3 Detected"
spd 51,0
sleep 10000dir 51,1
fnx 51,2
spd 51,200
end ifwend
end
上記例だと、検知区間②に在線している間はずっと、赤文字箇所がループ実行されちゃう。
これを回避するため、「prePos」という変数を定義し、検知区間に入って最初の一回だけ折り返し処理を実行するようにした。
●以下はそれなりにOKな例
'以下の2行はおまじないとして必要。
screen(7)
s88start
'DCC電源投入と、ポイント状態や変数を初期化してます。
pwr 1
print "START S88 Control -Shuttle-"
acc 31,1
acc 41,1
prePos = 0
sleep 4000
'アドレス51の車両に対して、FWD方向でF0/F1をON、2秒待って汽笛(F2)を鳴らし、2秒待って速度200で発進。
dir 51,1
fnc 51,0,1
fnc 51,1,1
sleep 2000
fnx 51,2
sleep 2000
spd 51,200'赤文字の while~wend 内を永久ループ
while 1
'検知区間②で在線検知、かつ、prePosが2でない、つまりこの区間で1回目の検知である場合のみ、print文以降の処理を実施。この中でprePos に2を投入しているので、繰り返し処理とならない。
if s88get(2)=1 then
if prePos = 2 then
else
print "S88.2 Detected"
prePos = 2
spd 51,0
sleep 10000
dir 51,2
sleep 2000
fnx 51,2
sleep 2000
spd 51,200
end if
end if'検知区間③の処理で、上述の②と同様の処理を記述。
if s88get(3)=1 then
if prePos = 3 then
else
print "S88.3 Detected"
prePos = 3
spd 51,0
sleep 10000
dir 51,1
sleep 2000
fnx 51,2
sleep 2000
spd 51,200
end if
end ifwend
end
上記対応で定義した「prePos」、要は列車の位置を監視するための変数であり、今後複数の編成を走らせる場合、かなり重要になりそう。。。
なお、dir、fnc、fnx、spd あたりの命令を連続して記述すると、動作が不安定になることがあったため、適宜 sleep 処理を追加しています。
ということで、実際に動かしてみた動画です。
つづく