Simple-Scada forum

Simple-Scada 2 => Ошибки => Тема начата: pan2000 от 11 Июля 2017, 14:17:39

Название: Проблемы с тегом типа Int64
Отправлено: pan2000 от 11 Июля 2017, 14:17:39
При записи достаточно большой величины в тег типа 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, простая переменная значение не изменяет.

Проект во вложении.
Название: Re: Проблемы с тегом типа Int64
Отправлено: Teodor от 11 Июля 2017, 15:26:21
Проблемы скорее с методом AsInt нежели с самим интом. Имею подозрение что он где-то, для перевода из Float цепляет значение с плавающей запятой, и в итоге точности не хватает.
Название: Re: Проблемы с тегом типа Int64
Отправлено: pan2000 от 11 Июля 2017, 15:43:54
Разумнее хранить данные в формате типа объявления тега и использовать методы для преобразования к другим типам.
Но точно ответить могут только авторы.
Название: Re: Проблемы с тегом типа Int64
Отправлено: Simple-Scada от 11 Июля 2017, 16:08:09
pan2000, спасибо за подробную информацию и пример. Действительно, есть лишнее округление для больших значений Int64. Проблему устранили, в ближайшем обновлении её уже не будет.
Название: Re: Проблемы с тегом типа Int64
Отправлено: Teodor от 12 Июля 2017, 17:44:58
Разумнее хранить данные в формате типа объявления тега и использовать методы для преобразования к другим типам.
Но точно ответить могут только авторы.
Нормальное такое себе хранение ;D. Если OPC переваривает Инт64 (QWORD) теги, то так можно демо скаде скормить 64 QWORD = 256 WORD тегов. ;) Главное потом не запутаться что у тебя и где  :-\
Название: Re: Проблемы с тегом типа Int64
Отправлено: pan2000 от 13 Июля 2017, 12:49:25
 Это одна сторона увеличение размера данных. Вторая заключается в некоторой гарантии целостности данных, скажем четыре 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, но в нем тоже похоже аналогичная проблема - коррекция данных для своего собственного типа при записи в тег.