将32位实数转换为2x 16位字节

时间:2015-07-12 14:58:23

标签: 32-bit 16-bit floating-point-conversion codesys structured-text

我正在尝试通过CAN通信(IFM)发送32位实时,但CAN通信只接受16位值。

如果我尝试发送的值超过255,则重置为0并继续该模式。因此,我需要将32位实数值分成两个16位值,然后在通信的另一侧重新组合。

我似乎无法理解如何在结构化文本中做到这一点。

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

<强>第一即可。我没有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

答案 1 :(得分:1)

我知道我参加派对有点晚了,但想把它作为解决方案加入。

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

这类似于Felix Keil的答案,但它使用了2 pointer个变量和word array来直接检索信息。