Добрый день!
Мне нужно сетевую переменную Data_net перевести в двоичное число, чтобы в будущем извлекать биты. В текущий момент Data_net := 24576. Пока эта строчка не закомментирована, в текстовом поле выдаётся правильный перевод. (картинка не ерунда)
Но стоит эту строчку закомментировать (ведь сетевая переменная может меняться, она не должна быть всегда равна 24576), выдаёт ерунду.
var
Data_net: word;
myInt : integer;
BinaryNumber: string;
begin
Data_net := 24576;
myInt := Integer(Data_net);
BinaryNumber := inttobin(Data_net,16);
Field3.Text := Copy(BinaryNumber, 1, 4) + ' ' + Copy(BinaryNumber, 5, 4) + ' ' +
Copy(BinaryNumber, 9, 4) + ' ' + Copy(BinaryNumber, 13, 4);
end.
Мой вопрос состоит в том, что почему без строчки Data_net := 24576 все ломается? Ну и по картинке "ерунда подробнее" видно, что эта переменная и так равна 24576. Я хочу, чтобы в текстовое поле выводился правильный перевод этой переменной, какой бы она ни была.
Я чуть-чуть переработал код для большей наглядности:
var
myInt : integer;
BinaryNumber: string;
correct : integer; //24576
correctBinaryNumber : string;
begin
myInt := Integer(Data_net); //перевод сетевой переменной из word в int
BinaryNumber := inttobin(myInt,16); //перевод из десятичной в двоичную систему
correct := 24576;
correctBinaryNumber := inttobin(correct,16); //перевод из десятичной в двоичную систему
Text1.Text := inttostr(myInt);
Field1.Text := Copy(BinaryNumber, 1, 4) + ' ' + Copy(BinaryNumber, 5, 4) + ' ' +
Copy(BinaryNumber, 9, 4) + ' ' + Copy(BinaryNumber, 13, 4);
Field2.Text := Copy(correctBinaryNumber, 1, 4) + ' ' + Copy(correctBinaryNumber, 5, 4) + ' ' +
Copy(correctBinaryNumber, 9, 4) + ' ' + Copy(correctBinaryNumber, 13, 4);
end.
То что моя переменная - сетевая, разве не означает, что она уже внешняя?
То что моя переменная - сетевая, разве не означает, что она уже внешняя?
Внешняя переменная - это переменная, которая объявлена в меню редактирования переменных (https://simple-scada.com/help/manual/variable-editor.html) и у которой задан тип = "Внешний тег" (https://simple-scada.com/help/manual/varmain.html#:~:text=%D0%A2%D0%B8%D0%BF%20%E2%80%93%20%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D1%8F%D1%8F%20(%D1%81%20OPC%2D%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0)%20%D0%B8%D0%BB%D0%B8%20%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D1%8F%D1%8F%20(%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F)%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F.);
Внутренняя переменная - это переменная, которая объявлена в меню редактирования переменных (https://simple-scada.com/help/manual/variable-editor.html) и у которой задан тип = "Внутренний тег" (https://simple-scada.com/help/manual/varmain.html#:~:text=%D0%A2%D0%B8%D0%BF%20%E2%80%93%20%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D1%8F%D1%8F%20(%D1%81%20OPC%2D%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0)%20%D0%B8%D0%BB%D0%B8%20%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D1%8F%D1%8F%20(%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F)%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F.);
Локальная переменная - это переменная объявленная в скрипте, в разделе var.
Внутренние и внешние переменные в Simple-Scada являются объектами типа TM_Variable с множеством свойств и методов, которые подробно описаны по этой ссылке (https://simple-scada.com/help/script/tmvariable.html). Если нужно получить значение переменной в виде целого числа, то нужно использовать свойство AsInt, например:
var
myInt: integer;
begin
myInt := Data_net.AsInt;
//...
Также можно сразу из числа получить значение бита. Например:
var
aInt: Integer;
aBit0, aBit1, aBit2: Boolean;
begin
aInt := Data_net.AsInt; // получаем значение переменной Data_net в виде целого числа
aBit0 := GetBit(aInt, 0); // получаем значение нулевого бита
aBit1 := GetBit(aInt, 1); // получаем значение первого бита
aBit2 := GetBit(aInt, 2); // получаем значение второго бита
// если биты 0 и 1 включены
if (aBit0) and (aBit1) then
begin
// что-то делаем
end;
end.
И inttobin у меня заработала только со значением 15, а не 16. Если ставлю 16, то в выходной строке 17 символов получается.
Да, выводится на один символ больше, добавим исправление в ближайшее обновление.