微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

BOOL 和 WORD 的联合位映射

如何解决BOOL 和 WORD 的联合位映射

我试图在一个单词中映射一些位,但我看到编译时 bool 的大小等于一个字节。当我看到正在执行的代码时,每个 BOOL 都是 8 位大小。如何在结构或联合中指定位字段? 这是我的代码

TYPE FAULT_CODE:
STRUCT 
fault1,falut2,fault3: BOOL;

END_STRUCT
END_TYPE

TYPE U_fault :
UNION
    faultCode: FAULT_CODE;
    in: WORD;
END_UNION
END_TYPE

enter image description here

解决方法

答案

您要查找的 ST 数据类型是 BIT

  • BOOL:8 位
  • 位:1 位

您只能将数据类型 BIT 用于结构或功能块中的单个变量。可能的值为 TRUE (1) 和 FALSE (0)。

一个 BIT 元素需要 1 位内存空间,您可以使用它的名称来寻址结构或功能块的各个位。按顺序声明的 BIT 元素合并为字节。与 BOOL 类型相比,这允许您优化内存使用,每个类型至少占用 8 位。但是,位访问需要更长的时间。因此,如果您想以指定格式定义数据,您应该只使用数据类型 BIT。


示例

TYPE st_Flags :
STRUCT
    Bit1  : BIT;
    Bit2  : BIT;
    Bit3  : BIT;
    Bit4  : BIT;
    Bit5  : BIT;
    Bit6  : BIT;
    Bit7  : BIT;
    Bit8  : BIT;
END_STRUCT
END_TYPE
TYPE u_Error :
UNION
    _Byte   : BYTE;
    _Flag   : st_Flags;
END_UNION
END_TYPE
,

您应该避免 BIT 数据类型,因为 Beckhoff 基于 PC 的控制没有小型嵌入式系统或旧 PLC 系统所具有的内存限制。

在 Beckhoff 文档中,BIT 访问操作比正常的 BOOL 访问操作花费的时间更长。

CPU 时间是需要考虑的更重要的资源,因为更快的 CPU 比 RAM 棒贵得多(并且使用 4GB 的 RAM,您可以分配大量 BOOL)。

也就是说,如果您想评估一个 WORD,因为您想从中提取故障代码,请使用 CASE OF 语句。

每个 CASE 都是一种 ERROR 类型,也可以声明为 ENUM 类型。

ENUM 示例:

TYPE E_Error :
(
    eNO_ERROR := 0,eGENERAL_ERROR,eMOTION_ERROR,eSAFETY_ERROR
);
END_TYPE

CASE OF 语句示例:

CASE wError OF
    eNO_ERROR:
        ;
    eGENERAL_ERROR:
        ;
    eMOTION_ERROR:
        ;
    eSAFETY_ERROR:
        ;   
END_CASE
,

要添加到 Steves 的答案中,您还可以使用 Bit Access to Variables 放弃创建自定义数据类型的需要!

如果您的变量是整数类型(SINT、INT、DINT、USINT、UINT、UDINT、BYTE、WORD、DWORD),那么您可以像这样访问它的各个位:>

VAR
    myWord: WORD;
END_VAR

myWord.0 := FALSE;
myWord.1 := TRUE;
myWord.2 := FALSE;
myWord.3 := TRUE;
myWord.4 := FALSE;
myWord.5 := TRUE;
// And so on

正如上面提到的 Filippo Boido 一样,BOOL 本质上要快得多,因此除非您的内存不足,或者需要通过总线在 WORD 中传递数据,否则首选使用 BOOL 数组.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。