Daijiro Taira

多chロガー (リバエン)Windows 版を配布

AM-8001K サーモロガー ビューア

安立計器の小型サーモロガー AM-8001K に溜めた測定データを、専用ソフト無しでUSB経由でPCに取り出して見る/出すためのビューアです。

AM-8001K サーモロガー ビューア の操作の様子
実アプリを自動操縦して録画:①起動(空画面)→ ②USB未接続でダウンロードを押すと『接続して』と案内(アプリは落ちない)→ ③接続時はワンクリックで読み出し(読み取り専用・約15秒)→ ④記録間隔を本体ヘッダから自動取得(0.1秒/点)→ ⑤複数の記録をチェックで重ねて比較 → ⑥グラフ上でカーソル値を読み取り → ⑦CSV/Excel出力。

本体の通信仕様が公開されていないため、自分で解析(リバースエンジニアリング=完成品から内部の仕組みを読み解くこと)して作った“読み取り専用”ツール。保存データをワンクリックで吸い上げ、グラフ表示・複数記録の重ね比較・カーソルでの値読み取り・CSV/Excel出力ができます。本体には一切書き込まないので、何度読み出しても安全です。

使い方

  1. 画面の見方

    画面の見方

    上に[⬇本体からダウンロード][開く][デモ][CSV出力][Excel出力]のツールバー、左カラムに『セッション情報/チャンネル(記録の一覧)/記録間隔/グラフの拡大範囲』のパネル、右は上=折れ線グラフ・下=データ表の2段構成。起動直後はデータ未読み込みで、本体から読み出す・保存済みファイルを開く・例(デモ)を表示、の3通りで読み込めます。

  2. 本体から読み出す(専用ソフト不要・読み取り専用)/記録間隔は自動

    本体から読み出す(専用ソフト不要・読み取り専用)/記録間隔は自動

    本体をUSBでつなぎ計測を停止して[⬇本体からダウンロード]を押すと、保存データを読み取り専用で吸い上げます(消去・設定変更はしない設計・約15秒)。画像は取得済みデータ(Rec0〜Rec5の6記録)を読み込んだ状態で、Rec0=室温21.9℃から527℃まで上がる昇温ランプ(151点)が表示されています。左の『セッション情報』に機種・点数・記録数が出ます(点数はいちばん長い記録の点数)。記録間隔は本体のヘッダから自動取得(ここでは 0.1秒/点)され、横軸が自動で経過時間(151点×0.1秒=0〜15秒)になります。

  3. 複数の記録を重ねて比較する

    複数の記録を重ねて比較する

    1回の読み出しで複数の記録(この本体ではRec0〜Rec5の6本)が入ります。左一覧のチェックで表示する記録を選ぶと、色分けして重ね描画。画像はRec0〜Rec3とRec5の5本にチェックを入れた例(点数の多いRec4=2459点は外しています)。Rec0だけが室温→527℃へ立ち上がり、ほかは室温(約24〜25℃)で待機していたことが一目で分かります。既定では先頭のRec0だけ表示し、見たい記録だけチェックします。

  4. グラフ上でカーソルを置いて値を読む

    グラフ上でカーソルを置いて値を読む

    グラフにマウスを置くと、最寄りの点に縦線とマーカーが付き、グラフ上の大きなパネルに『経過時間(点番号)|記録名: 温度』が表示されます。画像では 8.2秒(点82)で Rec0 が 335.0℃。横軸は記録間隔×点番号で求めた経過時間です(本体の固定時刻は使いません)。

  5. 記録に名前・メモを付ける(再読込で自動復元)

    記録に名前・メモを付ける(再読込で自動復元)

    各記録の[✎]ボタンで『記録の編集』が開き、名前とメモを付けられます(画像例:名前=昇温ランプ(室温→527℃)、メモ=Ca 試料・40min・0.1秒/点)。名前・メモは記録の中身から作るハッシュ(SHA-256=内容が同じなら必ず同じ値になる指紋のようなもの)をキーに別ファイルへ保存され、同じデータを次に読み込んだとき自動で復元されます。

  6. CSV / Excel に出力する(本体データは非破壊)

    CSV / Excel に出力する(本体データは非破壊)

    [CSV出力]/[Excel出力]で、チェック中の記録をまとめて書き出します。列は『点番号・経過時間(s)・Rec0(℃)・…』の統一形式。画像は出力直後の状態で、上のステータスバーに保存先(…\ams_demo_export.csv)が出ています(保存後に「開きますか?」の確認も出ます)。本体のデータには一切書き込まないので、何度でも読み出して出力できます。

ダウンロード

仕組みと使った技術

