PDA

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



samrat
20.11.2008, 13:53
Установка: непосредственно на компорт подключен МВУ-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
25.11.2008, 11:49
Установка та-же, но прибор включен через АС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
Работу с МВА отлажу на днях. Алгоритм вычисления контрольной суммы тот же, что и выше.
Действительно ошибок при передаче стало меньше, существенно.
В общем спасение утопающих - дело рук самих утопающих.:cool: