将 32 位实数转换为 2x 16 位字节
Converting 32-Bit Real to 2x 16-Bit Bytes
我正在尝试通过 CAN 通信 (IFM) 发送 32 位实数,但 CAN 通信只接受 16 位值。
如果我尝试发送的值超过 255,它将重置回 0 并继续以该模式继续。因此,我需要将 32 位实数值拆分为两个 16 位值,然后在通信的另一侧重新组合。
我似乎无法理解如何在结构化文本中做到这一点。
如有任何帮助,我们将不胜感激
第一。我没有使用 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
我知道我来晚了一点,但想将其添加为解决方案。
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 通信 (IFM) 发送 32 位实数,但 CAN 通信只接受 16 位值。
如果我尝试发送的值超过 255,它将重置回 0 并继续以该模式继续。因此,我需要将 32 位实数值拆分为两个 16 位值,然后在通信的另一侧重新组合。
我似乎无法理解如何在结构化文本中做到这一点。
如有任何帮助,我们将不胜感激
第一。我没有使用 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
我知道我来晚了一点,但想将其添加为解决方案。
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
直接检索信息。