BIDS Specifications

スポンサーリンク

※2020年9月1日追記 : 現在の最新版はv202です. 仕様関係はGitHubの方に載せますので, しばらくお待ちください.

ここでは、BIDSの仕様について書いておきたいと思います。なお、掲載時点で未実装の機能があるほか、β版等でリリースされているもの、専用仕様を採用しているものなどと仕様が異なる場合があります。この仕様書のバージョンは「v201」です。

略記一覧

本ページにおいて、以下の表のように略記する場合があります。

略記意味
csdllBIDScs.dll(特記なき限りクライアントモードを指す)
SvBIDS_Server.exe(サーバーモードのcsdllを組み込んだ表示ソフトも含む)
SvCpBVEとBIDS_Server.exeをともに起動したコンピュータ
ClCpSvCpのBIDS_Server.exeとの通信を確立させたSvを起動させたコンピュータ
OpeReqOperation Requestの略

System Link Image

BIDSがどのようにして機器の連動を実現しているかのイメージ図です。開発を進めていくうちに接続方式等が変更になる場合があります。
コミュニケーションの詳細については、後日作成予定です。

Sender : Mother Side

Sender : Client Side

Request Process

Sv-Sv通信

Sv間での通信には主にTCP/IPを用います。オプション設定として、UDP/IPにて通信することも可能です。
BVEの運転情報を独自の構造をしたbyte配列へと変換したものを、SvCpのSvからClCpのSvへと情報を送信しています。BVEを操作するためにClCpのSvからSvCpのSvへと情報を送信することはできますが、PanelやSoundの値を書き換えることはできません。
Sv-Sv通信には、以下の5つのモードがあります。デフォルトはFullですが、回線に余裕がない場合や必要な情報が限られている場合は、Full以外のモードを選択することができます。

NumModeBasicPanelSoundSecurity
0Full
1Old(※1)※2※3※4×
2Lite+××
3Lite×××
4Req

※1 : 旧世代互換対応用のデータ構造です。
※2 : 一部の情報が制限される場合があります。
※3 : Panel[0]~Panel[255]までの256個のデータのみ取得できます。
※4 : Sound[0]~Sound[255]までの256個のデータのみ取得できます。

但し、BIDS_Server.exeではOldモード、Reqモードへの対応はしておりません。

Basic情報群

Basic情報群では、速度情報や位置情報などの基本的な情報をグループ化して送信します。
送信する情報は、以下の通りです。送信情報のインデックス番号は、INum*4を利用してください。

固定数値グループ

このグループは、Basic情報群のうち数値が固定されているものを扱います。

INumTypeNameUnitInfo
0byte[4]Header中身は {0x54, 0x52, 0x62, 0x01} です。
1UInt16[2]Version送信元のVersion情報(前2Byte)と、送信元の情報(後2Byte)です。この仕様書に準拠している場合は、前2Byteには201(0x00C9)が入ります。
2UInt16[2]Handles1(段)Brake, Powerそれぞれのハンドルの段数です。前2ByteがBrake、後2ByteがPowerです。
3UInt16[2]Handle2(段)前2ByteがATS確認に必要な最低段数で、後2Byteが常用最大ブレーキにあたるB段数です。
4UInt16[2]Others(両,段)前2Byteが編成両数、後2Byteが単弁の割り当て段数です。
5~(var)CarInfoこちらのページ(準備中)にて解説します。
(Last)byte[4]Tail中身は {0xFE, 0xFE, 0xFE, 0xFE} です。情報の後尾4byteに入ります。

なお、INum.1の「送信元の情報」は、以下の通りです。この番号は、Versionに依らずに随時追加されます。

NumInfo
0不明
1BIDS_Server.exe(BIDSppと接続中)
2BIDS_Server.exe(OBIDSid.dllと接続中)
3BIDS_Server.exe(ClCpで起動中)
4BIDS_toSkyWay.exe(公開予定品)

共通変数グループ

このグループは、BVE5とopenBVEで共通して設定されている変数を扱います。将来的に扱われることを私が望んでいる変数も格納されてる可能性があります。

