SiLA 2のFeature設計|Command・Property・データ型をどう決めるか

SiLA 2のFeature設計のアイキャッチ

この記事で学べること

  • SiLA 2のFeatureが、装置の「できること」を表す契約書である理由
  • CommandとPropertyをどう分け、Observableをいつ使うか
  • Parameter、Response、Intermediate Responseの設計方法
  • データ型、単位、制約、Custom Data Typeを使って曖昧さを減らす方法
  • Defined Execution Errorと安全機能の責任範囲
  • Feature Definition(FDL)を作り、公式Python SDKで検証する手順

SiLA 2で装置をつなぐとき、通信が通るだけでは自動化は完成しません。「温度を設定する」「現在温度を読む」「運転完了を待つ」といった装置の能力を、クライアントが誤解しない形で定義する必要があります。その中心がFeatureです。

SiLA公式サイトは、FeatureをSiLA Serverが提供する能力と説明し、Featureが呼び出せるCommandと、読み取り・購読できるPropertyを公開するとしています[1]。本記事では温度調節装置を例に、Featureを実務で設計する順番を解説します。なお、ここで示すXMLは説明用の公開可能な仮想例であり、特定メーカーの実装ではありません。

結論:Featureは装置の通信コマンド表ではなく「意味のある能力」で切る

最初に結論をまとめます。

  1. Featureは、装置型式や通信プロトコルではなく、利用者から見た能力で分ける。
  2. 状態を変える操作はCommand、現在値や状態の参照はPropertyにする。
  3. 短い設定変更はUnobservable、長時間処理や再接続後も追跡したい処理はObservableを優先する。
  4. 数値には単位と許容範囲を付け、同じ意味の型はCustom Data Typeで再利用する。
  5. 予測可能な業務上の失敗はDefined Execution Errorとして列挙する。
  6. FDLは目視確認だけで終えず、XSD検証と使用SDKのコード生成をCIで実行する。

重要なのは、RS-232の「SET 50」のような装置固有文字列をそのまま表に出さないことです。その文字列を背後に隠し、クライアントには「SetTargetTemperature」という意味を提供します。SiLA 2はHTTP/2、Protocol Buffers、gRPCを基盤にしますが、Feature設計では通信の細部より機能を表すことが中心です[1]。全体像は実験自動化の通信・制御・標準を整理するも参照してください。

Feature Definition(FDL)の構造

FeatureはXML形式のFeature Definition Language(FDL)で記述します。主な要素は次のとおりです[2]。

要素 役割 温度制御の例
Feature 一まとまりの能力 TemperatureController
Command 状態を変える処理、または仕事の実行 SetTargetTemperature、RunTemperatureHold
Parameter Commandへ渡す入力 TargetTemperature、HoldDuration
Response 正常完了時の最終結果 AcceptedTargetTemperature、CompletedAt
Intermediate Response 実行中に届く中間結果 ElapsedSeconds
Property 現在値・状態・構成情報の参照 CurrentTemperature、CurrentOperatingState
DataTypeDefinition Feature内で再利用する型 Temperature、OperatingState
Defined Execution Error 予測可能な実行失敗 DeviceBusy、SafetyInterlockOpen

FeatureのIdentifierはUpperCamelCaseで、公式仕様は能力に応じてService、Provider、Controllerなどの接尾辞を推奨しています[2]。したがって「TC01」や「ModelABC」のような機種名ではなく、温度を制御する能力ならTemperatureControllerとする方が再利用しやすくなります。

CommandとPropertyをどう分けるか

Commandは「動詞」、Propertyは「現在の事実」

迷ったときは、呼び出しによって装置の状態や処理が変わるかを確認します。

  • Command:目標温度を設定する、測定を開始する、試料を搬送する、校正を実行する
  • Property:現在温度、シリアル番号、扉の開閉状態、運転状態、現在の測定値

「TargetTemperatureをPropertyにして書き込む」という設計は一見簡単ですが、SiLA 2のPropertyは読み取り・購読のための概念です。設定変更はCommandにし、受理した値をResponseとして返すと、入力と結果を追跡しやすくなります。

1つの巨大Commandを避ける

「RunExperiment」に温度、時間、測定、保存先をすべて詰めると、再利用や部分テストが難しくなります。一方、1バイト操作までCommandへ分解すると、クライアントが装置固有手順を組み立てることになります。

