4. DataItem 数据类型:ASCII、Binary、Boolean、Unsigned Integer、Signed Integer、Float、String、List

在 SECS/GEM 协议中,DataItem(数据项)是构成消息(Message)与变量(Variable)的最小数据单元。每个 DataItem 都必须关联一个明确的数据类型,以决定其存储长度、编码方式与解析规则。SEMI 标准 E5 定义了 8 种基础数据类型,涵盖了从简单的开关状态到复杂的嵌套结构。

理解这些数据类型是设计数据采集方案的前提——错误的类型映射会导致数据解析失败、通信超时甚至设备异常。本节将逐一剖析每种类型的定义、编码格式、适用场景与常见陷阱。

SECS/GEM DataItem 数据类型全景 DataItem ASCII Binary Boolean UINT SINT Float String List 编码要点 每种类型在 HSMS 或 RS-232 传输时都有固定的长度前缀与字节序规则 List 是唯一可以嵌套其他 DataItem(包括 List 自身)的复合类型

4.1 ASCII

定义:ASCII 类型用于传输可打印的 ASCII 字符序列,每个字符占用 1 字节。在 SECS/GEM 消息中,ASCII 数据项通常用于传递设备 ID、操作员注释、配方名称等人类可读文本。

属性值
格式代码0x41('A')
字节长度可变,由长度前缀指定(1~4 字节长度字段)
编码范围0x20 ~ 0x7E(可打印 ASCII)
典型用途设备名称、错误消息、用户输入
⚠ 常见陷阱:ASCII 类型不包含空字符终止符(如 C 语言的 '\0')。接收方必须根据长度前缀精确截取字符串,不能依赖字符串结束标记。部分老旧设备可能混入不可见控制字符,建议在采集层做过滤清洗。

4.2 Binary

定义:Binary 类型用于传输原始字节序列,不进行任何字符编码转换。每个字节的值范围为 0x00 ~ 0xFF。Binary 适合传输固件镜像、传感器原始数据、加密校验和等非文本数据。

属性值
格式代码0x42('B')
字节长度可变,由长度前缀指定
编码方式逐字节原样传输
典型用途固件块、图像数据、自定义协议载荷
💡 采集建议:在数据采集方案中,Binary 类型通常需要配合额外的元数据(如长度、校验算法标识)一起上报。建议在设备端预先定义好 Binary 数据块的解析模板,避免在主机侧做猜测式解析。

4.3 Boolean

定义:Boolean 类型表示逻辑真/假值,在 SECS/GEM 中编码为单字节:0x00 表示 FALSE,0x01 表示 TRUE。任何非 0x00 的值都应被视为 TRUE,但标准强烈建议仅使用 0x00 和 0x01。

属性值
格式代码0x42('B')——与 Binary 共用格式代码,通过上下文区分
字节长度固定 1 字节
有效值0x00 (FALSE), 0x01 (TRUE)
典型用途报警状态、门锁状态、工艺使能标志
⚠ 重要:Boolean 与 Binary 在 SECS/GEM 底层使用相同的格式代码 0x42。区别在于:Boolean 的长度固定为 1,且语义上只关心最低位。在实现数据采集解析器时,必须通过 SML(SECS Message Language)定义或设备手册来区分两者,不能仅靠格式代码判断。

4.4 Unsigned Integer (UINT)

定义:UINT 类型用于传输无符号整数,支持 1、2、4、8 字节四种长度。字节序采用大端(Big-Endian)编码,即高位字节在前。

子类型格式代码字节数取值范围
U10x55('U')10 ~ 255
U20x55('U')20 ~ 65,535
U40x55('U')40 ~ 4,294,967,295
U80x55('U')80 ~ 2⁶⁴-1
🔍 编码示例:U4 值 16909060(十六进制 0x01020304)在 HSMS 消息中的字节序列为:0x55 0x04 0x01 0x02 0x03 0x04。其中 0x55 是格式代码,0x04 是长度(4 字节),后续 4 字节为大端数值。

4.5 Signed Integer (SINT)

定义:SINT 类型用于传输有符号整数,同样支持 1、2、4、8 字节四种长度,采用大端字节序与二进制补码表示。

