Преобразование 32-битного реального в 2x 16-битных байтов
Я пытаюсь отправить 32-битный реал через связь CAN (IFM), но шина CAN принимает только 16-битное значение.
Если значение, которое я пытаюсь отправить, превышает 255, оно сбрасывается до 0 и продолжается в этом шаблоне. Поэтому мне нужно разделить 32-битное реальное значение на два 16-битных значения, а затем повторно собрать на другой стороне связи.
Я просто не могу понять, как это сделать в структурированном тексте.
Любая помощь будет оценена
2 ответа
Я знаю, что немного опоздал на вечеринку, но хотел добавить это как решение.
VAR
rRealVar : REAL;
awWordArray : ARRAY[0..1] OF WORD;
pTemp : POINTER TO REAL;
pTemp2 : POINTER TO REAL;
END_VAR
// Get a pointer to the REAL variable
pTemp := ADR(rRealVar);
// Get a pointer to the ARRAY base
pTemp2 := ADR(awWordArray);
// Assign the value of the REAL variable into the ARRAY base
pTemp2^ := pTemp^;
(* Index 0 := Bits 15-0
Index 1 := Bits 31-16
Это похоже на ответ Феликса Кейла, но оно использует 2 pointer
переменные и word array
получать информацию напрямую.
Первый У меня нет опыта работы с CAN, и я не знаю, какие FB вы используете для их отправки. Но если он сбрасывает более 255, кажется, что вы можете отправлять только 8-битные значения (байты) вместо 16-битных.
Второе Я бы предложил решение UNION (REAL_BYTE_SIZE = 4):
Переменные в UNION совместно используют одну и ту же память. Поэтому их можно интерпретировать по-разному
TYPE U_RealForCanBus :
UNION
rValue : REAL;
arrbyBytes : ARRAY[1..REAL_BYTE_SIZE] OF BYTE;
END_UNION
END_TYPE
Если вы объявите
uRealToSendOverCan : U_RealForCanBus;
Вы можете установить uRealToSendOverCan.rValue и прочитать uRealToSendOverCan.arrbyBytes
Или вы можете просто сделать MEMCPY, если вы не хотите, чтобы переменные разделяли память:
rValue : REAL;
arrbyToSend : ARRAY[1..REAL_BYTE_SIZE] OF BYTE;
MEMCPY(ADR(arrbyToSend ),ADR(rValue),REAL_BYTE_SIZE);
Или вы всегда можете использовать указатель для интерпретации памяти по-другому:
rValue : REAL;
parrbyToSend : POINTER TO ARRAY[1..REAL_BYTE_SIZE] OF BYTE;
parrbyToSend := ARD(rValue); //Initialize pointer
parrbyToSend^[2] ... //Second Byte of rValue