INumTypeNameUnitInfo
0byte[4]Header中身は {0x54, 0x52, 0x62, 0x02} です。
1doubleMyLocation[m]自列車の位置です。8byteを使用します
3singleMySpeed[km/h]自列車の現在速度です。
4singleMyCurrent[A]自列車に流れる電流(主電動機電流)です。
5singleMyWireVolt[kV]自列車の架線電圧です。(2018.3.1現在未実装)
6UIntNowTime[ms]現在時刻です。24時以降も加算されると思われます
7singleMyBCPressure[kPa]自列車のブレーキシリンダー(BrakeCylinder)圧
8singleMyMRPressure[kPa]自列車の元空気ダメ(Main air Reservoir)圧
9singleMyERPressure[kPa]自列車の釣合空気ダメ(Equalizing air Reservoir)圧
10singleMyBPPressure[kPa]自列車のブレーキ管(Brake Pipe)圧
11singleMySAPPressure[kPa]自列車の直通管(Straight Air Pipe)圧
12intMySignalNum自列車のいる閉塞の信号現示番号
13bit[8]MyDoor自列車のドア状態
14byte[4]Tail中身は {0xFE, 0xFE, 0xFE, 0xFE} です。

ドア状態に関しては、以下の表を参考にしてください。

NumInfo01
0パイロットランプ点灯状態
1左ドア開扉状態
2右ドア開扉状態
3左ドア動作状態
4右ドア動作状態
51ドア開扉実施状態FT
6半自動扱い実施状態FT
7ドアバックアップ実施FT

なお、開扉状態は動作が完全に終わった後に値が変化する仕様にする予定です。また、一部機能は実装されていない場合があります。

Bvets5独自変数グループ

BVE5独自の変数は2019年3月1日現在存在しないため、予約領域扱いとなります。

INumTypeNameUnitInfo
0byte[4]Header中身は {0x54, 0x52, 0x62, 0x03} です。
1byte[4]Tail中身は {0xFE, 0xFE, 0xFE, 0xFE} です。

openBVE独自変数グループ

現在openBVEの仕様を確認中です。仕様の正式策定まで今しばらくお待ちください。

INumTypeNameUnitInfo
0byte[4]Header中身は {0x54, 0x52, 0x62, 0x04} です。
1byte[4]Tail中身は {0xFE, 0xFE, 0xFE, 0xFE} です。

ハンドルグループ

このグループでは、各ハンドルの位置を設定しています。

INumTypeNameInfo
0byte[4]Header中身は {0x54, 0x52, 0x62, 0x05} です。
1Int32Powerマイナスで抑速段に入ります。
2Int32Brakeブレーキハンドル位置(正の整数)
3Int32Reverserレバーサー位置(SLの場合は逆転機H位置-10000 ≦ x ≦ +10000)
4Int32SelfBrake単弁位置(正の整数)
5byte[4]Tail中身は {0xFE, 0xFE, 0xFE, 0xFE} です。

一部機能は実装されていない場合があります。

Panel情報群

BVEのPanel配列です。Panel配列を128個ずつに区切り、50ms~500ms(Svで指定 デフォルト200ms)ごとにローテーションで送信します。但し、区切った後の配列内に1つでの値の更新を検出すると、即座に送信されます。
データは、1送信あたりヘッダの4Byteと終末記号の4Byteを含めた520Byteを、BIDSから送信します。但し、実際はこれに加えて様々な情報が自動で付加されるため、通信量はこれよりも多くなります。

データ構造は、以下の通りです。なお、HeaderとTail以外のすべての変数はInt32型です。

NumNameInfo
0Header中身は {0x54, 0x52, 0x70, n} です。
1Panel[0 + 128 * n](128*n)番目のPanelの情報
(省略)
128Panel[127 + 128 * n](127 + 128 * n)番目のPanelの情報
129Tail中身は {0xFE, 0xFE, 0xFE, 0xFE} です。

nには0~255までのグループ番号が整数で入ります。BVE5の場合0か1のみですが、openBVEの場合は最大で128 * 256 = 2^15個の要素を扱うことができます。なお、存在しない要素の情報には「0」が入ります。

Sound情報群

Panel情報群と同じく、128個の要素を1まとめにして送信します。
データ構造は、以下の通りです。なお、HeaderとTail以外のすべての変数はInt32型です。

NumNameInfo
0Header中身は {0x54, 0x52, 0x73, n} です。
1Sound[0 + 128 * n](128*n)番目のSoundの情報
(省略)
128Sound[127 + 128 * n](127 + 128 * n)番目のSoundの情報
129Tail中身は {0xFE, 0xFE, 0xFE, 0xFE} です。

nには0~255までのグループ番号が整数で入ります。BVE5の場合0か1のみですが、openBVEの場合は最大で128 * 256 = 2^15個の要素を扱うことができます。なお、存在しない要素の情報には「0」が入ります。

Security情報群

保安装置の機能ごとに情報領域を割り当てています。詳しい割り当ては、専用ページ(後日作成予定)を参照してください。

INumTypeNameInfo
0byte[4]Header中身は {0x54, 0x52, 0x68, n} です。 n で保安装置の種類を表します。
1~Securities中身は保安装置によって異なります。
mbyte[4]Tail中身は {0xFE, 0xFE, 0xFE, 0xFE} です。保安装置により m の値は変化します。

OpeReq

BIDSには、csdllからのBVE操作要求をSvCpのBVEに対して送る機能があります。それがOpeReqです。
OpeReqは、Sv-Sv間通信、Sv-csdll間通信いずれにも用いることができます。
OpeReqはShift-JISでエンコードされたstring文字列で構成されます。コマンドの返答もstringで行われます。

コマンドは 接頭辞(+ 識別子)(Head) + 命令内容(Order) + 接尾辞(Tail) で構成されます。

利用できる機能は以下の通りです。

識別子

CharTargetAction
RReverser操作要求を出す
SPower & Brake Lever操作要求を出す
PPower Lever操作要求を出す
BBrake Lever操作要求を出す
KATS Keys操作要求を出す
IBIDS情報送信要求を出す
ABIDS情報自動送信の開始要求を出す
DBIDS情報自動送信の停止要求を出す
VBIDS対話先Svのバージョンを取得する
EBIDSエラー発生を通告する(主に対話先から送られる)
HBIDS保安装置状態の送信要求を出す

R : レバーサー操作要求

レバーサーのハンドル位置を、指定位置に変更する命令です。3種類の命令をそれぞれ2~3種ずつあるコマンドのいずれかで実行できます。

コマンドは以下の7つです。なお、SLの逆転機を操作する必要が出てきた際は、お問い合わせください。
接尾辞の"\n"は、表中では省略しています。実際の運用時に忘れないように注意してください。

HeadOrderMeaning
TRRF前進位置
1
N中立位置
0
R後進位置
B
-1

なお、同じ意味を持つコマンドいずれを使用しても結果は同じです。お好みのコマンドを使用してください。
操作が受理されると、0が返ります。

S : ワンハンドル型マスコン操作要求

ワンハンドル型マスコンのレバー位置を変更する命令を出します。このコマンド自体にリミッタはなく、車両の持つ段数以上のコマンドも受理されますが、必ずしも操作がBVEに反映されるわけではないことに注意してください。

コマンドは、以下のように任意の段数位置の数字と組み合わせて構成されます。接尾辞の"\n"は、表中では省略しています。実際の運用時に忘れないように注意してください。

HeadOrderMeaning
TRS-xレバー位置を-xに設定する(x∈ℕ)
-1レバー位置を-1に設定する(B1位置に設定されます)
0レバー位置を0に設定する(N位置に設定されます)
1レバー位置を1に設定する(P1位置に設定されます)
xレバー位置をxに設定する(x∈ℕ)

なお、ℕは自然数全体の集合を表しますが、ハンドル位置を指定する変数としてint型が用いられているため、最大でも"2,147,483,647″(約20億)となります。BVEがそこまでの段数をサポートしているかは知りませんが。
操作が受理されると、0が返ります。

P : 力行ハンドル操作要求

接尾辞の"\n"は、表中では省略しています。実際の運用時に忘れないように注意してください。

HeadOrderMeaning
TRP-xレバー位置を-xに設定する(x∈ℕ)
-1レバー位置を-1に設定する(抑速1段位置に設定されます)
0レバー位置を0に設定する(P0位置に設定されます)
1レバー位置を1に設定する(P1位置に設定されます)
xレバー位置をxに設定する(x∈ℕ)

なお、ℕは自然数全体の集合を表しますが、ハンドル位置を指定する変数としてint型が用いられているため、最大でも"2,147,483,647″(約20億)となります。BVEがそこまでの段数をサポートしているかは知りませんが。
操作が受理されると、0が返ります。

B : 制動ハンドル操作要求

接尾辞の"\n"は、表中では省略しています。実際の運用時に忘れないように注意してください。

HeadOrderMeaning
TRB0レバー位置を0に設定する(B0位置に設定されます)
1レバー位置を1に設定する(B1位置に設定されます)
xレバー位置をxに設定する(x∈ℕ)

なお、ℕは自然数全体の集合を表しますが、ハンドル位置を指定する変数としてint型が用いられているため、最大でも"2,147,483,647″(約20億)となります。BVEがそこまでの段数をサポートしているかは知りませんが。
操作が受理されると、0が返ります。

