PDA

Просмотр полной версии : Строку в 2 DWORD



Спорягин Кирилл
30.10.2020, 15:52
День добрый, форумчане!

Столкнулся с такой простой, на первый взгляд, задачей. А, на второй, не смог решить.

Касса мне возвращает номер фискального накопителя (ФН) в виде строки из 16 символов. Например, 9876543219876543.
Для формирования QR-кода на индикаторе мне нужно передать этот номер на индикатор. Но индикатор принимает номер ФН в виде LWORD (2 DWORD).
Соответственно, нужно преобразовать String[16] в LWORD или 2 DWORD.

На CDS V3 это одна строчка STRING_TO_LWORD. Но 2-й кодесис не работает с LWORD.

Попробовал следующий алгоритм:
1. string_to_real
2. результат пункта 1 делю на 2^32
3. результат деления - это старший DWORD, остаток от деления - это младший DWORD.

Но беда в том, что уже пункт 1 приводит к потери знаков в номере ФН, так как real в 32 бита имеет в мантисе 7 знаков, а остальное отбрасывается.

Вообщем, кто знает как выполнить такое преобразование, если контроллер работает только с 32-х битными целыми?

Спорягин Кирилл
30.10.2020, 18:30
чешское, светлое

Куда высылать?

Спорягин Кирилл
02.11.2020, 13:04
А так не проще?



FUNCTION str_to_w64 : ARRAY[0..1] OF DWORD
VAR_INPUT
str : STRING(16);
END_VAR
VAR
str1 : STRING(8);
str2 : STRING(8);
END_VAR

str_to_w64[0] := STRING_TO_DWORD(LEFT(str, len(str) - 8));
str_to_w64[1] := STRING_TO_DWORD(RIGHT(str, 8));


Так вы буквально 2 dwordа получаете, а нужно все же LWORD.
Сравните, что дает функция Валенка и что ваша.

saii
02.11.2020, 16:12
Сравните, что дает функция Валенка и что ваша.
А Вы пробовали сравнить?


Так вы буквально 2 dwordа получаете, а нужно все же LWORD.
А как Вы получите LWORD, если среда его не поддерживает?


Сравните, что дает функция Валенка и что ваша.
Не вижу принципиальных различий. Профиль функций одинаков. Только входящий STRING короче.

P.S. Не нравиться не ешьте... :) Мое дело предложить - Ваше отказаться.

saii
02.11.2020, 20:07
Согласен, погорячился, был не прав... упустил некоторые мелочи :)