Алексей Шелепов
Forum Member / Участник форума
Участник № / Member № 6361
отправлено / posted
Здравствуйте! В сети по Modbus RTU несколько двухканальных весоизмерительных приборов. Активен только один канал каждого прибора. Написана программа, которая при помощи блока IMP поочередно записывет в прибор номер активного канала (код АЦП) и считывает текущий вес с задержкой его в аргументе блоком DEL. Минус всего этого, что в процессе работы происходит перескок отображаемого веса из первого канала во второй и наооборот. Вопрос: возможно ли организовать последовательный опрос каналов в приборе, т.е. записали номер АЦП - считали вес - по флагу окончания чтения к следующему каналу, затем следующий прибор?
Сообщения / Posts 49 | Из / From: РФ
| IP / IP: IP адрес / IP address |
Алексей Шелепов
Forum Member / Участник форума
Участник № / Member № 6361
отправлено / posted
Уважаемая техподдержка! Ответьте,пожалуйста, на вопрос, т.к. мы находимся на стадии сдачи объекта и время играет не на нас!
Сообщения / Posts 49 | Из / From: РФ
| IP / IP: IP адрес / IP address |
отправлено / posted
Надо писать пользовательскую программу, которая будет контролировать исполнение команд чтения и записи и реализовывать нужную последовательность. Учитывая асинхронность потока Modbus RTU по отношению к основному циклу пересчета базы каналов, надо контролировать именно факт исполнения запроса и команды. Для контроля исполнения запроса можно задать этому каналу цикл "Однократно" и запускать его сбросом атрибута 3 (СОСТОЯНИЕ). После получения корректного ответа канал будет автоматически выключен. Контролируя атрибут 3 можно установить факт завершения запроса. Контроль команды, исполняемой каналом OUT, необходимо считать из устройства реальный номер его активного канала.
Сообщения / Posts 17322 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Алексей Шелепов
Forum Member / Участник форума
Участник № / Member № 6361
отправлено / posted
Спасибо, все получилось. Но есть еще вопрос: если канал не получил ответ как можно определить ошибку запроса, чтобы продолжить последовательность выполнения программы?
Сообщения / Posts 49 | Из / From: РФ
| IP / IP: IP адрес / IP address |
отправлено / posted
Если канал не получил ответ, ему выставляется признак аппаратной недостоверности (атрибут 4, I).
Конкретный код ошибки можно получить через диагностическую переменную @e_MODBUS. После использования этой информации с помощью канала, связанного с аналогичной переменной типа OUT, результат диагностики надо сбрасывать.
Сообщения / Posts 17322 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Алексей Шелепов
Forum Member / Участник форума
Участник № / Member № 6361
отправлено / posted
Здравствуйте! Вопрос по поводу "Однократного" запроса канала. Возможно ли таким образом запускать канал HEX32? Атрибут 3(СОСТОЯНИЕ) у него все время 0. Если не возможно, то подскажите как считать по запросу число в формате UDINT.
Сообщения / Posts 49 | Из / From: РФ
| IP / IP: IP адрес / IP address |
отправлено / posted
В стандарте Modbus нет команд для считывания чисел формата UDINT. Надо либо считывать отдельно 2 слова в 2 канала, а затем в программе формировать из этих слов число формата UDINT, либо использовать канал ChGroupReq с подключением к переменной R_FIFO_Queue (см. описание канала ChGroupReq).
Сообщения / Posts 17322 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Алексей Шелепов
Forum Member / Участник форума
Участник № / Member № 6361
отправлено / posted
Спасибо за ответ. Именно так программа и работает: из двух слов с Modbus'а формируется слово UDINT. В дальнейшем UDINT необходимо ПО ЗАПРОСУ записывать в два разных канала HEX32.
Сообщения / Posts 49 | Из / From: РФ
| IP / IP: IP адрес / IP address |
отправлено / posted
Непонятно, почему результат надо записывать в 2 разных канала. И чем "запрос на запись в канал HEX32@ отличается от запроса по Modbus?
Сообщения / Posts 17322 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Алексей Шелепов
Forum Member / Участник форума
Участник № / Member № 6361
отправлено / posted
В сообщении от 21.06 этого топика я описывал ситуацию:"В сети по Modbus RTU несколько двухканальных весоизмерительных приборов. Активен только один канал каждого прибора". Так вот, по Вашей подсказке,написана программа последовательных запросов: 1.Записывается в прибор номер активного канала W_WORD(16); 2.Проверяется корректность записи, чтением номера кан. и сравнением в программе; 3.Производиться чтение веса (тип данных float)активного канала "однократным" запросом путем сброса атр.3 первого канала Float. 4.Контролируя атр.3 канала Float переходим к обработке 2 канала прибора и запись во второй канал Float. Теперь появилась необходимость считывать другой параметр прибора - код нуля. Также из активного канала. Его формат UDINT. Считывается он двумя W_WORD и складывается программно в дв. слово. Далее по вышеизложенному алгоритму нужно это дв. слово записать по запросу в первый HEX32(акт. 1 канал), а затем во второй (акт. 2 канал).
Сообщения / Posts 49 | Из / From: РФ
| IP / IP: IP адрес / IP address |
Алексей Шелепов
Forum Member / Участник форума
Участник № / Member № 6361
отправлено / posted
Уже хорошо что понятно. Теперь дальше. Канал HEX32 как канал Float "однократно" не работает. Объясните последовательно и логично как считать данные UDINT по запросу.
Сообщения / Posts 49 | Из / From: РФ
| IP / IP: IP адрес / IP address |
Алексей Шелепов
Forum Member / Участник форума
Участник № / Member № 6361
отправлено / posted
Спасибо за понимание и логичность. Отвечать не надо. Реализовали программно.
Сообщения / Posts 49 | Из / From: РФ
| IP / IP: IP адрес / IP address |
отправлено / posted
Считывать Modbus-слова надо каналами HEX16, а вычисленный результат записывать в каналы HEX32.
Учитывая необходимость строго одновременного считывания двух слов одного UDINT-числа, связка из двух каналов, запрашивающих с периодом ОДНОКРАТНО, корректно функционировать не будет.
Возьмите 1 канал CALL.ChGroupReq с двумя аргументами UDINT и циклом обработки ОДНОКРАТНО. Залинкуйте его на первый из двух считываемых регистров. Тогда при каждом цикле опроса в двух аргументах канала CALL.ChGroupReq Вы получите 2 последовательных слова из необходимого UDINT-числа. Обработайте эти аргументы программой и запишите в нужный канал HEX32.
Сообщения / Posts 17322 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
Еще 1 вариант. Возьмите "Источник" Rin_Float(4) или Rout_Float(3) и залинкуйте его на канал HEX32 с периодом "Однократно". В канале будет 32-разрядное целое число.
Сообщения / Posts 17322 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Алексей Шелепов
Forum Member / Участник форума
Участник № / Member № 6361
отправлено / posted
Здравствуйте! С чтением переменной по Modbus понятно, спасибо. Подскажите как аналогично производить запись переменной по запросу, контролировать исполнение записи и в каком атрибуте считать ошибку записи.
Сообщения / Posts 49 | Из / From: РФ
| IP / IP: IP адрес / IP address |
отправлено / posted
Запись Modbus-переменной осуществляется каналом OUT, который отрабатывает функцию записи только в том случае, когда его значение меняется (с экрана или программно). Поэтому для записи не надо принимать никаких мер специальных мер, запись всегда производится однократно при изменении значения канала. Контролировать исполнение команды записи следует по атрибуту 4 (Достоверность) канала связи с Modbus-переменной.
Сообщения / Posts 17322 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Алексей Шелепов
Forum Member / Участник форума
Участник № / Member № 6361
отправлено / posted
Атрибут 4(достоверность) выставляется в случае ошибки запроса, а возможно ли считать окончание однократной записи?
Сообщения / Posts 49 | Из / From: РФ
| IP / IP: IP адрес / IP address |
отправлено / posted
Атрибут 39 (EXEC) взводится в "1", когда канал начинает отрабатывать свою функцию и автоматически сбрасывается в "0", когда функция выполнена.
Сообщения / Posts 17322 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Алексей Шелепов
Forum Member / Участник форума
Участник № / Member № 6361
AVeshnik
Junior Member / Новичок
Участник № / Member № 6661
отправлено / posted
Здравствуйте! Есть такой вопрос: как проверять соединение прибора со скадой по модбас? Я пробовал параметр "Достоверность" компонента из "Каналы" присвоить аргументу под экраном, а потом этот аргумент перетаскивал объекту на экране. Потом задавал константу при которой истинно. По идее оно должно было менять цвет после исчезновения связи и потом при ее появлении. Но этого не происходит. Подскажите как сделать чтобы объект на экране сменял цвет при смене состояния связи. Спасибо.
Сообщения / Posts 4 | Из / From: Украина
| IP / IP: IP адрес / IP address |
отправлено / posted
Ответ по результатам присланного Вами проекта послан почтой. Топик закрывается.
Сообщения / Posts 17322 | Из / From: Россия
| IP / IP: IP адрес / IP address |