将32位实数转换为2x 16位字节
我试图通过CAN通信(IFM)发送32位实数,但CAN通信只接受16位值。将32位实数转换为2x 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
这类似于菲利克斯Keil的答案,但它使用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
我得到的错误:'MEMCPY是没有函数,当试图使用这个,我想我没有它的库? - 更新,但是在结构化文本中,它不喜欢使用它 – SilverShotBee
可能值得一提的是,我使用的是Codesys 2.3,UNION不可用 – SilverShotBee
我不知道MEMCPY在您身边,但另一个想法是使用指针来解释变量的不同。因此我编辑了答案 –
这与我现在使用的方法几乎相同 – SilverShotBee