子类型格式代码字节数取值范围
I10x49('I')1-128 ~ 127
I20x49('I')2-32,768 ~ 32,767
I40x49('I')4-2³¹ ~ 2³¹-1
I80x49('I')8-2⁶³ ~ 2⁶³-1
💡 选型建议:在定义设备数据采集项时,如果数值不可能为负(如晶圆计数、步序号),优先使用 UINT 而非 SINT,以避免符号位带来的解析歧义。对于温度偏差、位置偏移等可能为负的物理量,则必须使用 SINT。

4.6 Float

定义:Float 类型用于传输单精度(4 字节)或双精度(8 字节)浮点数,遵循 IEEE 754 标准,字节序为大端。

子类型格式代码字节数精度
F40x46('F')4约 7 位十进制有效数字
F80x46('F')8约 15 位十进制有效数字
⚠ 精度陷阱:F4(单精度)在表示大整数时可能丢失精度。例如,16777217 在 F4 中会被舍入为 16777216。如果设备上报的浮点数值实际为整数且范围较大,建议在设备端转换为 I4 或 U4 后再传输,避免采集到的数据出现不可预期的舍入误差。

4.7 String

定义:String 类型与 ASCII 类似,但允许传输包括扩展 ASCII(0x80 ~ 0xFF)在内的完整字节序列。在 SECS/GEM 中,String 通常用于传输多语言文本或包含特殊符号的数据。

属性值
格式代码0x53('S')
字节长度可变,由长度前缀指定
编码范围0x00 ~ 0xFF(所有字节值)
典型用途多语言配方名称、自定义日志、扩展属性
🔍 ASCII vs String 对比:
  • 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 层以内
典型用途多参数集合、矩阵数据、事件报告内容
List 嵌套结构示例(配方参数) L:3(根 List,3 个子项) A: "Recipe_A" U4: 100 L:2(嵌套子 List) F4: 23.5 B: 1 List 的长度字段表示子元素个数,而非字节总数 解析时必须递归处理每个子元素,直到遇到非 List 类型为止

4.9 数据类型选择矩阵

在数据采集方案设计阶段,应根据数据的物理含义与精度要求选择最合适的数据类型。下表提供了常见设备数据项的类型推荐对照:

数据项示例推荐类型理由
设备序列号ASCII纯可打印字符,长度固定
晶圆 IDString可能包含特殊字符或扩展 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
💡 解析器实现要点:
  1. 读取第一个字节,判断格式代码(0x4C=List, 0x41=ASCII, 0x55=UINT, 0x46=Float, 0x42=Binary/Boolean)。
  2. 对于 List,后续 1~4 字节为子元素个数;对于其他类型,后续 1~4 字节为数据字节长度。
  3. 根据长度读取数据载荷,并按类型规则转换为内存中的数据结构。
  4. 遇到 List 时递归执行上述步骤,直到所有嵌套层级解析完毕。

4.11 数据采集方案中的类型映射策略

在构建数据采集系统时,建议采用以下策略来保证类型安全与解析效率:

  • 预定义类型字典:在系统初始化阶段,从设备 GEM 配置文件(如 .edl 文件)中加载所有 DataItem 的类型定义,建立 ID→类型的映射表。
  • 强类型解析器:为每种数据类型编写独立的解析函数,避免使用万能解析器导致的类型混淆。
  • 边界值检测:对于 UINT/SINT,在解析后检查数值是否在合理范围内;对于 Float,检查是否为 NaN 或 Infinity。
  • List 深度限制:设置最大嵌套深度(建议 8 层),防止畸形消息导致递归栈溢出。
  • 日志记录:在类型映射失败时,记录原始字节流与期望类型,便于离线排查。
⚠ 生产环境警示:某半导体工厂曾因将 Boolean 误配置为 U1 类型,导致采集系统将 0x01 正确解析为 1,但将 0x00 解析为 0 后存入整数字段,后续报表系统将 0 视为“数据缺失”而非“FALSE”,引发长达两周的误报警。类型映射的准确性直接影响上层应用的可靠性,务必在集成测试阶段覆盖所有 DataItem 类型的边界测试。