VBScript (Visual Basic Scripting Edition)を掌握する極限の知見:COMポート設定から計測機器データ自動収集まで(WScript.Shell 活用術)
皆さん、こんにちは!VBScriptの奥深い世界へようこそ。あなたは今、マクロの記録から一歩踏み出し、もっとパワフルな自動化の世界へ飛び込もうとしている、そんな熱意に満ちた方々だと思います。素晴らしいですね!
今回は、VBScriptの強力な味方である `WScript.Shell` オブジェクトを駆使して、外部ライブラリに頼ることなく、PCに接続された計測機器とのシリアル通信(COMポート)を自在に操る方法を、基礎から丁寧に解説していきます。
「COMポート?シリアル通信?なんだか難しそう…」そう思われた方もいるかもしれません。でも大丈夫!まるで隣で一緒にコードを書きながら、一つ一つ紐解いていくような感覚で、このブログ記事を読み進めてください。ここをクリアすれば、VBScriptでのシリアル通信の基本はバッチリですよ!
なぜVBScriptでCOMポートを操作するのか?
「最近はAPI連携が主流じゃないの?」そう思われるかもしれません。確かに、現代のシステム開発ではAPI連携が主流です。しかし、現場にはまだまだレガシーな計測機器や、APIが提供されていない古いシステムが数多く存在します。
そんな時、VBScriptは強力な武器になります。PCに標準搭載されている `WScript.Shell` オブジェクトを使えば、OSのコマンドを実行したり、環境変数を操作したりと、様々なシステム連携が可能です。今回は、この `WScript.Shell` を使って、PCのCOMポート設定を直接制御し、計測機器からのデータ取得を自動化するテクニックをご紹介します。
COMポートとは?計測機器との「会話」の舞台裏
COMポート(Communication Port)は、コンピュータが外部の機器とシリアル通信を行うための「窓口」のようなものです。USBが普及する以前は、マウスやモデムなどの周辺機器を接続するのに標準的に使われていました。
計測機器の世界では、今でも多くの機器がCOMポートを通じてデータをやり取りしています。このCOMポートの設定(通信速度、データビット数、パリティ、ストップビットなど)が、機器との「会話」のルールとなります。このルールが合わないと、データは正しく送受信できません。
`WScript.Shell` オブジェクトの扉を開ける
VBScriptからCOMポートを操作するために、まずは `WScript.Shell` オブジェクトを生成する必要があります。これは、Windowsの様々な機能にアクセスするための「鍵」のようなものです。
‘ WScript.Shell オブジェクトを生成します。
‘ これが、OSのコマンドを実行したり、様々な操作を行うための入り口になります。
Set objShell = WScript.CreateObject(“WScript.Shell”)
この `Set objShell = WScript.CreateObject(“WScript.Shell”)` という一行で、`objShell` という変数に `WScript.Shell` オブジェクトが格納されます。この `objShell` を通じて、私たちはOSのコマンドを実行できるようになるのです。
`mode` コマンドでCOMポート設定を自在に操る!
さて、いよいよ本題です。COMポートの設定は、Windowsのコマンドプロンプトで `mode` コマンドを使うことで行うことができます。VBScriptからこの `mode` コマンドを実行するには、先ほど生成した `objShell` オブジェクトの `Run` メソッドを使います。
`Run` メソッドは、外部のプログラムを実行するためのメソッドです。引数には実行したいコマンド文字列を指定します。
COMポート設定の基本コマンド
COMポートの設定を行う `mode` コマンドの基本的な書式は以下のようになります。
mode COMx: baud=xxxx parity=x data=x stop=x
- `COMx`: 設定したいCOMポート番号(例: COM1, COM2)
- `baud=xxxx`: 通信速度(ボーレート)。例: 9600, 115200
- `parity=x`: パリティビット。None(n), Odd(o), Even(e), Mark(m), Space(s)
- `data=x`: データビット数。通常は 7 または 8
- `stop=x`: ストップビット数。通常は 1 または 2
VBScriptでCOMポート設定を実行するコード例
では、具体的なVBScriptコードを見てみましょう。ここでは、COM1ポートの通信速度を9600bps、データビットを8ビット、パリティをNone、ストップビットを1ビットに設定する例です。
‘ — COMポート設定 —
‘ 設定したいCOMポート番号
Const COM_PORT = “COM1”
‘ 通信速度 (ボーレート)
Const BAUD_RATE = “9600”
‘ データビット数 (7 or 8)
Const DATA_BITS = “8”
‘ パリティ (None:n, Odd:o, Even:e, Mark:m, Space:s)
Const PARITY = “n”
‘ ストップビット数 (1 or 2)
Const STOP_BITS = “1”
‘ modeコマンドの文字列を組み立てます。
Dim strModeCommand
strModeCommand = “mode ” & COM_PORT & “: baud=” & BAUD_RATE & ” parity=” & PARITY & ” data=” & DATA_BITS & ” stop=” & STOP_BITS
‘ WScript.Shell オブジェクトを使って mode コマンドを実行します。
‘ 0 はコマンド実行後にウィンドウを非表示にするための引数です。
‘ True はコマンド実行を待機するための引数です。
‘ objShell.Run strModeCommand, 0, True
‘ 注意: 上記のコードはウィンドウを非表示にするため、実行状況が見えにくくなります。
‘ デバッグ時は、ウィンドウを表示させて確認することをおすすめします。
‘ その場合は、第2引数を 1 に設定してください。
‘ objShell.Run strModeCommand, 1, True
WScript.Echo “実行コマンド: ” & strModeCommand ‘ 実行するコマンドを表示
objShell.Run strModeCommand, 1, True ‘ コマンドを実行し、完了を待つ (ウィンドウ表示あり)
WScript.Echo COM_PORT & ” の設定が完了しました。”
‘ — ここまでがCOMポート設定 —
コードのポイント:
- `Const` を使って、設定値を定数として定義しています。これにより、後で設定を変更したい場合に、この部分だけを修正すれば良くなり、コードの見通しが良くなります。
- `strModeCommand = “mode ” & COM_PORT & “: baud=” & BAUD_RATE & ” parity=” & PARITY & ” data=” & DATA_BITS & ” stop=” & STOP_BITS` の部分で、`mode` コマンドの文字列を組み立てています。`&` 演算子で文字列を連結しています。
- `objShell.Run strModeCommand, 1, True` の部分が、実際に `mode` コマンドを実行する箇所です。
- 第1引数 (`strModeCommand`): 実行するコマンドです。
- 第2引数 (`1`): ウィンドウの表示方法を指定します。`0` は非表示、`1` は通常表示です。デバッグ中は `1` にすると、コマンドプロンプトの実行状況が確認できて便利です。
- 第3引数 (`True`): コマンドの実行が完了するまでスクリプトの実行を待機するかどうかを指定します。`True` にすると、`mode` コマンドが終了してから次の処理に進みます。
実行環境の準備と確認
このスクリプトを実行するには、お使いのWindows PCでVBScriptが実行できる環境が必要です。通常、Windowsには標準で備わっています。
実行前の確認事項:
1. COMポート番号: 接続する計測機器がどのCOMポートに割り当てられているか確認してください。デバイスマネージャーから確認できます。「ユニバーサル・シリアル・バス・コントローラー」や「ポート (COM と LPT)」の項目に、USB-Serial変換アダプターなどの名前で表示されていることが多いです。
2. 通信条件: 計測機器の取扱説明書などで、必要な通信速度(ボーレート)、データビット数、パリティ、ストップビット数を確認してください。これらが合わないと、データは正しく受信できません。
3. スクリプトの保存: 上記のコードをテキストエディタ(メモ帳など)に貼り付け、`.vbs` の拡張子で保存してください(例: `SetComPort.vbs`)。
陥りやすいエラーとその対処法
VBScriptでのCOMポート設定では、いくつか注意すべき点があります。
エラー1: COMポートが見つからない、または使用中
症状: `mode` コマンドを実行しても、エラーメッセージが表示されたり、設定が反映されなかったりする。
原因:
- 指定したCOMポート番号が間違っている。
- そのCOMポートが他のアプリケーション(ターミナルソフトなど)で使用中である。
- USB-Serial変換アダプターなどが正しく認識されていない。
対処法:
- デバイスマネージャーでCOMポート番号を再確認してください。
- 他のアプリケーションでCOMポートを開いている場合は、それらを終了させてからスクリプトを実行してください。
- USB-Serial変換アダプターのドライバーを再インストールしてみてください。
エラー2: 通信条件の不一致
症状: COMポート設定は成功したように見えるが、計測機器からのデータが文字化けしたり、何も受信できなかったりする。
原因:
- VBScriptで設定した通信速度、データビット数、パリティ、ストップビット数が、計測機器の設定と一致していない。
対処法:
- 計測機器の取扱説明書を再度確認し、VBScriptの `Const` で定義している値を正確に一致させてください。特に、パリティの設定(`n`, `o`, `e` など)は間違いやすいので注意が必要です。
エラー3: `WScript.Shell` オブジェクトが生成できない
症状: スクリプトを実行すると、「 ActiveX コンポーネントはオブジェクトを作成できません。」のようなエラーが表示される。
原因:
- VBScriptの実行環境に問題がある。
- セキュリティ設定により、`WScript.Shell` オブジェクトの生成がブロックされている。
対処法:
- Windowsのスクリプト実行ポリシーを確認・変更してみてください(ただし、セキュリティリスクも伴うため、慎重に行ってください)。
- 別のPCで試してみるか、Windowsの再インストールを検討する必要があるかもしれません(稀なケースです)。
計測機器からのデータ自動読み取りへの道
COMポートの設定が完了したら、次は実際に計測機器からデータを読み取るステップです。これには、主に2つのアプローチが考えられます。
1. 標準入出力 (`WScript.StdIn`, `WScript.StdOut`) と `mode` コマンドの組み合わせ:
これは、外部ライブラリを一切使わない、最もVBScriptらしいアプローチです。`mode` コマンドでCOMポートを設定した後、`WScript.StdIn` や `WScript.StdOut` を使って、コマンドプロンプトの標準入出力にデータを送受信するようなイメージです。しかし、VBScriptで直接COMポートの入出力ストリームを操作するのは少し複雑になります。
2. 外部コマンド(例: Tera Term, PuTTYなどのCLI版)の利用:
より現実的で簡単なのは、シリアル通信を行うためのコマンドラインツール(例えば、Tera TermやPuTTYのコマンドラインインターフェース)を `WScript.Shell` から呼び出し、そのツールの出力結果をVBScriptで受け取る方法です。
今回は、よりVBScriptの標準機能にフォーカスするため、ここでは2番目のアプローチを少しだけご紹介し、より高度なデータ収集は別の機会に譲りたいと思います。
Tera Term を使ったデータ受信のイメージ(参考)
Tera Termのようなターミナルソフトは、コマンドラインから起動し、特定のCOMポートに接続してデータを送受信する機能を持っています。VBScriptからTera Termを起動し、一定時間待機させた後、Tera Termが生成したログファイルなどを読み取る、といった連携が考えられます。
‘ —Tera Term を使ってデータを受信するイメージ(参考)—
‘ ※このコードはTera Termがインストールされており、
‘ コマンドラインから起動できることを前提としています。
‘ また、Tera Termの設定(ログ保存先など)は別途必要です。
Dim objShell
Set objShell = WScript.CreateObject(“WScript.Shell”)
‘ Tera Term を起動し、COM1ポートに接続してログを保存するコマンド例
‘ 実際のコマンドはTera Termのバージョンや設定によります。
‘ 例: C:\Program Files\teraterm\ttssh2.exe /சையில் /C=COM1 /B=9600 /L=C:\teraterm_log.txt
‘ 上記はあくまで一例です。ご自身の環境に合わせて調整してください。
Dim strTeraTermCommand
strTeraTermCommand = “””C:\Program Files\teraterm\ttssh2.exe”” /சையில் /C=COM1 /B=9600 /L=C:\teraterm_log.txt”
WScript.Echo “Tera Term を起動してデータ受信を開始します…”
‘ コマンドを実行(ここでは非同期で実行)
objShell.Run strTeraTermCommand, 0, False
‘ データ受信のために一定時間待機する (例: 5秒)
WScript.Sleep 5000
WScript.Echo “データ受信待機時間が終了しました。ログファイルを確認してください。”
‘ — Tera Term でのデータ受信は完了 —
‘ 後続処理で C:\teraterm_log.txt ファイルを読み込むなどの処理を行います。
‘ Set objShell = Nothing ‘ オブジェクトの解放
注意: 上記のTera Term連携コードは、あくまで「イメージ」です。実際のTera Termのコマンドラインオプションや、ログファイルの保存形式などは、お使いのバージョンや設定によって異なります。詳細な連携方法については、Tera Termのドキュメントなどを参照してください。
まとめ:VBScriptで広がる自動化の世界
いかがでしたでしょうか?今回は、VBScriptの `WScript.Shell` オブジェクトと `mode` コマンドを組み合わせることで、COMポートの設定を行い、計測機器との通信の第一歩を踏み出す方法を解説しました。
- `WScript.Shell` オブジェクトでOSコマンド実行の扉を開く。
- `mode` コマンドでCOMポートの通信条件を自在に設定する。
- エラーシューティングのポイントを押さえ、スムーズな自動化を目指す。
この知識を身につければ、あなたはVBScriptを使って、より多くのシステム連携や、業務の自動化を実現できるようになります。マクロの記録だけでは難しかった、外部機器との連携も、きっとあなたの手で可能になるはずです。
「ここをクリアすれば、VBScript (Visual Basic Scripting Edition)の基本はバッチリですよ」という言葉を胸に、ぜひこのテクニックをあなたの武器にしてください。
次回は、さらに一歩進んで、実際に計測機器からデータを取得し、それをVBScriptで処理する具体的な方法について、さらに深掘りしていきましょう。お楽しみに!
