設備ライン制御機(LCP)

設備ラインの制御機(親)と配下 3 機器を、1 プロジェクト 4 セッションで同時に立ち上げるサンプル。複数機器を相手にする制御アプリを実機なしで開発・試験できます。

TCP 7000–7003独自バイナリ LCPビッグエンディアンCRC16(Modbus)

概要

設備ラインの制御機(親)と配下 3 機器(コンベア・ロボットアーム・検査カメラ)を、それぞれ独立したスタブとして 1 プロジェクト 4 セッションで同時に立ち上げます。

独自バイナリプロトコル LCP(Line Control Protocol)を題材に、ビッグエンディアン・長さ前置フレーミング・CRC16(Modbus) の組み合わせ、コマンド判別やフィールド条件による応答分岐、接続時の状態通知と 5 秒周期の定期通知を試せます。

設備ライン制御サンプルの画面
4 セッション(7000–7003)が同時に待ち受け。左のサイドバーで機器を切り替えます

ファイル構成

ファイル役割
line-controller/line-controller.commsimプロジェクト本体(4 セッション・構造体定義を含む)
line-controller/line-controller.commsim-struct構造体定義のみの可搬ファイル(別プロジェクトへのインポート用)

相手役:設備ライン制御クライアント(CommSim.LineControlClient)または ncat 127.0.0.1 7000 等の汎用 TCP ツール。

このサンプルは汎用デモアプリ CommSim.Sample のシナリオには含まれません。代わりに、独自バイナリプロトコル LCP に特化した CommSim.LineControlClient を用意しています。

機器構成

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)

制御クライアント開発するアプリ
CommSim4 機器を 4 セッションで再現

通信フロー

ライン制御機(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周期(自動)
検査カメラ(7003)は INSPECT の 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 81Ready(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) を持ちます。

A5 5ASync 2B Unit1B Cmd1B 判別 Length2B 全体長 Payload可変 CRC162B

使用する機能

複数セッション

4 機器を 1 ファイルで同時に立ち上げ

メッセージ構造定義

Command を判別フィールドにして定義を分ける

バイナリ構造応答

条件分岐・Unit エコー・長さ/CRC 自動付与

オートメーション

接続時あいさつ・5 秒周期の状態通知

設定内容

プロジェクト設定

既定データ形式RawHex(バイナリ)
エンディアンビッグエンディアン
フレーミング方式LengthPrefixed(長さ前置)
共通ヘッダ長 / 長さ ofs / size6B / 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=16Mode(0=Manual/1=Auto)
LCP 0x22 SET_SPEED 要求Command=34Speed(U16)
LCP 0x31 PICK 要求Command=49Station(U8)
LCP 0x40 INSPECT 要求Command=64Recipe(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 = 1A5 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なし
定期状態通知周期 5000msA5 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)で表示。

起動手順

  1. 先に CommSim(実機側)を用意: CommSim 本体で samples/line-controller/line-controller.commsim を開き、4 セッション(7000〜7003)を「接続(待ち受け)」状態にする。
  2. 次に制御クライアントを起動: CommSim.LineControlClient を起動する。クライアント画面右上の「CommSim で開く」ボタンを押せば、同梱の line-controller.commsim を CommSim 本体で開けます。
  3. 操作したい機器のタブを開き「接続」を押すと、その機器のポートへつながります。
順番が逆(クライアントが先)だと接続に失敗します。その場合は CommSim 側を起動してから再度「接続」してください。

動作確認手順

  1. samples/line-controller/line-controller.commsim を「ファイル」→「ファイルから開く…」(Ctrl+O)で開く。
  2. 各セッションタブの「接続」ボタンをクリックし、4 つ全て待ち受け状態にする。
  3. CommSim.LineControlClient の各機器タブで「接続」を押す(または ncat 127.0.0.1 7000 等でも可)。
  4. ライン制御機(7000)に接続した直後、STATUS 相当の状態通知が自動で届くことを確認する。
  5. STATUS 要求・SET_MODE 要求を送り、それぞれ期待の応答が返ることを確認する。
  6. 5 秒待機して、定期状態通知が届くことを確認する。
  7. 検査カメラで 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)

← サンプル一覧に戻る