Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: EvgeniySM от 01 Марта 2017, 12:37:26

Название: Как выделить биты из переменной типа DWORD
Отправлено: EvgeniySM от 01 Марта 2017, 12:37:26
Возникла необходимость выделять отдельные биты из переменных типа DWORD. Начал было это делать функцией GetBit, но не получилось, не работает она с таким типом данных. Шкалу для DWORD прописывал. Пришлось разделять переменные DWORD на двухбайтовые переменные INT16 а потом уже выделять нужные мне биты, что в целом увеличило количество скриптов. Это баг или так и должно быть? Можно ли исправить?
Название: Re: Не выделяются биты из переменной типа DWORD
Отправлено: Simple-Scada от 01 Марта 2017, 13:31:51
Функция GetBit работает с DWord. Допустим у нас есть DWord переменная с именем vrMyVar. При создании переменной в Редакторе выставляем ей тип данных LongWord и шкалу  от 0 до 4294967295. Далее код получения бита должен быть таким:

Код
var
  aBit: Boolean;
begin
  // получаем состояние 30 бита (считая с нуля)
  aBit := GetBit(vrMyVar.AsInt64, 30);
end.

Также обратите внимание, что биты в GetBit нумеруются с нуля.
Название: Re: Не выделяются биты из переменной типа DWORD
Отправлено: deldemo от 02 Марта 2017, 07:22:22
Странно у меня и обычное обращение работает.
Код
if GetBit(Мойтег.Value, №бита) then           
Название: Re: Не выделяются биты из переменной типа DWORD
Отправлено: Simple-Scada от 02 Марта 2017, 09:16:44
deldemo, это правильно. Свойство Value у переменной имеет тип данных Variant, который автоматически приводится компилятором к нужному типу данных. А в нашем примере мы просто использовали явное приведение к типу Int64 через AsInt64.
Название: Re: Не выделяются биты из переменной типа DWORD
Отправлено: EvgeniySM от 17 Марта 2017, 12:24:51
Функция GetBit работает с DWord. Допустим у нас есть DWord переменная с именем vrMyVar. При создании переменной в Редакторе выставляем ей тип данных LongWord и шкалу  от 0 до 4294967295. Далее код получения бита должен быть таким:

Код
var
  aBit: Boolean;
begin
  // получаем состояние 30 бита (считая с нуля)
  aBit := GetBit(vrMyVar.AsInt64, 30);
end.

Также обратите внимание, что биты в GetBit нумеруются с нуля.

Проверил, в целом работает, но выделенный бит можно присвоить только локальной переменной, прописанной после "Var" внутри скрипта. Если я пытаюсь значение выделенного бита присвоить глобальной внутренней переменной, которая у меня прописана в редакторе переменных, то скрипт не компилируется.

Вообще, в чём разница между локальными (скриптовыми) и глобальными переменными?
Название: Re: Не выделяются биты из переменной типа DWORD
Отправлено: Teodor от 17 Марта 2017, 12:59:58
в глобальную надо писать:  имя.value :=GetBit(vrMyVar.AsInt64, 30);
Название: Re: Не выделяются биты из переменной типа DWORD
Отправлено: Simple-Scada от 18 Марта 2017, 10:05:37
Цитировать
Вообще, в чём разница между локальными (скриптовыми) и глобальными переменными?
Глобальные переменные на самом деле не совсем переменные, это целые объекты с множеством свойств. Ведь когда Вы создаете глобальную переменную, то помимо имени и типа данных выбираете шкалу, описание, OPC-сервер, адрес, параметры архивации, аварийные границы и т.д. Глобальная переменная хранит все эти данные. И работать в скрипте обычно нужно не с самой переменной, а с её свойствами. Если нужно поменять значение, то для этого есть свойство Value и нужно писать MyVariable.Value := 10;, как выше написал Teodor. Если нужно получить описание, то нужно писать Text1.Text := MyVariable.Description и так далее. Все свойства глобальных переменных описаны здесь (http://simple-scada.com/scripts_manual?section=script_variable). В общем глобальные переменные такие же объекты, как и поля, кнопки, фигуры и т.д. А локальные переменные скрипта примитивны, они никаких свойств не имеют и просто хранят данные определенного типа. Например переменная A: Word просто хранит число от 0 до 65535, для неё не задать описание или архивацию и т.п.
Название: Re: Не выделяются биты из переменной типа DWORD
Отправлено: EvgeniySM от 20 Марта 2017, 07:50:56
Спасибо за развёрнутый ответ, написал скрипты по вашим рекомендациям, всё работает.