K : ATSキー操作要求

ATSキーとは、BVEのATSプラグインに対するボタン操作に用いられるキーのことで、BVEの標準機能です。
BIDSでは、このほかにBVEのウィンドウに対して直接キー入力イベントを発生させるコマンドも実装していますが、思わぬトラブルが発生する可能性があるので、使用は推奨しておりません。

コマンドの構成は以下の通りです。接尾辞の"\n"は、表中では省略しています。実際の運用時に忘れないように注意してください。

HeadOrderMeaning
TRKUxx番ボタンをUpさせる
Dxx番ボタンをDownさせる
Pyyに対応するキーのPressイベントを発生させる
Ryyに対応するキーのReleaseイベントを発生させる

(それぞれ 0≦x≦19 y∈ℕ)
なお、yに入る数字についてはMicrosoftのこちらのページをご覧ください。
xに入る数字については以下の表を参考にしてください。

0 : Horn14 : ATS_S8 : ATS_B212 : ATS_E16 : ATS_I
1 : Horn25 : ATS_A19 : ATS_C113 : ATS_F17 : ATS_J
2 : Music Horn6 : ATS_A210 : ATS_C214 : ATS_G18 : ATS_K
3 : Const. Speed7 : ATS_B111 : ATS_D15 : ATS_H19 : ATS_L

また、openBVE向けには、以下の番号もサポートしております。
Commandは"OpenBveApi.Interface.Translations.Command“(20以上のもの)に準拠しております。

NumCommandMeaning
22DoorsLeft左側ドアを開閉する
23DoorsRight右側ドアを開閉する
30PlayMicSoundsマイクからの音声入力を有効化する
31CameraInteriorカメラ位置を運転台にする
32CameraInteriorNoPanelカメラ位置を運転台にし、運転台Panelを消す
33CameraExteriorカメラ位置を車両の外観を見れるような位置にする
34CameraTrackカメラ位置を線路付近にする
57TimetableToggle時刻表の表示/非表示を切り替える
58TimetableUp時刻表を上にスクロールさせる
59TimetableDown時刻表を下にスクロールさせる
60MiscClock画面内の時計の表示/非表示を切り替える
61MiscSpeed画面内の現在速度の表示/非表示を切り替える
62MiscGradient画面内の勾配状態の表示/非表示を切り替える
63MiscDistanceToNextStation画面内の次駅までの距離の表示/非表示を切り替える
64MiscFps画面内のfpsの表示/非表示を切り替える
65MiscAIAI運転(自動運転)の有効/無効を切り替える
66MiscInterfaceModeInterfaceモードを切り替える
67MiscBackfaceCullingBackface Cullingモードの有効/無効を切り替える
68MiscCPUModeCPUモードの高低を切り替える
69MiscTimeFactor時の進みを加速させるか否かを切り替える
70MiscPause一時停止する。もしくは復帰する
71MiscMuteミュートにする。もしくは復帰する
72MiscFullscreenフルスクリーン表示の有効/無効を切り替える
73MiscQuitopenBVEを終了する
74MenuActivateメニューを表示する
75MenuUpメニューの選択項目を1つ上げる
76MenuDownメニューの選択項目を1つ下げる
77MenuEnterサブメニューに入る
78MenuBackサブメニューから離脱する
79DebugWireframeWire Frame表示の有効/無効を切り替える
80DebugNormalsNormal Renderingモードに切り換える(?)
81DebugBrakeSystemsブレーキのデバッグ用画面の表示/非表示を切り替える
82DebugATSATSのデバッグ用画面の表示/非表示を切り替える
83ShowEventsEvent表示画面の表示/非表示を切り替える
103SecurityMATS PI用 Mボタン(後方互換性確保用)
104SecurityNATS PI用 Nボタン(後方互換性確保用)
105SecurityOATS PI用 Oボタン(後方互換性確保用)
106SecurityPATS PI用 Pボタン(後方互換性確保用)
107WiperSpeedUpワイパーの往復速度を加速させる
108WiperSpeedDownワイパーの往復速度を減速させる
109FillFuel燃料を補給する(エンジン車用)
110Headlightsヘッドライトの点灯/滅灯を切り替える
111LiveSteamInjectorLive Steam Injectorを操作する(?)(蒸気動車用)
112ExhaustSteamInjectorExhaust Steam Injectorを操作する(?)(蒸気動車用)
113IncreaseCutoffCutoffを増やす(?)(蒸気動車用)
114DecreaseCutoffCutoffを減らす(?)(蒸気動車用)
115Blowersブロワーを起動/停止(?)する
116EngineStartエンジンを起動する(エンジン車用)
117EngineStopエンジンを停止する(エンジン車用)
118GearUpギアを上げる(エンジン車用)
119GearDownギアを下げる(エンジン車用)
120RaisePantographパンタグラフを上げる(電気車用)
121LowerPantographパンタグラフを下げる(電気車用)
122MainBreaker主シャ断器を入れる/落とす
123RouteInformation路線の情報の表示/非表示を切り替える

