Зарегистрирован: Oct 05, 2005 Сообщения: 106 Рейтинг: +8/-0 Откуда: Харьков
Добавлено: Вт 12 Апр, 2011 13:24:34 Заголовок сообщения: Чтение данных с произвольных адресов по modbus
Есть прибор - расходомер УВР-011. У него есть выход RS-485. По заверению разработчиков - протокол modbus, НО не modiconовский (т.е. данные будут лежать не в области начиная с 40001, а в какой то другой, в какой - еще точно не знаю).
Чем бы вычитать правильно эти данные в ControlLogix?
Через MVI-MCM? Но насколько я вычитал из документации, при применении функции 3 (чтение), вычитка начинается с 40001 (devaddr). Как изменить не нашел.
Через MVI-GSC (или MVIe-GCS)? Но там вроде как прийдется как-то прописывать весь этот протокол (что в общем то лень), да и потянет ли он работу в удаленных шасси?
Последний раз редактировалось: Eraser (Ср 13 Апр, 2011 12:25:35), всего редактировалось 1 раз
Зарегистрирован: Mar 09, 2006 Сообщения: 29 Рейтинг: +2/-0 Откуда: Kharkov
Добавлено: Вт 12 Апр, 2011 22:36:53 Заголовок сообщения: Re: Вычитка данных с произвольных адресов по modbus
Eraser писал(а):
Чем бы вычитать правильно эти данные в ControlLogix?
MVI-MCM - это оптимальный вариант. Можно также использовать MVI-GSC или MVI-ADM.
Eraser писал(а):
По заверению разработчиков - протокол modbus, НО не modiconовский (т.е. данные будут лежать не в области начиная с 40001, а в какой то другой, в какой - еще точно не знаю).
...
Через MVI-MCM? Но насколько я вычитал из документации, при применении функции 3 (чтение), вычитка начинается с 40001 (devaddr). Как изменить не нашел.
Согласно спецификации modbus, доступ к регистрам ввода (также как и к дискретным входа, выходам и регистрам хранения) осуществляется с помощью 16-битного адреса. Это значит, что вы указываете адрес требуемого регистра в диапазоне от 0 до FFFF. А формат адресации вида "40001" придуман для логического разделения дискретных входов, выходов, входных регистров и регистров хранения. Он используется на бумаге (в документации). В железе - просто 16-битный адрес.
Так что, если эти разработчики используют 16-битный адрес, то данные вы считаете без проблем.
Мануал со мной тоже согласен:
User manual MVI56-MCM, page 47 писал(а):
DevAddress specifies the Modbus Slave address for the registers associated with that command. This is the offset address for the Modbus Slave device. With Modbus, to read an address of 40001, what will actually be transmitted out port is Function Code 03 (one byte) with an address of 00 00 (two bytes). This means that to read an address of 40501, use Func 3 with a DevAddress of 500.
Eraser писал(а):
Через MVI-GSC (или MVIe-GCS)? Но там вроде как прийдется как-то прописывать весь этот протокол (что в общем то лень), да и потянет ли он работу в удаленных шасси?
Да, придется реализовывать модбас протокол на релейной логике. Это лишняя трата времени.
MVI-GSC "потянет работу в удаленном шасси" точно также, как и MVI-MCM. У них одинаковые размеры тегов входа/выхода модуля.
Из личного опыта: два MVI-GSC с RPI = 30мс в удаленных шасси нормально работают в одном сегменте controlnet. К тому же, в этой сети еще шасси с сигнальными модулями работают.
Если время обновления данных не критично, то можно смело размещать MVI-MCM в удаленном шасси. Если требуется максимальная скорость обновления данных, то может стоит использовать MVI-ADM, размещенный в локальном шасси. Можно сэкономить несколько десятков миллисекунд
Прежде, чем покупать дорогущие модули MVI-MCM или задумываться о ручном программировании ADM, посмотрите в каталог
C:\RSLogix 5000\Projects\Samples\ENU\v16\Rockwell Automation
там лежит файл ModbusMaster.ACD
В нем готовая реализация протокола на ладдере через встроенный COM-порт процессора.
В нем готовая реализация протокола на ладдере через встроенный COM-порт процессора. Wink
необходимо на одно шасси приводить 3 разных сети от 3-х шкафов с расходомерами, так что нужны дополнительные порты.
Цитата:
Мануал со мной тоже согласен: Smile
что то мне кажется что мануал не очень то согласен . В мануале то как раз и прописано, что чтение при посылке байтов 00 00 будет идти с 40001, а если я хочу скажем считать с 38950 ? что мне записать в тэг DevAddress? Отрицательные значения?
И еще вдогонку, в конце при посылке надо добавлять СRC. Так вот MVI-MCM будет сам добавлять это к каждому запросу? Или мне нужно это еще высчитывать дополнительными командами?
И еще вдогонку, в конце при посылке надо добавлять СRC. Так вот MVI-MCM будет сам добавлять это к каждому запросу? Или мне нужно это еще высчитывать дополнительными командами?
MCM будет добавлять сам. Для удаленного шасси обрати внимание на MVI56E-MCMR.
С расходомером могут быть проблемы и другого рода, например корректор расхода газа БВР.М имеет как-бы протокол "Modbus", но:
- считывать надо весь блок данных (128 байт).
- данные упакованы (8 бит, 8 бит, ..., 16, 32, 32, ..., 80, 8, ...).
...там лежит файл ModbusMaster.ACD
В нем готовая реализация протокола на ладдере через встроенный COM-порт процессора.
У RS232 скорость передачи данных меньше и помехозащищенность хуже. ИМХО не годится он для серьезных решений в автоматизации.
А также нарушается принцип модульности АСУ ТП. Горячей замены коммуникационного модуля после возможного замыкания сети модбас на силовую сеть уже не получится
Но при ограниченном бюджете можно воспользоваться этим вариантом.
Eraser писал(а):
необходимо на одно шасси приводить 3 разных сети от 3-х шкафов с расходомерами, так что нужны дополнительные порты.
В принципе, сети можно объединить через повторители, если по количеству хостов влазите в 247 штук и не требуется высокая скорость обмена данными.
Eraser писал(а):
Цитата:
Мануал со мной тоже согласен: Smile
что то мне кажется что мануал не очень то согласен . В мануале то как раз и прописано, что чтение при посылке байтов 00 00 будет идти с 40001, а если я хочу скажем считать с 38950 ? что мне записать в тэг DevAddress? Отрицательные значения?
Вы не поняли то, что я написал. В сеть (модбас слейву) передается адрес регистра в диапазоне от 0 до 65535. Это традиционное представление адреса. В "нетрадиционном" представлении модбас адресов типа "40001" ведущая цифра "4","3", "1", "0" определяет как бы "тип данных". "4" - это регистры хранения, "3" - регистры чтения, "1" - входные биты "0" - выходные биты. А число образованное оставшимися 4мя цифрами минус один это как раз адрес из диапазона 0-FFFF. Вот его то и надо посылать слейву. А "тип данных" в отсылаемой модбас телеграмме определяется функцией, которую вы указали.
Если вам разработчики расходомера указали адрес 38950, это значит, что вам надо считывать данные функцией 4 из регистра чтения по адресу 8949.
Если разработчики указали адрес 38950, а также указали, что считывать надо из регистров хранения, то вам надо считывать данные функцией 3 из регистра хранения по адресу 38950.
Вот такая путаница в модбасе.
И опять уже Википедия со мной согласна:
Wikipedia - Modbus писал(а):
Следует отметить, что со способом адресации данных связана определённая путаница. Modbus был первоначально разработан для контроллеров Modicon. В этих контроллерах для каждой из таблиц использовалась специальная нумерация. Например, первому регистру ввода соответствовал номер ячейки 30001, а первому регистру хранения — 40001. Таким образом, регистру хранения с адресом 107 в команде Modbus соответствовал регистр № 40108 контроллера. Хотя такое соответствие адресов больше не является частью стандарта, некоторые программные пакеты могут автоматически «корректировать» вводимые пользователем адреса, например, вычитая 40001 из адреса регистра хранения.
Если разработчики указали адрес 38950, а также указали, что считывать надо из регистров хранения, то вам надо считывать данные функцией 3 из регистра хранения по адресу 38950.
если функцией 3, то что при этом указать в DevAddres? ведь при использовании функции 3 в сеть уйдет запрос на чтение того адреса, что указан в DevAddres + 40001. Или не так?
Думаю, что это все же должно сработать
Цитата:
Если вам разработчики расходомера указали адрес 38950, это значит, что вам надо считывать данные функцией 4 из регистра чтения по адресу 8949.
ведь при использовании функции 3 в сеть уйдет запрос на чтение того адреса, что указан в DevAddres + 40001. Или не так?
откуда такая информация?
Еще раз, из мануала MVI56-MCM:
Цитата:
"With Modbus, to read an address of 40001, what will actually be transmitted out port is Function Code 03 (one byte) with an address of 00 00 (two bytes)."
На человеческом языке это:
Чтобы считать адрес 40001 по модбасу, из порта, в действительности, будет передаваться функция 3 с адресом 0 (в двух байтах).
Если разработчики указали адрес 38950, а также указали, что считывать надо из регистров хранения, то вам надо считывать данные функцией 3 из регистра хранения по адресу 38950.
Ну, тогда получается что эта фраза лишена смысла, т.к. регистры хранения начинаются с 40000 адреса.
Цитата:
В "нетрадиционном" представлении модбас адресов типа "40001" ведущая цифра "4","3", "1", "0" определяет как бы "тип данных". "4" - это регистры хранения, "3" - регистры чтения, "1" - входные биты "0" - выходные биты.
В общем, я понял, что MVI-MCM должен мне подойти, и с 99% вероятностью будет работать как надо, если только разработчики расходомера УВР-011 не зададут какой то уж очень специфический адрес на чтение.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
Smart Solutions VDT GmbH | Friedrich-List-Allee 38, D-41844 Wegberg-Wildenrath, Germany Tel.: +49 2432 933 57 83 | e-Mail: office@vdt-solutions.de Все товарные знаки и торговые марки являются собственностью их владельцев.
При использовании материалов сайта ссылка на данный сайт обязательна. Открытие страницы: 0.131 секунды