PythonでSiLA 2を動かす|模擬装置のサーバーとクライアントを作ろう

PythonでSiLA 2を動かすのアイキャッチ

確認日:2026年10月12日

SiLA 2の概念を理解しても、実際にサーバーへ接続してCommandを呼び出すまでは、通信の流れを具体的に想像しにくいかもしれません。本記事では、公式Python実装と公式Example Serverを使い、1台のPC上に模擬装置のSiLA ServerとSiLA Clientを作ります。

装置実機やPLCは必要ありません。Pythonの仮想環境を用意し、サーバーを起動し、別のターミナルからコマンド実行・プロパティ取得・エラー処理まで確認します。SiLA 2の全体像を先に確認したい方は、実験自動化の通信・制御・標準を整理するも参照してください。

この記事で学べること

  • SiLA Server、SiLA Client、Featureの関係
  • Python 3.10以上の仮想環境へSiLA 2 v0.14.0を導入する方法
  • 公式Example Serverを模擬装置として起動する方法
  • Commandの実行とPropertyの取得をPythonから行う方法
  • ValidationErrorとSilaConnectionErrorを処理する方法
  • 開発用の非暗号化接続と、本番環境の暗号化接続を分ける理由
  • 模擬装置から実機ラッパーへ発展させる手順

今回作るもの

SiLA 2では、機能を提供する側をSiLA Server、機能を利用する側をSiLA Clientと呼びます。ServerとClientは物理的な装置名ではなく役割です。装置制御PCがServerになり、実験ワークフローやGUIがClientになる構成が典型です[1][2]。

ターミナル1
公式Example Server(模擬装置)
  ├─ GreetingProvider
  │   ├─ SayHello Command
  │   └─ StartYear Property
  └─ TimerProvider
      └─ Countdown Command

              localhost:50052
                     ▲
                     │ SiLA 2 / gRPC
                     ▼

ターミナル2
Python Client
  ├─ SayHelloを実行
  ├─ StartYearを取得
  ├─ 不正入力を送ってValidationErrorを確認
  └─ 誤ったポートへ接続して接続エラーを確認

公式Pythonリポジトリには、Server、Client、Feature実装、エラー処理を学べるExample ServerとClientスクリプトが含まれています[3][4][8]。今回はこれを教材として使うため、装置ドライバーの作成より先に「通信が成立する最小構成」を確認できます。

使用するバージョンと前提条件

本記事では次の環境で検証しました。

項目 本記事の条件
Python 3.12.14(公式パッケージの要件は3.10以上)
SiLA 2 Python 0.14.0
公式リポジトリ SiLA2/sila_python、タグv0.14.0
通信先 127.0.0.1:50052
暗号化 学習用に無効。本番利用は禁止
装置 公式Example Serverによる模擬装置

公式リポジトリのv0.14.0タグは2025年12月1日付で、Python 3.10以上を前提としています[3][4]。SDKの更新によりAPIや依存関係が変わる可能性があるため、記事どおりに再現する場合はバージョンを固定してください。

手順1:仮想環境を作る

作業用フォルダーへ移動し、仮想環境を作ります。仮想環境を使うと、ほかのPythonプロジェクトと依存パッケージを分離できます[5]。

Windows PowerShell

mkdir sila2-demo
cd sila2-demo
py -3.12 -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip

macOS・Linux

mkdir sila2-demo
cd sila2-demo
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip

次のコマンドでPythonの位置とバージョンを確認します。

python --version
python -c "import sys; print(sys.executable)"

Pythonが3.10未満の場合は、先に新しいPythonを導入してください。仮想環境を有効化せずにインストールすると、別のPython環境へパッケージが入ることがあります。

手順2:SiLA 2と公式Example Serverを入れる

再現性を確保するため、公式リポジトリをv0.14.0タグで取得します。

git clone --depth 1 --branch v0.14.0 https://gitlab.com/SiLA2/sila_python.git
python -m pip install "sila2==0.14.0"
python -m pip install ./sila_python/example_server

インストールできたかを確認します。

python -c "import sila2; print(sila2.__version__)"
python -c "from sila2_example_server import Server, Client; print('import OK')"

期待する出力は次のとおりです。

0.14.0
import OK

