DOBON.NETプログラミング道掲示板
(現在 過去ログ1 を表示中)

HOME HELP 新規作成 新着記事 トピック表示 発言ランク ファイル一覧 検索 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■32872 / inTopicNo.1)  RS-485通信でのログ
  
□投稿者/ おいちゃん 一般人(1回)-(2015/03/15(Sun) 23:44:10)
  • アイコン環境/言語:[環境(Win8) 使用言語(VB.net 2012 express) framework4.5] 
    分類:[.NET] 

    皆さん、こんばんは。
    早速ですが、掲題の処理で困っています。

    というのも、ログが下記の状態になってしまっているのです。
    "2015/03/13 15:50:32.138","送信1","02 01 01 01 "
    "2015/03/13 15:50:32.216","受信1","02 01 00 00 "
    "2015/03/13 15:50:32.451","送信2","01 01 01 01 "
    "2015/03/13 15:50:32.544","受信2","01 01 00 00 "
    .
    .
    .
    "2015/03/13 17:13:53.412","送信1","02 01 01 01 "
    "2015/03/13 17:13:53.475","受信1","02 01 00 00 "
    "2015/03/13 17:13:53.725","送信2","01 01 01 01 "
    "2015/03/13 17:13:53.803","受信2","02 01 00 00 "
    .
    .
    .

    となり、"受信2"の所に、"受信1"の電文が表示されて困っています。

    485通信に使っている機材はLineEye SI-35 USBで、SW-A・SW-Bのスイッチ1がONです。
    (SW-A→内部処理・677μsec、speed・More19200bps。Sw-B→送信データのエコー受信・無し)
    そして、LineEyeのLE-1500を使って、通信電文を表示させており、
    そこでは電文の表示が狂う事はありません。

    因みに、接続方法は、

    ΓLE-1500
    PC→SI-35---機械1-機械2

    となっています。

    DiscardInBufferメソッドを入れても、解決できません。
    何方か、ご教授の程、お願い致します。

引用返信 削除キー/
■32873 / inTopicNo.2)  Re[1]: RS-485通信でのログ
□投稿者/ おいちゃん 一般人(2回)-(2015/03/15(Sun) 23:52:42)
  • アイコン2015/03/16(Mon) 07:21:41 編集(投稿者)

    因みに、ボーレート 19200bps、パリティなし、ストップビット1です。
    タイマーオブジェクトを使い、300msに一度、機械に送信しています。
    Private Function SendTARGET_485(N As Integer) As Boolean

    Dim D() As System.Byte
    Dim M$
    Dim E$
    Dim TEMP$
    Dim I As System.Int32
    Dim strStimeBuff As System.String
    Dim strEtimeBuff As System.String
    Dim flag As System.Boolean
    Dim intLen As System.Int32 = 0
    Dim intPointer As System.Int32 = 0
    Dim intReceivebytes As System.Int32 = 0
    Dim dtNow As DateTime
    Dim dtTimeout As DateTime


    'Stopwatchオブジェクトを作成する
    Dim sw As New System.Diagnostics.Stopwatch()

    Try
    ReDim RTX_D(50)
    ReDim D(1)
    Select Case N


    Case 1
    ReDim D(4)
    '=========================================
    'データセット
    D(0) = &H2
    D(1) = &H1
    D(2) = &H1
    D(3) = &H1
    '=========================================

    Case 2
    ReDim D(4)
    '=========================================
    'データセット
    D(0) = &H1
    D(1) = &H1
    D(2) = &H1
    D(3) = &H1
    '=========================================

    Case 3
    ReDim D(4)
    '=========================================
    'データセット
    D(0) = &H2
    D(1) = &H0
    D(2) = &H0
    D(3) = &H0
    '=========================================

    Case 4
    ReDim D(4)
    '=========================================
    'データセット
    D(0) = &H1
    D(1) = &H0
    D(2) = &H0
    D(3) = &H0
    '=========================================
    End Select

    '送信電文の表示
    M$ = ""
    For I = 0 To 4
    TEMP$ = "00" + Hex$(D(I))
    M$ = M$ + TEMP$.Substring(TEMP$.Length - 2) + " "
    Next I

    '受信バッファクリア
    RcvBuf = ""

    '受信フラグクリア
    RcvFlag = 0

    'ストップウォッチを開始する
    sw.Reset()
    sw.Start()

    '電文出力
    SerialPort1.Write(D, 0, 4)

    '送信時間取得
    strStimeBuff = Now.ToString("yyyy/MM/dd HH:mm:ss.") + Now.Millisecond.ToString("000")
    dtNow = DateTime.Now

    '送信ログ
    Select Case N

    Case 1
    Me.WriteLog("""" + strStimeBuff + """,""" + "送信1" + """,""" + M$ + """")
    Case 2
    Me.WriteLog("""" + strStimeBuff + """,""" + "送信2" + """,""" + M$ + """")
    Case 3
    Me.WriteLog("""" + strStimeBuff + """,""" + "送信3" + """,""" + M$ + """")
    Case 4
    Me.WriteLog("""" + strStimeBuff + """,""" + "送信4" + """,""" + M$ + """")

    End Select

    '受信待ち
    flag = False

    Do
    intReceivebytes = SerialPort1.Read(RTX_D, intPointer, RTX_D.Length - intPointer)
    intPointer += intReceivebytes
    dtTimeout = Now
    If (dtTimeout.Ticks - dtNow.Ticks) > 100000000 Then
    Me.Timer1.Enabled = False
    MsgBox("受信電文不可")
    Me.WriteLog("ここで強制終了(受信電文不可)")
    Return False
    End If

    If intPointer >= 4 Then
    '返信時間取得
    flag = True
    End If
    Loop While (flag = False)

    strEtimeBuff = Now.ToString("yyyy/MM/dd HH:mm:ss.") + Now.Millisecond.ToString("000")
    sw.Stop()

    '受信
    'SerialPort1.Read(RTX_D, 0, 4)

    RcvFlag = 1

    If intLen > 4 Then
    Me.Timer1.Enabled = False
    MsgBox("受信電文不良発生")
    Me.WriteLog("ここで強制終了")
    Return False
    End If

    E$ = ""
    For I = 0 To 4
    TEMP$ = "00" + Hex$(RTX_D(I))
    E$ = E$ + TEMP$.Substring(TEMP$.Length - 2) + " "
    Next I

    '送信ログ
    Select Case N
    Case 1
    Me.WriteLog("""" + strEtimeBuff + """,""" + "受信1" + """,""" + E$ + """")
    Case 2
    Me.WriteLog("""" + strEtimeBuff + """,""" + "受信2" + """,""" + E$ + """")
    Case 3
    Me.WriteLog("""" + strEtimeBuff + """,""" + "受信3" + """,""" + E$ + """")
    Case 4
    Me.WriteLog("""" + strEtimeBuff + """,""" + "受信4" + """,""" + E$ + """")
    End Select


    If sw.Elapsed.TotalMilliseconds > 300 Then
    Me.Timer1.Enabled = False
    MsgBox("処理時間が300msを超えました。")
    Me.WriteLog("ここで強制終了。処理時間が300msを超えました。")
    Return False
    End If


    '受信した
    If (RcvFlag = 1) Then
    Return True
    Else
    Return False
    End If


    Catch ex As Exception

    Debug.Print(Err.Description)

    MsgBox("エラー発生→" & Err.Description)

    '回線エラー表示
    Return False
    End Try

    End Function
引用返信 削除キー/
■32874 / inTopicNo.3)  Re[2]: RS-485通信でのログ
□投稿者/ shu 大御所(456回)-(2015/03/16(Mon) 12:37:00)
  • アイコンNo32873に返信(おいちゃんさんの記事)

    SendTARGET_485
    がどのような手順で呼ばれているのかによると思います。
    送受信の組が完了する前に送信されているのではないでしょうか?
引用返信 削除キー/
■32875 / inTopicNo.4)  Re[3]: RS-485通信でのログ
□投稿者/ おいちゃん 一般人(3回)-(2015/03/17(Tue) 13:22:20)
  • アイコンshuさん

    早速の返信、有難う御座います。

    私も、shuさんの仰る事が起こっていると思い、1台だけですが、
    オシロスコープに繋ぎ、波形を見ました。
    入力開始から出力終了まで、約150msで終了しており、入出力がバッティング
    している様子は無かったです。

    下記に、先の関数を呼出している箇所のソースを記載します。
    引き続き、宜しくお願い致します。

    Private STAT_TARGET_485 As System.Boolean
    Private RcvBuf As System.String
    Private RcvFlag As System.Int32
    Private RTX_D() As System.Byte
    Private counter As System.Int32

    Public Sub New()

    ' この呼び出しはデザイナーで必要です。
    InitializeComponent()

    ' InitializeComponent() 呼び出しの後で初期化を追加します。
    counter = 1
    End Sub

    Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
    If SerialPort1.IsOpen = True Then

    'シリアルポートをクローズする.
    SerialPort1.Close()

    Else

    'オープンするシリアルポートをセット.
    SerialPort1.PortName = "COM" & Me.txtPortNo.Text

    'ボーレートをセット.
    SerialPort1.BaudRate = 19200

    'データビットをセットする. (データビット = 8ビット)
    SerialPort1.DataBits = 8

    'パリティビットをセットする. (パリティビット = なし)
    SerialPort1.Parity = Parity.None

    'ストップビットをセットする. (ストップビット = 1ビット)
    SerialPort1.StopBits = StopBits.One

    '文字コードをセットする.
    SerialPort1.Encoding = Encoding.Unicode

    Try
    'シリアルポートをオープンする.
    SerialPort1.Open()
    Timer1.Interval = Integer.Parse(Me.txtSpeed.Text)
    Timer1.Enabled = True
    Catch ex As Exception
    MsgBox(ex.Message)
    End Try

    End If
    End Sub


    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

    Dim boolFlg As System.Boolean
    Try
    boolFlg = SendTARGET_485(counter)
    If boolFlg = False Then
    Me.Timer1.Enabled = False
    Exit Sub
    End If

    counter += 1
    If (counter > 30) Then
    counter = 1
    End If
    Catch ex As Exception
    End Try
    End Sub
    Private Sub WriteLog(ByVal buff As System.String)
    'Dim textFile As System.IO.StreamWriter
    'textFile = New System.IO.StreamWriter(System.Reflection.Assembly.GetExecutingAssembly().Location + Now.ToString("yyyy-MM-dd") + ".LOG", True, System.Text.Encoding.Default)
    'textFile.WriteLine(buff)
    'textFile.Close()

    Dim fs As New FileStream(System.Reflection.Assembly.GetExecutingAssembly().Location + Now.ToString("yyyy-MM-dd") + ".LOG", _
    FileMode.Append, FileAccess.Write, FileShare.Write)
    Dim sr As TextWriter = New StreamWriter(fs, Encoding.GetEncoding("shift-jis"))
    Try
    sr.WriteLine(buff)
    sr.Close()
    fs.Close()
    Catch E As Exception
    ' Let the user know what went wrong.
    Console.WriteLine(E.Message)
    End Try
    End Sub

    Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
    'シリアルポートをオープンしている場合、クローズする.
    If SerialPort1.IsOpen Then
    SerialPort1.Close()
    End If
    'ダイアログをクローズする.
    Me.Close()
    End Sub
引用返信 削除キー/
■32876 / inTopicNo.5)  Re[4]: RS-485通信でのログ
□投稿者/ shu 大御所(457回)-(2015/03/18(Wed) 11:00:29)
  • アイコンNo32875に返信(おいちゃんさんの記事)

    Private RTX_D() As System.Byte
    がPrivateで宣言されているので前回値が残っているのではないか?

    Timer_Tickで処理中にTimerを停止していないようなのでちょうふくで
    実行されているのではないか?


引用返信 削除キー/
■32877 / inTopicNo.6)  Re[5]: RS-485通信でのログ
□投稿者/ おいちゃん 一般人(4回)-(2015/03/18(Wed) 13:50:19)
  • アイコンNo32876に返信(shuさんの記事)
    > ■No32875に返信(おいちゃんさんの記事)
    >
    > Private RTX_D() As System.Byte
    > がPrivateで宣言されているので前回値が残っているのではないか?
    >
    > Timer_Tickで処理中にTimerを停止していないようなのでちょうふくで
    > 実行されているのではないか?
    >
    >

    shuさん
    早速の返信、有難うございます。

    Timer_Tickの件は、「どうしても300ms内で送受信を終わらせたい。」
    という要望があり、それで処理中でもtimerが動く様にしているのです。

    Private RTX_D() As System.Byteに関しては、SendTARGET_485関数内で
    redimしているので、クリアされていると思っていました。
    ローカル変数にしてやってみます。

    また、報告致します。
引用返信 削除キー/
■32913 / inTopicNo.7)  Re[6]: RS-485通信でのログ
□投稿者/ おいちゃん 一般人(5回)-(2015/04/24(Fri) 08:30:28)
  • アイコンshuさん

    報告が遅れてしまい、済みませんでした。
    その後、色々と調べ倒したら、通信している
    バード側にも潜在バグがありました。

    それが原因で上手く制御できない事も分かりました。

    色々と、ご教授くださいまして、ありがとうございました。
解決済み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/

HOME HELP 新規作成 新着記事 トピック表示 発言ランク ファイル一覧 検索 過去ログ

- Child Tree -