OMRON UPS BY50S~PCとの通信エラーが解消していないのでUSBデバイスを監視して異常なら再起動する

先週、OMRON UPS BY50Sを保証交換してもらってから、USBケーブルでの監視状態がすごく安定する様にはなったのだが、それでもたまにBY50Sの状態監視ができない状態(通信エラー)が起きていることがある。まだ根本的な解決に至っていない様だ。またハズレ個体を手にしてしまったということか?

メーカー(OMRON)は無償交換してくれたし、これ以上は仕方ないと判断して、通信状態を定期的に監視して、もし通信エラーが起きているならUSBポートをリセットするスクリプト(BATファイル)を走らせて対処療法的に対策することにした。停電の時にきちんとシャットダウンスクリプトが動いてくれたら良いのだ。

デバイスマネージャでUSBポートを突き止める

マイクロソフトが配布している「devcon.exe」を使えばUSBデバイス(ポート)の状態をチェックして、リセットをかけられるのだが、デバイスIDの指定が必要になる。デバイスマネージャにおいて、BY50Sがどの様に(デバイスIDで)認識されているか調べることにした。いきなりデバイスマネージャに取り掛かっても良いが確実に探したいので遠回りをする。

最初にUSBデバイスがどの様に認識されているか調べるのが近道だ。調べるために使ったのは「usbdeview」というフリーウェアだ。WindowsというOSは過去に接続されたUSBデバイスはレジストリに記録される仕組みになっている為、USBDeviewで表示させると数年前に接続したUSBデバイスなども羅列される。

これでは情報が雑然とするので、USBDeviewのオプション表示機能を使って「切断されたデバイス」は非表示にして現在接続されているデバイスのみに絞り込む。

「オプション」-「切断されたデバイスを表示する」のレ点を外す。

すると現在USBポートに接続されていて有効になっているデバイスのみ表示される(下図)ので、シンプルに現在は4つのデバイスが認識されているのがわかる。

一番上にリストアップされたBY50Sが「USB入力デバイス」として認識されており、左端の黄緑色で正常ステータスだということがわかる。このリストから該当デバイスをダブルクリックすると詳細情報が分かる。

これで大体の”アタリ”がついたので、デバイスマネージャで調べやすくなった。デバイスマネージャを起動してOS上でどの様に認識されているかを追跡する。

ヒューマン・インターフェイスデバイス内の、USB入力デバイスが怪しい。

みつけた!詳細タプのプロパティから、「バスによって報告されるデバイスの説明」を選ぶと、値に「BY50S」という情報が見つかった。

ハードウェアIDの情報が欲しいので、プロパティの種類を「ハードウェアID」に切り替えて値を探す。下図の場合は「USB\VID_0590&PID_0081&REV_0109」ということがわかった。ちなみに右クリックするとこの値はコピーできるのでメモ帳などに容易に転記できる。

devcon.exeを手に入れる

devcon.exeは「Windows Driver Kit(WDK)」に含まれるツールの一つに過ぎない。開発環境を整えているPCであればすでにインストールされているかもしれないが、私のこのPCには開発環境は入れていないので、これっぽっちのことで余計なものまでインストールしたくない。ピンポイントでdevcon.exeを手に入れる方法はネットで検索すると見つけられる。下記を参考にさせてもらった。

リンクが切れる可能性もあるので要点だけ引用させてもらっておく。
787bee96dbd26371076b37b13c405890.cabをダウンロードしてきて、CABファイルの中から「filbad6e2cce5ebc45a401e19c613d0a28f」を取り出して、devcon.exeとリネームしてPATHが通っているディレクトリに保存すれば、コマンドプロンプトから実行できる様になるそうだ。実際に試してみたら成功した。

devcon.exeを試験してみる

コマンドプロンプトから下記を実行してみた。ダブルコーテーションで囲った部分は当然ながら先に調べたBY50Sの「ハードウェアID」である。人それぞれPC環境が違うのでこのIDは違っていると思われる。自分で調べましょう。

devcon status "USB\VID_0590&PID_0081&REV_0109"

Name: USB  Driver is running.

と返ってきたのでBY50Sとの通信が正常だと言うことがわかる。確かに今はBY50Sのステータスアイコンも緑色で商用運転中(正常)とある。

なお、devcon.exeについては検索すると色々な情報が見つかるので用途(目的)に合った方法を導入することになると思う。USBポートをリセットする方法もある様なのでHUBにぶら下がっているデバイスをまとめて再起動することもできそうだ。

devcon.exeでUSBデバイス(BY50S)を再起動してみる

USBデバイス(BY50S)のIDを突き止めてステータスが取れる様になったので、コマンドの引数をリスタートに変更してやれば再起動もできるはずだ。

ところが失敗した・・Restart failedと表示される。

No matching debices found.ってのが気になる。権限の問題かも知れない

試しにコマンドプロンプトを管理者権限で起動してもう一度やってみる。

ステータスも取れたし、リスタートも成功した。どうやらUSBデバイスの再起動には管理者権限が必要らしい。ということでこのことはしっかり記憶(意識)しておく必要がある。

スクリプト(BAT)を考えてみる

Windowsにはタスクスケジューラがあるので、例えば10分毎にBATスクリプトを繰り返し実行し、USBデバイスのスタータスを取得し、異常が出ていればリスタートをするという単純なもので良いだろうと考えた。

ステータスはテンポラリファイルにリダイレクトし、それをfindで調べて異常通知であればリスタートを実行し、最後に必ずテンポラリファイルを削除するということを繰り返す。シンプルな方がメンテナンス(バグ取り)しやすいので、プログラマでもない私はこの路線で行くことにする。

GISTにあげておくので、今後もっと詳しい誰かが改良してくれることを期待しておこう。現時点では再起動のログを残すということは考えていないので改良するとしたらそこにあるかも知れない。

もちろんBY50S以外のデバイスでもUSB接続が不安定とか、意図的にUSBデバイスをリスタートさせたい用途に応用できると思われる。

タスクスケジューラに登録して繰り返し実行

Windows上で繰り返し実行や、定時に実行させるにはタスクスケジューラを使うのがお手軽だと思う。LinuxだとCronを使えるのでよりシンプルだが、Windowsユーザーである以上はタスクスケジューラを活用するのがしきたりに乗った方法だろう。

ここで注意しなくてはならないことは、「管理者権限」でBATファイルを実行させないと、リスタートが行われない(失敗する)ということだ。これまでの検証結果で実行権限が必要だということが分かっている。タスクスケジューラーには実行ユーザーと権限を設定する項目があるので忘れずに設定し、少し検証してから実運用に移行する必要がある。

今後も様子をみて不具合やより良いアイディアが湧いたらスクリプトを見直す可能性はある。できれば面倒なのでこのまま安定して動いてほしいけれど。

One Reply to “OMRON UPS BY50S~PCとの通信エラーが解消していないのでUSBデバイスを監視して異常なら再起動する”

コメントを残す