SiLA 2はFeature DefinitionからProtocol BuffersとPythonコードを生成し、gRPCを介してClientとServerを接続します。Protocol Buffersは構造化データを言語中立に定義する仕組みで、gRPCはその定義を使って遠隔手続きを呼び出します[6][7]。ただし利用者は、通常は生成されたPythonクラスを通じてCommandやPropertyを操作します。

手順3:模擬SiLA Serverを起動する

1つ目のターミナルで仮想環境を有効化し、次を実行します。

python -m sila2_example_server \
  --ip-address 127.0.0.1 \
  --port 50052 \
  --disable-discovery \
  --insecure \
  --verbose

Windows PowerShellでは、改行せず1行で実行すると確実です。

python -m sila2_example_server --ip-address 127.0.0.1 --port 50052 --disable-discovery --insecure --verbose

サーバーが待機状態になると、ターミナルは入力待ちへ戻りません。これは正常です。終了するときはCtrl+Cを押します。

各オプションの意味

オプション 意味 今回の判断
--ip-address 127.0.0.1 同じPCからだけ接続 学習用として外部公開を防ぐ
--port 50052 Serverの待受ポート 公式Example Serverの標準値
--disable-discovery mDNSによる装置検出を無効化 今回は接続先を明示する
--insecure TLS暗号化を無効化 localhostでの学習限定
--verbose 起動・接続情報を表示 問題を見つけやすくする

重要:--insecureを付けたServerを、社内LAN、研究ネットワーク、クラウドへ公開してはいけません。SiLA 2仕様は暗号化、認証、認可を扱っており、非暗号化は開発時だけの例外です[2]。

手順4:完全なClientコードを作る

2つ目のターミナルで、次の内容をsila2_client_demo.pyとして保存します。

from __future__ import annotations

from sila2.framework import SilaConnectionError, ValidationError
from sila2_example_server import Client

HOST = "127.0.0.1"
PORT = 50052


def call_server() -> None:
    # withを抜けると通信資源が自動的に解放される
    with Client(HOST, PORT, insecure=True) as client:
        # Command:Serverに処理を依頼する
        response = client.GreetingProvider.SayHello(Name="Researcher")
        print(f"Greeting: {response.Greeting}")

        # Property:Serverが持つ現在値を取得する
        start_year = client.GreetingProvider.StartYear.get()
        print(f"StartYear: {start_year}")

        # 制約違反を意図的に発生させる
        try:
            client.TimerProvider.Countdown(-1, Message="invalid test")
        except ValidationError as exc:
            print(f"ValidationError caught: {exc.message}")


def check_wrong_port() -> None:
    # Serverが待ち受けていないポートへ接続する異常系
    try:
        with Client(HOST, PORT + 1, insecure=True):
            pass
    except SilaConnectionError as exc:
        print(f"ConnectionError caught: {type(exc).__name__}")


if __name__ == "__main__":
    call_server()
    check_wrong_port()

サーバーを起動したまま、2つ目のターミナルで実行します。

python sila2_client_demo.py

本記事の検証環境では、次の出力を確認しました。

Greeting: Hello SiLA 2 Researcher
StartYear: 2026
ValidationError caught: Constraint violated: MinimalInclusive(0.0) (-1)
ConnectionError caught: SilaConnectionError

StartYearは実行年に依存するため、別の年に実行すれば値が変わります。エラーメッセージの細部もSDKバージョンによって変わる可能性があります。

コードのどこがSiLA 2なのか

1.Clientを作るとFeatureが見える

with Client(HOST, PORT, insecure=True) as client:

ClientはServerのFeature Definitionを前提に、GreetingProviderやTimerProviderをPython属性として扱います。Featureは、装置が提供する機能のまとまりです。SiLA 2では、各FeatureにCommand、Property、Metadataなどを定義します[1][2]。

2.Commandは動作を依頼する

response = client.GreetingProvider.SayHello(Name="Researcher")

SayHelloはCommandです。入力ParameterとしてNameを送り、応答としてGreetingを受け取ります。実機なら「測定開始」「試料搬送」「設定値変更」などがCommandに相当します。

3.Propertyは状態や設定値を読む

start_year = client.GreetingProvider.StartYear.get()

StartYearはPropertyです。実機なら、シリアル番号、現在温度、ドア状態、装置モードなどを表せます。変化を通知できるObservable Propertyと、要求時に読むUnobservable Propertyがあります。

