RS232C通信プログラムです。
ここで紹介するのは、測定器、装置との通信確認に使用する為のRS232Cソフトです。
ターミナルモードで使用するものではありません。
RS232コンポーネント三種類を使用したプログラムが、ダウンロードできます。
通常文字の送受信三種類と、ヘキサコード送受信一種類の四種類です。
測定器との通信は、通常プログラムハンドシェイクを使用します、測定器にコマンドを送信すると、それを実行し実行した結果を測定器が送ってくるといったやり方が主なやり方です。
何か送信すれば、必ず応答があり、応答があってから次のコマンドを送信するという方法です。
キーボードでキーを叩くと、叩く毎に文字の送信と表示するターミナルモードでは、動作しない測定器があります、ターミナルモードでは動作しないのが一般的です、コマンド送信を途中で打ち切られた場合、いつまでも待ち続けずにタイムアウトとして次のコマンドを待つことが出来る様にするためです。
コマンドは、指定されたボーレートでいっきに連続で送信する必要があり、それに対応した送受信方式のプログラムです。
大半の測定器にはチェックサムはありませんが、電動装置には、チェックサムが必要なものがあります、誤動作による事故を防止する為ですが、チェックサムは、メーカーによって少し違う事が多く、チェックサムの付加機能はありません、必要であれば先に計算をしておいて、送信コードとして入力しておく必要があります。
チェックサムの計算方法は、メーカーの取扱説明書に必ず記載されています。
装置からの応答にも、チェックサムが付いてくるので、本番のソフトには受信データーが正しいか確認をするルーチンを入れる必要があります。
四種類のプログラムは、殆ど同じなので、代表的なものについて説明をします。
上図は、相手の通信装置と接続状態にある時です。
このソフトでは、15個まで、予め送信コマンドを用意しておくことが出来ます。
送信ボタンをクリックすることによって、入力されたコマンドが送信されます、送信用コマンドは、プログラム終了時保存され、次の起動時に読み込まれて再設定されます。
受信内容は保存されません。
一番上の入力欄は、送信文字を入力したあとエンターキーで送信されます、送信と同時に入力された文字は消去され残りません。
通信を開始する前に、必要に応じて通信条件の設定をします。
設定には通信の設定と、受信データーの表示用設定があります。
BaudRate
通信速度を設定します、PCI上は115.2Kが最高速度ですが、USB変換ケーブルにはもっと早いものもあります。 USBドライバー変換タイプのものには、専用の値のものもありますので、自由な速度も入力できますが、通常の場合は、基本の値でしか動作しません。
ByteSize
一つの値ののビット数 4~8迄設定できます、単に数字だけを送信するなら、4ビットで良いのですが、今は、文字コードコマンドを使用するので、8ビットが殆どです。
稀に、古い測定器で7ビットのものもあります。
設定でデータービット数が4ビット~8ビットとなっていますが、ハードに依存し現在使用できるのは、5ビット~8ビットです。
StopBits
一つデーターの終わりのビット数で基本的には1ビットです。通信速度誤差、受信データー処理の為の時間確保等に使用されます。
DCB構造体が8250(通信用IC)を形成する為に使用される場合、1.5のストップビットを持った6,7,8データビットの時と、2ストップビットを持った5データビットの使用は無効の組み合わせです。
Parity
送信エラー検出用で、ビットの値により奇数、偶数、なし、マーク、スペース等がありますが、一般的には奇数か偶数です、通信エラーチェックにチェックサムが使用される場合は、無しの場合もあります。
Xon,Xoff
通信受信ブッファがオーバーフローしないように、送信停止、送信開始を送信元に送信してコントロールする方法です。
送受信バッファの大きさは、ユーザー設定となっており、通常は4Kバイト位用意しますが、送信の状態により設定します。
バッファ残りどれぐらいで、XonXoffを行うのかの設定も出来ます。
送信側としては、送信バッファの残り具合を確認してから次のデーターを送信しなければなりません。
プログラムハンドシェイクを使用する測定器との通信の場合百バイト程度でも良い場合があります、一番長い通信データーが入れば問題良いことになります。又、プログラムハンドシェイクを行う場合は、Xon,Xoffは必要ありません。
RtsCts
信号線で送受信可能か行う方式です。
受信可能な場合RTS信号をハイにします、それを相手側がCTS端子で読み取り、データーを送ってきます。
受信バッファが90%以上になると、RTS信号がロウになり、相手からの送信を停止させます、これは、アプリケーションソフトではなく、システム側で行われるので、設定さえすれば、ユーザーは制御する必要はありません。
この場合も、送信に先立って、送信バッファの確認が必要です。
Cts(MS_CTS_ON)を状態を読み取る関数をここで使用しているRS232Cコンポーネントには用意していません。
必要であれば、DSR(MS_DSR_ON)を読み取るのと同じなので自分でコンポーネントに追加して下さい。
DTRDSR
一般的には、モデム用ですが、測定器の中には、この信号を利用しているものもあります。
ポートをオープンし、データーの受信が可能になったら、DTR信号をハイに設定します、RtsCtsが有効になっていると、Rtsもハイに設定されます。
通常は、ポートをOpenしたら、DTRをハイにするのですが、これは、システム側でなく、アプリケーションソフトで、ハイに設定します。
ここで使用しているRS232Cコンポーネントでは、ボートOpenでハイになり、CloseでLOWになるようにつくられているので、プログラムで設定する必要はありません。
DSR信号は、GetDsrStateで、RS232Cコンポーネントを利用して読み取れるようになっています。
もし自分でフローコントロールを行いたい場合は、Windows APi
EscapeCommFunctionと、GetCommModemStatusを利用して行います。
その時は、コンポーネントのフロー設定をしない状態にします、通信ハンドルは、OPEN状態ならコンポーネントから読み出せます。
PortNo
PortNoは、通信用のCOMポート番号です、ポート番号は、1から256迄で、デバイスマネージャーで空いていれば好きな番号に設定が可能です。
本プログラムでは、レジストリーからCOM番号を読み出し、使用可能なポートが表示されます。
改行文字数
改行文字数は、通信とは関係ありません、受信文字を表示すのに、一行の文字数をいくつにするかの設定です。
受信文字数が多く、改行が無い場合、指定された文字数で、改行を追加し、TMemoに追加表示します。
ErrCheck
通信Errorのチェック、通信エラーのチェックを行うか行わないかの設定です。
RS232Cは、余程条件が悪く無い限りエラーは発生しません。
エラーが発生するのは、余程配線の状態が悪い、通信の設定が、送受信側で食い違っている、ノイズが異常に発生している時です。
条件が良ければ、エラー確認は殆ど必要ありません。
測定器の設定パリティ等がわからない場合に、エラーの確認をする事により、設定ミスの確認が出来ます。
通信モニターを使用すれば良いのですが。
dellimiter
文末、文頭に付加する文字の設定を行います。
測定器、装置によって、文末文頭に付加する文字が決められています。
測定器は、通常文末は、0D,OAの何れかです。
シーケンサー、モーターの駆動装置等に、分頭にSTX、文末にETX 又は二文字のETX,ETX1の場合があり、そのコードの付加する設定を行います。
相手からのデーターを受信する場合、ここで設定したものでTMemoに改行出力し、送信する場合は、入力された文字に付加して送信出力します。
TimeOut
送受信のタイムアウトです。何らかの理由により、送信、又は、受信が停止した時、制御を戻すためのものです。
ここで使用しているRS232Cコンポーネントは、送信時は、送信終了を待たずに、送信バッファにデーターを書き込んだら、制御を戻すのと、送信終了まで待って制御を戻す方法を選択出来るようになっています。
受信側も同じで、指定された受信文字数受信しないと、制御を戻さない場合と、ブァッファに指定された文字数が不足していても、あるだけの文字数を読み出して制御を戻してしまうモードの選択が出来る様になっています。
受信割り込み発生時は、受信した文字数をアプリケーションに渡すので、その文字数を指定して読み出せば、問題なく読み出せますが、送信側は相手が受信を止めていると、制御が戻らなくなってしまいます、その時に送信タイムアウトが働いて制御が戻ることになります。
長いデーターを一度に送る場合は、タイムアウト時間を長く設定する必要があります、そうしないと、送信途中でタイムアウトになります。
BreakSendTime
ブレーク送信の長さを設定します。
ブレークは、信号線を強制的にLOWに指定された時間出力します、その結果受信側は、#00を受信、ついでフレーミングエラーを検出、更にその後ブレークを検出することになります、ブレークを検出したら、その時のフレーミングエラーをキャンセル、#00は、アプリケーション側でキュンセルをします。
最近では、ブレークを利用した測定器とか装置はなく、必要ないかもしれませんが、最新のUSB変換ケーブルでもこのモードが残っているので、ここでのRS232Cコンポーネントでも対応しました。
受信Event設定
データーを受信した場合の、受信割り込みの発生文字コード(バイナリー)の設定をします。
通常は、何も指定せず、受信したら割り込みが発生するようにします、CPUの込み具合で、バッファにデーターが溜まったら受信割り込みが発生します。
しかし、これだと、測定器とプログラムでハンドシェイクを行う場合、文末区切り文字(delimiter)が受信されるのをプログラムで確認する必要があります。
文末区切り文字(delimiter)を割り込み発生文字としておけば、この文字が受信文字に含まれた時だけ、割り込みが発生するので、プログラムが簡単になります。
例えば、通常の改行#0Aを設定しておけば、最後の#0Aで割り込みが発生します、但し漢字を使用すると、#0Aが混じることがあるので、漢字の通信には使用出来ません。
測定器、装置との通信には、2バイト文字は使用されないので、全く問題はありません。
OnEvent文字数
文字受信時の割り込み発生の最低文字数を設定します。
通常は一文字として、それ以上の設定はしません、あくまでもテスト用です、その為この条件は保存されません。
通信ソフトを再起動すると、デフォルトの1文字に戻ります。
連続送信間隔
データーの連続送信モード時、前の送信から次の送信までの空時間を設定します。
測定器から、REDAコマンドでデーターを読みだとすると、この時間を設定することにより、間隔的にデーターを読み出すことが出来ます。
空時間は、あまり正確ではありません。
最下行クリア
Tmemoの一番下の行まで行ったら、全部消去してまた先頭から出力わ行うモードで設定です。
通信接続時の、連続送信モードについて
通信テストとして、同じコマンドを連続して送信出来る様になっています。
通信間隔は設定で行います。
範囲送信は、Startに最初の送信ボタン番号を、toに最後の送信ボタンの番号を入力します、範囲送信ボタンをクリックすると、順番に設定した送信ボタンのデーターが送り出されます。範囲送信は、一回だけ指定された範囲を送信します、次に範囲送信をクリックしないと、再送信は行われません。
その際、受信確認はされません。
連続指定は、連続指定に送信ボタンの番号をいれます、連続送信のボタンをクリックすると、指定された一つのコマンドだけ連続で送信します、この場合も受信確認はありません。
連続送信の停止は、連続送信停止ボタンをクリックして行います。
1文字割り込み送信は、送信中に設定された1文字を割り込んで送信するためのものです。
通常は使用しません、送信エラーの再現用と思えば良いでしょう。
Hex code通信
Hexコード通信確認用のものです、文字の通信では、表示されないコードを表示通信する為のものです。
設定でデータービット数が4ビット~8ビットとなっていますが、ハードに依存し現在使用できるのは、5ビット~8ビットです。
Hexコード通信で確認が出来ます。
送信データーの入力時、HEXの場合先頭に $ 文字を付加します、Delphiの数値変換機能をそのまま利用するためです。
数値の場合は、0~255までの値を入力します、区切りにはカンマを使用し、数値とヘキサの混在も可能です。
DCB構造体が8250(通信用IC)を形成する為に使用される場合、1.5のストップビットを持った6,7,8データビットの時と、2ストップビットを持った5データビットの使用は無効の組み合わせです。
各プログラムによりTmemoへの出力方法が多少違います、実際に測定用ソフトや、装置を動かす為のソフトを作成する場合の参考にして下さい。
通信ソフトの確認は、PCが二台有ると確認が容易ですが、無い場合は、USBRS232C変換ケーブルと、RS232Cクロスケーブルを用意すれば、送受信とも一台のパソコンで行い通信の確認を行う事ができます。RS232Cクロスケーブルは、全線接続タイプがベターです。
通信ポートを二個用意し、通信ソフトも二つ起動します。