При записи достаточно большой величины в тег типа Int64 значение изменяется на 1.
Скрипт с примером изменения:
var
a: int64;
begin
a := $20000000000003;
x1.Value := a;
Text1.Text := 'Int64 =' + IntToHex(a,8); // Text1 = '00000003'
Text2.Text := 'AsInt64 =' + IntToHex(x1.AsInt64,8); // Text2 = '00000004' !
a := $20000000000001;
x1.Value := a;
Text3.Text := 'Int64 =' + IntToHex(a,8); // Text3 = '00000001'
Text4.Text := 'AsInt64 =' + IntToHex(x1.AsInt64,8); // Text4 = '00000000' !
end.
Поле Text2 показывает увеличение значения на 1, поле Test4 - уменьшение на 1, простая переменная значение не изменяет.
Проект во вложении.
Это одна сторона увеличение размера данных. Вторая заключается в некоторой гарантии целостности данных, скажем четыре WORDа во всей цепочке передачи данных, это именно те самые четыре WORDа, которые начали движение от контроллера.
Пример для Int64:
procedure XXX_OnDataChange(Sender: TM_control);
type word4 = record a,b,c,d: word; end;
var
t:word4;
pt: ^word4 = @t;
begin
PInt64(pt)^ := TM_Text(Sender).Variable.Value; // Вызывающий процедуру тег должен иметь тип Int64 !!!
PSUS_1.Text := FloatToStr(t.a * 0.05, 2);
PSIS_1.Text := FloatToStr(t.b * 0.1, 1); // и т.д
P.S. Можно использовать и тип Double, но в нем тоже похоже аналогичная проблема - коррекция данных для своего собственного типа при записи в тег.