Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: СергейД от 08 Сентября 2021, 07:30:15

Название: конвертирование из BCD
Отправлено: СергейД от 08 Сентября 2021, 07:30:15
Добрый день.
Может у кого-то есть готовый скрипт для преобразования данных в формате BCD, чтобы их можно было вывести нормально на визуализацию.
Такие данные выдаёт контроллер Koyo.
Название: Re: конвертирование из BCD
Отправлено: Simple-Scada от 08 Сентября 2021, 21:06:18
Здравствуйте.

А каким образом данные в формате BCD поступают в скаду? Они записываются в файл и их нужно читать из файла? Или читаются через с OPC-сервер через переменные?
Название: Re: конвертирование из BCD
Отправлено: СергейД от 09 Сентября 2021, 14:56:44
Здравствуйте.
Через OPC сервер.
Название: Re: конвертирование из BCD
Отправлено: pan2000 от 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-числа.

Название: Re: конвертирование из BCD
Отправлено: СергейД от 16 Сентября 2021, 10:20:21
Спасибо большое.