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

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

Автор Тема: конвертирование из BCD  (Прочитано 1997 раз)

СергейД

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
конвертирование из BCD
« : 08 Сентября 2021, 07:30:15 »
Добрый день.
Может у кого-то есть готовый скрипт для преобразования данных в формате BCD, чтобы их можно было вывести нормально на визуализацию.
Такие данные выдаёт контроллер Koyo.
« Изменён: 08 Сентября 2021, 15:31:08 от СергейД »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3224
    • Просмотр профиля
    • Simple-Scada
Re: конвертирование из BCD
« Ответ #1 : 08 Сентября 2021, 21:06:18 »
Здравствуйте.

А каким образом данные в формате BCD поступают в скаду? Они записываются в файл и их нужно читать из файла? Или читаются через с OPC-сервер через переменные?

СергейД

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: конвертирование из BCD
« Ответ #2 : 09 Сентября 2021, 14:56:44 »
Здравствуйте.
Через OPC сервер.

pan2000

  • Постоялец
  • ***
  • Сообщений: 229
    • Просмотр профиля
Re: конвертирование из BCD
« Ответ #3 : 12 Сентября 2021, 09:45:28 »
   Здравствуйте.

  Конвертировать  данные из BCD-формата в десятичный можно последовательным суммированием BCD-цифр умноженных на десять в степени индекс разряда (справа налево, начиная с 0).
Большую сложность представляет получение BCD-цифр из исходных данных - нужно знать их формат представления. Это может быть последовательность байтов с одной цифрой в младший тетраде, двумя цифрами в каждом байте, по 4 цифры в одном 16-разрядном слове, по 8 в 32-разрядном.
Или сборке по отдельным BCD-цифрам произвольных переменных, например скрипт "Изменились переменные, перечисленные в скрипте":
Код: (delphi)
function Digit(const aVariable:TM_Variable; const BCDindex:integer; const DiGindex:integer): int64;
var i: int64;
    j: integer;
begin
  i := (aVariable.AsInt64 shr (BCDindex * 4)) and $F;   // извлечь BCD-цифру
  for j := 1 to DIGindex do i := i * 10;                // ее значение в соответствующим разряде десятичного числа
  Result := i;
end;

var ii: int64;
begin
// поразрядная сборка по набору переменных
  ii := Digit(QuadrupleDigit_1, 2, 0) +    // слово - 4 цифры
        Digit(DoubleDigit_2,    1, 1) +    // упакованный байт - 2цифры
        Digit(DoubleDigit_2,    0, 2) +    // упакованный байт - 2цифры
        Digit(SingleDigit_4,    0, 3) +    // байт - цифра в младшей тетраде
        Digit(SingleDigit_0,    0, 4) +    // байт - цифра в младшей тетраде
        Digit(EightDigit,       7, 5);     // двойное слово - 8 цифр

  Field21.Text := IntToStr(ii);       // вывод результата
end.

Во вложении пример для всех перечисленных способов представления BCD-числа.


СергейД

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: конвертирование из BCD
« Ответ #4 : 16 Сентября 2021, 10:20:21 »
Спасибо большое.