Показано с 1 по 2 из 2

Тема: DCON хромает моя реализация или баги в документации? Подскажите.

  1. #1

    По умолчанию DCON хромает моя реализация или баги в документации? Подскажите.

    Установка: непосредственно на компорт подключен МВУ-8 в режиме DCON скорость 9600, без паритета, 8 бит данных и т.д. работаю через MSComm. Всё работает, но замечена странность, прибор отвечает той же строкой, что и послана в него. То есть посылаю:#1021.000A5, наблюдаю включение, но отклик прибора в точности такой-же, то есть та-же строка, хотя по документации он должен быть >[Chk](cr). Для облегчения раздумий привожу участки кода на VB:
    Public Function DCONCRC8(Dannie As String) As String '
    Dim data1, i As Long
    data1 = 0
    For i = 1 To Len(Dannie)
    data1 = data1 + Asc(Mid(Dannie, i, 1))
    Next i
    DCONCRC8 = Hex(data1 Mod 256)

    End Function

    Public Sub DCONOut(Modul As Long, Kanal As Long, DataSet As String)
    MSComm1.Output = "#" + Hex(Modul) + Hex(Kanal) + DataSet + DCONCRC8("#" + Hex(Modul) + Hex(Kanal) + DataSet) + Chr(&HD)
    lstO44ed.AddItem ("#" + Hex(Modul) + Hex(Kanal) + DataSet + DCONCRC8("#" + Hex(Modul) + Hex(Kanal) + DataSet) + Chr(&HD))
    'MSComm1.Output = "#" + Hex(Modul) + Hex(Kanal) + DataSet + Chr(&HD)
    'lstO44ed.AddItem ("#" + Hex(Modul) + Hex(Kanal) + DataSet + Chr(&HD))
    End Sub
    Public Function DCONIn() As String
    Dim BufferPort, ChST As String
    Dim dummie As Long
    BufferPort = ""
    tmrErrorFlag = False
    tmrError.Enabled = True

    While MSComm1.InBufferCount < 3
    dummie = DoEvents
    If tmrErrorFlag = True Then
    tmrError.Enabled = False
    lstO44ed.AddItem (BufferPort)
    DCONIn = "Error Time Out Or Sintax Error Or CheckSum Error"
    Exit Function
    End If
    Wend

    tmrError.Enabled = False

    BufferPort = MSComm1.Input
    If Mid(BufferPort, 1, 1) = ">" Then
    DCONIn = "Done"
    ElseIf Mid(BufferPort, 1, 1) = "?" Then
    DCONIn = "Error Value Out Of Bounds"
    ElseIf Mid(BufferPort, 1, 1) = "!" Then
    DCONIn = "Error Of Connect"
    End If
    lstO44ed.AddItem ("Exit with: " + BufferPort)
    End Function
    Последний раз редактировалось samrat; 20.11.2008 в 14:02. Причина: форматирование кода

  2. #2

    По умолчанию

    Установка та-же, но прибор включен через АС3М, немного поменял реализацию, и ответ стал "как по книжке". Привожу код:
    MSComm1.Settings = "9600,N,8,1"
    MSComm1.CommPort = porttrm
    MSComm1.Handshaking = comNone


    MSComm1.InBufferSize = 512
    MSComm1.PortOpen = True

    MSComm1.InputLen = 512
    Далее основная процедура, МВУ работает нормально, но пока МВА не отладил, всё равно привожу без купюр.
    'Совмещённая процедура чтения и записи по протоколу DCON
    Public Function MyDCONConnect(ByVal Device As Long, ByVal Kanal As String, ByVal DataSet As String) As String
    Dim Lk***** jdem, i As Long
    Dim sending As String
    Dim dummie As Long
    Lkanal = Len(Kanal)
    BufferPort = ""
    If Len(DataSet) > 0 And Lkanal > 0 Then 'пишем МВУ поканально
    jdem = 4
    sending = "#" + Hex(Device) + Hex(CLng(Kanal)) + DataSet + DCONCRC8("#" + Hex(Device) + Hex(CLng(Kanal)) + DataSet) + Chr(&HD)
    ElseIf Len(DataSet) = 0 And Lkanal = 0 Then ' читаем МВА группой
    sending = "#" + Hex(Device) + DCONCRC8("#" + Hex(Device)) + Chr(&HD)
    jdem = 60
    ElseIf Len(DataSet) = 0 And Lkanal > 0 Then 'читаем МВА поканально
    sending = "#" + Hex(Device) + Hex(CLng(Kanal)) + DCONCRC8("#" + Hex(Device) + Hex(CLng(Kanal))) + Chr(&HD)
    jdem = 11

    Else 'неверный ввод параметров
    MyDCONConnect = "Err_NAX"
    Exit Function
    End If
    lstO44ed.AddItem ("Посылаем: " + sending)


    MSComm1.Output = sending

    'чтение данных

    tmrErrorFlag = False
    tmrError.Enabled = True
    Do While MSComm1.InBufferCount < jdem 'работаем до заполнения буфера
    dummie = DoEvents
    If tmrErrorFlag = True Then 'если сработал таймер ожидания выходим
    tmrError.Enabled = False

    lstO44ed.AddItem ("Err_TIME, Err_CRC, Err_Sintax " + MSComm1.Input) 'BufferPort) 'сообщаем о выходе и его причине
    MyDCONConnect = "Err_TIME, Err_CRC, Err_Sintax"
    Exit Function
    End If


    Loop
    tmrError.Enabled = False
    BufferPort = BufferPort + MSComm1.Input 'вычитываем результат из буфера
    'оцениваем результат
    If Mid(BufferPort, 1, 1) = ">" Then
    If Len(DataSet) > 0 And Lkanal > 0 Then 'пишем МВУ поканально
    If DCONCRC8(">") = Mid(BufferPort, 2, 2) Then
    MyDCONConnect = "Done" 'записали канал правильно
    lstO44ed.AddItem ("Приняли" + BufferPort)
    Else
    MyDCONConnect = "Done Err_POX" 'записали нормально, отклик с ошибкой
    End If
    ElseIf Len(DataSet) = 0 And Lkanal = 0 Then ' читаем МВА группой
    If DCONCRC8(Mid(BufferPort, 1, 57)) = DCONCRC8(Mid(BufferPort, 58, 2)) Then
    MyDCONConnect = Mid(BufferPort, 2, 56) 'прочитали правильно
    Else
    MyDCONConnect = "Err_EBN" 'ошибка при передаче битые данные
    End If
    ElseIf Len(DataSet) = 0 And Lkanal > 0 Then 'читаем МВА поканально
    If DCONCRC8(Mid(BufferPort, 1, 8)) = DCONCRC8(Mid(BufferPort, 9, 2)) Then
    MyDCONConnect = Mid(BufferPort, 2, 7) 'прочитали правильно
    Else
    MyDCONConnect = "Err_EBN" 'ошибка при передаче битые данные
    End If

    End If



    ElseIf Mid(BufferPort, 1, 1) = "#" Then
    If Len(DataSet) > 0 And Lkanal > 0 Then 'пишем МВУ поканально
    If BufferPort = sending Then
    MyDCONConnect = "Done" 'записали канал правильно
    Else
    MyDCONConnect = "Done Err_POX" 'записали нормально, отклик с ошибкой
    End If
    ElseIf Len(DataSet) = 0 And Lkanal = 0 Then ' читаем МВА группой
    If DCONCRC8(Mid(BufferPort, 1, 57)) = DCONCRC8(Mid(BufferPort, 58, 2)) Then
    MyDCONConnect = Mid(BufferPort, 2, 56) 'прочитали правильно
    Else
    MyDCONConnect = "Err_EBN" 'ошибка при передаче битые данные
    End If
    ElseIf Len(DataSet) = 0 And Lkanal > 0 Then 'читаем МВА поканально
    If DCONCRC8(Mid(BufferPort, 1, 8)) = DCONCRC8(Mid(BufferPort, 9, 2)) Then
    MyDCONConnect = Mid(BufferPort, 2, 7) 'прочитали правильно
    Else
    MyDCONConnect = "Err_EBN" 'ошибка при передаче битые данные
    End If

    End If



    ElseIf Mid(BufferPort, 1, 1) = "?" Then
    MyDCONConnect = "Err_Val"
    Exit Function
    ElseIf Mid(BufferPort, 1, 1) = "!" Then
    MyDCONConnect = "Err_Conn"
    Exit Function
    Else
    MyDCONConnect = "Err_NIX" 'облом них не вошло
    End If
    End Function
    Работу с МВА отлажу на днях. Алгоритм вычисления контрольной суммы тот же, что и выше.
    Действительно ошибок при передаче стало меньше, существенно.
    В общем спасение утопающих - дело рук самих утопающих.

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •