■【スクテン】No.002
*基本ルールはこちらを参照
■動作確認 : ver.4.1.0.4
■更新情報 : ver.0.1

自動折返し運転その2です。使い勝手は多少良いです。
センサーを踏むと進行方向判定、減速して指定待機時間後に方向転換、発車します。センサーを2つ設置すると、その間を自動で往復します。デフォルトでは往復途中はノンストップです。2駅だけのこじんまりとしたレイアウト等に向くかと思います。
略図
hsst_002.gif
 
■ルール
編成の初期進行方向(「編成配置」部品を配置するレールの向き)を統一してください。
逆に行く場合は走行開始前に方向転換して対処します。(詳細は後述)
下記の編成スクリプトが未記述の編成は、スクリプト記述済みのセンサーを通過させないで下さい。
他(スクテン同士含む)と併用不可。(動作の保証なし)出来れば単体で使用してください。
 
編成

Var varIniVvolt
//加減速前の想定電圧を扱います。

Var varVolt
//加減速後の目標電圧を扱います。

Var varTime
//加減速の所要時間を扱います。

Var varDirection
//編成進行方向(正位=1 / 反位=-1)

Var hndTmp
//↓のイベントハンドラ

SetEventAfter this mtdGetDirection hndTmp 200
//一応、初期進行方向を取得。

//call this mtdTurn
//↑展開方向と逆に走らせる場合は「//」を消して有効化します。

SetVoltage 0.50
//ビュアー開始時の走行電圧(=希望速度÷最高速度)max1.00~min0.00
//例えばmax130km/hの編成の0.50は65km/hです。



BeginFunc mtdGetDirection
GetDirection2 varDirection
//編成進行方向をvarDirectionに代入。

EndFunc
BeginFunc mtdDrive
SetVoltage varIniVvolt
//手動操作などで狂いが出たときの為に加減速前にvarIniVvoltの内容でSetVoltageを実行。

SetTimerVoltage varVolt varTime
//varVolt、varTimeの内容で加減速操作を実行。

EndFunc
BeginFunc mtdTurn
Turn
//方向転換

EndFunc
BeginFunc mtdStart
setf varIniVvolt 0.0
setf varVolt 0.5
//加速後の電圧を設定。

set varTime 7000
//加速所要時間を設定。

call this mtdDrive
//上の内容で加減速操作を実行。

EndFunc



 
センサー1(図中左)

SetSensorMode 0
//センサー感知モード(0=編成先頭)

VarTrain varObjtrain
//編成名を扱います。

Var hndTrainTurn
Var hndTrainStart
Var hndSensor
//イベントハンドラ3つ。

SetEventSensor mtdDirection hndSensor
//センサー上を編成が通過したらmtdDirectionを実行。



BeginFunc mtdDirection
GetSenseTrain varObjtrain
//varObjtrainにセンサー通過編成名を代入。

call varObjtrain mtdGetDirection
//編成varObjtrainのmtdGetDirectionを実行。

Var tmp
mov tmp varObjtrain.varDirection
//編成varObjtrainのvarDirectionの値をtmpにコピー。

ifeq tmp 1
call this mtdCallTrain
//tmpが1ならmtdCallTrainを実行。

else
endif
EndFunc
BeginFunc mtdCallTrain
setf varObjtrain.varIniVvolt 0.5
//編成varObjtrainのvarIniVvolt(想定電圧)を設定(末尾の数値)

setf varObjtrain.varVolt 0.0
//編成varObjtrainのvarVolt(目標電圧)を設定(末尾の数値)

set varObjtrain.varTime 5000
//編成varObjtrainのvarTime(移行時間)を設定(末尾の数値)

call varObjtrain mtdDrive
//上の内容で編成varObjtrainのmtdDrive(加減速操作メソッド)を実行

SetEventAfter varObjtrain mtdTurn hndTrainTurn 7000
SetEventAfter varObjtrain mtdStart hndTrainStart 10000
//編成varObjtrainのmtdTurn(方転)とmtdStart(発車)を指定時間後に実行。
//各末尾の数値は実行までの待機時間(1秒=1000)
//上行は減速所要時間+停車後から方向転換までの時間で算出。
//下段は更に方向転換後から発車までの時間を加算。

EndFunc




センサー2(図中右)

SetSensorMode 0
//センサー感知モード(0=編成先頭)

VarTrain varObjtrain
//編成名を扱います。

Var hndTrainTurn
Var hndTrainStart
Var hndSensor
//イベントハンドラ3つ。

SetEventSensor mtdDirection hndSensor
//センサー上を編成が通過したらmtdDirectionを実行。



BeginFunc mtdDirection
GetSenseTrain varObjtrain
//varObjtrainにセンサー通過編成名を代入。

call varObjtrain mtdGetDirection
//編成varObjtrainのmtdGetDirectionを実行。

Var tmp
mov tmp varObjtrain.varDirection
//編成varObjtrainのvarDirectionの値をtmpにコピー。

ifeq tmp -1
call this mtdCallTrain
//tmpが-1ならmtdCallTrainを実行。

else
endif
EndFunc
BeginFunc mtdCallTrain
setf varObjtrain.varIniVvolt 0.5
//編成varObjtrainのvarIniVvolt(想定電圧)を設定(末尾の数値)

setf varObjtrain.varVolt 0.0
//編成varObjtrainのvarVolt(目標電圧)を設定(末尾の数値)

set varObjtrain.varTime 5000
//編成varObjtrainのvarTime(移行時間)を設定(末尾の数値)

call varObjtrain mtdDrive
//上の内容で編成varObjtrainのmtdDrive(加減速操作メソッド)を実行

SetEventAfter varObjtrain mtdTurn hndTrainTurn 7000
SetEventAfter varObjtrain mtdStart hndTrainStart 10000
//編成varObjtrainのmtdTurn(方転)とmtdStart(発車)を指定時間後に実行。
//各末尾の数値は実行までの待機時間(1秒=1000)
//上行は減速所要時間+停車後から方向転換までの時間で算出。
//下段は更に方向転換後から発車までの時間を加算。

EndFunc



■仕組み
編成がセンサーを踏むと進行方向を判定し、結果次第でその編成に含まれるメソッドmtdDriveをセンサー側で設定した数値で実行し減速→停車します。同時にタイマーイベントで同編成のメソッドmtdTurnとmtdStartが時間差で実行されて停車→方向転換→発車の流れを作っています。減速~発車に関連する数値は全てセンサー側に記述されていますので、待機時間算出なども楽かと思います。無論、センサー毎に設定を違えても大丈夫です。加速関連は編成側に記述してあります。
 
進行方向については、GetDirection2命令にて取得した数値を基準に判定します。編成の初期進行方向(図中の緑色矢印方向)が1、反位が-1となります。センサースクリプトの
  ifeq tmp 1
は、GetDirection2命令にて取得した進行方向が「1」なら減速を開始。という事です。逆に「-1」ならスルーされます。このためNo.001とは違い編成末尾がセンサーを越えて停まってもちゃんと機能します。
図中のセンサー二つの違いは、実は進行方向の条件分岐のみだったりします。(折り返しにする場合はもう片方とは逆の作用が必要ですのでネ。)図中左のセンサーは、図上で左行き列車を停め、右行き列車を無視。図中右のセンサーはその逆に右行き列車を停め、左行き列車を無視ということです。
列車を初期進行方向と逆方向(図上右向き)に走らせたい場合は、編成スクリプトの
  call this mtdTurn
