Вопрос: в процессе разработки программы часто возникают задачи преобразования данных. В некоторых случаях достаточно стандартных операторов конверсии (например, REAL_TO_INT). Но иногда возникают вопросы другого рода, например - как разбить переменную DWORD на 4 отдельных байта, как преобразовать 2 переменные типа WORD в REAL и т.д. Очевидно, что можно сделать это с помощью указателей. Но есть ли более простые способы?
Ответ: такие способы есть. Рассмотрим три библиотеки:
1. Библиотека Util содержит функции, позволяющие:
- собирать переменные типов BYTE/WORD/DWORD из отдельных битов и разделять их на отдельные биты (удобно для графических языков);
- выделять/устанавливать конкретный бит переменных типа BYTE/WORD/DWORD;
- преобразовывать данные из десятичного формата в двоично-десятичный и обратно.
а также:
- функции конверсии для кода Грея;
- функции преобразования HEX-значений в ASCII-коды и обратно (пример: 16#30--->16#3330, где 16#33 - ASCII-код символа '3', а 16#30 - ASCII-код символа '0').
Util.png
2. Библиотека CAA Memory содержит функции, позволяющие:
- выделять младшие и старшие байты/слова из переменных типа WORD/DWORD;
- собирать переменные типов BYTE/WORD/DWORD из отдельных битов/байт/слов и разделять их на отдельные биты/байты/слова;
- изменять порядок бит/байт/слов в переменных типа BYTE/WORD/DWORD.
caa memory.png
Приведем также пример конвертации 2 WORD в REAL с помощью данной библиотеки:
Код:
VAR
wLow: WORD := 16#851F;
wHigh: WORD := 16#4133;
dwVar: DWORD;
rVar: REAL;
END_VAR
dwVar := MEM.PackWordsToDword(wHigh, wLow);
MEM.MemMove(ADR(dwVar), ADR(rVar), SIZEOF(rVar));
// rVar теперь имеет значение 11.22
3. Библиотека OwenCommunication содержит функции и ФБ, позволяющие:
- преобразовать REAL в 2 WORD и наоборот с возможностью изменения порядка байт;
- преобразовать DWORD в 2 WORD и наоборот с возможностью изменения порядка байт;
- преобразовать любой тип данных в любой.
OwenComm.png
Код:
VAR
wLow: WORD := 16#851F;
wHigh: WORD := 16#4133;
rVar: REAL;
END_VAR
rVar := OCL.WORD2_TO_REAL(wHigh, wLow, FALSE);
// rVar теперь имеет значение 11.22