乐于分享
好东西不私藏

IEC61131-3编程语言中WORD和UINT类型该如何选

IEC61131-3编程语言中WORD和UINT类型该如何选

简介

IEC-61131-3是工业自动化控制编程领域的国际标准,它规范了可编程逻辑控制器(PLC)的软件编程,核心目标是统一和标准化原本由各厂商自定、互不兼容的PLC编程方式。标准定义了5种编程语言,工程师可根据任务选择。

  • 文本类
    • IL
      指令表,类似汇编。
    • ST
      结构化文本,类似Pascal/C。
  • 图形类
    • LD
      梯形图,源于继电器电路。
    • FBD
      功能块图,用于信号流。
    • SFC
      顺序功能图,用于编排步骤。

数据类型

IEC61131-3 标准为工业控制编程定义了一套完整的数据类型体系,主要分为基本数据类型衍生数据类型(用户自定义类型)两大类。

基本数据类型

基本数据类型是标准预定义的,可直接使用。

类别
数据类型
描述
取值范围/示例
位串/布尔 BOOL
布尔值,1位
TRUE

/FALSE或 1/0
BYTE
8位无符号位串
0

16#FF
WORD
16位无符号位串
0

16#FFFF
DWORD
32位无符号位串
0

16#FFFF FFFF
LWORD
64位无符号位串
0

16#FFFF FFFF FFFF FFFF
有符号整数 SINT
8位短整数
-128

127
INT
16位整数
-32768

32767
DINT
32位双整数
-2^31

2^31-1
LINT
64位长整数
-2^63

2^63-1
无符号整数 USINT
8位无符号短整数
0

255
UINT
16位无符号整数
0

65535
UDINT
32位无符号双整数
0

2^32-1
ULINT
64位无符号长整数
0

2^64-1
实数/浮点 REAL
32位单精度浮点数
约6位有效数字
LREAL
64位双精度浮点数
约15位有效数字
时间日期 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)在内存占用和数值范围上看似相同,但核心区别在于设计意图和操作方式。选择错误会导致代码意图模糊、操作不便甚至逻辑错误。

核心区别

特性
位串 (如 BYTEWORDDWORD)
无符号整型 (如 USINTUINTUDINT)
设计本质 位的集合

。每个位被视为一个独立的布尔(开关)状态。
纯粹的数值

。代表一个整体的整数。
核心用途
表示一组标志位、状态位、位掩码。例如:设备IO状态、错误码位域、通信协议中的标志位。
表示数量、计数、索引、尺寸等需要进行算术运算的数值。例如:计数器值、转速、长度。
典型操作 位操作

:置位、复位、位测试、位与/或/非、移位。
算术运算

:加、减、乘、除、比较大小。
数据视角
关注每一位(Bit) 的0/1含义。
关注整体数值的大小。
类比
一排独立的开关。
一个里程表或计数器。

如何正确选择

遵循一个核心原则:根据数据的“含义”和“操作方式”来选择,而不是仅仅看它能存多大的数。

1. 选择位串(Bit Strings)的场景:

  • 数据代表一组独立的开关量/状态位时。

    • 示例1
      一个数字量输入模块的8个通道状态,每个通道有信号为1,无信号为0。应使用 BYTE类型,可以方便地测试第N位是0还是1。
    • 示例2
      设备报警字(共16位),每一位代表一种特定的故障(如:位0=过流,位1=过热…)。应使用 WORD类型,便于用位掩码检查特定报警是否触发。
    • 示例3
    • 通信协议中一个字节的控制字,其中bit7是使能位,bit3-bit0是模式选择。应使用 BYTE或 WORD
2. 选择无符号整型(Unsigned Integers)的场景:
  • 数据代表一个整体的数量或数值,且不会为负时。– 示例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。