4. DataItem 数据类型:ASCII、Binary、Boolean、Unsigned Integer、Signed Integer、Float、String、List
在 SECS/GEM 协议中,DataItem(数据项)是构成消息(Message)与变量(Variable)的最小数据单元。每个 DataItem 都必须关联一个明确的数据类型,以决定其存储长度、编码方式与解析规则。SEMI 标准 E5 定义了 8 种基础数据类型,涵盖了从简单的开关状态到复杂的嵌套结构。
理解这些数据类型是设计数据采集方案的前提——错误的类型映射会导致数据解析失败、通信超时甚至设备异常。本节将逐一剖析每种类型的定义、编码格式、适用场景与常见陷阱。
4.1 ASCII
定义:ASCII 类型用于传输可打印的 ASCII 字符序列,每个字符占用 1 字节。在 SECS/GEM 消息中,ASCII 数据项通常用于传递设备 ID、操作员注释、配方名称等人类可读文本。
| 属性 | 值 |
|---|---|
| 格式代码 | 0x41('A') |
| 字节长度 | 可变,由长度前缀指定(1~4 字节长度字段) |
| 编码范围 | 0x20 ~ 0x7E(可打印 ASCII) |
| 典型用途 | 设备名称、错误消息、用户输入 |
4.2 Binary
定义:Binary 类型用于传输原始字节序列,不进行任何字符编码转换。每个字节的值范围为 0x00 ~ 0xFF。Binary 适合传输固件镜像、传感器原始数据、加密校验和等非文本数据。
| 属性 | 值 |
|---|---|
| 格式代码 | 0x42('B') |
| 字节长度 | 可变,由长度前缀指定 |
| 编码方式 | 逐字节原样传输 |
| 典型用途 | 固件块、图像数据、自定义协议载荷 |
4.3 Boolean
定义:Boolean 类型表示逻辑真/假值,在 SECS/GEM 中编码为单字节:0x00 表示 FALSE,0x01 表示 TRUE。任何非 0x00 的值都应被视为 TRUE,但标准强烈建议仅使用 0x00 和 0x01。
| 属性 | 值 |
|---|---|
| 格式代码 | 0x42('B')——与 Binary 共用格式代码,通过上下文区分 |
| 字节长度 | 固定 1 字节 |
| 有效值 | 0x00 (FALSE), 0x01 (TRUE) |
| 典型用途 | 报警状态、门锁状态、工艺使能标志 |
0x42。区别在于:Boolean 的长度固定为 1,且语义上只关心最低位。在实现数据采集解析器时,必须通过 SML(SECS Message Language)定义或设备手册来区分两者,不能仅靠格式代码判断。
4.4 Unsigned Integer (UINT)
定义:UINT 类型用于传输无符号整数,支持 1、2、4、8 字节四种长度。字节序采用大端(Big-Endian)编码,即高位字节在前。
| 子类型 | 格式代码 | 字节数 | 取值范围 |
|---|---|---|---|
| U1 | 0x55('U') | 1 | 0 ~ 255 |
| U2 | 0x55('U') | 2 | 0 ~ 65,535 |
| U4 | 0x55('U') | 4 | 0 ~ 4,294,967,295 |
| U8 | 0x55('U') | 8 | 0 ~ 2⁶⁴-1 |
0x55 0x04 0x01 0x02 0x03 0x04。其中 0x55 是格式代码,0x04 是长度(4 字节),后续 4 字节为大端数值。
4.5 Signed Integer (SINT)
定义:SINT 类型用于传输有符号整数,同样支持 1、2、4、8 字节四种长度,采用大端字节序与二进制补码表示。
| 子类型 | 格式代码 | 字节数 | 取值范围 |
|---|---|---|---|
| I1 | 0x49('I') | 1 | -128 ~ 127 |
| I2 | 0x49('I') | 2 | -32,768 ~ 32,767 |
| I4 | 0x49('I') | 4 | -2³¹ ~ 2³¹-1 |
| I8 | 0x49('I') | 8 | -2⁶³ ~ 2⁶³-1 |
4.6 Float
定义:Float 类型用于传输单精度(4 字节)或双精度(8 字节)浮点数,遵循 IEEE 754 标准,字节序为大端。
| 子类型 | 格式代码 | 字节数 | 精度 |
|---|---|---|---|
| F4 | 0x46('F') | 4 | 约 7 位十进制有效数字 |
| F8 | 0x46('F') | 8 | 约 15 位十进制有效数字 |
4.7 String
定义:String 类型与 ASCII 类似,但允许传输包括扩展 ASCII(0x80 ~ 0xFF)在内的完整字节序列。在 SECS/GEM 中,String 通常用于传输多语言文本或包含特殊符号的数据。
| 属性 | 值 |
|---|---|
| 格式代码 | 0x53('S') |
| 字节长度 | 可变,由长度前缀指定 |
| 编码范围 | 0x00 ~ 0xFF(所有字节值) |
| 典型用途 | 多语言配方名称、自定义日志、扩展属性 |
- ASCII 只允许 0x20~0x7E,String 允许 0x00~0xFF。
- ASCII 适合纯英文场景,String 适合国际化场景。
- 在数据采集系统中,如果无法确定设备端编码,建议统一使用 String 类型接收,然后在主机侧根据约定的字符编码(如 UTF-8、GBK)进行二次解码。
4.8 List
定义:List 是 SECS/GEM 中唯一的复合数据类型,可以包含任意数量的子 DataItem,且子 DataItem 可以是包括 List 在内的任何类型。List 实现了数据的嵌套结构,是构建复杂消息(如配方参数列表、多站点测量数据)的基础。
| 属性 | 值 |
|---|---|
| 格式代码 | 0x4C('L') |
| 长度含义 | 子元素个数(而非字节数) |
| 嵌套深度 | 标准未限制,但实际实现通常限制在 10 层以内 |
| 典型用途 | 多参数集合、矩阵数据、事件报告内容 |
4.9 数据类型选择矩阵
在数据采集方案设计阶段,应根据数据的物理含义与精度要求选择最合适的数据类型。下表提供了常见设备数据项的类型推荐对照:
| 数据项示例 | 推荐类型 | 理由 |
|---|---|---|
| 设备序列号 | ASCII | 纯可打印字符,长度固定 |
| 晶圆 ID | String | 可能包含特殊字符或扩展 ASCII |
| 腔室门状态 | Boolean | 仅开/关两种状态 |
| 工艺温度 | F4 | 浮点数值,精度要求适中 |
| 累计运行时间 | U4 | 非负整数,范围可达 49 天(秒级) |
| 位置偏移量 | I2 | 可能为负,范围 -32768 ~ 32767 足够 |
| 传感器原始波形 | Binary | 非文本数据,需原样传输 |
| 多站点测量结果 | List of F4 | 嵌套结构,站点数量可变 |
4.10 编码与解析示例
以下是一个完整的 SECS-II 消息片段,展示了多种 DataItem 类型的混合编码。该消息表示一个“配方参数下载”请求:
// SML 表示法
S2F41 W
<L[3]
<A "Recipe_Alpha"> // 配方名称 (ASCII)
<U4 150> // 目标厚度 (Unsigned Integer)
<L[2]
<F4 23.5> // 温度设定点 (Float)
<Boolean TRUE> // 是否启用闭环控制 (Boolean)
>
>.
对应的 HSMS 字节流(十六进制)为:
0x4C 0x03 // List, 3 个子元素
0x41 0x0D // ASCII, 13 字节
0x52 0x65 0x63 0x69 0x70 0x65 0x5F 0x41 0x6C 0x70 0x68 0x61 // "Recipe_Alpha"
0x55 0x04 // U4, 4 字节
0x00 0x00 0x00 0x96 // 150
0x4C 0x02 // List, 2 个子元素
0x46 0x04 // F4, 4 字节
0x41 0xBC 0x00 0x00 // 23.5 (IEEE 754)
0x42 0x01 // Boolean, 1 字节
0x01 // TRUE
- 读取第一个字节,判断格式代码(0x4C=List, 0x41=ASCII, 0x55=UINT, 0x46=Float, 0x42=Binary/Boolean)。
- 对于 List,后续 1~4 字节为子元素个数;对于其他类型,后续 1~4 字节为数据字节长度。
- 根据长度读取数据载荷,并按类型规则转换为内存中的数据结构。
- 遇到 List 时递归执行上述步骤,直到所有嵌套层级解析完毕。
4.11 数据采集方案中的类型映射策略
在构建数据采集系统时,建议采用以下策略来保证类型安全与解析效率:
- 预定义类型字典:在系统初始化阶段,从设备 GEM 配置文件(如 .edl 文件)中加载所有 DataItem 的类型定义,建立 ID→类型的映射表。
- 强类型解析器:为每种数据类型编写独立的解析函数,避免使用万能解析器导致的类型混淆。
- 边界值检测:对于 UINT/SINT,在解析后检查数值是否在合理范围内;对于 Float,检查是否为 NaN 或 Infinity。
- List 深度限制:设置最大嵌套深度(建议 8 层),防止畸形消息导致递归栈溢出。
- 日志记录:在类型映射失败时,记录原始字节流与期望类型,便于离线排查。