4.制約違反は実装コードへ入る前に検出できる

client.TimerProvider.Countdown(-1, Message="invalid test")

Countdownの回数には0以上という制約があるため、-1を渡すとValidationErrorになります。入力範囲をFeature Definitionに持たせることで、ClientとServerの双方が機械可読な制約を共有できます。

正常系と異常系をどう検証したか

試験 操作 期待結果 検証結果
Command正常系 SayHelloに文字列を渡す Greetingが返る 成功
Property正常系 StartYear.get() 整数が返る 成功
入力異常 Countdownへ-1を渡す ValidationError 成功
接続異常 50053番ポートへ接続 SilaConnectionError 成功
終了処理 withブロックを抜ける Client資源を解放 成功

通信ライブラリの検証では、成功する1例だけでは不十分です。入力不正、接続先誤り、タイムアウト、再接続、二重実行などを段階的に追加します。本記事では最初の2種類の異常系までを扱い、長時間Commandや再試行設計は後続記事で詳しく説明します。

よくあるエラーと対処

ModuleNotFoundError: No module named 'sila2'

仮想環境が有効か確認し、python -m pip show sila2を実行します。pipだけを実行すると、別のPythonへ入ることがあるため、python -m pipを推奨します。

No module named 'sila2_example_server'

python -m pip install ./sila_python/example_serverを実行した場所を確認します。Git clone後のフォルダー名を変更した場合は、実際のパスに合わせます。

SilaConnectionError

Serverが起動中か、ClientとServerでIPアドレス、ポート、暗号化設定が一致しているか確認します。Serverが--insecureならClientにもinsecure=Trueが必要です。

ポートが使用中と表示される

別のプロセスが50052番を使用しています。ServerとClientの両方を、たとえば50060番へ変更します。片方だけ変えると接続できません。

コンテナで装置検出が失敗する

SiLA Server Discoveryはローカルネットワーク上のサービス検出を使います。制限されたコンテナでは、ネットワークインターフェース列挙やマルチキャストが許可されない場合があります。本記事の検証環境でもこの制限があったため、検証用アダプターでDiscoveryを無効化して直接接続しました。実環境では、コンテナのネットワーク設定を確認するか、IPアドレスとポートを明示して接続してください。

模擬装置から実機へ発展させる5段階

  1. 装置機能を棚卸しする:開始、停止、設定、状態、結果を分ける。
  2. Featureを設計する:Command、Property、Parameter、Response、制約、単位、エラーを定義する。
  3. コードを生成する:sila2-codegenでFeature固有のServer/Clientクラスを生成する。
  4. 装置ドライバーを接続する:生成された実装クラスからSCPI、シリアル通信、メーカーSDKなどを呼ぶ。
  5. 異常系を試験する:装置Busy、通信断、タイムアウト、停止要求、再起動後の状態を確認する。

実機接続では、SiLA 2がモーターやヒーターを直接制御するとは限りません。装置内PLCや組込み制御が安全に動作を実行し、SiLA Serverは上位の操作・状態・結果を公開する構成が一般的です。装置、LIMS、データベースまで含む設計は、実験装置・LIMS・データベースを連携する設計で解説しています。

実務で起こりやすい失敗

SDKの最新版だけを追い、バージョンを記録しない

開発時は動いても、後日の再構築で依存関係が変わる可能性があります。Python、SiLA SDK、Feature Definition、生成コード、装置ファームウェアを一組として記録します。

模擬装置の成功を実機接続の成功とみなす

模擬ServerはSiLA通信の確認には有効ですが、実機固有のタイミング、Busy状態、応答欠落、物理停止、安全インターロックは再現しません。実機PoCでは通信試験と装置安全試験を分けます。

Commandを送れば必ず1回だけ実行されると思う

Clientが応答を受け取る前に通信が切れると、処理が実行済みか不明になる場合があります。安易な再送は二重実行につながります。試料ID、実行ID、現在状態を照合してから再試行する設計が必要です。

開発用の非暗号化接続を本番へ残す

操作コマンドや研究データがネットワーク上を流れるため、暗号化、認証、認可、ネットワーク分離、監査ログを検討します。--insecureはlocalhostの学習用に限定します。

