Страница 1 из 1

Вывод отрицательного числа в поле вывода

СообщениеДобавлено: Ср май 15, 2019 3:03 pm
npp
Задача: Отобразить в СКАДЕ параметры прибора-анализатора питающей сети РПМ-416.

Проблема: В СКАДЕ (в текстовом поле вывода) неправильно отображается отрицательное число.

Реализация: СКАДА InTouch ME с прибором связывается с помощью драйвера MOTCP (ModBus TCP).

Скрины (проблемный тэг выделен красным):
tags.jpg
Тэги проекта
(469.8 КБ) Скачиваний: 0

drive.jpg
Тэги драйвера MOTCP (ModBus TCP)
(424.67 КБ) Скачиваний: 0

motcp.jpg
Описание драйвера MOTCP (ModBus TCP)
(495.29 КБ) Скачиваний: 0

int.jpg
Описание типа данных INT в InTouch ME
(166.19 КБ) Скачиваний: 0

Re: Вывод отрицательного числа в поле вывода

СообщениеДобавлено: Ср май 15, 2019 3:23 pm
npp
Нюансы:

1. Требуемый параметр (минимальное напряжение) имеет отрицательное значение. В приборе он хранится в 32битном регистре (по 16 бит в адресах 114 и 115).

2. Читаю параметр через драйвер ModBus TCP с атрибутом DWSW, что означает
32-bit Integer Value (Holding Register): Read and write 32-bit integer values using two consecutive Holding Registers with Word Swap
ПО-русски: 32-разрядное целочисленное значение (регистр хранения): считывание и запись 32-разрядных целочисленных значений с использованием двух последовательных регистров хранения с помощью Word Swap. (это обмен местами старшего и младшего слова).

3. Дополнительно читаю из прибора требуемый параметр не целиком, а пословно с атрибутом X4 (см. тэги WORD_High и WORD_Low) - содержимое выглядит вроде как и должно быть.

4. Так почему 32-битное число тэга RPM_CH1_UMIN отображается в поле вывода без учёта знака "минус", который определяется крайним битом старшего слова?

5. Если тэг RPM_CH1_UMIN объявить типом "ВЕЩЕСТВЕННЫЙ" (64 бита), а не "ЦЕЛОЕ" (32 бита) то в поле вывода мы увидим нормальное такое 64-битное значение 4 294 967 295, которое говорит о том, что крайний бит старшего слова равен таки "1", что свидетельствует об отрицательном значении 32-битного числа.

Re: Вывод отрицательного числа в поле вывода

СообщениеДобавлено: Ср май 15, 2019 4:28 pm
Генератор зла
IF RPM_CH1_UMIN >32766 THEN RPM_CH1_UMIN = ((RPM_CH1_UMIN - 65534) + 1); ENDIF;

Re: Вывод отрицательного числа в поле вывода

СообщениеДобавлено: Ср май 15, 2019 5:43 pm
npp
О, благодарю, я это понимаю, только у нас не FFFE(h), а FFFF FFFE(h). 32 бита же.

Я не про это хотел спросить, а где у Интача МЕ галочка "Отобразить правильно отрицательное число"?
А главный вопрос - почему InTouch МЕ не отображает так, как это должно быть по логике?

Вот лежит в тэге типа INTEGER (читай выделенной памяти) Интача 32-битное отрицательное число, записанное туда драйвером связи. Лежит правильно с точки зрения документации и стандартов типов данных.

Почему поле выводит число в формате UInt, хотя тип тэга явно указан Int?

Либо я что-то не так понимаю, либо где-то есть соответствующая настройка поля, либо это баг Интача.

Прошу разъяснить по возможности, мне как новичку важно услышать, что это особенность ПО, чтобы не искать другие пути решения.

Если других решений нет, то подскажите, куда именно вписать скрипт преобразования, чтобы он работал непрерывно для постоянного отображения значения на экране СКАДы. :roll:

Re: Вывод отрицательного числа в поле вывода

СообщениеДобавлено: Ср май 15, 2019 6:04 pm
Генератор зла
npp писал(а):О, благодарю, я это понимаю, только у нас не FFFE(h), а FFFF FFFE(h). 32 бита же.

Ну, можно добавить ещё оператор AND 0000FFFFh
npp писал(а):Я не про это хотел спросить, а где у Интача МЕ галочка "Отобразить правильно отрицательное число"?

Нет в InTouch ME такой кнопки
npp писал(а):А главный вопрос - почему InTouch МЕ не отображает так, как это должно быть по логике?

Сперва необходимо разобраться, чей косяк: сервера в/в или InTouch ME. М.б. InTouch ME уже получает число в формате Unsigned Int ?
npp писал(а):Если других решений нет, то подскажите, куда именно вписать скрипт преобразования, чтобы он работал непрерывно для постоянного отображения значения на экране СКАДы.

Tasks - Math worksheet
Tasks - Scheduler worksheet

Re: Вывод отрицательного числа в поле вывода

СообщениеДобавлено: Ср май 15, 2019 7:18 pm
npp
Сперва необходимо разобраться, чей косяк: сервера в/в или InTouch ME. М.б. InTouch ME уже получает число в формате Unsigned Int ?


Что значит "получает число в формате"? Получает только число, а формат числа определяет сам InTouch ME (точнее я задаю формат в свойствах тэга), что должно определять дальнейшее поведение математики InTouch ME - учитывать знак или нет в своих расчётах, показывать минус в окне или нет.

А вдруг драйвер ModBus TCP тайно меняет атрибут тэга RPM_CH1_UMIN с Int на UInt, хотя явно у InTouch ME типа Uint нету. Что вообще здесь происходит? :cry:
Это тупик.