設備ライン監視

独自バイナリ LineFrame(STX+Cmd+Len+可変 Payload+8bit 総和チェックサム)を題材に、構造体定義の確認と、同梱した採取ログ(.commsimlog)でのログビュワー確認を 1 つのサンプルでまとめて試せます。

TCP 7000 / 7001LineFrameSum8 チェックサム採取ログ同梱ログビュワー

概要

このサンプルは 2 つの面を持ちます。1 つは 構造体定義:受信バイト列を「判別・長さ・可変ペイロード・チェックサム」の役割を持つフィールドへ分解し、{crc:Sum8} で応答チェックサムを自動付与します。もう 1 つは 採取ログ:あらかじめ記録した複数日・複数コネクションのログを同梱しており、アプリを起動せずにログビュワーの機能(複数日マージ・コネクション識別・タイムライン)を確認できます。

同梱の採取ログに含まれるバイト列は、すべてこのサンプルの構造体定義 LineFrame に準拠した実フレーム(チェックサム妥当)です。ログビュワーの「内容」列に出るフレームを、構造体定義のフィールド構成と対応づけて読めます。
設備ライン監視サンプルの構造体ルール
「自動応答」タブ ②バイナリ構造応答:Read/Status/Write を Cmd 条件で分岐し {crc:Sum8} で総和を自動付与する 3 ルール

ファイル構成

