確認日: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段階
- 装置機能を棚卸しする:開始、停止、設定、状態、結果を分ける。
- Featureを設計する:Command、Property、Parameter、Response、制約、単位、エラーを定義する。
- コードを生成する:
sila2-codegenでFeature固有のServer/Clientクラスを生成する。 - 装置ドライバーを接続する:生成された実装クラスからSCPI、シリアル通信、メーカーSDKなどを呼ぶ。
- 異常系を試験する:装置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設計、装置ドライバー、安全制御、再実行防止、認証・認可、監査ログを段階的に追加することが重要です。
参考文献
- SiLA, “Standards | SiLA Rapid Integration,” SiLA 2 Core, Mapping, Features and official repositories, 参照日2026-10-12. https://sila-standard.com/standards/
- SiLA 2 Working Group, “SiLA 2 Part (A) – Overview, Concepts and Core Specification,” Public Document Release v1.1, 2022. PDF
- SiLA2, “sila_python: Python implementation of SiLA2,” GitLab, 参照日2026-10-12. https://gitlab.com/SiLA2/sila_python
- SiLA2, “sila_python v0.14.0,” GitLab Tags, 2025-12-01. https://gitlab.com/SiLA2/sila_python/-/tags
- Python Software Foundation, “venv — Creation of virtual environments,” Python 3 Documentation, 参照日2026-10-12. https://docs.python.org/3/library/venv.html
- gRPC Authors, “Quick start | Python,” gRPC Documentation, updated 2024-11-25. https://grpc.io/docs/languages/python/quickstart/
- Protocol Buffers, “Overview,” Google, 参照日2026-10-12. https://protobuf.dev/overview/
- SiLA2, “Example Server,” sila_python v0.14.0, GitLab, 2025. Example Server


