Форум TRACE MODE: техническая поддержка
Тема закрыта / Topic Closed  Тема закрыта / Topic Closed
Послать новую тему / Post New Topic  
Тема закрыта / Topic Closed  Тема закрыта / Topic Closed
мой профиль / my profile авторизация / login | регистрация / register | поиск / search | часто задаваемые вопросы / faq | начало / forum home

  Следующая старая тема / next oldest topic   Следующая новая тема / next newest topic
» Форум TRACE MODE: техническая поддержка » ТЕХНИЧЕСКАЯ ПОДДЕРЖКА / TECHNICAL SUPPORT TRACE MODE 6 » Редактор проекта TRACE MODE 6 / » ModBus отрицательное значение

   
Автор / Author Тема / Topic: ModBus отрицательное значение
orisil
Forum Member / Участник форума
Участник № / Member № 1377


Icon 1 отправлено / posted      Профиль для / Profile for orisil           Редактировать/удалить сообщение / Edit/Delete Post 
Есть прибор МТР 8-15 фирмы "МИКРОЛ"
Необходимо отобразить отрицательное значение на экране. Связь построена в таком порядке: "Источники/приемники->ModBus->RoutWord(3)---->канал Float---->Аргумент экрана (тип даных INT)----> ГЭ "Текст" формат отображения даных Generic.
Вместо отрицательных значений - 65357, 65356 и т.д. В руководстве написано "INT (short) – целое со знаком размерностью 2 байта (-32768 ... 32767)"

Сообщения / Posts 47 | Из / From: Украина  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Administrator
Участник № / Member № 4


Icon 1 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
В Modbus не отрицательных чисел.
Их интепретация - функция пользователя.
Канал Float превращает 16-битовое число в ЦЕЛОЕ_БЕЗ_ЗНАКА.
Надо, видимо, использовать канал HEX16, который оба байта в чистом виде передаст в аргумент INT экрана.

Сообщения / Posts 17106 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
orisil
Forum Member / Участник форума
Участник № / Member № 1377


Icon 1 отправлено / posted      Профиль для / Profile for orisil           Редактировать/удалить сообщение / Edit/Delete Post 
Использовал HEX16. Ничего не меняется вместо -1 значение 65536. Может еще какие варианты кто подскажет?
Контроллер выдает при положительных значениях измеряемой величины числа от 0000Н до 7FFFH, а при отрицательных значениях от FFFFH до 8000H (как повсеместно принято). Но, к сожалению, Trace Mode не может перевести это отрицательное значение в 16-ричной форме в соответствующее десятичное число. К примеру, при считывании с контроллера числа FFFBH (что соответствует -5), на экран выводится значение 65531. Как быть?

Сообщения / Posts 47 | Из / From: Украина  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Romсheg
unregistered



Icon 1 отправлено / posted            Редактировать/удалить сообщение / Edit/Delete Post 
AdAstra Technical Support: "В Modbus нет отрицательных чисел." А вы в курсе, что вообще в цифровой технике, коей являются все вычислительные устройства, вообще понятие отрицательного числа нет? [Усмешка / Big Grin] И именно поэтому во всем мире принят единый стандарт представления таких чисел, который ТМ6 почему-то упорно отрицает, утверждая что так не бывает, не бывает, потому что мы так захотели. Может все же перестанем отрицать очевидное и примем это как проблему, а не как частный случай? Ведь он не единичен. [Пдмигивание / Wink]

2orisil: Я сам в недавнем проекте с таким столкнулся. Вывернуться пришлось так: написал алгоритм, который анализирует диапазон входного значения канала, и если он зашкаливает за пределы 32768 - делаю простое вычитание из этого значения 65536, получается вполне приемлемый отрицательный результат. Вешаете этот алгоритм на Трансляцию всех каналов, которые у вас по Модбасу могут отрицательные значения считывать.
По сути придется сделать руками аналог того, что ТМ6 должен делать при преобразовании типов.

IP / IP: IP адрес / IP address | Report this post to a Moderator
orisil
Forum Member / Участник форума
Участник № / Member № 1377


Icon 1 отправлено / posted      Профиль для / Profile for orisil           Редактировать/удалить сообщение / Edit/Delete Post 
2Romcheg: Дело в том, что над алгоритмом я тоже думал. В самом алгоритме ничего сложного, но... Количество каналов ключа исполнительного модуля на пределе, а в ситуации с алгоритмом количество каналов удваивается, то-есть для программы нужен канал связанный с источником-приемником и канал с уже обработаным выходным значением
Сообщения / Posts 47 | Из / From: Украина  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Administrator
Участник № / Member № 4


Icon 1 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
Самое простое средство - считать значение канала HEX16 на экран через аргумент INT и в ГЭ "Текст" задать формат представления %hd.
Сообщения / Posts 17106 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
A40
unregistered



Icon 1 отправлено / posted            Редактировать/удалить сообщение / Edit/Delete Post 
quote:
Отправитель / Originally posted by orisil:
то-есть для программы нужен канал связанный с источником-приемником и канал с уже обработаным выходным значением

Не нужен. Используйте свойство "вызов" числового канала, связанного с источником данных.
IP / IP: IP адрес / IP address | Report this post to a Moderator
Romсheg
unregistered



Icon 1 отправлено / posted            Редактировать/удалить сообщение / Edit/Delete Post 
2orisil: Дело как раз в том, что не надо канала дополнительного под алгоритм - алгоритм вешаете на Трансляцию того канала, что с источником/приемником связан. Посмотрите хэлп на предмет, что такое "Трансляция" - тогда станет понятно о чем я.

2AdAstra Technical Support: Это решение - "костыль" ТОЛЬКО для отображения на экране. Но вообще-то системы АСУ не только циферки на экране показывают, они еще и в алгоритмах их используют. [Пдмигивание / Wink]

IP / IP: IP адрес / IP address | Report this post to a Moderator
orisil
Forum Member / Участник форума
Участник № / Member № 1377


Icon 1 отправлено / posted      Профиль для / Profile for orisil           Редактировать/удалить сообщение / Edit/Delete Post 
Спасибо AdAdstra за "считать значение канала HEX16 на экран через аргумент INT и в ГЭ "Текст" задать формат представления %hd." Как быть с ГЭ "Тренд", ведь там HEX16 отображается не совсем корректно и формат представления %hd не работает. Почему в "СПРАВКЕ" нет такого формата отбражения?

2Romcheg: в моем случае значения не нуждаются в програмной обработке. Только отбражение и архивирование в трендах. За "Трансляцию" отдельное СПАСИБО!!! удастся сильно сэкономить на каналах в других алгоритмах обработки.

Сообщения / Posts 47 | Из / From: Украина  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Romсheg
unregistered



Icon 1 отправлено / posted            Редактировать/удалить сообщение / Edit/Delete Post 
2orisil: только учтите, что Трансляция "рвет" канал пополам, то есть - если у вас алгоритм не обеспечивает прямую или логическую связь атрибута Реальное и Аппаратное, то значение в канале с Трансляцией дальше Аппаратное (для канала Input и Реальное для Output) никуда не уйдет. Учитывайте это, если будете использовать Трансляцию канала для программ, которые к этому каналу отношения не имеют. [Улыбка / Smile]
IP / IP: IP адрес / IP address | Report this post to a Moderator
orisil
Forum Member / Участник форума
Участник № / Member № 1377


Icon 1 отправлено / posted      Профиль для / Profile for orisil           Редактировать/удалить сообщение / Edit/Delete Post 
Создал алгоритм по рекомендации Romcheg. В профайлере меню "компоненты" - все как положено (к примеру [001] 65493 A соответствует [000] -43 R. Реальное значение канала привязано через аргумент INT к ГЭ "Текст" и к ГЭ "Тренд". "Тренд" отобржает "65493" всегда. "Текст" отображает "-43" только если задать формат отображения %hd. Вовсех остальных случаях ничего не поменялось - "65493..."
Сообщения / Posts 47 | Из / From: Украина  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Administrator
Участник № / Member № 4


Icon 1 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
Предложенный алгоритм будет адекватен только в канале FLOAT.
Сообщения / Posts 17106 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Romсheg
unregistered



Icon 1 отправлено / posted            Редактировать/удалить сообщение / Edit/Delete Post 
2AdAstra Technical Support: А вот такое надо в базу ошибок заносить, если аргументу указан явный тип данных со знаком (INT - это знаковый тип), то там хоть HEX16 канал будь на входе с отрицательным значением в виде 0xFFFF на экране это должно быть везде отрицательным значением. Иначе преобразование типов в системе, откровенно говоря - глючит. [Пдмигивание / Wink] Иначе какой тогда смысл в типах аргументах: INT, UINT, DINT, UDINT и прочих?
Это во-первых. А во-вторых - системе давно уже нужны улучшения по каналам типа HEX - нужен флаг является ли значение отрицательным или беззнаковым. Если целочисленные НЕХ16 еще можно FLOAT-каналом заменить, то для HEX32 - это уже не пройдет никак.

IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Administrator
Участник № / Member № 4


Icon 1 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
Мы учтем Ваше замечание.
Сообщения / Posts 17106 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Технолог Петухов
Forum Member / Участник форума
Участник № / Member № 4283


Icon 1 отправлено / posted      Профиль для / Profile for Технолог Петухов           Редактировать/удалить сообщение / Edit/Delete Post 
..можно я тут близко к теме спрошу..

Вот запрашиваю RinWord(4) подряд 6 штук.
Уходит запрос типа "прислать с 0-го адреса 6 регистров".
Если ответ от девайса приходит , то всё нормально.

Если устройство НЕ отвечает, кроме вышеописанного запроса начинают уходить последовательно:
"прислать с 1-го адреса 5 регистров"
"прислать с 2-го адреса 4 регистров"
... и т.д. до
"прислать с 5-го адреса 1 регистр"

Спрашивается- это нормально ? Как-то можно управлять этим размножением запросов?

Сообщения / Posts 37 | Из / From: РФ  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Administrator
Участник № / Member № 4


Icon 1 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post 
От темы топика это очень далеко.
Да, такая ситуация является типичной для драйверов, формирующих групповые запросы через числовые каналы.
Чтобы этого избежать, формируйте групповы запросы Modbus с помощью каналов CALL.ChGroupReq, привязанных к переменной Modbus с начальным адресом группы.

Топик закрываю.

Сообщения / Posts 17106 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
   

Послать новую тему / Post New Topic  
Тема закрыта / Topic Closed  Тема закрыта / Topic Closed
Открыть тему / Open Topic   Feature Topic   Переместить топик / Move Topic   Удалить топик / Delete Topic Следующая старая тема / next oldest topic   Следующая новая тема / next newest topic
 - Printer-friendly view of this topic
Перейти к / Hop To


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



Powered by Infopop Corporation
UBB.classic™ 6.7.2