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