見出し画像

Rosso Laboratory

センサー1個で距離式信号機

昨晩ななついろチャンネルさんにお邪魔して信号機について色々と話をしていました。

信号機を再現するには、
①閉塞を再現する一番忠実な方法(閉塞式信号機)
②センサーを数多く置いて距離で変える方法(距離式信号機)
③通過後の時間によって変化させる方法(時限式信号機)
の3つがあると思いますが、①は構築するのが大変すぎますし、②は色々分岐するようなレイアウトではセンサーをばら撒くようになってゴチャゴチャします。よって大体は③が多く使用されるのですが、この方式は速度が遅かったり停車してしまうと実態に合わなくなります。

そこでななついろさんは2つのセンサーを使い、最初のセンサーで赤を表示をさせ信号機上で止まっているよう時には赤表示のままとし、通過したら次のセンサーで時間によって変化させる方式としていました。VRM4ではこれが精一杯かもしれません。

しかしVRMNXにはPythonがあります。そこで②の距離式信号機をセンサー1個で計算して再現させてみようと思い立ちました。そして出来たのがこちら。

#OBJID=38
import vrmapi
def vrmevent_38(obj,ev,param):
    di = obj.GetDict()
    if ev == 'init':
        di['signal36'] = vrmapi.LAYOUT().GetSignal(36)
        di['signal36'].SetStat(0,6)
        di['train'] = 0
        di['timerEID'] = 0
        di['distance'] = 0
    elif ev == 'broadcast':
        dummy = 1
    elif ev == 'timer':
        if param['eventUID'] == 100:
            speed = di['train'].GetSpeed()
            di['distance'] = di['distance'] + 1.85185 * speed
            if di['distance'] > 2500:
                di['signal36'].SetStat(0,6)
                obj.ResetEvent(di['timerEID'])
                di['distance'] = 0
            elif di['distance'] > 2000:
                di['signal36'].SetStat(0,4)
            elif di['distance'] > 1500:
                di['signal36'].SetStat(0,3)
            elif di['distance'] > 1000:
                di['signal36'].SetStat(0,2)
            elif di['distance'] > 0:
                di['signal36'].SetStat(0,1)
    elif ev == 'time':
        dummy = 1
    elif ev == 'after':
        dummy = 1
    elif ev == 'frame':
        dummy = 1
    elif ev == 'catch':
        obj.ResetEvent(di['timerEID'])
        di['distance'] = 0
        di['train'] = obj.GetTrain()
        di['timerEID'] = obj.SetEventTimer(1,100)

これがまた1発で動きました(^^)/ 流石はPython(^^)/

信号機はID36の5灯信号機で
6進行 2500mm
4減速 2000mm
3注意 1500mm
2警戒 1000mm
1停止 0mm
レイアウトは1周3766mm、列車長は約420mmです。それでは動画でご覧下さい。

鉄道模型シミュレーターNX距離式信号機

速度を変えても大体同じ位置で信号が変わっている(少し変わるのは1秒毎に見ているので速度によりズレます)のが分かると思います。やはりPythonは凄いわ(^^)/

<追記>次ページにて修正版スクリプトがありますのでそちらをお使いください。
PVアクセスランキング にほんブログ村


ランキングに参加中。クリックして応援お願いします!

コメント一覧

rosso_laboratory
@nanatsuiro こんにちは、ななついろさん(^^)/
なるほど。確かに鉄道模型的には時間で変わる方がリアルではありますね。距離で変化させるのは現実の鉄道に近いか。了解致しました(^^)/ また次回も楽しみにしています。
nanatsuiro
zio 様

こんにちは☆
先日は、当方のライブ配信で色々とアドバイスをくださり、お礼を申しあげます。

信号機の制御として閉塞方式は現実的ですが、センサーが多くなり大変です。従いまして、時間で変化させる方式が、模型的には良いかなと思っておりますが、これもTOMIXさんの模型製品「TCSn灯式信号機」のような動作状態を得るのは、なかなか難しいです。

Pythonによる「センサー通過後、編成がどのくらい進んだかの距離」で、信号機の変化を制御させる方法は、編成が信号機の上で停車していても信号機が赤(停車)のままを維持する事が出来ますね。

ただ、この距離による信号機の変化は、次の周で信号機に差し掛かる時、必ず「青(進行)」が表示されている事になります。

TOMIXさんの模型製品「TCSn灯式信号機」では、信号機通過後に車両の速度を上げると、次の周で信号機に差し掛かる時に「青(進行)」以外の表示の時がでてまいり、信号機の表示に合わせて速度を落とすという楽しみ方ができます。

この、信号機の状態によって手動による減速を楽しむ場合、時間で管理する方法が良いと思います。

勿論、距離による色変化の管理方式でも、ひとつのエンドレス上に編成が複数有れば、最初の編成が信号機を通過後、次の編成が信号機に到着するタイミングによっては「青(進行)」以外の表示になっている事もででまいります。

現実世界の鉄道模型では、「DCC(デュアルキャブコントロール)」や「DCC(デジタルコマンドコントロール)」、TNOSを使わない従来の方式では、ひとつの周回上に編成は一つという前提が有る為、信号機の制御は時間管理の方が、現実世界の鉄道模型と親和性が高いかなと思っております。

制御関係は鉄道模型シミュレーターの方が、かなり複雑な事が行えますので、そういう意味での楽しみ(苦労?)や醍醐味は、鉄道模型シミュレーターならではだと思っております。

今後とも、どうぞよろしくお願い申しあげます。
名前:
コメント:

※文字化け等の原因になりますので顔文字の投稿はお控えください。

コメント利用規約に同意の上コメント投稿を行ってください。

 

※ブログ作成者から承認されるまでコメントは反映されません。

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最新の画像もっと見る

最近の「Pythonスクリプト」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事