Преобразование 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
Другие вопросы по тегам