つじるの忘れんぼ鉄道

DCC自動運転で秋葉原にあった交通博物館のジオラマを目指すブログ

DSbasic 入門してみる(6)往復運転 + 機関車2両

前回の往復運転コードをベースに、機関車2両を互いに発進させるコードを作ります。

と、気軽に始めたはいいものの、いざコードを作り始めると、考えなければいけないことが多く、いきなり難易度が上がったような気がしてきた。。。

忘れないように流れを図にまとめてみました。

 

f:id:tsujiru:20190502004818p:plain

f:id:tsujiru:20190502004833p:plain

f:id:tsujiru:20190502004850p:plain

f:id:tsujiru:20190502004905p:plain

f:id:tsujiru:20190502004920p:plain

 

2台の機関車を行ったり来たりさせたいだけなのに、結構大変。。。

ちなみにここでは、Slot0(アドレス4) と Slot1(アドレス51)の2つの車両を動かす前提でコードを書いています。(下図の4と51)

f:id:tsujiru:20190502013409p:plain

 

コードは下記のとおりです。

※ブログに貼り付けるとタブインデントが消えちゃって可読性悪いですね。。。

GoogleDriveにアップしましたので、DSbasic - Google ドライブ からダウンロードしてください。(今回のコードは[006_s88-shuttle_2xloco_20190501.BAS]というファイルです)

screen(7)
s88start

print "START S88 Control -Shuttle + 2xLoco-"
sleep 5000
pwr 1
acc 31,1
acc 41,1
sleep 5000

'動かす2両のアドレスをSlot0と1に設定する
SLOT0 = getslotaddr(0)
SLOT1 = getslotaddr(1)
print "SLOT 0 = " + SLOT0
print "SLOT 1 = " + SLOT1

'前提:2両の初期位置は、検知区間①、②にすること。
S0Pos = 2
S1Pos = 1
'先発をSlot0に設定
NextLoco = 0

'SLOT0を起動(ESU BR151)
print "BR151 booting..."
dir SLOT0,2
fnc SLOT0,0,1
sleep 5000
fnc SLOT0,1,1
sleep 2000
fnc SLOT0,3,1
sleep 2000
fnc SLOT0,4,1
sleep 2000
fnc SLOT0,9,1
sleep 2000
fnx SLOT0,2
print "BR151 boot completed"
sleep 2000
spd SLOT0,200

sleep 10000

'SLOT1を起動(NGC DD51)
print "DD51 booting..."
dir SLOT1,2
fnc SLOT1,0,1
fnc SLOT1,1,1
print "DD51 boot completed"
sleep 2000
fnx SLOT1,2


while 1


if s88get(2)=1 then
if S0Pos = 2 then
else
print "S88.2 Detected"
S0Pos = 2
sleep 500
'SLO0を停止
spd SLOT0,0
sleep 10000
'ポイントを分岐
acc 31,0
'SLOT1を発進
NextLoco = 1
dir SLOT1,2
sleep 2000
fnx SLOT1,2
sleep 2000
spd SLOT1,200
end if
end if


if s88get(1)=1 then
if S1Pos = 1 then
else
print "S88.1 Detected"
S1Pos = 1
sleep 1000
'SLO1を停止
spd SLOT1,0
sleep 10000
'ポイントを直進
acc 31,1
'SLOT0を発進
NextLoco = 0
dir SLOT0,2
sleep 2000
fnx SLOT0,2
sleep 2000
spd SLOT0,200
end if
end if


if s88get(3)=1 then

'検知区間③に進入した車両がSLOT0の場合
if NextLoco = 0 then
if S0Pos = 3 then
else
print "S88.3 Detected as SLOT0"
S0Pos = 3
spd SLOT0,0
sleep 10000
dir SLOT0,1
sleep 2000
fnx SLOT0,2
sleep 2000
spd SLOT0,200
end if
end if

'検知区間③に進入した車両がSLOT1の場合
if NextLoco = 1 then
if S1Pos = 3 then
else
print "S88.3 Detected as SLOT1"
S1Pos = 3
spd SLOT1,0
sleep 10000
dir SLOT1,1
sleep 2000
fnx SLOT1,2
sleep 2000
spd SLOT1,200
end if
end if

end if

wend

end

キモは、流れ図内にも吹き出しで記載していますが、「NextLoco」値による、命令対象となる機関車の判断ロジックかと思います。(上記の赤文字箇所)

たった2両でこれなので、これ以上増やす場合は、配列とか定義していかないと厳しいのかもしれません。私はプログラマーではないので、そういったコーディングがどこまで可能なのか心配。。。

 

 実行すると、こんな感じでメッセージ出力します。

f:id:tsujiru:20190502012452p:plain

  

実際に動かした動画はこちら。


DSbasic 機関車2両による自動往復運転

 

次は、これをスイッチバック全体で往復させる自動運転かな~

 

つづく