タイトル | : シリアル通信で異常に時間がかかってしまう |
記事No | : 14420 |
投稿日 | : 2010/01/26(Tue) 13:13 |
投稿者 | : ぽると |
いつもお世話になってます。 以下の環境にて装置とのシリアル通信処理で通信時間が異常にかかるタイミングが不定期に発生して困っています。
PC1 : 統括用PC OS : Windows 2000 SP4 VB : 6.0(SP6) PG : 統括用プログラム TCP通信 : inetWinsock1.0J TCPコントロール
PC2 : 装置通信用PC OS : Windows XP SP2 VB : 6.0(SP6) PG : 装置通信用プログラム TCP通信 : Winsock コントロール シリアル通信 : MsComm コントロール
システムの流れとして @PC1から指令を送信する。TCP通信。 APC2が Winsock_DataArrival で受け取った指令に応じてPC1に装置状態を返したり( Winsock.SendData )、 装置に命令( MsComm.Output )を送信します。 BPC1がPC2から受け取った内容に応じて、次の指令を出す or 装置状態の取得 @〜Bを繰り返しています。
シリアル通信プログラムの内容です。 シリアルの通信形式はテキストです。コマンド文字列作成や通信ログ出力処理はある程度省いてます。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ Dim mlngDoEventCount as Long ' グローバル変数( DoEvents 調査用 )
Dim lobjMsComm as MsComm ' MsComm コントロールオブジェクト Dim lstrSendData As String ' 送信データ Dim lstrReceiveData As String ' 受信データ Dim lintDataLength As Integer ' 要求データサイズ Dim ldatStartTime As Date ' シリアル通信開始時間 Dim ldatEndTime As Date ' シリアル通信完了時間 Dim i as Integer
lstrSendData = <コマンド文字列> lintDataLength = <コマンドに応じて設定されてます>
For i = 0 To 3 ' リトライ用ループ With lobjMsComm .InBufferCount = 0 ' バッファクリア .Output = lstrSendData ' コマンド送信 ldatStartTime = Now ' 通信開始時間( ログ用 ) mlngDoEventCount = 0 ' DoEvents カウンタ( 調査ログ用 ) ' 受信待ち Do DoEvents mlngDoEventCount = mlngDoEventCount + 1 Loop Until (DateDiff("s", ldatStartTime, Now) >= 10) Or _ (.InBufferCount >= lintDataLength) ldatEndTime = Now ' 通信完了時間( ログ用 ) lstrReceiveData = .Input ' 受信文字列取得 ' 通信ログ出力処理 If DateDiff("s", ldatStartTime, ldatEndTime) >= 10 Then ' タイムアウトログ出力 ' コールスタックログ出力 ' 関数呼び出し履歴 mlngDoEventCount も出力して Do〜Loop に制御が ' 戻ってきているかもチェック End If ' パリティエラーチェック If InStr(lstrReceiveData, "?") = 0 Then Exit For End If End With Next i ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
ldatStartTime と ldatEndTime の間隔が 10秒以上(ひどい場合だと1000秒とか)になるケースが不定期に発生しています。 タイムアウトログとして送信文字列、受信文字列、受信データ長と要求データ長等を出力していますが、 通信時間が異常にかかっている以外はデータには問題なさそうでした。 コールスタックログとして内部関数の呼び出し履歴を出力しており、そちらを調べたところ、 PC1とのTCP/IP通信による Winsock_DataArrival が連続して発生しており、 上記のシリアル通信プログラムの DoEvents に復帰しなくなっていることがわかりました。 ( mlngDoEventCount のカウンタが同じ数値のまま Winsock_DataArrival が連続発生 )
========== コールスタックログ内容抜粋 ========== 0,<シリアル通信関数> 1,Winsock_DataArrival(14), DoEvents = 1000 2,Winsock_DataArrival(14), DoEvents = 1000 3,Winsock_DataArrival(14), DoEvents = 1000 4,Winsock_DataArrival(14), DoEvents = 1000 5,Winsock_DataArrival(14), DoEvents = 1000 ・ ・ ・ ================================================
現在、PC1とPC2の通信部分のみを抜き出したテストプログラムを作成しテストを行っていますが、 一向に再現できずな状態です。
以上、状況説明が長くなってしまいましたが、よろしくお願いします。
|