IEC61131-3编程语言中WORD和UINT类型该如何选
简介
IEC-61131-3是工业自动化控制编程领域的国际标准,它规范了可编程逻辑控制器(PLC)的软件编程,核心目标是统一和标准化原本由各厂商自定、互不兼容的PLC编程方式。标准定义了5种编程语言,工程师可根据任务选择。
- 文本类
- IL
指令表,类似汇编。 - ST
结构化文本,类似Pascal/C。 - 图形类
- LD
梯形图,源于继电器电路。 - FBD
功能块图,用于信号流。 - SFC
顺序功能图,用于编排步骤。
数据类型
IEC61131-3 标准为工业控制编程定义了一套完整的数据类型体系,主要分为基本数据类型和衍生数据类型(用户自定义类型)两大类。
基本数据类型
基本数据类型是标准预定义的,可直接使用。
|
|
|
|
|
|---|---|---|---|
| 位串/布尔 | BOOL |
|
TRUE
FALSE或 1/0 |
BYTE |
|
0
16#FF |
|
WORD |
|
0
16#FFFF |
|
DWORD |
|
0
16#FFFF FFFF |
|
LWORD |
|
0
16#FFFF FFFF FFFF FFFF |
|
| 有符号整数 | SINT |
|
-128
127 |
INT |
|
-32768
32767 |
|
DINT |
|
-2^31
2^31-1 |
|
LINT |
|
-2^63
2^63-1 |
|
| 无符号整数 | USINT |
|
0
255 |
UINT |
|
0
65535 |
|
UDINT |
|
0
2^32-1 |
|
ULINT |
|
0
2^64-1 |
|
| 实数/浮点 | REAL |
|
|
LREAL |
|
|
|
| 时间日期 | TIME |
|
T#1d2h3m4s5ms |
DATE |
|
D#2023-06-29 |
|
TIME_OF_DAY
TOD) |
|
TOD#11:30:00 |
|
DATE_AND_TIME
DT) |
|
DT#2023-06-09-11:30:00 |
|
| 字符串 | STRING |
|
'text' |
WSTRING |
|
"text" |
需注意,虽然BOOL逻辑上只表示1位,但BOOL在内存中通常占用1个字节。
用户自定义类型
用户可以根据基本类型创建更复杂的数据结构,主要包括以下5种:
- 直接派生类型
基于标准类型定义一个新类型(FB),并可为其中的基本类型指定初始值。 - 枚举类型
定义一组命名的常量。 - 子范围类型
限制一个基类型的取值范围。 - 数组类型
定义同一类型元素的集合。 - 结构体类型
将不同类型的数据组合成一个逻辑单元。
数据类型选择
位串(Bit Strings)和无符号整型(Unsigned Integers)在内存占用和数值范围上看似相同,但核心区别在于设计意图和操作方式。选择错误会导致代码意图模糊、操作不便甚至逻辑错误。
核心区别
|
|
BYTE, WORD, DWORD) |
USINT, UINT, UDINT) |
|---|---|---|
| 设计本质 | 位的集合
|
纯粹的数值
|
| 核心用途 |
|
|
| 典型操作 | 位操作
|
算术运算
|
| 数据视角 |
|
|
| 类比 |
|
|
如何正确选择
遵循一个核心原则:根据数据的“含义”和“操作方式”来选择,而不是仅仅看它能存多大的数。
1. 选择位串(Bit Strings)的场景:
-
数据代表一组独立的开关量/状态位时。
- 示例1
一个数字量输入模块的8个通道状态,每个通道有信号为1,无信号为0。应使用 BYTE类型,可以方便地测试第N位是0还是1。 - 示例2
设备报警字(共16位),每一位代表一种特定的故障(如:位0=过流,位1=过热…)。应使用 WORD类型,便于用位掩码检查特定报警是否触发。 - 示例3
-
通信协议中一个字节的控制字,其中bit7是使能位,bit3-bit0是模式选择。应使用 BYTE或WORD。
-
数据代表一个整体的数量或数值,且不会为负时。– 示例1:设备的启动次数。应使用
UINT或UDINT,便于进行Count := Count + 1的递增操作。 - 示例2
电机转速(单位:RPM)。应使用 UINT,便于进行IF Speed > 1500 THEN ...的比较。 - 示例3
数组的索引或长度。应使用 UINT或UDINT。
一个关键示例说明区别
假设有一个16位的寄存器,其值为 2#0000 0000 0010 0101(十进制为37)。
- 如果将其定义为
WORD(位串) -
你关心的是:第0位、第2位、第5位是1。程序可以通过 (MyWord AND 16#4) > 1来判断bit2是否为TRUE。 -
这非常适合表示16个传感器的状态。 - 如果将其定义为
UINT(无符号整数) -
你关心的是:它的值是37。程序可能会判断 MyUInt > 3000。 -
这非常适合表示一个数值,比如速度是否大于3000 rpm。
夜雨聆风