Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: Rindzin от 09 Февраля 2022, 14:52:31

Название: Обработка типа данных SmallInt
Отправлено: Rindzin от 09 Февраля 2022, 14:52:31
Добрый день,

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

https://disk.yandex.ru/i/bUkdoUJNRwu8iQ (https://disk.yandex.ru/i/bUkdoUJNRwu8iQ)
Название: Re: Обработка типа данных SmallInt
Отправлено: Simple_Scada от 09 Февраля 2022, 15:27:33
Здравствуйте.

Какая переменная используется, внутренняя или внешняя? Если внешняя, то какой тип данных у переменной на контроллере? Какой тип выбран у неё же в скаде? Как выполняете запись в скаде? Через ввод в поле или через скрипты? Используется ли смещение запятой, или визуальная шкала? Какую версию скады используете? Пришлите для проверки текущую версию проекта(..\Simple-Scada 2\Projects) на support@simple-scada.com.
Название: Re: Обработка типа данных SmallInt
Отправлено: Rindzin от 14 Февраля 2022, 07:35:55
Переменная внешняя. Контроллер Овен 232М. Данные считываются через Owen OPC Server. В скаде, как я уже написал, SmallInt. В поле ввода выводится через связь с переменной. Без смещений запятой, без шкалы, без скриптов.
https://disk.yandex.ru/d/zTpXE33o3dW6vQ (https://disk.yandex.ru/d/zTpXE33o3dW6vQ) - проект
https://disk.yandex.ru/i/G7HkleA_eTWTpQ (https://disk.yandex.ru/i/G7HkleA_eTWTpQ) - описание переменной в opc сервере, используется стандартный шаблон для контроллера из программы
Название: Re: Обработка типа данных SmallInt
Отправлено: Simple-Scada от 14 Февраля 2022, 09:43:09
У Вас на OPC-сервере тип данных у переменной задан Word. Это число от 0 до 65535. Зачем в скаде выбран SmallInt? Скада никак не сможет переопределить переменную в OPC-сервере. Приведите типы данных в соответствие и меняйте значение в диапазоне от 0 до 65535, как требует тип данных.
Название: Re: Обработка типа данных SmallInt
Отправлено: Rindzin от 14 Февраля 2022, 10:00:21
Если я выбираю тип данных Int16, то получаю такую картину
https://disk.yandex.ru/i/MkWLAwm18MxXfQ (https://disk.yandex.ru/i/MkWLAwm18MxXfQ)
Значения переменной в контроллере могут быть отрицательными, это температура воздуха. Сам контроллер на экране показывает верные значения -10, -15, -25
Название: Re: Обработка типа данных SmallInt
Отправлено: Simple_Scada от 14 Февраля 2022, 12:15:45
Не нужно наугад менять типы данных в скаде и на OPC-сервере. Для начала разберитесь с настройками переменной на OPC-сервере. Посмотрите, какой тип данных переменная имеет в ПЛК и укажите этот тип данных(или соответствующий ему) у переменной на OPC-сервере. Убедитесь, что на самом OPC-сервере переменная имеет корректное значение. После этого, импортируйте переменную (https://simple-scada.com/help/manual/variable-import-opc.html) в редактор переменных, либо вручную установите у нее тип данных (https://simple-scada.com/help/manual/data-types.html) соответствующий типу данных установленному на OPC-сервере.
Название: Re: Обработка типа данных SmallInt
Отправлено: Rindzin от 14 Февраля 2022, 12:51:07
Посмотрите, какой тип данных переменная имеет в ПЛК
Извиняюсь, что начал разбираться в проблеме с обратной стороны, Вы абсолютно правы. Из манула:
** При отрицательных числах выводится положительно число, которое больше 32768. Для
чтения и записи отрицательных чисел используется формула: Y = 32768 + |X|.
Тип данных действительно Word. Не знаю зачем так сделано.

Правильно я понимаю, что для обработки этих значений не нужно связывать переменную с сервера с полем ввода? Либо выводить значение через скрипт, либо создать внутреннюю переменную связанную с полем и менять ее значение по формуле?
Название: Re: Обработка типа данных SmallInt
Отправлено: Simple_Scada от 14 Февраля 2022, 20:54:17
Самым простым и правильным способом будет привести переменную к необходимому типу на ПЛК и использовать в скаде готовую переменную без преобразований. В ином случае, можно создать внутреннюю переменную, в которую будет записываться результат вычислений. Затем создать скрипт по событию "Изменились переменные (https://simple-scada.com/help/script/changemulvar.html)", добавить в список скрипта исходную переменную, произвести необходимые расчеты и записать результат во внутреннюю переменную. Например:
Код: (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" и т.д.
Название: Re: Обработка типа данных SmallInt
Отправлено: Rindzin от 15 Февраля 2022, 09:38:36
ТРМ 232 готовое решение "из коробки", поэтому исходников нет и поменять что-то нельзя.
В любом случае спасибо за ответы, проблема решена
Название: Re: Обработка типа данных SmallInt
Отправлено: AndrewNA от 25 Апреля 2026, 16:45:26
Переспрошу про возможность преобразования переменной с OPC со знаком минус в положительную (отображает значение как и на оборудовании), только через скрипт?


Название: Re: Обработка типа данных SmallInt
Отправлено: Simple Scada от 27 Апреля 2026, 16:48:23
Здравствуйте.

Если переменная на ПЛК/устройстве может принимать только отрицательные значения, например от 0 до -100, то у переменной можно задать шкалу (https://simple-scada.com/help/manual/edit-scale.html) от 0 до -100, а визуальную шкалу в режиме масштабирования (https://simple-scada.com/help/manual/varextra.html?anchor=scalling) установить 0-100. Тогда значения переменной будут автоматически преобразовываться из шкалы 0 .. -100 в шкалу 0 .. 100.