ファイル内容
line-monitor/line-monitor.commsimプロジェクト本体(LineFrame 構造体定義・構造体ルール・2 スタブセッション)
line-monitor/line-monitor.commsim-struct構造体定義のみの可搬ファイル(別プロジェクトへのインポート用)
line-monitor/logs/sample-line-monitor-day1.commsimlog採取ログ 1 日目(PLC制御 #1/#2・センサーGW #3・UDP 監視。#2 は 23:50 開始で深夜をまたぐ)
line-monitor/logs/sample-line-monitor-day2.commsimlog採取ログ 2 日目(#2 が継続=00:10 切断、新規 #4/#5、UDP 監視継続)

機器構成

LineFrame でやり取りする 2 つの TCP スタブセッション。いずれも単体で完結し、中継相手(実機)を必要としません。

ライン制御アプリテスト対象アプリ
CommSimPLC制御 7000 / センサーGW 7001

通信フロー

Read / Status / Write 要求に対し、値・OK を載せた応答(Cmd の最上位ビットを立てた応答コード)を返します。チェックサムは {crc:Sum8} で自動付与されます。

  • App →Read 要求 A5 01 01 00 A7Cmd=01 / ch0
  • ← CommSimRead 応答 A5 81 02 00 64 8C値 100 + Sum8 自動
  • App →Status 要求 A5 02 00 A7Cmd=02
  • ← CommSimStatus 応答 A5 82 01 00 28OK
  • App →Write 要求 A5 04 03 05 00 FF B0reg5=0x00FF
  • ← CommSimWrite 応答 A5 84 01 00 2AOK

フレーム内訳

要求例 A5 01 01 00 A7 の解釈:

A5    : Stx(固定スタートバイト=判別)
01    : Cmd(0x01 = Read)
01    : Len(Payload バイト数)
00    : Payload(チャンネル 0)
A7    : Sum(先頭からの 8bit 総和チェックサム)

想定プロトコル

先頭 Stx に続き、Cmd・Len・可変 Payload・末尾 Sum。Len は Payload のバイト数を示します。1 フレーム=4 + Len バイト。

A5Stx 1B 判別 Cmd1B Len1B Payload可変 Sum1B
フィールド型 / 役割備考
Stxu8 / 判別固定 0xA5
Cmdu81=Read / 2=Status / 4=Write / 16=Heartbeat / 129(0x81)=ReadResp / 130(0x82)=StatusResp / 132(0x84)=WriteResp
Lenu8 / 長さPayload のバイト数
PayloadhexLen の値だけ読む(可変長)
Sumu8 / チェックサム8bit 総和(先頭 Stx から直前まで)

使用する機能

メッセージ構造定義

判別(Stx)・長さ(Len)・可変 Payload・Sum8 チェックサム役割

バイナリ構造応答

Cmd 条件で分岐し {crc:Sum8} で総和を自動付与

ログビュワー

同梱採取ログで複数日マージ・コネクション識別・タイムラインを確認

設定内容

プロジェクト設定

既定データ形式RawHex(バイナリ HEX)
エンディアンBig
フレーミング方式長さ前置(LengthPrefixed)
共通ヘッダ長 / 長さ ofs / size3B / 2 / 1
長さ基準 / 補正ボディ長 / +1(末尾 Sum 1 バイト分)
長さ補正 +1 は、Len が「Payload のバイト数」を示すのに対し、フレーム末尾に Sum(1 バイト)が付くため、実受信バイト数が 3 + Len + 1 になるのを補正しています。

構造体定義(LineFrame)

フィールド名役割備考
Stxu8判別固定 0xA5(全フレーム共通の先頭バイト)
Cmdu8なし列挙:Read/Status/Write/Heartbeat と各応答コード
Lenu8長さPayload のバイト数
PayloadhexなしLen フィールドの値だけ読む(可変長)
Sumu8チェックサム8bit 総和(先頭バイトから計算)

バイナリ構造応答

セッション条件(Cmd)応答テンプレート(HEX)
PLC制御 7000=1(Read)A5 81 02 00 64 {crc:Sum8}(値100)
PLC制御 7000=2(Status)A5 82 01 00 {crc:Sum8}(OK)
PLC制御 7000=4(Write)A5 84 01 00 {crc:Sum8}(OK)
センサーGW 7001=1(Read)A5 81 02 00 FA {crc:Sum8}(値250)
センサーGW 7001=2(Status)A5 82 01 00 {crc:Sum8}(OK)

応答の値(100 / 250 など)を変えても、{crc:Sum8} が先頭から直前までを自動で総和して末尾に付与するため、チェックサムを手計算する必要はありません。

動作確認手順(スタブ)

  1. CommSim で samples/line-monitor/line-monitor.commsim を開く(メニューバー「ファイル」→「ファイルから開く…」)。
  2. セッション「PLC制御スタブ (TCP 7000)」の「起動」ボタンをクリックし、待ち受け状態にする。
  3. クライアントから Read 要求 A5 01 01 00 A7 を送る(送信欄のデータ形式は「RawHex」。CommSim.Sample で「動かすサンプル=設備ライン監視」を選び ① の「デモ送信」でも可)。
  4. ログペインに受信(Rx)が表示され、フィールド分解(Stx・Cmd・Len・Payload・Sum)が確認できる。
  5. 同タブに送信(Tx)として A5 81 02 00 64 8C が表示される(値100+Sum8 自動)。
構造体定義だけを確認したいときは、メニュー「構造体定義…」を開くと LineFrame のフィールド構成(役割・長さ元・チェックサム)を一覧できます。

採取ログでログビュワーを確認

このサンプルには、複数日・複数コネクションを記録した採取ログを同梱しています。アプリを起動しなくても、メニュー「ツール」→「ログビュワーを開く…」から開けば、実セッションのログがどう見えるかを確認できます。

  1. 単一ファイルsample-line-monitor-day1.commsimlog を 1 つ開く(samples/line-monitor/logs/ 内=プロジェクト既定のログ保存先。ログビュワーの初期フォルダもここを指す。sample- 接頭が同梱デモログで、セッション起動時の実行時ログ <プロジェクト名>_<当日>.commsimlog とはファイル名で区別できる)。左にコネクション一覧(#1/#2/#3・接続元→上流・件数)、右に統合ログ(内容列にメッセージ)。コネクション #N を選ぶと当該行に絞り込まれる。
  2. セッションフィルタ:コネクション一覧ヘッダのセレクタで PLC制御 / センサーGW / 監視ブロードキャスト (UDP 50000) を切替。UDP セッションは #N を持たず全行表示。
  3. 複数日マージ:「ログを開く…」で 2 ファイルをまとめて選択。時刻順にマージされ、深夜をまたぐコネクション #2 が 1 コネクションに統合される(件数も合算)。#N は日またぎでも振り直されない(#1〜#5 が一意)。
  4. タイムライン:「タイムライン」に切替。コネクション #N(+UDP)がレーンに分かれ、種別色で描画。ホイールでズーム、ドラッグでパン。
採取ログ内の各フレームは LineFrame 準拠です。たとえば内容「応答 値100」の行のバイトは A5 81 02 00 64 8C で、上の構造体定義のとおり Cmd=ReadResp(0x81) / Len=2 / Payload=00 64 / Sum=0x8C に分解できます。

→ ログビュワーの詳細← サンプル一覧に戻る