问题描述
我试图在一个单词中映射一些位,但我看到编译时 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
解决方法
答案
您要查找的 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 数组.