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

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

Автор Тема: Как выделить биты из переменной типа DWORD  (Прочитано 7910 раз)

EvgeniySM

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Возникла необходимость выделять отдельные биты из переменных типа DWORD. Начал было это делать функцией GetBit, но не получилось, не работает она с таким типом данных. Шкалу для DWORD прописывал. Пришлось разделять переменные DWORD на двухбайтовые переменные INT16 а потом уже выделять нужные мне биты, что в целом увеличило количество скриптов. Это баг или так и должно быть? Можно ли исправить?
« Изменён: 31 Марта 2017, 10:45:07 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Не выделяются биты из переменной типа DWORD
« Ответ #1 : 01 Марта 2017, 13:31:51 »
Функция GetBit работает с DWord. Допустим у нас есть DWord переменная с именем vrMyVar. При создании переменной в Редакторе выставляем ей тип данных LongWord и шкалу  от 0 до 4294967295. Далее код получения бита должен быть таким:

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

Также обратите внимание, что биты в GetBit нумеруются с нуля.
« Изменён: 01 Марта 2017, 13:34:35 от Simple-Scada »

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Не выделяются биты из переменной типа DWORD
« Ответ #2 : 02 Марта 2017, 07:22:22 »
Странно у меня и обычное обращение работает.
Код
if GetBit(Мойтег.Value, №бита) then           

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Не выделяются биты из переменной типа DWORD
« Ответ #3 : 02 Марта 2017, 09:16:44 »
deldemo, это правильно. Свойство Value у переменной имеет тип данных Variant, который автоматически приводится компилятором к нужному типу данных. А в нашем примере мы просто использовали явное приведение к типу Int64 через AsInt64.

EvgeniySM

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Не выделяются биты из переменной типа DWORD
« Ответ #4 : 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" внутри скрипта. Если я пытаюсь значение выделенного бита присвоить глобальной внутренней переменной, которая у меня прописана в редакторе переменных, то скрипт не компилируется.

Вообще, в чём разница между локальными (скриптовыми) и глобальными переменными?

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Не выделяются биты из переменной типа DWORD
« Ответ #5 : 17 Марта 2017, 12:59:58 »
в глобальную надо писать:  имя.value :=GetBit(vrMyVar.AsInt64, 30);

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Не выделяются биты из переменной типа DWORD
« Ответ #6 : 18 Марта 2017, 10:05:37 »
Цитировать
Вообще, в чём разница между локальными (скриптовыми) и глобальными переменными?
Глобальные переменные на самом деле не совсем переменные, это целые объекты с множеством свойств. Ведь когда Вы создаете глобальную переменную, то помимо имени и типа данных выбираете шкалу, описание, OPC-сервер, адрес, параметры архивации, аварийные границы и т.д. Глобальная переменная хранит все эти данные. И работать в скрипте обычно нужно не с самой переменной, а с её свойствами. Если нужно поменять значение, то для этого есть свойство Value и нужно писать MyVariable.Value := 10;, как выше написал Teodor. Если нужно получить описание, то нужно писать Text1.Text := MyVariable.Description и так далее. Все свойства глобальных переменных описаны здесь. В общем глобальные переменные такие же объекты, как и поля, кнопки, фигуры и т.д. А локальные переменные скрипта примитивны, они никаких свойств не имеют и просто хранят данные определенного типа. Например переменная A: Word просто хранит число от 0 до 65535, для неё не задать описание или архивацию и т.п.

EvgeniySM

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Не выделяются биты из переменной типа DWORD
« Ответ #7 : 20 Марта 2017, 07:50:56 »
Спасибо за развёрнутый ответ, написал скрипты по вашим рекомендациям, всё работает.