外部機器の状態表示設計

· · Windows, 外部機器, 装置連携, 状態管理, UI/UX, 監視

まず結論

外部機器(カメラ、バーコードリーダ、PLC、計測器、プリンタ、シリアル機器など)と連携する Windows アプリで最も大事なのは、状態を1個の boolean(接続中/未接続)に潰さないことです。

最低限、次の7つを分けるべきです:

  • 存在: OS から見えているか
  • セッション確立: 自アプリが open / 初期化済みか
  • 応答性: heartbeat や問い合わせに返るか
  • 機能準備: 実際の操作をいま受け付けられるか
  • データ鮮度: 画面の値は新しいか
  • 構成一致: 想定した個体・型番・firmware か
  • 監視健全性: 監視処理自体が生きているか

なぜ「接続中」が危ないのか

「接続中」という1つの文言は、実際には次の6つの質問を混ぜてしまっています:

  1. OS から対象機器が見えているか
  2. 自アプリが open / login できているか
  3. 問い合わせに応答があるか
  4. いま操作を安全に実行できるか
  5. 画面の値は新しいか
  6. 想定した機器か

これらを全部「接続中」で潰すと、操作者は次に何をすればよいか判断できません。

分けるべき内部状態

意味 確認方法 UI 表示例
存在 OS から見えているか 起動時列挙、着脱通知 未接続 / 接続済み
セッション open/login 済みか handle/SDK 初期化結果 確認中 / 初期化中
応答性 問い合わせに返るか timeout 付き軽量問い合わせ 応答あり / 応答なし
機能準備 操作をいま可能か 機器固有の状態確認 使用可能 / busy
データ鮮度 表示値が新しいか timestamp / sequence 最新 / 値が古い
構成一致 想定機器か model/serial/firmware 対象機器 / 想定外
監視健全性 監視経路が生きているか worker heartbeat 監視中 / 監視停止

機器が悪い状態アプリが観測できていない状態を分けることが重要です。

UI 表示のベストプラクティス

3層構造にする

  • 上段: 要約状態
  • 中段: 理由
  • 下段: 詳細パネル(必要なときだけ)

例:

  • 要約: 接続済み / 使用不可
  • 理由: ウォームアップ中 - 残り約18秒
  • 詳細: model, serial, firmware など

文言は「状態 + 理由 + 次の行動」

  • ×: エラー
  • ○: 応答なし - heartbeat timeout - ケーブルと電源を確認してください

古いデータを隠さない

  • 値の横に timestamp と age(経過時間)を表示
  • 一定時間を超えたら色やラベルを変える
  • 操作可能判定から外す

重要度で表示場所を変える

  • 軽微な状態変化: ステータスバー
  • 作業継続可能な注意: インライン通知
  • 操作停止が必要な異常: 主表示領域やダイアログ

状態確認のベストプラクティス

  1. 起動時に列挙、以後は着脱通知 - 通知だけでは既存機器は拾えない
  2. 「存在」「開ける」「応答する」「使える」を分ける - 同じではない
  3. event と poll を混ぜる - 検出は event、健全性確認は poll
  4. 監視処理と UI を分離 - UI スレッドで直接 I/O しない
  5. 個体識別を安定させる - COM3 などの見た目でなく serial number などのぶれないキーを使う

再接続と運用のベストプラクティス

  • 再接続は backoff 付きで - 最短ループで叩き続けない
  • flapping(状態の行き来)をならす - UI は短い確認期間を置いてから確定表示
  • 監視停止と機器停止を混同しない - 監視ワーカーが死んだだけかもしれない
  • 最低限のログを残す - timestamp, device key, 状態遷移, 理由, エラーコード

やってはいけないこと

  • 状態を「接続中 / 未接続 / エラー」の3つに潰す
  • open 成功をそのまま「使用可能」とみなす
  • 最後の値を新しい顔で表示する(timestamp なし)
  • UI スレッドで open / read を回す
  • critical な異常をステータスバーだけに出す
  • COM3 などの名前だけで個体識別する

まとめ

外部機器連携アプリで本当に大事なのは、次の5つを分けることです:

  • 存在している
  • 自アプリが開ける
  • 応答している
  • いまその操作ができる
  • 画面の値が新しい

「接続中」と表示できることより、その表示が現実とどれだけずれにくいかのほうが実務では重要です。

関連する記事

同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。

関連トピック

このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。

このテーマがつながるサービス

この記事は次のサービスページにつながります。近い入口からご覧ください。

ブログ一覧に戻る