Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Шкала позволяет вводить число, которое выходит за диапазон типа данных  (Прочитано 6463 раз)

OlegM

  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Добрый день.
1. Создал внутреннюю переменную Byte [0…255].
2. Выбрал для нее шкалу с диапазоном [0…65535]. Теперь диапазон шкалы больше чем диапазон типа данных.
3. Привязывал эту переменную к полю ввода.

Почему я могу ввести в поле ввода любое число из диапазона шкалы от 0 до 65535 (например 65000),
когда указанный тип данных Byte может принимать лишь значение 255 ?
« Изменён: 17 Января 2025, 12:22:44 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Здравствуйте.

Допустимый диапазон определяется не типом данных, а шкалой и сдвигом запятой/визуальной шкалой. Практически во всех известных нам проектах, весь диапазон типа данных не используется. Например, заданное значения для контроля уровня жидкости в резервуаре может передаваться в скаду как Integer (целое от -2147483648 до 2147483647). Но реально используемый диапазон 0-100%. Поэтому переменной можно назначить шкалу 0 - 100% и пользователь не сможет задать некорректное значение, например -9999.
Для отображения трендов также используются параметры шкалы и сдвига запятой/визуальной шкалы, а не диапазон типа данных.

Timothy Clement

  • Постоялец
  • ***
  • Сообщений: 166
  • ОАО Борисовский завод "Металлист"
    • Просмотр профиля
    • Полымя
Добрый день, тут интересно другое. Тип данных подразумевает выделение памяти программой, как в таком случае не происходит ошибки переполнения памяти? Поправьте если не прав
« Изменён: 17 Января 2025, 15:12:02 от Simple-Scada »

OlegM

  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Допустимый диапазон определяется не типом данных, а шкалой и сдвигом запятой/визуальной шкалой. Практически во всех известных нам проектах, весь диапазон типа данных не используется...
Вы отвечаете про ситуацию, которая наоборот от описанной мной: диапазон типа данных включает в себя диапазон шкалы (т.е., используя шкалу мы сужаем перечень возможных значений, который нам предоставляет тип данных). Это хорошо, это есть в вашей документации.
Я же спрашиваю про ситуацию, когда диапазон, предоставляемый типом данных меньше (является лишь частью) диапазона шкалы: шкала включает в себя диапазон типа данных.

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

Такое странное поведение я заметил для внутренних переменных.
Спасибо  :)
« Изменён: 17 Января 2025, 15:12:23 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Цитировать
Тип данных подразумевает выделение памяти программой, как в таком случае не происходит ошибки переполнения памяти? Поправьте если не прав
Переполнения никогда не произойдет. Скада никогда не запишет во внешнюю переменную больше данных, чем выделено под эту переменную на OPC-сервере (независимо от типа данных выбранного скаде). Внутренние переменные имеют тип Variant, поэтому в них можно записать любое значение, которое позволяет Variant.

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

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