Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: OlegM от 17 Января 2025, 12:01:44

Название: Шкала позволяет вводить число, которое выходит за диапазон типа данных
Отправлено: OlegM от 17 Января 2025, 12:01:44
Добрый день.
1. Создал внутреннюю переменную Byte [0…255].
2. Выбрал для нее шкалу с диапазоном [0…65535]. Теперь диапазон шкалы больше чем диапазон типа данных.
3. Привязывал эту переменную к полю ввода.

Почему я могу ввести в поле ввода любое число из диапазона шкалы от 0 до 65535 (например 65000),
когда указанный тип данных Byte может принимать лишь значение 255 ?
Название: Re: Шкала позволяет вводить число, которое выходит за диапазон типа данных
Отправлено: Simple-Scada от 17 Января 2025, 12:21:01
Здравствуйте.

Допустимый диапазон определяется не типом данных, а шкалой и сдвигом запятой/визуальной шкалой (https://simple-scada.com/help/manual/varextra.html). Практически во всех известных нам проектах, весь диапазон типа данных не используется. Например, заданное значения для контроля уровня жидкости в резервуаре может передаваться в скаду как Integer (целое от -2147483648 до 2147483647). Но реально используемый диапазон 0-100%. Поэтому переменной можно назначить шкалу 0 - 100% и пользователь не сможет задать некорректное значение, например -9999.
Для отображения трендов также используются параметры шкалы и сдвига запятой/визуальной шкалы (https://simple-scada.com/help/manual/varextra.html), а не диапазон типа данных.
Название: Re: Шкала позволяет вводить число, которое выходит за диапазон типа данных
Отправлено: Timothy Clement от 17 Января 2025, 13:25:25
Добрый день, тут интересно другое. Тип данных подразумевает выделение памяти программой, как в таком случае не происходит ошибки переполнения памяти? Поправьте если не прав
Название: Re: Шкала позволяет вводить число, которое выходит за диапазон типа данных
Отправлено: OlegM от 17 Января 2025, 14:36:42
Допустимый диапазон определяется не типом данных, а шкалой и сдвигом запятой/визуальной шкалой (https://simple-scada.com/help/manual/varextra.html). Практически во всех известных нам проектах, весь диапазон типа данных не используется...
Вы отвечаете про ситуацию, которая наоборот от описанной мной: диапазон типа данных включает в себя диапазон шкалы (т.е., используя шкалу мы сужаем перечень возможных значений, который нам предоставляет тип данных). Это хорошо, это есть в вашей документации.
Я же спрашиваю про ситуацию, когда диапазон, предоставляемый типом данных меньше (является лишь частью) диапазона шкалы: шкала включает в себя диапазон типа данных.

Как получается так, что я могу задать в поле для типа данных Byte число, которое выходит за его диапазон?
Тип данных отвечает за размер выделяемой под переменную памяти и максимальное число, которое может попасть в Byte -- это 255.
Я же могу, изменив шкалу, задать, например, 65500 для переменной типа Byte.

Такое странное поведение я заметил для внутренних переменных.
Спасибо  :)
Название: Re: Шкала позволяет вводить число, которое выходит за диапазон типа данных
Отправлено: Simple-Scada от 17 Января 2025, 15:54:06
Цитировать
Тип данных подразумевает выделение памяти программой, как в таком случае не происходит ошибки переполнения памяти? Поправьте если не прав
Переполнения никогда не произойдет. Скада никогда не запишет во внешнюю переменную больше данных, чем выделено под эту переменную на OPC-сервере (независимо от типа данных выбранного скаде). Внутренние переменные имеют тип Variant (http://www.delphibasics.ru/Variant.php), поэтому в них можно записать любое значение, которое позволяет Variant.

Цитировать
Вы отвечаете про ситуацию, которая наоборот от описанной мной
Мы отвечаем на Ваш вопрос: "почему я могу ввести в поле ввода любое число из диапазона шкалы от 0 до 65535 (например 65000),
когда указанный тип данных Byte может принимать лишь значение 255?"
. Ответ: потому что Вы задали шкалу 0..65535, а допустимый диапазон определяется именно шкалой, как мы писали выше.

Цитировать
Такое странное поведение я заметил для внутренних переменных.
Все внутренние переменные имеют тип Variant (http://www.delphibasics.ru/Variant.php) и тип выбранный в окне редактирования переменных для них несущественен при выполнении присвоений. Если Вам нужна строго типизированная переменная (например, для работы в скриптах), то её можно объявить в коде скрипта:
Код: (delphi)
var
  B: Byte;
begin
  ...