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

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

Автор Тема: Обработка типа данных SmallInt  (Прочитано 4203 раз)

Rindzin

  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
Обработка типа данных SmallInt
« : 09 Февраля 2022, 14:52:31 »
Добрый день,

в поле ввода отрицательные значения с типом данных SmallInt выводятся как числа больше 32768

https://disk.yandex.ru/i/bUkdoUJNRwu8iQ
« Изменён: 14 Февраля 2022, 09:43:30 от Simple-Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1407
    • Просмотр профиля
Re: Обработка типа данных SmallInt
« Ответ #1 : 09 Февраля 2022, 15:27:33 »
Здравствуйте.

Какая переменная используется, внутренняя или внешняя? Если внешняя, то какой тип данных у переменной на контроллере? Какой тип выбран у неё же в скаде? Как выполняете запись в скаде? Через ввод в поле или через скрипты? Используется ли смещение запятой, или визуальная шкала? Какую версию скады используете? Пришлите для проверки текущую версию проекта(..\Simple-Scada 2\Projects) на support@simple-scada.com.
« Изменён: 14 Февраля 2022, 09:43:36 от Simple-Scada »

Rindzin

  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
Re: Обработка типа данных SmallInt
« Ответ #2 : 14 Февраля 2022, 07:35:55 »
Переменная внешняя. Контроллер Овен 232М. Данные считываются через Owen OPC Server. В скаде, как я уже написал, SmallInt. В поле ввода выводится через связь с переменной. Без смещений запятой, без шкалы, без скриптов.
https://disk.yandex.ru/d/zTpXE33o3dW6vQ - проект
https://disk.yandex.ru/i/G7HkleA_eTWTpQ - описание переменной в opc сервере, используется стандартный шаблон для контроллера из программы
« Изменён: 14 Февраля 2022, 09:43:42 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Обработка типа данных SmallInt
« Ответ #3 : 14 Февраля 2022, 09:43:09 »
У Вас на OPC-сервере тип данных у переменной задан Word. Это число от 0 до 65535. Зачем в скаде выбран SmallInt? Скада никак не сможет переопределить переменную в OPC-сервере. Приведите типы данных в соответствие и меняйте значение в диапазоне от 0 до 65535, как требует тип данных.

Rindzin

  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
Re: Обработка типа данных SmallInt
« Ответ #4 : 14 Февраля 2022, 10:00:21 »
Если я выбираю тип данных Int16, то получаю такую картину
https://disk.yandex.ru/i/MkWLAwm18MxXfQ
Значения переменной в контроллере могут быть отрицательными, это температура воздуха. Сам контроллер на экране показывает верные значения -10, -15, -25

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1407
    • Просмотр профиля
Re: Обработка типа данных SmallInt
« Ответ #5 : 14 Февраля 2022, 12:15:45 »
Не нужно наугад менять типы данных в скаде и на OPC-сервере. Для начала разберитесь с настройками переменной на OPC-сервере. Посмотрите, какой тип данных переменная имеет в ПЛК и укажите этот тип данных(или соответствующий ему) у переменной на OPC-сервере. Убедитесь, что на самом OPC-сервере переменная имеет корректное значение. После этого, импортируйте переменную в редактор переменных, либо вручную установите у нее тип данных соответствующий типу данных установленному на OPC-сервере.

Rindzin

  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
Re: Обработка типа данных SmallInt
« Ответ #6 : 14 Февраля 2022, 12:51:07 »
Посмотрите, какой тип данных переменная имеет в ПЛК
Извиняюсь, что начал разбираться в проблеме с обратной стороны, Вы абсолютно правы. Из манула:
** При отрицательных числах выводится положительно число, которое больше 32768. Для
чтения и записи отрицательных чисел используется формула: Y = 32768 + |X|.
Тип данных действительно Word. Не знаю зачем так сделано.

Правильно я понимаю, что для обработки этих значений не нужно связывать переменную с сервера с полем ввода? Либо выводить значение через скрипт, либо создать внутреннюю переменную связанную с полем и менять ее значение по формуле?

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1407
    • Просмотр профиля
Re: Обработка типа данных SmallInt
« Ответ #7 : 14 Февраля 2022, 20:54:17 »
Самым простым и правильным способом будет привести переменную к необходимому типу на ПЛК и использовать в скаде готовую переменную без преобразований. В ином случае, можно создать внутреннюю переменную, в которую будет записываться результат вычислений. Затем создать скрипт по событию "Изменились переменные", добавить в список скрипта исходную переменную, произвести необходимые расчеты и записать результат во внутреннюю переменную. Например:
Код: (delphi)
var
  aVar: TM_Variable;
begin
  aVar := GetVariableByName(Variable.Name + '_Calc'); // ищем внутреннюю переменную
  if (aVar <> nil) and (Variable.AsInt >= 32768) then // если значение исходной переменной >= 32768, то
    aVar.Value := 32768 - Variable.AsInt              // записываем во внутреннюю расчитанное значение
  else                                                // иначе
    aVar.Value := Variable.AsInt;                     // записываем во внутреннюю значение внешней переменной
end.
Это универсальный скрипт, в список которого можно добавить нужные переменные значения которых требуется рассчитывать. Для каждой такой переменной нужно создать внутреннюю переменную с тем же именем + приставка. В примере используется приставка "_Calc". К примеру, исходная переменная имеет имя "MyVar", а внутренняя имеет имя "MyVar_Calc" и т.д.
« Изменён: 14 Февраля 2022, 21:02:10 от Simple_Scada »

Rindzin

  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
Re: Обработка типа данных SmallInt
« Ответ #8 : 15 Февраля 2022, 09:38:36 »
ТРМ 232 готовое решение "из коробки", поэтому исходников нет и поменять что-то нельзя.
В любом случае спасибо за ответы, проблема решена

AndrewNA

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Обработка типа данных SmallInt
« Ответ #9 : 25 Апреля 2026, 16:45:26 »
Переспрошу про возможность преобразования переменной с OPC со знаком минус в положительную (отображает значение как и на оборудовании), только через скрипт?



Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 288
    • Просмотр профиля
    • Simple-Scada
Re: Обработка типа данных SmallInt
« Ответ #10 : 27 Апреля 2026, 16:48:23 »
Здравствуйте.

Если переменная на ПЛК/устройстве может принимать только отрицательные значения, например от 0 до -100, то у переменной можно задать шкалу от 0 до -100, а визуальную шкалу в режиме масштабирования установить 0-100. Тогда значения переменной будут автоматически преобразовываться из шкалы 0 .. -100 в шкалу 0 .. 100.