devix (Пользователь)
Fresh Boarder
Постов: 2
|
МТЛ-32 и modbus 13 г., 4 мес. назад
|
|
Здравствуйте!
Меня интересует возможно ли по протоколу modbus запись данных в счетчик МТЛ-32, через функцию с номером 16 одновременно несколько регистров, то есть за раз записывать данные размер которых больше двух байт.
В документации написано что можно считывать при помощи функции с номером 3 а записывать при помощи функции с номером 6. По стандарту, при помощи функции 6 можно за раз записать только один регистр размером в два байта.
Как в таком случае действовать:
Допустим я хочу установить значение счетчика без масштабирования(F_RAW) в 0x22223333;
1. В контроллере имеется значение F_RAW=0x0011FFFF;
2. Первой командой я передаю старшие два байта 0x2222;
3. Контроллер записывает в старшие два байта значение 0x2222 и получаем значение F_RAW=0x2222FFFF;
4. Контроллеру на импульсный вход приходит импульс и получаем значение F_RAW=0x22230000;
5. Второй командой я передаю значение младших двух байтов 0x3333;
6. Контроллер записывает в младшие два байта значение 0x3333 и получаем значение F_RAW=0x22233333;
В итоге мы получили неправильное значение F_RAW если мы бы записали при помощи одной команды, мы бы получили значение F_RAW=0x22223334. При записи в обратном порядке, в определенных случаях тоже может возникнут такого же рода ошибка. При помощи функции с номером 16 можно было бы добиться транзакционной записи данных с размером более двух байт.
|
|
|
|
|
Для добавления сообщений, Вы должны зарегистрироваться или авторизоваться.
|
asu_tp (Модератор)
Модератор
Постов: 18
|
RE: МТЛ-32 и modbus 13 г., 4 мес. назад
|
|
В счетчике МТЛ-32 предусмотрена только одна функция для записи данных в регистры по интерфейсу – функция 06 протокола ModBus RTU. Данная функция позволяет записать в SLAVE-устройство за один запрос со стороны MASTER-устройства один двухбайтный регистр. В связи с тем, что двух байт для представления накопленного значения в счетчике будет мало, в приборе МТЛ-32 реализована поддержка чисел в формате INT и в формате FLOAT, где для представления одного числа используется 4 байта, то есть – 2 регистра.
Исходя из условий поставленной Вами задачи, последовательная запись одного числа в два запроса действительно может (хотя вероятность очень низка) привести, в конечном счете, к некорректной записи, когда, по внешнему сигналу прибором будет выполнен инкремент значения счетчика с переносом единицы в старший регистр.
Возможны 2 варианта решения данной задачи.
Первый вариант.
1. Прочитать значения младшего и старшего регистров.
2. Сравнить значение в младшем регистре, которое находилось в счетчике с тем, которое планируется туда записать:
a. Старое значение меньше или равно новому – в таком случае, первым запросом нужно записать новое значение в старший регистр, вторым запросом – записать в младший регистр.
b. Старое значение больше нового – в таком случае, первым запросом нужно записать новое значение в младший регистр, вторым запросом – записать в старший регистр.
Второй вариант.
Затереть значение в обоих регистрах, записав 0х0000 в младший регистр, а затем – и в старший.
После этого – записать новое значение, при этом, первым запросом необходимо записать в младший регистр, а вторым – в старший.
Первый вариант более предпочтительный, так как не будет утрачен ни один импульс счета.
Приведенные варианты решения справедливы в случае инкрементирующего счетчика. Если счетчик выполняет вычитывание (декремент), тогда последовательность записи по регистрам должна быть противоположной указанной выше.
|
|
|
|
|
Для добавления сообщений, Вы должны зарегистрироваться или авторизоваться.
|
devix (Пользователь)
Fresh Boarder
Постов: 2
|
RE: МТЛ-32 и modbus 13 г., 4 мес. назад
|
|
А вообще планируется реализовывать функцию 16?
Хотим подключить ваш прибор к скада системе, Ваш OPC Server подвержен мною описанным ошибкам?
Вообще не хотелось бы так делать как вы описали. И вообще какое то странное решение не реализовывать функцию 16 когда у вас есть данный с размером более двух байт, с чем это связано?
И вообще не хорошо удаленно значения изменять за несколько тактов, может возникнуть ситуации когда какая то часть значения изменится а другая часть изменится через какой то большой промежуток времени или вообще не изменится из за зависания или порчи задающего устройства (например компьютера) .
Например мы через компьютер хотим изменить значение счетчика, за первый запрос мы меняем какую то одну часть, а следующий запрос по какой то причине не проходит, вот и получаем некорректное значение счетчика.
|
|
|
|
|
Последнее редактирование: 09.11.2010 21:51 Редактировал devix.
|
|
Для добавления сообщений, Вы должны зарегистрироваться или авторизоваться.
|
asu_tp (Модератор)
Модератор
Постов: 18
|
RE: МТЛ-32 и modbus 13 г., 4 мес. назад
|
|
Функция 16 протокола ModBus RTU будет реализована в новых версиях программного обеспечения таймера-счетчика МТЛ-32.
Ваши замечания по ОРС Server также будут приняты во внимание.
|
|
|
|
|
Для добавления сообщений, Вы должны зарегистрироваться или авторизоваться.
|
Roman (Пользователь)
Fresh Boarder
Постов: 19
|
RE: МТЛ-32 и modbus 13 г., 1 мес. назад
|
|
Можу порадувати автора теми в моєму ІТМ-11 ver 91.32 реалізовано
функцію DEC-16 тобто HEX-10
Тільки регістри на відміну від МІК 51 потрібно міняти місцями 3,4,1,2
-
А виробникам приладів побажаю давати ширшу інструкцію стосовно протокольного
обміну, а то з кожним разом цей пункт стає все меншим, а в останньому варіанті
практично повністю відсутній.
-
Ще попрошу за можливості викладати на сайті приклади програм написаних на С++ і
на Delphi (бо я на такому пишу)
|
|
|
|
|
Для добавления сообщений, Вы должны зарегистрироваться или авторизоваться.
|
|