のアタマにあるリマーク(//)を消してください。走り出す前に一度方向転換します。
 
部品名の参照はしませんので、同一部品名が複数あっても大丈夫です。
 

以下、ちょっとした応用。
No.001でも同じこと書きましたけど、センサースクリプトの
  SetEventAfter varObjtrain mtdTurn hndTrainTurn (時間)
を消して方向転換させなければ、「折返しセンサー」ではなく「停車センサー」になります。No.002の場合は進行方向の判定がありますので全線単線の「折返し」でも途中に「停車」を挟むことが可能です。
また、目標電圧を0.00にしなければ「減速」になります。終着駅手前で徐行・・・なんてことも出来ましょう。
2009/02/25 01:01 | 電波 | コメント(10) | トラックバック(0) | page top↑
n e w < < スクテン 始動。 | H o m e | 【スクテン】No.001 > > o l d
コメント
こんにちは。
取り掛かっていたレイアウトも完成したので暫く、スクリプトの勉強でもしようかと?三日坊主で終わらなければよいのだが(笑)

早速、配置してみました。なるほど旨く方向転換が出来るものですネ。(変わった瞬間はチョット違和感がありますが)リマークが付いているので超初心者でも何となく理解出来たかなぁ(笑)VRMのエデッタも文字色が変えられるともっと分かり易いと思う次第です。明日になると又、忘れそうボリボリ・・・

スクテン、追加楽しみにしています。
by:漆黒 | URL | #kwzMfkEo【2009/03/01 16:13】 [ 編集] | page top↑
どもです。
 
>変わった瞬間はチョット違和感が
運転台視点ですと、間髪入れずに反対側に向きますからね・・・。今度試してみようと思ってるんですが、方向転換前に一度地上カメラなどの他の視点にパスしておいて、その間に方向転換すれば誤魔化せるかも?なんて考えてたりします。
 
>VRMのエデッタも文字色が変えられるともっと分かり易い
そうですね!今は「全ての文字」の色が変えられるだけですからね・・・。
 
よく、スクリプトは行のアタマに空白を挿入して見やすいようにレイアウトしたりするのですが、現状では行のアタマの空白はHTMLの仕様上無視されていて、表向きには「無いもの」扱いですから更に見づらいですね。
次回以降、この辺をちょっと変えてみます。

でわでわ。
by:moko | URL | #uBfUABJ6【2009/03/01 22:10】 [ 編集] | page top↑
早速試してみましたが、問題なく動作しました。
これで念願のローカル線自動ピストン運転が出来るようになりました。
今後の展開も楽しみで、この調子でやって頂けると助かりますし、勉強にもなります。
by:junichi | URL | #-【2009/03/02 13:48】 [ 編集] | page top↑
どもです。
そう言って頂けると、志気が上がりますですよ。(笑)
また前みたくスローペースですが、脳みそコネコネしながら次回案を考えておりますので!気長によろしくお願いします。
 
でわでわ。
by:moko | URL | #uBfUABJ6【2009/03/02 22:34】 [ 編集] | page top↑
警笛の追加について
スクテンNo.2にて途中駅を作って駅停車→発車をさせているのですが、発車の際、警笛を鳴らす場合はどうすればいいのか教えてください。
(最後にPlayHornを入れたのですが動作しませんでした・・・)
by:さとし・F | URL | #-【2009/03/18 17:48】 [ 編集] | page top↑
どもです。
スクテン全然増やせてなくて申し訳ないです・・・。
 
>発車の際、警笛を鳴らす
これは途中駅のみでしょうか?
 
全駅共通ならば編成スクリプトのメソッド mtdStart の末尾(EndFuncの手前)に PlayHorn を追加すればOKだと思います。
 
途中駅のみの場合は先ず、編成スクリプトの末尾に
 
BeginFunc mtdPlayhorn
PlayHorn
EndFunc

 
を追加してください。
警笛を鳴らしたいその前に減速させるセンサーの冒頭に
 
Var hndTrainHorn
 

を追加。同じセンサー内のメソッド mtdCallTrain の末尾(EndFuncの手前)に
 
SetEventAfter varObjtrain Playhorn hndTrainHorn 時間
 

を追加してください。ちょっと複雑ですが・・・。
因みに、この時間は「発車と同時」ならセンサーが発車メソッドを呼び出すまでの待機時間と同じ数値を、ずらす場合は待機時間を基準に算出してください。
 
・・・解り辛くてスミマセンが、如何でしょうか。
by:moko | URL | #uBfUABJ6【2009/03/18 19:09】 [ 編集] | page top↑
ありがとうございます。
試してみます。
by:さとし・F | URL | #-【2009/03/18 23:30】 [ 編集] | page top↑
教えてください。
途中駅での発車同時警笛の件なのですが
[Playhorn] ERROR 未定義のメソッドを参照。
  正しいメソッド名に書き換えてください。
となってしまいます。

編成スクリプト
Var varIniVvolt
//加減速前の想定電圧を扱います。

Var varVolt
//加減速後の目標電圧を扱います。

Var varTime
//加減速の所要時間を扱います。

Var varDirection
//編成進行方向(正位=1 / 反位=-1)

Var hndTmp
//↓のイベントハンドラ

SetEventAfter this mtdGetDirection hndTmp 200
//一応、初期進行方向を取得。

//call this mtdTurn
//↑展開方向と逆に走らせる場合は「//」を消して有効化します。

SetVoltage 0.26
//ビュアー開始時の走行電圧(=希望速度÷最高速度)max1.00~min0.00
//例えばmax130km/hの編成の0.50は65km/hです。



BeginFunc mtdGetDirection
GetDirection2 varDirection
//編成進行方向をvarDirectionに代入。

EndFunc
BeginFunc mtdDrive
SetVoltage varIniVvolt
//手動操作などで狂いが出たときの為に加減速前にvarIniVvoltの内容でSetVoltageを実行。

SetTimerVoltage varVolt varTime
//varVolt、varTimeの内容で加減速操作を実行。

EndFunc
BeginFunc mtdTurn
Turn
//方向転換

EndFunc
BeginFunc mtdStart
setf varIniVvolt 0.0
setf varVolt 0.26
//加速後の電圧を設定。

set varTime 7000
//加速所要時間を設定。

call this mtdDrive
//上の内容で加減速操作を実行。

EndFunc

BeginFunc mtdPlayhorn
PlayHorn
EndFunc

駅手前の減速センサースクリプト
Var hndTrainHorn

SetSensorMode 0
//センサー感知モード(0=編成先頭)

VarTrain varObjtrain
//編成名を扱います。

Var hndTrainTurn
Var hndTrainStart
Var hndSensor
//イベントハンドラ3つ。

SetEventSensor mtdDirection hndSensor
//センサー上を編成が通過したらmtdDirectionを実行。



BeginFunc mtdDirection
GetSenseTrain varObjtrain
//varObjtrainにセンサー通過編成名を代入。

call varObjtrain mtdGetDirection
//編成varObjtrainのmtdGetDirectionを実行。

Var tmp
mov tmp varObjtrain.varDirection
//編成varObjtrainのvarDirectionの値をtmpにコピー。

ifeq tmp 1
call this mtdCallTrain
//tmpが1ならmtdCallTrainを実行。

else
endif
EndFunc
BeginFunc mtdCallTrain
setf varObjtrain.varIniVvolt 0.26
//編成varObjtrainのvarIniVvolt(想定電圧)を設定(末尾の数値)

setf varObjtrain.varVolt 0.0
//編成varObjtrainのvarVolt(目標電圧)を設定(末尾の数値)

set varObjtrain.varTime 4500
//編成varObjtrainのvarTime(移行時間)を設定(末尾の数値)

call varObjtrain mtdDrive
//上の内容で編成varObjtrainのmtdDrive(加減速操作メソッド)を実行

SetEventAfter varObjtrain mtdStart hndTrainStart 15000
//編成varObjtrainのmtdTurn(方転)とmtdStart(発車)を指定時間後に実行。
//各末尾の数値は実行までの待機時間(1秒=1000)
//上行は減速所要時間+停車後から方向転換までの時間で算出。
//下段は更に方向転換後から発車までの時間を加算。


SetEventAfter varObjtrain Playhorn hndTrainHorn 15000
EndFunc


以上です。
宜しくお願いします。

by:さとし・F | URL | #-【2009/03/19 21:29】 [ 編集] | page top↑
スミマセン。
僕のミスです・・・「mtd」が抜けておりました。(涙)
「駅手前の減速センサー」のスクリプトだけ下記に書き替えてください。(編成スクリプトはそのままで大丈夫です。)


SetSensorMode 0
//センサー感知モード(0=編成先頭)

VarTrain varObjtrain
//編成名を扱います。

Var hndTrainTurn
Var hndTrainStart
Var hndSensor
Var hndTrainHorn
//イベントハンドラ

SetEventSensor mtdDirection hndSensor
//センサー上を編成が通過したらmtdDirectionを実行。



BeginFunc mtdDirection
GetSenseTrain varObjtrain
//varObjtrainにセンサー通過編成名を代入。

call varObjtrain mtdGetDirection
//編成varObjtrainのmtdGetDirectionを実行。

Var tmp
mov tmp varObjtrain.varDirection
//編成varObjtrainのvarDirectionの値をtmpにコピー。

ifeq tmp 1
call this mtdCallTrain
//tmpが1ならmtdCallTrainを実行。

else
endif
EndFunc
BeginFunc mtdCallTrain
setf varObjtrain.varIniVvolt 0.26
//編成varObjtrainのvarIniVvolt(想定電圧)を設定(末尾の数値)

setf varObjtrain.varVolt 0.0
//編成varObjtrainのvarVolt(目標電圧)を設定(末尾の数値)

set varObjtrain.varTime 4500
//編成varObjtrainのvarTime(移行時間)を設定(末尾の数値)

call varObjtrain mtdDrive
//上の内容で編成varObjtrainのmtdDrive(加減速操作メソッド)を実行

SetEventAfter varObjtrain mtdStart hndTrainStart 15000
//編成varObjtrainのmtdTurn(方転)とmtdStart(発車)を指定時間後に実行。
//各末尾の数値は実行までの待機時間(1秒=1000)
//上行は減速所要時間+停車後から方向転換までの時間で算出。
//下段は更に方向転換後から発車までの時間を加算。

SetEventAfter varObjtrain mtdPlayhorn hndTrainHorn 15000

EndFunc
by:moko | URL | #uBfUABJ6【2009/03/19 22:30】 [ 編集] | page top↑
ありがとうございました。
無事動作しました。
また、よろしくお願いいたします。
by:さとし・F | URL | #-【2009/03/20 00:44】 [ 編集] | page top↑
コメントの投稿














トラックバック