Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: Zeliboba от 24 Мая 2022, 20:53:29

Название: Преобразование
Отправлено: Zeliboba от 24 Мая 2022, 20:53:29
Добрый день! Потребовалось преобразовать Int из ОРС передающиеся в bool переменные. Есть для этого встроенный функционал или это возможно только скриптами?
Название: Re: Преобразование
Отправлено: Simple Scada от 25 Мая 2022, 10:19:56
Здравствуйте.

Вам требуется работать с битами переменной? Компоненты "Кнопка (https://simple-scada.com/help/manual/button.html)" и "Флажок (https://simple-scada.com/help/manual/checkbox.html)" могут работать с битом переменной напрямую -  см. свойство "Бит". Поэтому, если требуется работа с битами в данных компонентах, то в этом случае можно обойтись без скриптов. Для других компонентов можно работать с битами через скрипты (https://simple-scada.com/help/script/work-bits.html). См. пример изменение цвета по биту переменной по ссылке (https://simple-scada.com/help/script/bit-color.html)(пример №2).
Название: Re: Преобразование
Отправлено: Zeliboba от 25 Мая 2022, 10:26:50
из ПЛК 16 бит передаются в виде int, необходимо преобразовать в скаде в 16 переменных в виде bool

Название: Re: Преобразование
Отправлено: Zeliboba от 25 Мая 2022, 11:20:06
Вопрос снимается, нашел

https://simple-scada.com/help/script/inttobin.html
Название: Re: Преобразование
Отправлено: Simple_Scada от 25 Мая 2022, 11:49:26
Как мы ранее написали выше, в скриптах можно работать с битами переменной (https://simple-scada.com/help/script/work-bits.html). Например, если требуется получить значение бита переменной, то можно использовать функцию GetBit (https://simple-scada.com/help/script/getbit.html). Если Вам требуется управлять битами переменной через кнопки или флажки, то у данных компонентов для этого имеется свойство "Бит" и писать скрипты при этом не требуется.

Если обязательно нужно извлечь биты в отдельные переменные, то сделать это можно двумя способами:
1. Через OPC-сервер. Создать на OPC-сервере 16 Boolean переменных и указать для каждой требуемый бит. Затем импортировать переменные в скаду и работать с ними.
2. Через скада-систему.

Для этого, нужно создать внутренние переменные с типом данных Boolean и однотипными именами, например vrMyVar_Bit_0, vrMyVar_Bit_1 и тд., где "vrMyVar" – это имя переменной на OPC-сервере, из которой нужно извлечь биты. Затем нужно создать скрипт с типом события "Изменились переменные (https://simple-scada.com/help/script/changemulvar.html)", добавить переменную "vrMyVar" в список скрипта, как это описано по ссылке (https://simple-scada.com/help/script/changemulvar.html) и написать такой скрипт:
Код: (delphi)
var
  I: Integer;
  aVar: TM_Variable;
begin
  if not IsFirstChange then // пропускаем первое изменение(запуск, перезапуск проекта)
  for I:= 0 to 15 do
    begin
      aVar := GetVariableByName(Variable.Name + '_Bit_' + IntToStr(I));
      if aVar <> nil then                     // если переменная существует
        aVar.Value := GetBit(Variable.AsInt,I); // извлекаем из нее биты
    end;
end.
В результате выполнения данного скрипта, в переменные vrMyVar_Bit_0, vrMyVar_Bit_1 и тд. будут извлечены биты из переменной. Это универсальный скрипт, поэтому в список скрипта можно добавить другие переменные, из которых требуется извлечь биты в отдельные Boolean переменные.

Цитировать
Вопрос снимается, нашел
https://simple-scada.com/help/script/inttobin.html
Данная функция не предназначена для работы с битами. Если требуется извлечь биты из переменной в 16 отдельных переменных Boolean, то данная функция не подойдет.