0

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

如果我尝试发送的值高于 255,它会重置为 0 并继续以该模式。因此,我需要将 32-Bit Real 值拆分为两个 16-Bit 值,然后在通讯的另一侧重新组合。

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

任何帮助,将不胜感激

4

2 回答 2

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
于 2015-07-13T11:34:40.783 回答
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变量和 aword array直接检索信息。

于 2016-01-27T18:00:41.673 回答