WOLFRAM

TCPを通したシミュレーションとの交信

System Modelerシミュレーションは,実行中のシミュレーションがデータを読み取ったり書き込んだりするためのインターフェースに使えるプロトコルを使う.Wolfram System ModelerSimulation Control Session (WSMSCS)とWolfram System ModelerSimulation Data Session (WSMSDS)という,2つのセッションのネットワークプロトコルが使われる.以下の図はその設定を表す.

1.gif

System Modelerのシミュレーションセッション.

プロトコルは,パラメータと入力変数の両方を設定し,それぞれの統合ステップから(出力)変数を取り出すことを可能にする.リアルタイムのシミュレーションを行う場合には,シミュレータへのXMLの入力ファイルを設定して,シミュレータのサンプル比を決める固定の刻み幅で単一のステップソルバを使う.必要ならば,シミュレータがコンピュータのリアルタイムクロックと同期化するようにオプションを与えることができる.

WSMSCS/WSMSDS

System ModelerSimulation Control Sessionは,開始と終了のコマンドを発し,入力変数値を設定することで,実行中のシミュレーションのサーバを制御するために使われる.プロトコルは,TCP,およびヘッダとペイロードからなるメッセージ上で実行される.

System ModelerSimulation Data Sessionは,実行中のシミュレーションサーバからシミュレーションデータを受け取るために使われる.SDSセッションは,変数のサブスクリプションを設定するのに使われるSCSセッションとペアで使われなければならない.

WSMCOMパケット

それぞれのパケットは,パッケージのタイプおよびペイロードの長さを示すヘッダからなる.

WSMCOMヘッダ

ヘッダには,どのプロトコルを使うか,どのタイプのパッケージが送られるか,パケット特定のデータ,ペイロードの長さについての情報が含まれる.

ビット
0-7プロトコルバージョン1
8-15パケットタイプ1 - HELLO_SCS 2 - HELLO_SDS 3 - CMD 4 - CMD_REPLY 5 - CMD_ERROR 6 - SDS_OUTPUT_DATA 8 - SDS_INPUT_DATA
16-31パケット特有
32-63ペイロードの長さ

HELLO_SCSパケット

クライアントは,HELLO_SCSパケットを送信することで,SCSセッションを開始する.ペイロードは空でなければならない.開始に成功すると,サーバはCMD_REPLYパケットを返し,ペイロードは{SESSION_ID_SCS}になる.失敗した場合には,サーバはCMD_ERRORパケットを返し,ペイロードは問題の説明になる.

HELLO_SDSパケット

クライアントは,HELLO_SDSパケットを送信することで,SDSセッションを開始する.ペイロードは,対応するSCSセッションに与えられたSESSION_ID_SCSでなければならない.成功すると,サーバはCMD_REPLYパケットを返し,ペイロードは{SESSION_ID_SDS}になる.失敗すると,サーバはCMD_ERRORパケットを返し,ペイロードは問題の説明になる.

シミュレーションが始まった後,サーバは対応するSCSセッションのサブスクリプション設定に従って,SDS_OUTPUTパケットを各時間ステップごとにクライアントにストリームし始める.SDSセッションは,サーバにコマンドを送るのに使うことはできない.

CMDパケット

クライアントは,CMDパケットを送ることによって,サーバにインタラクティブなコマンドを送信する.ペイロードはこのコマンドを含まなければならない.成功すると,サーバはCMD_REPLYパケットを返し,ペイロードにはコマンドの結果が含まれる.失敗すると,サーバはCMD_ERRORパケットを返し,ペイロードは問題の説明になる.コマンドのリストについては,このセクションを参照されたい.

CMD_REPLYパケット

サーバは,CMD_REPLYパケットをHELLO_SCSHELLO_SDSCMDのいずれかのパケットに対する返答として送る.

CMD_ERRORパケット

サーバは,結果としてサーバのエラーをもたらすHELLO_SCSHELLO_SDSCMDのいずれかのパケットに対する返答としてCMD_ERRORパケットを送る.ペイロードには問題の説明が含まれる.

CMD_REPLYとCMD_ERRORのペイロード

