設備ライン監視
独自バイナリ LineFrame(STX+Cmd+Len+可変 Payload+8bit 総和チェックサム)を題材に、構造体定義の確認と、同梱した採取ログ(.commsimlog)でのログビュワー確認を 1 つのサンプルでまとめて試せます。
TCP 7000 / 7001LineFrameSum8 チェックサム採取ログ同梱ログビュワー
概要
このサンプルは 2 つの面を持ちます。1 つは 構造体定義:受信バイト列を「判別・長さ・可変ペイロード・チェックサム」の役割を持つフィールドへ分解し、{crc:Sum8} で応答チェックサムを自動付与します。もう 1 つは 採取ログ:あらかじめ記録した複数日・複数コネクションのログを同梱しており、アプリを起動せずにログビュワーの機能(複数日マージ・コネクション識別・タイムライン)を確認できます。
{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 スタブセッション。いずれも単体で完結し、中継相手(実機)を必要としません。
通信フロー
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 バイト。
| フィールド | 型 / 役割 | 備考 |
|---|---|---|
| Stx | u8 / 判別 | 固定 0xA5 |
| Cmd | u8 | 1=Read / 2=Status / 4=Write / 16=Heartbeat / 129(0x81)=ReadResp / 130(0x82)=StatusResp / 132(0x84)=WriteResp |
| Len | u8 / 長さ | Payload のバイト数 |
| Payload | hex | Len の値だけ読む(可変長) |
| Sum | u8 / チェックサム | 8bit 総和(先頭 Stx から直前まで) |
使用する機能
設定内容
プロジェクト設定
| 既定データ形式 | RawHex(バイナリ HEX) |
| エンディアン | Big |
| フレーミング方式 | 長さ前置(LengthPrefixed) |
| 共通ヘッダ長 / 長さ ofs / size | 3B / 2 / 1 |
| 長さ基準 / 補正 | ボディ長 / +1(末尾 Sum 1 バイト分) |
3 + Len + 1 になるのを補正しています。構造体定義(LineFrame)
| フィールド名 | 型 | 役割 | 備考 |
|---|---|---|---|
| Stx | u8 | 判別 | 固定 0xA5(全フレーム共通の先頭バイト) |
| Cmd | u8 | なし | 列挙:Read/Status/Write/Heartbeat と各応答コード |
| Len | u8 | 長さ | Payload のバイト数 |
| Payload | hex | なし | Len フィールドの値だけ読む(可変長) |
| Sum | u8 | チェックサム | 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} が先頭から直前までを自動で総和して末尾に付与するため、チェックサムを手計算する必要はありません。
動作確認手順(スタブ)
- CommSim で
samples/line-monitor/line-monitor.commsimを開く(メニューバー「ファイル」→「ファイルから開く…」)。 - セッション「PLC制御スタブ (TCP 7000)」の「起動」ボタンをクリックし、待ち受け状態にする。
- クライアントから Read 要求
A5 01 01 00 A7を送る(送信欄のデータ形式は「RawHex」。CommSim.Sample で「動かすサンプル=設備ライン監視」を選び ① の「デモ送信」でも可)。 - ログペインに受信(Rx)が表示され、フィールド分解(Stx・Cmd・Len・Payload・Sum)が確認できる。
- 同タブに送信(Tx)として
A5 81 02 00 64 8Cが表示される(値100+Sum8 自動)。
採取ログでログビュワーを確認
このサンプルには、複数日・複数コネクションを記録した採取ログを同梱しています。アプリを起動しなくても、メニュー「ツール」→「ログビュワーを開く…」から開けば、実セッションのログがどう見えるかを確認できます。
- 単一ファイル:
sample-line-monitor-day1.commsimlogを 1 つ開く(samples/line-monitor/logs/内=プロジェクト既定のログ保存先。ログビュワーの初期フォルダもここを指す。sample-接頭が同梱デモログで、セッション起動時の実行時ログ<プロジェクト名>_<当日>.commsimlogとはファイル名で区別できる)。左にコネクション一覧(#1/#2/#3・接続元→上流・件数)、右に統合ログ(内容列にメッセージ)。コネクション #N を選ぶと当該行に絞り込まれる。 - セッションフィルタ:コネクション一覧ヘッダのセレクタで PLC制御 / センサーGW / 監視ブロードキャスト (UDP 50000) を切替。UDP セッションは
#Nを持たず全行表示。 - 複数日マージ:「ログを開く…」で 2 ファイルをまとめて選択。時刻順にマージされ、深夜をまたぐコネクション #2 が 1 コネクションに統合される(件数も合算)。
#Nは日またぎでも振り直されない(#1〜#5 が一意)。 - タイムライン:「タイムライン」に切替。コネクション #N(+UDP)がレーンに分かれ、種別色で描画。ホイールでズーム、ドラッグでパン。
A5 81 02 00 64 8C で、上の構造体定義のとおり Cmd=ReadResp(0x81) / Len=2 / Payload=00 64 / Sum=0x8C に分解できます。