実務では、利用者が意味を理解でき、独立してテストできる単位を選びます。「目標温度を設定する」と「設定温度に到達後、所定時間保持する」は、所要時間と失敗条件が異なるため別Commandにする価値があります。装置をPythonから統合する一般的な層分けはPythonによる実験装置・研究データ連携にもつながります。

ObservableとUnobservableの選択

CommandにはObservable=”Yes”または”No”を指定します。公式仕様では、長時間動作、進捗を知りたい処理、接続が切れても結果を失いたくない処理はObservableが適します。一方、設定値を送るだけの短い処理はUnobservableが適する場合があります[2]。

判断 Unobservable Observable
典型例 設定値の変更、短いリセット 測定、加熱保持、長い校正
時間 短い、即時応答が期待できる 人が待つと感じる時間
進捗・中間結果 不要 必要、または有用
切断後の追跡 結果を受け取れない可能性 Execution UUIDを使って再追跡しやすい

今回の例では、SetTargetTemperatureはUnobservable、RunTemperatureHoldはObservableです。後者にはElapsedSecondsというIntermediate Responseを定義します。ただし中間応答は「進捗率」と同じではありません。温度到達時間が不確かな装置で根拠なく50%と返すより、「現在温度」や「経過時間」という観測可能な事実を返す方が安全です。

PropertyもObservableを選べます。Observable Propertyを購読すると、初回の現在値と、その後の変化が送られます[2]。現在温度や運転状態には向きますが、シリアル番号のように変化しない値はUnobservableで十分です。

Parameter、Response、中間応答を設計する

Parameterは必要最小限にする

ParameterにはCommand実行時に必ず確定している入力を置きます。入力が省略可能か、装置側の既定値に依存するかを曖昧にすると、同じ呼び出しでも装置ごとに結果が変わります。自動化で再現性を重視するなら、結果へ影響する設定は明示的なParameterにするか、使用した設定をResponseへ含めます。

Responseは「呼び出せた」ではなく、後工程に必要な結果を返す

成功時に単なるtrueだけを返すと、実際に採用された値、結果ファイル、完了時刻が分かりません。SetTargetTemperatureではAcceptedTargetTemperatureを返し、装置が丸めた値を後工程で確認できるようにします。RunTemperatureHoldではCompletedAtを返せば、実験記録と時刻を関連づけられます。

測定処理なら、結果そのものをStructureで返すか、ファイル参照とメタデータを返すかを、データ量と保存責任に応じて決めます。巨大なバイナリを毎回Responseに含めることが最善とは限りません。

データ型・単位・制約で曖昧さを消す

基本型だけでは意味が足りない

「Realだから温度」とは限りません。数値だけでは、摂氏かケルビンか、許容範囲はいくつか、端点を含むかが分かりません。SiLA 2にはInteger、Real、String、Boolean、Date、Time、Timestamp、Binary、Anyなどの基本型に加え、List、Structure、Constrainedといった派生型があります[2]。

物理量にはUnit Constraintが推奨されます。送信値はUnit Labelの単位で扱い、Factor、Offset、SI単位要素で換算関係を表します[2]。

<DataTypeDefinition>
  <Identifier>Temperature</Identifier>
  <DisplayName>Temperature</DisplayName>
  <Description>A temperature between minus 40 and 200 degrees Celsius.</Description>
  <DataType>
    <Constrained>
      <DataType><Basic>Real</Basic></DataType>
      <Constraints>
        <Unit>
          <Label>degree Celsius</Label>
          <Factor>1</Factor>
          <Offset>273.15</Offset>
          <UnitComponent><SIUnit>Kelvin</SIUnit><Exponent>1</Exponent></UnitComponent>
        </Unit>
        <MinimalInclusive>-40</MinimalInclusive>
        <MaximalInclusive>200</MaximalInclusive>
      </Constraints>
    </Constrained>
  </DataType>
</DataTypeDefinition>

Custom Data Typeは同じ意味を一度だけ定義する

TemperatureをCustom Data Typeにすれば、CommandのParameter、Response、Propertyが同じ単位・範囲を参照できます。仕様上、Custom Data TypeはParameter、Response、Intermediate Response、Property、Metadataで通常の型と同様に利用できます[2]。

ただし、装置ごとに許容温度が違うのに、無理に共通範囲を固定してはいけません。Featureが表す共通契約と、個体の能力値を分けます。例えば規格上のTemperatureは広い物理型とし、装置固有の最小・最大温度を別Propertyとして公開する設計も可能です。

