Просмотр полной версии : Нет связи с ТРМ138
Aleksander8
11.02.2025, 23:22
Сконфигурировал ТРМ138. Конфигуратор сказал, что у прибора адрес "0". Посылаю дейтаграмму Modbus RTU, контрольная сумма правильная.
Прибор не отвечает.
Если бы я послал ему что-то не правильное, получил бы в ответ дейтаграмму с ошибкой, т.е. с взведнным старшим битом во втором байте, т.е.команде.
И не понял, почему у прибора возможные адреса аж за 1000, при максимуме - 247?
Сергей0308
11.02.2025, 23:40
Сконфигурировал ТРМ138. Конфигуратор сказал, что у прибора адрес "0". Посылаю дейтаграмму Modbus RTU, контрольная сумма правильная.
Прибор не отвечает.
Если бы я послал ему что-то не правильное, получил бы в ответ дейтаграмму с ошибкой, т.е. с взведнным старшим битом во втором байте, т.е.команде.
И не понял, почему у прибора возможные адреса аж за 1000, при максимуме - 247?
Вроде по спецификации протокола, прибор не должен отвечать на широковещательные команды, в смысле по "0" адресу, мне кажется надо с азов начинать, иначе беда!
Будем ругаться. А то в последние месяцы совсем плохо стало: вместо того, чтобы почитать инструкцию, народ даже перепрошивать пытается всё подряд.
Вот тут есть инструкции и программы-конфигураторы: https://owen.ru/product/trm138/documentation_and_software
Следует ПО инструкции подключиться Конфигуратором. И посмотреть все настройки. И проверить связь с ним тоже через конфигуратор.
Aleksander8
12.02.2025, 06:09
В конфигураторе как раз написано, что адрес прибора начинается с нуля и далее через 8 до какого-то жуткого номера.
В конфигураторе установил адрес "0" и он всё отработал. Судя по просмотру обмена сниффером, конфигуратор работает по протоколу "овен".
Длинные посылки со странными числами, точнее буквами и, даже при опросе одного канала длиннющий ответ прибора и тоже буквами.
На модбас аски не похоже.
Aleksander8
12.02.2025, 08:24
Будем ругаться. А то в последние месяцы совсем плохо стало: вместо того, чтобы почитать инструкцию, народ даже перепрошивать пытается всё подряд.
Вот тут есть инструкции и программы-конфигураторы: https://owen.ru/product/trm138/documentation_and_software
Следует ПО инструкции подключиться Конфигуратором. И посмотреть все настройки. И проверить связь с ним тоже через конфигуратор.
Чтобы не быть голословным.
Во вложении скрины. Один с установлением связи с прибором по адресу "0". Во втором максимальный адрес, который можно присвоить прибору.
Не буду утверждать, но по моим наблюдениям есть предположения:
1. Если задать адрес больше чем 248, то прибор работает только по 11-битному Owen-протоколу.
2. Протокол определяется автоматически!!! Но по первому пакету! И держит его до сброса питания.
Спасибо!
1. Старый конфигуратор (который у тебя под эту модель прибора) работает по протоколу ОВЕН и поэтому может устанавливать связь по не таким адресам, как Modbus.
2. Протокол ОВЕН позволяет использовать более широкий диапазон адресов (длиной 11 бит). Вот оттуда в конфигураторе они берутся.
3. То, что эти адреса можно выбрать для протокола Modbus - почти что недоработка, так как тут, видимо, автовыбор протокола, и поэтому можно выбрать весь диапазон адресов.
4. В инструкции ещё сказано, что адреса разных приборов надо выбирать кратно 8и.
Поэтому я бы выбрал для него адрес из диапазона нормального Modbus: от 1 до 240 (с припуском в верхнюю сторону).
Адрес для Modbus, равный 0 - это широковещательный адрес. Прибор получит команду, но НЕ должен на неё отвечать, что он и делает (про что ты и спрашивал в первом посте темы).
То есть ИТОГО: Конфигуратор работает по протколу ОВЕН, где совсем другая адресация, и адрес 0 - значимый в том числе.
Чтобы всё хорошо работало по обычному Modbus - назначь прибору адрес из диапазона 1...240.
Aleksander8
12.02.2025, 09:28
То есть ИТОГО: Конфигуратор работает по протколу ОВЕН, где совсем другая адресация, и адрес 0 - значимый в том числе.
Чтобы всё хорошо работало по обычному Modbus - назначь прибору адрес из диапазона 1...240.
Установил конфигуратором адрес "8". Не помогло. Конфигуратор всё-равно видит прибор по адресу "0". Явно какой-то косяк.
Попробую врукопашную.
Установил адрес "16". Ответил. Что за ерунда?
Конфигуратор - да. А реальный ПЛК как видит?
Длина адреса - 8 бит?
Aleksander8
12.02.2025, 11:01
У меня самописная программа.
Тогда я бы проверил какой-то известной и рабочей. Например Modbus Poll, ОВЕН OPC-сервером и им подобными.
Для того, чтобы убедиться в том, что ТРМ корректно работает.
У меня самописная программа.
Если Вы работаете посредством функций WinApi то нужно открывать Com порт, настраивать его, удалять мусор и др.
Правильно формировать запрос (в смысле формата данных). Хотелось бы посмотреть что к чему.
Aleksander8
12.02.2025, 13:48
Если Вы работаете посредством функций WinApi то нужно открывать Com порт, настраивать его, удалять мусор и др.
Правильно формировать запрос (в смысле формата данных). Хотелось бы посмотреть что к чему.
Я работаю через конвертер USB-RS485 "ОВЕН" АС4, с помощью функций WinApi. Сейчас смонтировано на столе. Мусора пока нет.
Когда работал через конвертер RS232-RS485 АС3 и MsComm, проблем тоже не было. Всё работало в условиях сильных помех. Были ошибки связи. Придумал, как их обрабатывать.
Я же написал, что всё заработало.
Посмотреть не проблема. Только пишу на стареньком VB 6.0.
Только пишу на стареньком VB 6.0.Ура-ура! Я на нём тоже местами пописываю под настроение!
В общем, лучше проверить ТРМку через сторонние программы. Чтобы исключить все версии.
Aleksander8
12.02.2025, 14:09
Ура-ура! Я на нём тоже местами пописываю под настроение!
В общем, лучше проверить ТРМку через сторонние программы. Чтобы исключить все версии.
Скоро выйдет релиз twinBASIC. Вычищают ошибки и дописывают кучу новых функций.
Я писал для ТРМ201 и 202. Работало же. А ставить на комп ещё какие-то программы не хочется.
Я работаю через конвертер USB-RS485 "ОВЕН" АС4, с помощью функций WinApi. Сейчас смонтировано на столе. Мусора пока нет.
Когда работал через конвертер RS232-RS485 АС3 и MsComm, проблем тоже не было. Всё работало в условиях сильных помех. Были ошибки связи. Придумал, как их обрабатывать.
Я же написал, что всё заработало.
Посмотреть не проблема. Только пишу на стареньком VB 6.0.
Был бы признателен за предоставленные исходники. Сам пишу на Delphi, но есть проблемы.
Ваш опыт был бы полезен.
Aleksander8
12.02.2025, 14:41
Delphi и VB 6.0 совсем не родственники. Кроме самой программы ещё два модуля с декларациями функций WinApi. Например:
' МОДУЛЬ ДЛЯ РАБОТЫ С COM-ПОРТОМ
' при помощи API.
'Где взял модуль, не помню. Довёл до ума.
'--------------------------------------------------------
Option Explicit
'глобальные переменные
Global ComNum As Long 'хэндл открытого порта; >0, если порт открыт.
Global BarDCB As DCB 'таблица параметров порта
Global CtimeOut As COMMTIMEOUTS 'таймауты порта
Public bWrite(1 To 10) As Byte 'Буфер отправляемой дейтаграммы
Global bRead(254) As Byte 'буфер принятых символов
Public rc As Long 'Переменная для получения результатов работы функций
Public wr As Long 'Количество отправленных байт
Public err As Boolean 'Ошибка
Public rd As Long 'Количество принятых байт
'Структуры для параметров настройки порта
Type COMMTIMEOUTS
ReadIntervalTimeout As Long
ReadTotalTimeoutMultiplier As Long
ReadTotalTimeoutConstant As Long
WriteTotalTimeoutMultiplier As Long
WriteTotalTimeoutConstant As Long
End Type
Type DCB
DCBlength As Long
BaudRate As Long
fBitFields As Long
wReserved As Integer
XonLim As Integer
XoffLim As Integer
ByteSize As Byte
parity As Byte
StopBits As Byte
XonChar As Byte
XoffChar As Byte
ErrorChar As Byte
EofChar As Byte
EvtChar As Byte
wReserved1 As Integer
End Type
' Constants for the dwDesiredAccess parameter of the CreateFile() function
Const GENERIC_READ = &H80000000
Const GENERIC_WRITE = &H40000000
' Constants for the dwShareMode parameter of the CreateFile() function
Const FILE_SHARE_READ = &H1
Const FILE_SHARE_WRITE = &H2
' Constants for the dwCreationDisposition parameter of the CreateFile() function
Const CREATE_NEW = 1
Const CREATE_ALWAYS = 2
Const OPEN_EXISTING = 3
' Constants for the dwFlagsAndAttributes parameter of the CreateFile() function
Const FILE_ATTRIBUTE_NORMAL = &H80
Const FILE_FLAG_OVERLAPPED = &H40000000
'объявления функций API
Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Declare Function PurgeComm Lib "kernel32" (ByVal hFile As Long, ByVal dwFlags As Long) As Long
Public Declare Function SetCommTimeouts Lib "kernel32" (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As Long
Public Declare Function SetCommState Lib "kernel32" (ByVal hCommDev As Long, lpDCB As DCB) As Long
Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, _
ByVal nNumberOfBytesToRead As Long, _
lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long
Public Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, _
ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, _
ByVal lpOverlapped As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function GetLastError Lib "kernel32" () As Long
' Error codes reported by the CreateFile().
Const ERROR_FILE_NOT_FOUND = 2
Const ERROR_ACCESS_DENIED = 5
Const ERROR_INVALID_HANDLE = 6
Public Function OpenCOM(ByVal com As String) As Long 'Открытие COM-порта
Dim retval As Long
ComNum = CreateFile(("\\." & com), GENERIC_READ Or GENERIC_WRITE, 0, 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If ComNum = -1 Then
rc = err.LastDllError
Select Case rc ' Two typical error codes when trying to open a serial port:
Case ERROR_ACCESS_DENIED ' - The serial port opened by another application
MsgBox "The serial port is used by another program", vbCritical
Case ERROR_FILE_NOT_FOUND ' - The serial port does not exist, check the port name specified in the CreateFile()
MsgBox "The serial port does not exist", vbCritical
Case Else
MsgBox "CreateFile failed, the error code is " & Str(rc), vbCritical
End Select
MsgBox "Ошибка открытия порта " + com, vbCritical
OpenCOM = ComNum
Exit Function
Else
retval = PurgeComm(ComNum, 0) 'очистка очередей порта
End If
' Начальное заполнение таблицы параметров приемопередачи
BarDCB.DCBlength = 28 'длина блока DCB
BarDCB.fBitFields = &H83 'Битовое поле, биты которого означают следующее:
BarDCB.ByteSize = 8 'разрядность данных (кол-во бит)
BarDCB.parity = 0 '1-проверять нечетность, 2-проверять четность, 0-не проверять ничего
BarDCB.StopBits = 0 'количество стоповых бит: 0 -один, 1 -полтора, 2 -два
BarDCB.wReserved1 = 0 'зарезервировано. Не используется.
'Времена ожидания (Time Outs) в миллисекундах
CtimeOut.ReadIntervalTimeout = 5 'максимальное время между двумя принимаемыми символами.
CtimeOut.ReadTotalTimeoutConstant = 500 'постоянная часть таймаута на прием
CtimeOut.ReadTotalTimeoutMultiplier = 0 '5 'время на прием одного символа (для вычисления переменной части таймаута)
CtimeOut.WriteTotalTimeoutConstant = 20 'постоянная часть таймаута на передачу
'нулевые времена означают, что таймауты не используются.
OpenCOM = ComNum
End Function
Public Function SetCommParam(baud As Long, parity As Long, bits As Long, stops As Long) As Long
'подпрограмма установки параметров порту
Dim retval As Long
'установка таймаутов
CtimeOut.WriteTotalTimeoutMultiplier = 1 + Int(12000 / baud)
retval = SetCommTimeouts(ComNum, CtimeOut)
If retval = -1 Then
retval = GetLastError()
MsgBox "Ошибка при установке таймаутов, Error: " & retval
SetCommParam = retval
Exit Function
End If
BarDCB.fBitFields = 1
BarDCB.BaudRate = baud 'скорость приемопередачи в бодах
BarDCB.ByteSize = 8 'bits 'разрядность данных (кол-во бит)
BarDCB.parity = 0 'parity '1-проверять нечетность, 2-проверять четность, 0-не проверять ничего
BarDCB.StopBits = 0 'stops 'количество стоповых бит: 0 -один, 1 -полтора, 2 -два
retval = SetCommState(ComNum, BarDCB)
If retval = -1 Then
retval = GetLastError()
MsgBox "Не удается настроить порт на заданные параметры Error: " & retval, vbCritical, "Error!"
SetCommParam = retval
Exit Function
End If
' Call PrintDCB(BarDCB, CtimeOut)
End Function
Public Sub Sending(SendStr() As Byte, NumBytes As Long)
' Sending an array of 8 bytes to a remote device.
rc = WriteFile(ComNum, SendStr(1), NumBytes, wr, 0&) ' The wr indicates how many bytes were went to the port.
If rc = 0 Then
rc = err.LastDllError
MsgBox "WriteFile failed, the error code is " & Str(rc)
GoTo close_and_exit
End If
Exit Sub
close_and_exit:
rc = CloseHandle(ComNum)
End Sub
Public Sub Receiving(NumBytes As Long)
' Получаем ответ от девайса.
rc = ReadFile(ComNum, bRead(1), NumBytes, rd, 0) ' The rd indicates how many bytes were received from the port.
If rc = 0 Then
rc = err.LastDllError
MsgBox "ReadFile failed, the error code is " & Str(rc)
GoTo close_and_exit
End If
'Debug.Print rd
Exit Sub
close_and_exit:
rc = CloseHandle(ComNum)
End Sub
Спасибо за ответ!
Посмотрел текст программы, но как формируется запрос не нашел.
Aleksander8
12.02.2025, 15:06
Вам текст понятен?
Какой запрос вас интересует?
Вам текст понятен?
Какой запрос вас интересует?
Текст понятен, но возможно не до конца.
В частности, как формируется Public bWrite(1 To 10) As Byte 'Буфер отправляемой дейтаграммы
Есть "рыба" и её надо переварить.
Aleksander8
12.02.2025, 15:55
В частности, как формируется Public bWrite(1 To 10) As Byte 'Буфер отправляемой дейтаграммы
Это байтовый массив на 10 байт. Т.е. первый байт массива будет иметь номер в массиве 1, остальные по порядку.
Можно написать и так:
Public bWrite(9) As Byte
тогда первый элемент будет иметь номер в массиве 0.
Aleksander8
18.02.2025, 13:36
Был бы признателен за предоставленные исходники.
Пока ещё не всё выверено. Есть лишние функции. Посмотрите:
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot