RS232Cコンポーネント

 RS232C通信は、今でも測定器との通信に広く使用されています。
特に古くからある測定器は新しいバージョンが発売されても、RS232C通信は標準のインターフェースとして仕様に入っています。
USBが、新規に追加されたりしていますが、測定器のUSBは、VISA規格になっているのが普通です。VISAにはRS232Cもあり少し面倒ですがこれを使用して良いのですが、一般的ではありません。
VISAはUSB、RS-232C、LAN、GPIBでの通信が可能で、測定器メーカーがそれぞれ出しています、日本語で行いたい場合は菊水電子のKI-VISAが良いのですが、使用の条件として当然ですが通信をする相手として、一台は菊水電子の製品を使う事が条件になっています。
ダウンロードは菊水電子のホームページからダウンロードできます。
規格は統一規格なので、VISA対応の測定器であれば何処のメーカー測定器とも通信が可能ですが、測定用のコマンドは、メーカー、測定器によって異なります。
VISAは、複数のインターフェースをフォローするため、結構大きなファイルのインストールとなり、単にRS232Cのみを使用するのには向いていません
 現在のパソコンはRS232Cのポートがインターフェースとして仕様に無いものが多くなっています、RS232Cを使う場合USB変換ケーブルを使用する事になります。
ディスクトップタイプで特に法人向けの場合は今でもRS232Cは標準仕様となっています、その為かインテルのチップセットの中にはシリアルポートが組み込まれていて、パソコンの仕様にRS232Cが無くてもデバイスマネージャーにはCOMポートが表示されたりします。

 RS232Cコンポーネントの使用上の注意点

 RS232C通信の標準はANSIコードです、Delphi XEはUNIコードなので送信受信時にコード変換が必要です、コンポーネントの中にコード変換を組み込んでも良いのですが、漢字を使用する場合は注意が必要です。
 Windows Vista 以降で使用する場合で、USB変換ケーブルではなく、標準仕様のポート(PCIポート)の場合、特に高速通信9.6Kボー以上の場合は電源オプション 電源の詳細設定の中のプロセッサの電源管理 最小のプロセッサの状態の設定値を大きく(20%->100%)しないと受信時のバッファが間に合わずオーバーランエラーが発生します。
原因は他の割り込み処理が多く一バイト受信ごとの割り込みが追いつかなくなるためのようです。
最小のプロセッサーの状態を大きくしても、XP同等なので少しは消費電力が増えますが、目だった温度上昇はありません。
USB変換ケーブルを使用する場合は、一バイト毎の割り込み発生が無いので変更しなくても全く問題はありません。一バイト毎の受信割り込みは、変換ケーブルに組み込まれたチップにより処理されます。
 ここで紹介しているRS232Cコンポーネントは、WinXp以降でしか使用できません、WinXp以前で使用する場合は、OpenコマンドのCreateFileWをCreateFileに変更する必要があります、以前はポート番号が1~9は、CreateFileで10~256はCreateFileWでOpenしていましたが、Xp以前はもう使用される事は無いと判断し削除しました。(Win2000でも使用可能な筈ですが、Win2000のPCが無く確認が取れていません)
 実際に測定器及び装置を何台かRS232Cで接続して測定と装置の制御をした事があります、多くてもポートは6個程度でRS232C(COMポート)が9個あれば十分と思われますが、COMポートを他の通信のポートの代用として使用する場合、間違わないように大きなポート番号割り付けているようです。
測定器の中には、USBを使用し、インターフェースをRS232C(COMポート)として、通信速度を1Mボー近い速度で行っている物もあります。 この場合はRS232C変換ケーブルではなく、測定器と、パソコンの間はUSB接続で、USBドライバーでRS232C(COMポート)の信号に変換するようになっていて測定用のプログラムにUSBドライバーのDLLをリンクする手間を省くようになっています。
通信速度は、可なり速く、RS232Cの標準速度には無い速度となるので、RS232Cコンポーネントは標準以外の速度も設定できるようになっている必要があります。

 三種類のRS232コンポーネントを用意してありますのでその使用法について

