tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル シリアル通信で異常に時間がかかってしまう
投稿日: 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の通信部分のみを抜き出したテストプログラムを作成しテストを行っていますが、
一向に再現できずな状態です。

以上、状況説明が長くなってしまいましたが、よろしくお願いします。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。