なお、記載されていない番号の入力も受け付けますが、正常な動作は一切保証できません。

I : 運転情報送信要求

各種情報を取得できます。現在仕様策定中につき、将来的にコマンドが追加される可能性があります。
接尾辞の"\n"は、表中では省略しています。実際の運用時に忘れないように注意してください。

HeadOrderMeaning
TRIC0車両のBノッチ数
1車両のPノッチ数
2ATS確認段
3B67に相当する段
4編成車両数
5単弁の段数
6~その他車両情報(専用ページへ)(準備中)
E0自列車位置[m]
1自列車速度[km/h]
2現在時刻[ms]
3BC圧[kPa]
4MR圧[kPa]
5ER圧[kPa]
6BP圧[kPa]
7SAP圧[kPa]
8電流[A]
9(予約)架線電圧[V]
10現在時刻(HH)[時]
11現在時刻(MM)[分]
12現在時刻(SS)[秒]
13現在時刻(MS)[ミリ秒]
H0Bノッチ位置
1Pノッチ位置
2レバーサー位置(SLの場合は逆転機ハンドル位置-10000 ≦ x ≦ +10000)
3(予約)定速状態情報
4単弁ハンドル位置
P0Panel[0]の値
nPanel[n]の値
-1Panel配列の配列長を返します。負の数であれば、数字は何を送っても構いません。
S0Sound[0]の値
nSound[n]の値
-1Sound配列の配列長を返します。負の数であれば、数字は何を送っても構いません。
D0ドア状態(0:閉, 1:開, 2:左開, 3:右開, 4:両開)
1ドア特殊扱い(0:なし, 1:3/4(2/3)閉実施, 2:半自動扱い実施)
2ドアバックアップ実施TF

A : 運転情報自動送信開始要求

指定する運転情報に変更があった際に自動で送信するように登録するコマンドです。
多重登録は受け付けません。多重登録を要求されても、前回登録が上書きされるだけです。

登録方法は、"TRAxxx\n"とコマンドを送るだけです。正常に登録されると"TRAxxxX0\n"と返答が来ます。
xxxに入る文字列は、識別子"I"の運転情報送信要求で用いる文字列と同一です。

D : 運転情報自動送信停止要求

念のために用意しておりますが、自動送信登録は次回接続時に持ち越されず、また接続ごとに独立したリストを持っているため、機器接続中に情報が要らなくなった際くらいしか用途がありません。登録のない情報の自動送信を停止するよう要求された場合も、正常に登録が解除されたように返答が来るので、注意して下さい。

登録を解除する方法は、"TRDxxx\n"とコマンドを送るだけです。正常に登録が解除されると"TRDxxxX0\n"と返答が来ます。
xxxに入る文字列は、識別子"I"の運転情報送信要求で用いる文字列と同一です。

E : エラー発生通告

これは他のコマンドと違い、通常は要求側が送信することはありません。他の要求を処理する段階で何らかのエラーが発生した際に、返答側がこのコマンドを使用してエラーの発生を通告します。

エラーコマンドは以下の通りです。接尾辞の"\n"は、表中では省略しています。実際の運用時に忘れないように注意してください。

HeadNumMeaning
TRE0原因不明
1BIDSpp.dll(もしくはOBIDS.dll)と接続できていない
2コマンドの数値部が不正(存在しない数字)
3コマンドの記号部が不正(存在しない記号)
4コマンドの識別子が不正(存在しない識別子)
5数値変換がオーバーフローした
6要求情報の数値部に数字以外が混入している
7コマンドが不正(原因特定不可)
8BVEのウィンドウハンドル取得失敗

H : 保安装置状態情報送信要求

現在仕様策定中につき、しばらくお待ちください。

参考文献

JIS E 4010:1985 鉄道車両及び鉄道車両部品の記号

更新履歴

2019年2月28日obve向けATS_Keyの参照先へのリンクを追加
obve向けATS_KeyのMeaning追加宣言を削除
システム連携イメージを追加
2019年2月27日新規公開

Posted by Tetsu Otter