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

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

Автор Тема: Проблемы с тегом типа Int64  (Прочитано 3330 раз)

pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Проблемы с тегом типа Int64
« : 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, простая переменная значение не изменяет.

Проект во вложении.
« Изменён: 11 Июля 2017, 21:05:12 от Simple_Scada »

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Проблемы с тегом типа Int64
« Ответ #1 : 11 Июля 2017, 15:26:21 »
Проблемы скорее с методом AsInt нежели с самим интом. Имею подозрение что он где-то, для перевода из Float цепляет значение с плавающей запятой, и в итоге точности не хватает.

pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Re: Проблемы с тегом типа Int64
« Ответ #2 : 11 Июля 2017, 15:43:54 »
Разумнее хранить данные в формате типа объявления тега и использовать методы для преобразования к другим типам.
Но точно ответить могут только авторы.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3160
    • Просмотр профиля
    • Simple-Scada
Re: Проблемы с тегом типа Int64
« Ответ #3 : 11 Июля 2017, 16:08:09 »
pan2000, спасибо за подробную информацию и пример. Действительно, есть лишнее округление для больших значений Int64. Проблему устранили, в ближайшем обновлении её уже не будет.

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Проблемы с тегом типа Int64
« Ответ #4 : 12 Июля 2017, 17:44:58 »
Разумнее хранить данные в формате типа объявления тега и использовать методы для преобразования к другим типам.
Но точно ответить могут только авторы.
Нормальное такое себе хранение ;D. Если OPC переваривает Инт64 (QWORD) теги, то так можно демо скаде скормить 64 QWORD = 256 WORD тегов. ;) Главное потом не запутаться что у тебя и где  :-\

pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Re: Проблемы с тегом типа Int64
« Ответ #5 : 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, но в нем тоже похоже аналогичная проблема - коррекция данных для своего собственного типа при записи в тег.

« Изменён: 09 Августа 2017, 21:22:47 от Simple_Scada »