状態値は自由記述にしない

OperatingStateを単なるStringにすると、Idle、IDLE、Standbyなどが混在します。本例ではSet ConstraintでIdle、Heating、Holding、Cooling、Errorに限定しました。将来状態を追加するとクライアントへの影響があるため、FeatureVersionと変更方針も合わせて管理します。

Defined Execution Errorをどう設計するか

型や範囲の不正はValidation Errorで扱えます。一方、値の形式は正しいが実行できない条件はDefined Execution Errorとして設計します。公式仕様は、装置が忙しい、搬送元にプレートがない、搬送先が埋まっている、といった予測可能な前提条件を例示しています[2]。

温度制御例では次の3つを定義しました。

  • DeviceBusy:同時実行できない処理が進行中
  • SafetyInterlockOpen:扉や安全インターロックが開いている
  • TargetNotReached:装置内タイムアウトまでに目標温度へ到達しない

「Error1」「Failed」のような名称では、上位システムが再試行、中止、作業者通知を判断できません。エラーはクライアントが次の行動を選べる粒度にします。ただし予期できないソフトウェア障害や通信断まで、Defined Execution Errorに押し込む必要はありません。仕様でも、設計時に予測できない実装依存の失敗はUndefined Execution Errorと区別しています[2]。

実務でのFeature設計手順

  1. 利用場面を書く:「装置を制御する」ではなく、「ワークフローが目標温度を設定し、保持完了を待つ」と記述する。
  2. 能力の境界を決める:温度制御、攪拌、測定など、独立して再利用できるFeature候補へ分ける。
  3. CommandとPropertyを列挙する:動作と現在の事実を分ける。
  4. Observableを判断する:時間、進捗、切断後の追跡、結果消失リスクを確認する。
  5. 入出力を定義する:Parameter、Response、中間応答を後工程の判断から逆算する。
  6. 型と単位を固定する:範囲、単位、候補値、構造を定義し、再利用部分をCustom Data Typeにする。
  7. 失敗条件を列挙する:再試行可能、作業者対応、安全停止など、復旧行動を意識してエラーを分ける。
  8. FDLを機械検証する:XSD検証、コード生成、クライアントとの契約テストを自動化する。
  9. 実装と安全を分離する:Featureは上位インターフェースであり、PLCや装置内部のインターロックを置き換えない。

自動実験全体の位置づけは実験自動化とは?、閉ループ探索との関係は自律実験・Self-driving Labとは?で整理しています。

公式Python SDKでFDLを検証する

本記事では、2026年10月12日時点で公式GitLabに公開されているsila_python v0.14.0(2025年12月1日付タグ)を使い、説明用のTemperatureController.sila.xmlを検証しました[3][4]。SDKは規格そのものではなく実装の一つです。規格要件はSiLA仕様書で確認し、SDK固有のコマンドや生成物は使用版で固定してください。

python -m venv .venv
.venv/bin/python -m pip install "sila2[codegen]==0.14.0"
.venv/bin/sila2-codegen generate-feature-files \
  --output-directory generated \
  TemperatureController.sila.xml

正常なFDLからは、proto、Featureクラス、Client、Base実装、型、エラーなど8ファイルが生成されました。異常系としてFeature Identifierを「Temperature-Controller」に変えたところ、識別子パターン「[A-Z][a-zA-Z0-9]*」に違反すると検出されました。公式リポジトリのTimerProviderも、Observable Command、Intermediate Response、Property、Defined Execution Errorの実例として参考になります[5]。

注意:今回確認したCLIは、検証エラーを表示してもプロセス終了コードが0になる場合がありました。CIではCLIの終了コードだけを合否にせず、SDKのparse_feature_definitionなどで例外を捕捉し、異常時に非0を返す検証スクリプトを併用するのが編集部の推奨です。これはv0.14.0で観測したSDK固有動作であり、SiLA 2規格の要件ではありません。

よくある失敗

装置固有コマンドをそのままFeatureにする

SCPI文字列やメーカーSDKの関数名を公開すると、装置交換時にクライアントまで変更が必要になります。下位ドライバで装置固有差を吸収し、Featureには意味のある能力を出します。

単位をDescriptionだけに書く

「温度(℃)」と文章に書くだけでは、クライアントが機械的に換算できません。Unit Constraintと数値範囲を型に含めます。

長時間処理をUnobservableにする