CMD_REPLYCMD_ERRORのパケットにおけるすべてのペイロードは常に,{}に囲まれた配列としてフォーマットされる.配列内の要素は,コンマで区切られる.有効な配列要素は以下の通りである.

例:文字列の値を持つ文字列:{"var1","var2","var3"}

例:実数値を持つ配列:{1.0,2.0,3.0}

例:ネストした配列,文字列,および数:{{"var1",1.0},{"var2",2.0}}

SDS_OUTPUT_DATAパケット

SDSセッションがHELLO_SDSパケットを送ることによって開始された場合には,サーバは,それぞれのソルバステップの後で,サブスクリプションの変数値を持つSDS_OUTPUT_DATAパケットを送り始める.パケットヘッダ内のビット16-23がサブスクリプションIDである.

ペイロードは,バイナリ形式(double)のサブスクリプション変数すべての値からなる.

SDS_INPUT_DATAパケット

クライアントは,SDSセッション上でSDS_INPUT_DATAパケットを送り,すべての入力変数を設定することができる.ペイロードは,getInputVariableNames()で示される順序で,すべての入力変数についてバイナリ形式 (double)の値からなっていなければならない.

SCSのインタラクティブなコマンド

インタラクティブなコマンドはすべて,SCSセッションでCMDパッケージとして送られる.

getInputVariableNames()

モデルのすべての入力変数の名前を含むリストを返す.

cmd: getInputVariableNames()
reply: {"var1", "var2", "var3", }

getModelName()

モデルの名前を返す.

cmd: getModelName()
reply: {"IntroductoryExamples.HelloWorld"}

getOutputVariableNames()

モデルのすべての出力変数の名前を含むリストを返す.

cmd: getOutputVariableNames()
reply: {"var1", "var2", "var3", }

getParameterNames()

モデルのすべてのパラメータの名前を含むリストを返す.

cmd: getParameterNames()
reply: {"var1", "var2", "var3", }

getStateDerivativeVariableNames()

モデルのすべての状態微分変数の名前を含むリストを返す.

cmd: getStateDerivativeVariableNames()
reply: {"var1", "var2", "var3", }

getStateVariableNames()

モデルのすべての状態変数の名前を含むリストを返す.

cmd: getStateVariableNames()
reply: {"var1", "var2", "var3", }

getVariableNames()

モデルのすべての変数の名前を含むリストを返す.

cmd: getVariableNames()
reply: {"var1", "var2", "var3", }

getAlgebraicVariableNames()

モデルのすべての代数変数の名前を含むリストを返す.

cmd: getAlgebraicVariableNames()
reply: {"var1", "var2", "var3", }

setSubscription({"var1", "var2", "var3", ...})

対応するSDSセッションのサブスクリプションを設定する.SDSセッションで受け取ったパケットを認識するのに使われたSUBSCRIPTION_ID を返す.

cmd: setSubscription({"var1", "var2", "var3", })
reply: {SUBSCRIPTION_ID}

setInputValues({"var1", value1, "var2", value2, ...})

入力変数値を設定する.新しい値は,次のソルバステップで使われる.

cmd: setInputValues({"var1", value1, "var2", value2,...})
reply: {true}

getTime()

現行のシミュレーション時間を返す.

cmd: getTime()
reply: {2.54}

suspendSimulation()

continueSimulation()terminateSimulation()のコマンドが発されるまで,シミュレーションを停止する.

cmd: suspendSimulation()
reply: {true}

continueSimulation()

suspendSimulation()コマンドの後でシミュレーションを継続する.

cmd: continueSimulation()
reply: {true}

startSimulation()

startSimulation()コマンドが発されるまでシミュレーションの開始を待つように設定されている場合に,シミュレーションを開始する.

cmd: startSimulation()
reply: {true}

stopSimulation()

現行のソルバステップが終ったときに,シミュレーションを終了する.

cmd: stopSimulation()
reply: {true}

setParameterValues({"var1", value1, "var2", value2, ...})

パラメータ値を設定する.新しい値は,次のソルバステップで使われる.

cmd: setParameterValues({"var1", value1, "var2", value2,...})
reply: {true}

getVariableValues({"var1", "var2", ...})

変数値のリストを返す.

cmd: getVariableValues({"var1", "var2",...})
reply: {value1, value2,...}