COMM、USBCOMM、WPRCCOMMの三種類です。

通常の場合は、COMMコンポーネントを使用します。
このコンポーネントはUSB変換ケーブルを使用した場合、Break信号を検出できません。
USB変換ケーブルの中には、Break信号の受信が出来ないものもありますが、受信の出来るケーブルでもBreak信号を検出しません。
現在殆どのRS232C通信でBreak信号は使用されていませんので通常は問題ありませんが必要がある場合はUSBCOMM、WPRCCOMMを使用します。
又、 受信信号による画面の変更を直接高速で大量に行うとエラーが発生します。
原因は、画像の出力処理が完了しないうちに、次の受信割り込みが発生し、画面の変更を行おうとするためです。
ハイパースレッドを使用していない時は問題なかったのですが、WinXpが登場し、ハイパースレッドが使用出来るようになってこの問題が出てきました、Win2Kで、2CPUのマザーボードを使用すれば、確認が出来たのかもしれませんが、高価で手が出ませんでした。
現在は、マルチコアが当たり前なので、長時間使用する測定用のソフトには注意を払う必要があります。
対策としては、

procedure WndProces(var Msg: TMessage); // プログラムメッセージ取得ルーチン

var
    FWNDSPHWD : HWND; // Message用ハンドル

procedure TForm1.FormCreate(Sender: TObject);
begin
    FWNDSPHWD := Classes.AllocateHWnd(WndProces); // 受信処理ルーチン用ハンドル設定
...
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
    DeallocateHWnd(FWindowHandle); // WndProcd Handle の破棄
end;


のようにして、ハンドルを設定、sendmessageを使用して画面の変更を行うか、Tmemoの場合などは、sendmessageによりコマンドを送信変更をします。

memo1.selStart := memo1.GetTextLen;
SendMessage(memo1.Handle, EM_REPLACESEL, 0, Integer(@RecvBuf[0]));

sendmessageは、処理が終了するまで制御を戻さないので、次の受信割り込みの処理が行われることはありません。
制御を戻さないといっても、ポートの受信処理は行われ、指定されたバッファに蓄積されます、ブッファの容量を超えないうちに、処理を終了し次の割り込み処理を実行して、ブッファから読み出せば、良いことになります。

USBCOMMは、受信割り込み発生時タイマーを使用し少し遅延してエラー検出を行いUSB変換ケーブルがBreak信号を処理している場合、その信号を検出出来る様にしたものです。

WPRCCOMMは、受信スレッドにsendmessageを使用して、画面を操作しても問題が生じないようにしたものです。

画面表示を、通信で直接行わない場合は、高速で処理の出来るCOMMが良いと思います。

sendmessageを使用し、リアルタイムにグラフを表示しようとすると、測定器のデーターの転送速度が速い場合、転送速度に表示が間に合わなくなる場合があります、その場合表示にDirectXを使用するとか、データーの受信と、表示を分離し、受信データーはメモリーにストア、表示はメモリーから増えたデーターを複数個読み出してグラフに追加するようなマルチ処理が必要となります。グラフの更新を一個のデーター毎行うのではなく、2個以上のデーター毎更新して、表示を行い、転送データーに追随させるのです。高速で処理できる高価なグラフィックボードが使用できるのが一番なのですが。

測定器との通信を行う場合、先頭、最後の文字コードが決まっていたり、決められたdelimiterを使用するので、その文字コードを受信割り込み用に指定すれば、受信処理を可なり簡単にすることが出来ます。

使用方法の細かいことは、RS232C.DOC、Helpファイルを参照して下さい。
注意 RS232C.DOC、Helpのプログラム例は Delphiが Ansiコードの場合で記されています。

download RS232CETC.zip


         コンポーネント一覧へ戻る