通信断時に完了結果を受け取れず、同じ処理を再実行して二重実行になる恐れがあります。長時間の測定や保持処理はObservableを優先し、再接続とExecution UUIDの運用まで試験します。

Propertyを高速制御ループに使う

温度値を購読できても、それを使ってPC側でミリ秒周期の安全制御を実行する設計は危険です。ネットワーク遅延や切断を前提に、PIDやインターロックは装置内部またはPLCなど適切な制御層で実行します。

FeatureVersionを変えずに意味を変更する

Identifierが同じでも、単位、範囲、Response、エラーの意味を変えれば既存クライアントが誤動作します。互換性を確認し、破壊的変更では版を更新して並行試験します。

限界・不確かさ・安全と責任範囲

良いFeature定義は相互理解を助けますが、実装品質や装置安全を保証しません。FDLのXSD検証で分かるのは構文と一部の制約です。実装が本当にインターロックを確認するか、温度が正しいか、停止指令が所定時間内に効くかは、実機試験とリスク評価が必要です。

通知頻度、再購読、複数クライアント競合、認証、時刻同期、監査ログ、更新時の互換性はFeature XMLだけでは完結しません。危険な温度・圧力・可動部の保護は装置・PLC・安全回路側に置きます。

設計チェックリスト

  • Feature名が機種名ではなく能力を表している
  • Commandは動作、Propertyは現在の事実として分離されている
  • 長時間処理と結果消失リスクを考慮してObservableを選んだ
  • ParameterとResponseの意味が英語Descriptionで明確になっている
  • 物理量に単位、範囲、端点条件がある
  • 同じ意味の型をCustom Data Typeで再利用している
  • 状態値の表記揺れをSet Constraint等で抑えている
  • 予測可能な失敗をDefined Execution Errorとして列挙した
  • クライアントがエラーごとに再試行・中止・通知を選べる
  • FDLをXSDと対象SDKで自動検証した
  • 複数クライアント、切断、再接続、二重実行を試験した
  • 安全制御をネットワーク上位層へ移していない

FAQ

Featureは装置1台につき1つですか?

いいえ。1つのSiLA Serverが複数Featureを実装できます。温度制御、攪拌、測定、識別などを能力ごとに分けると再利用しやすくなります。

設定値はPropertyにできませんか?

現在の設定値をPropertyとして読むことはできますが、変更操作はCommandとして表す方が、入力、受理値、エラー、監査を明確にできます。

Observable Commandには必ずIntermediate Responseが必要ですか?

必須ではありません。進捗や中間結果が意味を持つ場合に定義します。根拠のない進捗率を返すより、状態Propertyや実測値を購読させる方が適切な場合もあります。

すべての数値に最小・最大を付けるべきですか?

物理・仕様上の境界が明確なら付ける価値があります。ただし装置個体で能力が異なる場合、Feature型に固定するか、能力Propertyとして公開するかを検討してください。

FDLが生成できれば相互運用できますか?

それだけでは不十分です。同じFeature定義、対応バージョン、実装挙動、エラー処理、認証、実機のタイミングを組み合わせて適合試験を行う必要があります。

まとめ

SiLA 2のFeature設計は、装置固有の通信を、研究者やワークフローが理解できる能力へ変換する作業です。CommandとPropertyを分け、所要時間に応じてObservableを選び、単位・範囲・Custom Data Typeでデータの意味を固定します。予測可能な失敗はDefined Execution Errorにし、安全停止は装置やPLCの制御層に残します。

1つの利用場面と2〜3個のCommandから始め、FDL検証、コード生成、契約テスト、実機テストを繰り返す方が確実です。次の記事では、長時間Commandの進捗とエラーを扱います。

参考文献

  1. SiLA, “Standards | SiLA Rapid Integration,” Technical Concept / SiLA 2 Features, 確認日 2026-10-12. https://sila-standard.com/standards/
  2. Association Consortium Standardization in Lab Automation, “SiLA 2 Part (A) – Overview, Concepts and Core Specification,” Public Document Release v1.1, 19 March 2022. PDF
  3. SiLA2, “sila_python,” official GitLab repository, 確認日 2026-10-12. https://gitlab.com/SiLA2/sila_python
  4. SiLA2, “sila_python v0.14.0,” tag/commit b3c611565d6df1d6747eb8cb7c211aed5e3e2055, 2025-12-01. v0.14.0
  5. SiLA2, “TimerProvider.sila.xml,” sila_python v0.14.0 example server. official example

コメントする

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA


上部へスクロール