技術的限界・安全・責任範囲

  • SiLA 2への対応は、装置そのものの安全性や測定精度を保証しません。
  • SiLA 2通信の成功は、装置コマンドが物理的に安全に実行されたことを意味しません。
  • 非常停止、温度・圧力上限、ドアインターロックなどの安全機能を、上位Pythonコードだけに依存させないでください。
  • 本記事の模擬Serverは教育用で、GxP、品質保証、製造設備への適合性を示すものではありません。
  • 本番導入では、装置メーカー、設備・安全担当、情報セキュリティ担当、利用部門の責任分界を定めます。

実験自動化全体の導入手順や費用対効果は、実験自動化とは?導入手順・装置連携・データ基盤、自律的な条件提案まで含む構成は自律実験・Self-driving Labとは?を参照してください。

導入前チェックリスト

  • Python 3.10以上を使用している
  • 仮想環境を有効化した
  • SiLA Pythonのバージョンを固定した
  • ServerとClientのIP・Portが一致している
  • 暗号化設定が一致している
  • CommandとPropertyの正常系を確認した
  • 入力不正と接続失敗を確認した
  • Clientを確実にcloseできる
  • 本番で--insecureを使わない
  • 実機接続では安全インターロックを別層に残す

FAQ

Q.SiLA 2を試すために実験装置は必要ですか?

必要ありません。公式Example Serverを模擬装置として使えば、Command、Property、エラー、Client接続を1台のPCで確認できます。

Q.PythonだけでServerもClientも作れますか?

作れます。ただし、SiLA 2は言語に依存しない規格です。Python ServerへC#やJavaのClientから接続する構成も可能です。実際の相互運用性は、同じFeature Definitionと仕様バージョンで試験してください。

Q.なぜExample Serverを使うのですか?

最初から独自Featureと実機ドライバーを同時に作ると、Feature設計、生成コード、通信、装置制御のどこに問題があるか分かりにくくなるためです。まず公式例で通信を成立させ、その後に1要素ずつ置き換えます。

Q.Server Discoveryを使わなくてもよいですか?

学習や固定構成のPoCではIPアドレスとポートを明示できます。装置の自動検出が必要な環境ではDiscoveryを評価しますが、ネットワークのマルチキャスト制約も確認してください。

Q.この記事の次に何を学ぶべきですか?

次はFeature Definitionを作り、Command、Property、データ型、制約、単位、Defined Execution Errorを設計します。その後、既存のSCPI・シリアル通信・メーカーSDKを実装クラスの内側へ接続すると、実機ラッパーへ発展できます。

まとめ

SiLA 2の最小実践では、模擬Serverを起動し、ClientからCommandとPropertyを操作し、正常系と異常系を確認することが出発点です。本記事の例では、公式Python実装v0.14.0を固定し、挨拶Command、開始年Property、入力制約違反、接続失敗を再現しました。

実機へ進むときは、通信できたことと安全に自動運転できることを区別してください。Feature設計、装置ドライバー、安全制御、再実行防止、認証・認可、監査ログを段階的に追加することが重要です。

参考文献

  1. SiLA, “Standards | SiLA Rapid Integration,” SiLA 2 Core, Mapping, Features and official repositories, 参照日2026-10-12. https://sila-standard.com/standards/
  2. SiLA 2 Working Group, “SiLA 2 Part (A) – Overview, Concepts and Core Specification,” Public Document Release v1.1, 2022. PDF
  3. SiLA2, “sila_python: Python implementation of SiLA2,” GitLab, 参照日2026-10-12. https://gitlab.com/SiLA2/sila_python
  4. SiLA2, “sila_python v0.14.0,” GitLab Tags, 2025-12-01. https://gitlab.com/SiLA2/sila_python/-/tags
  5. Python Software Foundation, “venv — Creation of virtual environments,” Python 3 Documentation, 参照日2026-10-12. https://docs.python.org/3/library/venv.html
  6. gRPC Authors, “Quick start | Python,” gRPC Documentation, updated 2024-11-25. https://grpc.io/docs/languages/python/quickstart/
  7. Protocol Buffers, “Overview,” Google, 参照日2026-10-12. https://protobuf.dev/overview/
  8. SiLA2, “Example Server,” sila_python v0.14.0, GitLab, 2025. Example Server

コメントする

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

CAPTCHA


上部へスクロール