設備ライン制御機(LCP)
設備ラインの制御機(親)と配下 3 機器を、1 プロジェクト 4 セッションで同時に立ち上げるサンプル。複数機器を相手にする制御アプリを実機なしで開発・試験できます。
TCP 7000–7003独自バイナリ LCPビッグエンディアンCRC16(Modbus)
概要
設備ラインの制御機(親)と配下 3 機器(コンベア・ロボットアーム・検査カメラ)を、それぞれ独立したスタブとして 1 プロジェクト 4 セッションで同時に立ち上げます。
独自バイナリプロトコル LCP(Line Control Protocol)を題材に、ビッグエンディアン・長さ前置フレーミング・CRC16(Modbus) の組み合わせ、コマンド判別やフィールド条件による応答分岐、接続時の状態通知と 5 秒周期の定期通知を試せます。
ファイル構成
| ファイル | 役割 |
|---|---|
line-controller/line-controller.commsim | プロジェクト本体(4 セッション・構造体定義を含む) |
line-controller/line-controller.commsim-struct | 構造体定義のみの可搬ファイル(別プロジェクトへのインポート用) |
相手役:設備ライン制御クライアント(CommSim.LineControlClient)または ncat 127.0.0.1 7000 等の汎用 TCP ツール。
機器構成
4 つのポートが同時に待ち受け、それぞれ独立して動作します。
ライン制御機
TCP 7000 / Unit=01
接続時あいさつ・5 秒周期通知あり
コンベア
TCP 7001 / Unit=11
RUN・SET_SPEED
ロボットアーム
TCP 7002 / Unit=21
HOME・PICK
検査カメラ
TCP 7003 / Unit=31
INSPECT(recipe で OK/NG)
通信フロー
ライン制御機(7000・Unit=01)の例。接続時と 5 秒周期は CommSim 側から自動送信、各コマンドには要求に応じて応答します。
- 接続時 ←状態通知
A5 5A 01 81 00 0D 01 01 01 01 01 C6 5Eあいさつ(自動) - App →STATUS 要求
A5 5A 01 01 00 08 19 11 - ← CommSimライン状態(稼働・Auto・全機 OK)
- App →SET_MODE Auto
A5 5A 01 10 00 09 01 60 1C - ← CommSim現在 Auto(応答末尾
01) - 5秒毎 ←稼働通知
A5 5A 01 8F 00 09 01 32 74周期(自動)
Recipe で分岐します。Recipe=2 → 判定 NG、それ以外 → OK。フィールド条件ルールの実例です。各セッションのコマンド
| 機器 / ポート | コマンド | 要求 HEX | 応答の意味 |
|---|---|---|---|
| ライン制御機 7000 / Unit=01 | STATUS(0x01) | A5 5A 01 01 00 08 19 11 | ライン状態(稼働中・Auto・全機 OK) |
| START(0x02) | A5 5A 01 02 00 08 19 E1 | 受理(00) | |
| STOP(0x03) | A5 5A 01 03 00 08 D9 B0 | 受理(00) | |
| SET_MODE Auto(0x10) | A5 5A 01 10 00 09 01 60 1C | 現在 Auto(01) | |
| SET_MODE Manual(0x10) | A5 5A 01 10 00 09 00 A0 DD | 現在 Manual(00) | |
| コンベア 7001 / Unit=11 | STATUS(0x01) | A5 5A 11 01 00 08 19 01 | 稼働中(01)・速度 1200 |
| RUN(0x20) | A5 5A 11 20 00 08 58 03 | 受理(00) | |
| SET_SPEED(0x22) | Speed フィールド付き | 設定速度をエコー | |
| ロボットアーム 7002 / Unit=21 | STATUS(0x01) | A5 5A 21 01 00 08 18 C1 | 待機中(01)・座標 X=100 Y=200 |
| HOME(0x30) | A5 5A 21 30 00 08 5A 43 | 受理(00) | |
| PICK(0x31) | Station フィールド付き | ステーション番号をエコー | |
| 検査カメラ 7003 / Unit=31 | STATUS(0x01) | A5 5A 31 01 00 08 18 81 | Ready(01)・前回 OK(00) |
| INSPECT recipe=1(0x40) | A5 5A 31 40 00 09 01 65 8D | 判定 OK(00) | |
| INSPECT recipe=2(0x40) | A5 5A 31 40 00 09 02 65 0D | 判定 NG(01) |
想定プロトコル(LCP フレーム)
全メッセージ共通のフレーム構造。Unit で宛先機器、Command で操作を表し、末尾に CRC16(Modbus) を持ちます。
使用する機能
設定内容
プロジェクト設定
| 既定データ形式 | RawHex(バイナリ) |
| エンディアン | ビッグエンディアン |
| フレーミング方式 | LengthPrefixed(長さ前置) |
| 共通ヘッダ長 / 長さ ofs / size | 6B / 4 / 2 |
| 長さ基準 | 全体長(WholeMessage) |
セッション設定
| セッション名 | プロトコル | 接続 | ポート |
|---|---|---|---|
| ライン制御機 (Line Controller) | TCP | サーバ | 7000 |
| コンベア (Conveyor) | TCP | サーバ | 7001 |
| ロボットアーム (Robot Arm) | TCP | サーバ | 7002 |
| 検査カメラ (Inspection) | TCP | サーバ | 7003 |
構造体定義(抜粋)
全定義で判別フィールドは Command、チェックサムは Crc16Modbus(先頭から)。
| 定義名 | 判別値 | 特徴フィールド |
|---|---|---|
| LCP 0x01 STATUS 要求 | Command=1 | — |
| LCP 0x10 SET_MODE 要求 | Command=16 | Mode(0=Manual/1=Auto) |
| LCP 0x22 SET_SPEED 要求 | Command=34 | Speed(U16) |
| LCP 0x31 PICK 要求 | Command=49 | Station(U8) |
| LCP 0x40 INSPECT 要求 | Command=64 | Recipe(U8) |
バイナリ構造応答(制御機 7000)
{field:Unit} は受信 Unit をエコー、{len:2} は全体長を自動計算、{crc:Crc16Modbus} は CRC を自動付与します。
| ルール | 条件 | 応答テンプレート |
|---|---|---|
| STATUS → ライン状態 | なし | A5 5A {field:Unit} 81 {len:2} 01 01 01 01 01 {crc:Crc16Modbus} |
| SET_MODE Auto → Auto(01) | Mode = 1 | A5 5A {field:Unit} 90 {len:2} 01 {crc:Crc16Modbus} |
| SET_MODE その他 → Manual(00) | なし(受け皿) | A5 5A {field:Unit} 90 {len:2} 00 {crc:Crc16Modbus} |
オートメーション(制御機 7000 のみ)
| 名前 | トリガー | 送信内容(HEX) | 繰り返し |
|---|---|---|---|
| 接続時あいさつ | 接続時 | A5 5A 01 81 00 0D 01 01 01 01 01 C6 5E | なし |
| 定期状態通知 | 周期 5000ms | A5 5A 01 8F 00 09 01 32 74 | なし(毎周期 1 回) |
設定の考え方
| 設定 | なぜそうするか |
|---|---|
| 4 機器を 1 プロジェクト・4 セッションにまとめる | 制御機・配下機器を 1 ファイルを開くだけで一斉に立ち上げるため。CommSim は複数ポートを同時待ち受けできる。 |
| フレーミングを長さ前置(基準「全体長」)+ビッグエンディアン | LCP フレームが先頭に固定ヘッダを持ち、Length フィールドにフレーム全体のバイト数(ビッグエンディアン)が入る仕様だから。 |
| Command を判別フィールドにしてコマンドごとに定義を分ける | コマンドによって後続ペイロード(Mode・Speed・Station・Recipe)の構成が違うから。 |
| SET_MODE・INSPECT はフィールド条件ルール+条件なし既定ルールで分岐 | 「Mode=1 なら Auto」「Recipe=2 なら NG」のように 1 つの値で応答を出し分けるため。先勝ちで『特定→既定』を判定する。 |
| 制御機にだけ「接続時あいさつ」「定期状態通知」を置く | 実機の制御機が接続直後に状態を通知し、その後も一定周期で稼働状況を送り続ける挙動を再現するため。 |
samples/line-controller/line-controller.commsim を「ファイル」→「ファイルから開く…」(Ctrl+O)。4 セッションすべてを起動し、制御クライアントまたは ncat 127.0.0.1 7000 で接続します。制御クライアント(CommSim.LineControlClient)の使い方
このサンプルの「実機」は 4 ユニットで構成される設備ラインシステム(CommSim 側)です。それを外部から操作するのが 設備ライン制御クライアント(CommSim.LineControlClient) で、これから開発する制御プログラムの完成イメージを示す専用サンプルアプリです。
- 4 機器へ同時マルチセッション接続: 制御機(7000/Unit=01)・コンベア(7001/Unit=11)・ロボットアーム(7002/Unit=21)・検査カメラ(7003/Unit=31)をタブで切り替え、各々独立に TCP クライアント接続します。
- 機器ごとの制御操作: STATUS 取得 / START / STOP / モード切替(制御機)、RUN / SET_SPEED(コンベア)、HOME / PICK(ロボットアーム)、INSPECT(検査カメラ)。
- 機器ごとの監視: 制御機タブは接続直後の状態通知・5 秒周期の稼働通知からリアルタイム表示。各機器の状態・座標・検査結果も表示。
- 通信ログ: 送受信フレームを HEX +フィールド分解(Sync / Unit / Command / Length / Payload / Crc)で表示。
起動手順
- 先に CommSim(実機側)を用意: CommSim 本体で
samples/line-controller/line-controller.commsimを開き、4 セッション(7000〜7003)を「接続(待ち受け)」状態にする。 - 次に制御クライアントを起動:
CommSim.LineControlClientを起動する。クライアント画面右上の「CommSim で開く」ボタンを押せば、同梱のline-controller.commsimを CommSim 本体で開けます。 - 操作したい機器のタブを開き「接続」を押すと、その機器のポートへつながります。
動作確認手順
samples/line-controller/line-controller.commsimを「ファイル」→「ファイルから開く…」(Ctrl+O)で開く。- 各セッションタブの「接続」ボタンをクリックし、4 つ全て待ち受け状態にする。
- CommSim.LineControlClient の各機器タブで「接続」を押す(または
ncat 127.0.0.1 7000等でも可)。 - ライン制御機(7000)に接続した直後、STATUS 相当の状態通知が自動で届くことを確認する。
- STATUS 要求・SET_MODE 要求を送り、それぞれ期待の応答が返ることを確認する。
- 5 秒待機して、定期状態通知が届くことを確認する。
- 検査カメラで recipe=2 を送ると判定 NG(01)、recipe=1 を送ると判定 OK(00)が返ることを確認する。
実行ログサンプル
ライン制御機(ポート 7000)のログペイン:
[接続] クライアント接続
[Tx] A5 5A 01 81 00 0D 01 01 01 01 01 C6 5E
(接続時あいさつ:ライン状態通知)
[Rx] A5 5A 01 01 00 08 19 11
Sync=A55A Unit=01 Command=01(Status) Length=0008 Crc=1911
[Tx] A5 5A 01 81 00 0D 01 01 01 01 01 C6 5E
(STATUS 応答:稼働中・Auto・全機 OK)
[Rx] A5 5A 01 10 00 09 01 60 1C
Sync=A55A Unit=01 Command=10(SetMode) Length=0009 Mode=01(Auto) Crc=601C
[Tx] A5 5A 01 90 00 09 01 A0 35
(SET_MODE Auto 受理応答)
[Tx] A5 5A 01 8F 00 09 01 32 74
(定期状態通知:5 秒後に自動送信)検査カメラ(ポート 7003)での INSPECT:
[Rx] A5 5A 31 40 00 09 02 65 0D
Sync=A55A Unit=31 Command=40(Inspect) Length=0009 Recipe=02 Crc=650D
[Tx] A5 5A 31 C0 00 09 01 A4 64
(INSPECT 応答:判定 NG=01)
[Rx] A5 5A 31 40 00 09 01 65 8D
Sync=A55A Unit=31 Command=40(Inspect) Length=0009 Recipe=01 Crc=658D
[Tx] A5 5A 31 C0 00 09 00 ...
(INSPECT 応答:判定 OK=00)