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



我试图通过CAN通信(IFM)发送32位Real,但CAN通信只接受16位值。

如果我试图发送的值超过255,它将重置回0并继续该模式。因此,我需要将32位实值拆分为两个16位值,然后在通信的另一边重新组装。

我似乎不太明白如何在结构化文本中做到这一点。

如有任何帮助,不胜感激

我知道我来晚了一点,但是我想把这个作为一个解决方案。

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来直接检索信息。

第一个。我没有CAN的经验,我不知道你用哪个fbi发送他们。但如果它重置超过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。urealtosendovercan . arbybytes

或者如果您不想让变量共享内存,您可以直接执行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

最新更新