全体の流れ

  1. 1. USBドライバ設定(初回のみ): ZadigでAM-8001K(VID_1599&PID_0001)にWinUSBを割り当てる。公式ドライバ(dcusb.sys)はPID_0002向け・署名失効のためWin10/11では使えず、WinUSBが現実解。
  2. 2. 接続確認: アプリ起動時にWinUSBが実際にオープンできるか試行(winusb_openable)して本体の接続・ドライバ状態を判定する。PnP照会フラグでなく実open試行を正とすることでZadig再導入後の誤検知を防ぐ。
  3. 3. ダウンロード(プロトコル実行): 確定済みASCIIキーワード6種(END/STATUS/STATUS2/TRANS/N/NEXT)を許可リストに固定した read-only プロトコルで通信。送信後にsettleペーシング(120ms)を挟み、永続バッファでCR境界までフレームを読み切ってからNEXTを送る。終端(YYYY)受信を成功条件に必須化し、途中打ち切りを成功扱いしない。
  4. 4. デコード: 受信した ASCII-hex ブロック列をレコードに分解し、記録間隔をヘッダ byte8-10(例 010083: 先頭4桁=値100→0.1s、末尾2桁83=ミリ秒フラグ)から自動取得。公式ソフトのパースコード(CString::Mid + atoi)を逆追跡して特定し、実機100msの既知値で裏取り済み。
  5. 5. 整合検証: チェックサム検証と自動リトライ(settle 80→120→300ms)をアプリ層で実施。生バイナリは Output/ に日時付きで自動保存。
  6. 6. 表示・比較: 取得した複数記録を「各記録=1チャンネル」に写像して重ね比較。折れ線グラフにカーソルパネルで点番号・経過時間・温度を表示。記録の名前・メモは内容のSHA-256ハッシュをキーにサイドカーJSONへ永続化し、再読込で自動復元。
  7. 7. 出力: CSV・Excel(点番号/経過時間(s)/Rec0(℃)…の統一列)で出力。ExcelはopenpyxlでXLSXを生成し、pandasへの依存を排除してexeを軽量化(24MB)。

使った技術

Python 3.9+
アプリ全体の実装言語
Tkinter(標準ライブラリ)
GUIフレームワーク。matplotlib不使用で折れ線グラフをCanvasに直接描画
ctypes(標準ライブラリ)
WinUSB APIをPythonから呼び出すUSBトランスポート層(winusb_transport.py)
openpyxl
Excel出力(pandas不使用でexeを軽量化)
WinUSB(Windows組み込みドライバ)
AM-8001KへのUSBバルク通信の基盤。Microsoft純正・署名済みのためSecure Boot環境でも動作
Zadig(同梱ツール)
AM-8001KへのWinUSB割り当てを自己署名込みで自動処理する初回セットアップツール
PyInstaller
Python不要の単一exeへのビルド(--windowed --onefile)

実装の工夫

  • プロトコルは送信コマンドを許可リスト6種(END/STATUS/STATUS2/TRANS/N/NEXT)に固定したread-onlyコマンドのみに制限。メモリ消去・時計設定・リモート設定は構造上送れない設計にし、非破壊を保証。
  • プロトコル解析フェーズ(protocol_candidates.pyによる候補台帳管理)と本番ダウンロードフェーズ(am8001k_download.py)を別モジュールに分離。未知コマンドはblocked/ready_to_try/tried/rejectedの状態管理で送信前に人間レビューを必須化した。
  • USB読み出しはポーリング連射でなく「送信→settleペーシング→CRフレーム境界まで読み切り→確認→次へ」の順次処理に統一。連射時は装置が脱同期してチェックサム不一致・データ破損が発生することを実機で確認し、settle=120msで安定化(約12秒・約5倍速)。
  • 記録ラベル(名前・メモ)の永続化キーは生バイトではなく「正規化した内容(点数+丸めた値)のSHA-256」を使用。保存形式差(.bin/.csv等)で同じデータが別物と判定されないようにしている。
  • WinUSBの接続判定は特定GUIDの一致ではなく実際にopenできるか(winusb_openable)を真とする。Zadig再導入で汎用GUIDに登録された場合にGUID照合では誤ブロックが発生することを実機で確認して修正した。
  • windowed exeではsys.stdout/sys.stderrがNoneになるため、起動時にNoneガード付きの_force_utf8()でStringIO差し替えかreconfigureを行い、cp932対策テンプレートによる.buffer参照クラッシュを防ぐ。

用語

AM-8001K / サーモロガー
安立計器(Anritsu Meter)の小型温度データロガー。設定間隔ごとに温度を本体メモリへ記録し、後からPCへ吸い上げて解析する測定器。
リバースエンジニアリング
仕様書が手に入らない完成品(ここでは本体とUSB通信)から、外側の観察と純正ソフトの解析で内部の仕組み・通信手順を読み解くこと。本ツールはこれで通信仕様を特定して作った。
記録 / Rec
1回の測定(計測の開始〜停止)で得られる1本のデータ列。本体には複数の記録が溜まり、ビューアでは Rec0・Rec1… と並ぶ。
記録間隔
1点を記録する時間の刻み(例 0.1秒/点)。本体のヘッダに埋め込まれており、ビューアが読み込み時に自動取得して横軸(経過時間)に使う。手入力で上書きも可能。
経過時間(横軸)
記録開始からの時間。記録間隔×点番号で計算する。本体の絶対時刻(2004年固定)は使わない。
WinUSB / Zadig
WinUSBはWindows標準の汎用USBドライバ(Microsoft純正・署名済み)。Zadigはそれを本機に割り当てる初回セットアップ用の同梱ツール。
読み取り専用(非破壊)
本体には読み出しコマンドしか送らず、メモリ消去・時計設定・設定変更は一切しないこと。元データを壊さないので何度でも安全に読み出せる。
昇温ランプ
温度を一定速度で上げていく測定。Rec0 がこれで、室温21.9℃から527℃まで連続的に上昇している。
チェックサム
受信データが途中で壊れていないかを確かめる検算値。各ブロック末尾の値と照合し、不一致なら警告して取りこぼしを検知する。