Переменная, содержащая код ошибки ModBus, @e_MODBUS сама не сбрасывается после того, как причина ошибки исчезает. 1) В документации сказано: "Как правило, посылка положительного значения в переменную типа OUTPUT обнуляет значение аналогичной переменной-счетчика типа INPUT." Протестировал - не обнуляет, а в переменную записывается переданное положительное значение. И то - не всегда. Как, все-таки, сбросить код ошибки? 2) Что означает код ошибки 13? В документации ошибка с этим кодом никак не прокомментирована.
[ 01.11.2011, 12:18: Сообщение отредактировал / Message edited by AdAstra Technical Support ]
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
1. "Как правило, ... переменной-счетчика ..." В данном случае диагностическая переменная - не "переменная-счетчик". Обнуление происходит только при подаче "0". Однако, обнуление происходит, только если ошибочная ситуация устранена. В данном случае, видимо, код ошибки постоянно восстанавливается в процессе обмена.
2. Код ошибки "13" - ERR_RT_CODE (по нашей документации) означает, что получено сообщение об ошибке в кадре ответа от устройства. Для Modbus это может означать, например, ошибка адреса переменной или ошибка в функции обращения к указанной переменной. Соответствующему каналу обмена при этом выставляется признак аппаратной недостоверности. Для уточнения кода ошибки, возвращаемой устройством, надо прочитать возвращаемый кадр (например, с помощью перехватчика COM-порта или с помощью отладочных функций Trace Mode 6). Во втором случае можно поставить этому каналу обмена флажок "Отладка" и задать в файле конфигурирования запуска МРВ ключ DEBUG=2200. Тогда в протоколе профайлера будут сообщения об ошибках обмена с ответными кадрами. Расшифровка кадра ответа - в соответствии с описанием протокола Modbus (протокол открыт в интернете).
Posted by Dmitry G. (Участник № / Member № 5438) on :
1. Специально проверил - при подаче "0" обнуление не происходит. Значение диагностической переменной меняется только при подаче положительного числа. Код ошибки постоянно не восстанавливается, т.к. ошибку я создаю сам однократно в тестовых целях.
2. Хотелось бы, чтобы "ваша" документация попала и в "нашу" тоже.
3. Сегодня встретился с очередными неизвестными кодами ошибок @e_MODBUS - 777 и 778. Каков их смысл?
4. Если по ModBus через разные порты опрашивается несколько устройств, как определить, к какому из них относится код ошибки в переменной @e_MODBUS?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
1. Как любой другой канал OUT, канал, связанный с диагностической переменной @e_MODBUS_OUT, отрабатывает свою функцию только при изменении своего значения или при взведении в 1 атрибута EXEC (39). Если Вы уверены, что ошибка формируется только однократно и значение канала @e_MODBUS_OUT равно 0, пошлите 1 в его атрибут EXEC (39).
2. Текст ERR_RT_CODE и означает - "от устройства получен код ошибки".
3 и 4. Если Вы работаете в релизе 6.07.7, возвращаемый код ошибки состоит из двух байтов. 0-й байт содержит собственно код ошибки, а 1-й байт - логический номер COM-порта (0 для COM1, 1 для COM2 и т.д.). Т.о., 777 и 778 соотвутствуют кодам 9 и 10 по COM4. Номер устройства таким образом определить нельзя. Следует анализировать недостоверности каналов обмена.
Приносим извинения за неполноту описания.
Posted by Dmitry G. (Участник № / Member № 5438) on :
Спасибо!
Posted by Dmitry G. (Участник № / Member № 5438) on :
Уточните, пожалуйста, что имеется в виду под "каналом OUT, связанным с диагностической переменной @e_MODBUS_OUT"? Правильно ли я понимаю, что необходимо создать канал OUT любого типа и связать его с переменной @e_MODBUS_OUT? Я поступил таким образом, и для сброса переменной делаю следующее: записываю 0 в переменную @e_MODBUS_OUT и подаю 1 в атрибут EXEC связанного с ней канала. Однако это не приводит к обнулению диагностической переменной. Опишите, пожалуйста, пошагово процедуру сброса переменной @e_MODBUS
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
М.б., "записываю 0 атрибут ВХОД и подаю 1 в атрибут EXEC канала OUT, связанного с переменной @e_MODBUS_OUT"? Так сбрасывать методически правильно, если только код ошибки не восстанавливается из-за постоянного обмена с ошибкой.
Если не работает, присылайте Ваш проект на адрес техподдержки.
Posted by Dmitry G. (Участник № / Member № 5438) on :
Выслал проект на адрес hotline@adastra.ru
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Ответ дан по электронной почте.
Для сброса значения нужно было использовать любой числовой канал типа Out. Канал Call не является числовым каналом.
Posted by Dmitry G. (Участник № / Member № 5438) on :