設備ライン制御機(LCP)

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

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

概要

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

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

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

機器構成

4 つのポートが同時に待ち受け、それぞれ独立して動作します。相手役は専用の制御クライアント(CommSim.LineControlClient)や ncat 等。

ライン制御機

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 74 32周期(自動)
検査カメラ(7003)は INSPECT の Recipe で分岐します。Recipe=2 → 判定 NG、それ以外 → OK。フィールド条件ルールの実例です。

想定プロトコル(LCP フレーム)

全メッセージ共通のフレーム構造。Unit で宛先機器、Command で操作を表し、末尾に CRC16(Modbus) を持ちます。

A5 5ASync 2B Unit1B Cmd1B 判別 Length2B 全体長 Payload可変 CRC162B
コマンド要求 HEX(制御機)応答の意味
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)

使用する機能

複数セッション

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

メッセージ構造定義

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

バイナリ構造応答

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

オートメーション

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

設定内容

プロジェクト設定

既定データ形式RawHex(バイナリ)
エンディアンビッグエンディアン
フレーミング方式LengthPrefixed(長さ前置)
共通ヘッダ長 / 長さ ofs / size6B / 4 / 2
長さ基準全体長(WholeMessage)

構造体定義(抜粋)

判別フィールドは Command、チェックサムは Crc16Modbus(先頭から)。コマンドごとに定義を分け、Payload 構成(Mode・Speed・Station・Recipe)を切り替えます。

定義判別値特徴フィールド
STATUS 要求Command=1
SET_MODE 要求Command=16Mode(0=Manual/1=Auto)
SET_SPEED 要求Command=34Speed(U16)
PICK 要求Command=49Station(U8)
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 74 32無限
開き方:samples/line-controller/line-controller.commsim を「ファイル」→「開く」(Ctrl+O)。4 セッションすべてを起動し、制御クライアントまたは ncat 127.0.0.1 7000 で接続します。

他のサンプルも構成・フロー付きで解説しています。

サンプル集へ戻る