This is topic Обмен по ModbusRTU in forum Общие вопросы / Common questions at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/45/t/000292.html

Posted by Алексей Шелепов (Участник № / Member № 6361) on :
 
Здравствуйте!
В сети по Modbus RTU несколько двухканальных весоизмерительных приборов.
Активен только один канал каждого прибора. Написана программа, которая при помощи блока IMP поочередно записывет в прибор номер активного канала (код АЦП) и считывает текущий вес с задержкой его в аргументе блоком DEL.
Минус всего этого, что в процессе работы происходит перескок отображаемого веса из первого канала во второй и наооборот.
Вопрос: возможно ли организовать последовательный опрос каналов в приборе, т.е. записали номер АЦП - считали вес - по флагу окончания чтения к следующему каналу, затем следующий прибор?
 
Posted by Алексей Шелепов (Участник № / Member № 6361) on :
 
Уважаемая техподдержка!
Ответьте,пожалуйста, на вопрос, т.к. мы находимся на стадии сдачи объекта и время играет не на нас!
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Надо писать пользовательскую программу, которая будет контролировать исполнение команд чтения и записи и реализовывать нужную последовательность.
Учитывая асинхронность потока Modbus RTU по отношению к основному циклу пересчета базы каналов, надо контролировать именно факт исполнения запроса и команды.
Для контроля исполнения запроса можно задать этому каналу цикл "Однократно" и запускать его сбросом атрибута 3 (СОСТОЯНИЕ). После получения корректного ответа канал будет автоматически выключен. Контролируя атрибут 3 можно установить факт завершения запроса.
Контроль команды, исполняемой каналом OUT, необходимо считать из устройства реальный номер его активного канала.
 
Posted by Алексей Шелепов (Участник № / Member № 6361) on :
 
Спасибо, все получилось. Но есть еще вопрос: если канал не получил ответ как можно определить ошибку запроса, чтобы продолжить последовательность выполнения программы?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Если канал не получил ответ, ему выставляется признак аппаратной недостоверности (атрибут 4, I).

Конкретный код ошибки можно получить через диагностическую переменную @e_MODBUS.
После использования этой информации с помощью канала, связанного с аналогичной переменной типа OUT, результат диагностики надо сбрасывать.
 
Posted by Алексей Шелепов (Участник № / Member № 6361) on :
 
Здравствуйте! Вопрос по поводу "Однократного" запроса канала. Возможно ли таким образом запускать
канал HEX32? Атрибут 3(СОСТОЯНИЕ) у него все время 0. Если не возможно, то подскажите как считать по запросу число в формате UDINT.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
В стандарте Modbus нет команд для считывания чисел формата UDINT.
Надо либо считывать отдельно 2 слова в 2 канала, а затем в программе формировать из этих слов число формата UDINT, либо использовать канал ChGroupReq с подключением к переменной R_FIFO_Queue (см. описание канала ChGroupReq).
 
Posted by Алексей Шелепов (Участник № / Member № 6361) on :
 
Спасибо за ответ. Именно так программа и работает: из двух слов с Modbus'а формируется слово UDINT. В дальнейшем UDINT необходимо ПО ЗАПРОСУ записывать в два разных канала HEX32.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Непонятно, почему результат надо записывать в 2 разных канала.
И чем "запрос на запись в канал HEX32@ отличается от запроса по Modbus?
 
Posted by Алексей Шелепов (Участник № / Member № 6361) on :
 
В сообщении от 21.06 этого топика я описывал ситуацию:"В сети по Modbus RTU несколько двухканальных весоизмерительных приборов.
Активен только один канал каждого прибора". Так вот, по Вашей подсказке,написана программа последовательных запросов:
1.Записывается в прибор номер активного канала W_WORD(16);
2.Проверяется корректность записи, чтением номера кан. и сравнением в программе;
3.Производиться чтение веса (тип данных float)активного канала "однократным" запросом путем сброса атр.3 первого канала Float.
4.Контролируя атр.3 канала Float переходим к обработке 2 канала прибора и запись во второй канал Float.
Теперь появилась необходимость считывать другой параметр прибора - код нуля. Также из активного канала. Его формат UDINT. Считывается он двумя W_WORD и складывается программно в дв. слово. Далее по вышеизложенному алгоритму нужно это дв. слово записать по запросу в первый HEX32(акт. 1 канал), а затем во второй (акт. 2 канал).
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Понятно.
Весьма последовательно и логично.
 
Posted by Алексей Шелепов (Участник № / Member № 6361) on :
 
Уже хорошо что понятно. Теперь дальше. Канал HEX32 как канал Float "однократно" не работает. Объясните
последовательно и логично как считать данные UDINT по запросу.
 
Posted by Алексей Шелепов (Участник № / Member № 6361) on :
 
Спасибо за понимание и логичность. Отвечать не надо. Реализовали программно.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Считывать Modbus-слова надо каналами HEX16, а вычисленный результат записывать в каналы HEX32.

Учитывая необходимость строго одновременного считывания двух слов одного UDINT-числа, связка из двух каналов, запрашивающих с периодом ОДНОКРАТНО, корректно функционировать не будет.

Возьмите 1 канал CALL.ChGroupReq с двумя аргументами UDINT и циклом обработки ОДНОКРАТНО.
Залинкуйте его на первый из двух считываемых регистров.
Тогда при каждом цикле опроса в двух аргументах канала CALL.ChGroupReq Вы получите 2 последовательных слова из необходимого UDINT-числа.
Обработайте эти аргументы программой и запишите в нужный канал HEX32.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Еще 1 вариант.
Возьмите "Источник" Rin_Float(4) или Rout_Float(3) и залинкуйте его на канал HEX32 с периодом "Однократно". В канале будет 32-разрядное целое число.
 
Posted by Алексей Шелепов (Участник № / Member № 6361) on :
 
Здравствуйте!
С чтением переменной по Modbus понятно, спасибо. Подскажите как аналогично производить запись переменной по запросу, контролировать исполнение
записи и в каком атрибуте считать ошибку записи.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Запись Modbus-переменной осуществляется каналом OUT, который отрабатывает функцию записи только в том случае, когда его значение меняется (с экрана или программно).
Поэтому для записи не надо принимать никаких мер специальных мер, запись всегда производится однократно при изменении значения канала.
Контролировать исполнение команды записи следует по атрибуту 4 (Достоверность) канала связи с Modbus-переменной.
 
Posted by Алексей Шелепов (Участник № / Member № 6361) on :
 
Атрибут 4(достоверность) выставляется в случае ошибки запроса, а возможно ли считать окончание однократной записи?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Атрибут 39 (EXEC) взводится в "1", когда канал начинает отрабатывать свою функцию и автоматически сбрасывается в "0", когда функция выполнена.
 
Posted by Алексей Шелепов (Участник № / Member № 6361) on :
 
Спасибо, реализовали.
 
Posted by AVeshnik (Участник № / Member № 6661) on :
 
Здравствуйте! Есть такой вопрос: как проверять соединение прибора со скадой по модбас? Я пробовал параметр "Достоверность" компонента из "Каналы" присвоить аргументу под экраном, а потом этот аргумент перетаскивал объекту на экране. Потом задавал константу при которой истинно. По идее оно должно было менять цвет после исчезновения связи и потом при ее появлении. Но этого не происходит. Подскажите как сделать чтобы объект на экране сменял цвет при смене состояния связи. Спасибо.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Ответ по результатам присланного Вами проекта послан почтой.
Топик закрывается.
 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2