0

我试图通过CAN通信(IFM)发送32位实数,但CAN通信只接受16位值。将32位实数转换为2x 16位字节

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

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

任何帮助,将不胜感激

回答

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 

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

+0

这与我现在使用的方法几乎相同 – SilverShotBee

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 
+0

我得到的错误:'MEMCPY是没有函数,当试图使用这个,我想我没有它的库? - 更新,但是在结构化文本中,它不喜欢使用它 – SilverShotBee

+0

可能值得一提的是,我使用的是Codesys 2.3,UNION不可用 – SilverShotBee

+0

我不知道MEMCPY在您身边,但另一个想法是使用指针来解释变量的不同。因此我编辑了答案 –