【问题标题】:Converting 32-Bit Real to 2x 16-Bit Bytes将 32 位实数转换为 2 个 16 位字节
【发布时间】:2015-09-30 21:04:38
【问题描述】:

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

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

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

任何帮助将不胜感激

【问题讨论】:

    标签: 32-bit 16-bit floating-point-conversion codesys structured-text


    【解决方案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
    

    【讨论】:

    • 我得到错误:MEMCPY is no function 尝试使用它时,我想我没有它的库? - 更新,我愿意,但在结构化文本中它不喜欢使用它
    • 值得一提的是,我使用的是 Codesys 2.3,UNION 不可用
    • 我不知道你这边的MEMCPY有什么问题,但另一个想法是使用指针来解释变量不同。因此,我编辑了答案
    【解决方案2】:

    我知道我参加聚会有点晚了,但想添加这个作为解决方案。

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

    【讨论】:

    • 这与我现在使用的方法几乎相同
    猜你喜欢
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 2013-10-12
    • 1970-01-01
    相关资源
    最近更新 更多