3、SECS-I 通信基础:RS-232 物理层、块传输协议、与 HSMS 的对比

聊到 SECS/GEM,很多人一上来就盯着 HSMS 看。毕竟现在 Ethernet 太普及了,谁还愿意碰串口?

但我得说一句:SECS-I 并没有死。我在不少老厂改造项目里,依然能看到 RS-232 线缆从设备屁股后面拖出来。你想想看,一台用了十几年的扩散炉,它不会因为你上了新系统就自动长出网口。

所以,这一章我们老老实实把 SECS-I 扒清楚。包括物理层怎么接、块传输怎么拆包、以及它跟 HSMS 到底差在哪。

3.1 RS-232 物理层:别小看那三根线

SECS-I 的物理层就是 RS-232。说白了,就是串口通信。但这里有个坑——它不是标准的 RS-232 电平

标准 RS-232 用 ±12V 表示 0 和 1,但 SECS-I 规范里明确要求使用 20mA 电流环。为什么?因为抗干扰。工厂车间里电机一启动,电压波动能把你信号吃掉。电流环就不一样了,20mA 拉过去,干扰再大也拉不垮。

我曾经在一个光伏车间里调试,现场变频器多到离谱。用普通 RS-232 转换器,数据全是乱码。换成 20mA 电流环隔离模块,瞬间稳了。嗯,这里要注意:买设备时一定要确认是电流环还是电压型,否则你会怀疑人生。

⚠️ 避坑指南: 我曾经遇到过一台设备,手册上写支持 SECS-I,结果拆开一看,里面直接飞线焊了个 MAX232 芯片。这种非标做法,通信距离超过 5 米必丢包。建议现场验收时,用示波器抓一下波形,确认是电流环还是电压型。

3.2 块传输协议:数据是怎么切碎的?

SECS-I 的传输单位叫 Block(块)。一个块最大 254 字节。为什么是 254?因为头部只有 1 个字节表示长度,0 被保留,所以最大 255-1=254。

我习惯把块传输想象成寄快递:

  • 一个 Message 可能很大,比如传 10KB 的配方文件
  • 它会被切成多个 Block,每个 Block 就是一个包裹
  • 接收方收到所有 Block 后,再拼回完整的 Message

每个 Block 的结构长这样:

+--------+--------+--------+--------+--------+--------+--------+--------+
| 长度(1B)| 设备ID  | 控制位 | 消息ID  | 块号   | 系统位  | 数据... |
|         | (1B)   | (1B)   | (2B)   | (1B)   | (2B)   | (0-244B)|
+--------+--------+--------+--------+--------+--------+--------+--------+

这里有个关键字段叫 控制位。它里面有个 E-bit(结束位)。当 E-bit=1 时,表示这是当前 Message 的最后一个 Block。接收方看到 E-bit=1,就知道可以开始拼装了。

💡 个人经验: 调试时最容易出问题的是块号溢出。块号只有 1 个字节,最大 255。如果一个 Message 被切成 300 个 Block,块号会从 255 绕回 0。有些老旧设备不处理绕回,直接报错。我建议:配方文件超过 60KB 时,主动分多次 Message 发送,别挑战极限。

3.3 传输流程:握手与重传

SECS-I 的传输是 半双工 的。也就是说,同一时刻只能一个方向发数据。发完一个 Block,必须等对方回 ACK,才能发下一个。

流程大致如下:

  1. 发送方发一个 Block
  2. 接收方收到后,回一个 ACK/NAK(1 字节)
  3. 发送方收到 ACK,继续发下一个 Block
  4. 如果收到 NAK 或超时没收到,重传当前 Block

超时时间是多少?规范里写的是 1 秒。但我在实际项目中,经常遇到老设备响应慢,1 秒不够用。我一般会设到 3 秒,同时加一个重试计数器,最多重试 3 次。超过 3 次,直接报通信故障。

🔧 调试技巧: 用串口助手抓包时,注意看 ACK 字节。0x06 表示 ACK,0x15 表示 NAK。如果连续出现 NAK,大概率是数据校验出错。SECS-I 没有 CRC,只有简单的奇偶校验。所以数据线一长,误码率就上来了。我建议:RS-232 线缆不要超过 15 米,超过就用 RS-422 转接。

3.4 与 HSMS 的对比:为什么 HSMS 成了主流?

HSMS(High-Speed SECS Message Services)是基于 TCP/IP 的。说白了,就是把 SECS 报文封装在 TCP 包里传。它跟 SECS-I 最大的区别在于:

对比项 SECS-I HSMS
物理层 RS-232(20mA 电流环) Ethernet(TCP/IP)
传输方式 半双工,逐块确认 全双工,可并发
最大块大小 254 字节 无限制(受 TCP 限制)
传输效率 低(每块都要 ACK) 高(批量确认)
连接管理 无(物理连接即通信) 有(Select/Connect 状态机)
适用场景 老设备、短距离、低速 新设备、远距离、高速

你可能会问:既然 HSMS 这么好,为什么还要学 SECS-I?

原因很简单:很多老设备只支持 SECS-I。你不可能为了上 HSMS,把设备的主板都换了。而且,SECS-I 的逻辑其实更简单,适合初学者理解 SECS 协议的底层机制。我当年就是从 SECS-I 入门的,搞懂了块传输和 ACK 机制,再看 HSMS 的会话管理,一下子就通了。

📌 我的建议: 如果你在开发新设备,直接用 HSMS。但如果你要对接老设备,或者做设备改造,SECS-I 是绕不过去的坎。我个人习惯是:在软件层统一封装成 HSMS 接口,底层根据设备类型自动切换 SECS-I 或 HSMS。这样上层应用不用关心物理层,维护起来也方便。

3.5 知识体系图:SECS-I 的核心逻辑

下面这张图,是我自己画的一个 SECS-I 通信流程概览。你可以把它当作本章的思维导图:

SECS-I 通信核心逻辑 物理层 RS-232 / 20mA 电流环 块传输协议 最大 254 字节 / Block 传输流程 半双工 / ACK 确认 20mA 电流环 vs 电压型 线缆长度 ≤ 15 米 头部结构:长度/设备ID/控制位 E-bit 结束标志 块号 0-255 绕回处理 发送 Block → 等待 ACK 超时重传(建议 3 秒) 最大重试 3 次 与 HSMS 对比:效率低但兼容老设备 新项目用 HSMS,改造项目保留 SECS-I 适配层

这张图把 SECS-I 的三个核心层串起来了。从上往下看:物理层负责把电信号传过去,块传输协议负责把数据切成小包,传输流程负责保证每个包都安全到达。最下面是对比 HSMS 的结论——说白了,SECS-I 就是给老设备用的,新项目别折腾它。

3.6 本章小结

SECS-I 虽然老,但它是理解 SECS 协议的基础。搞懂了块传输和 ACK 机制,你再看 HSMS 的会话管理,会发现很多概念是相通的。

我个人觉得,学 SECS-I 最大的收获不是学会怎么接串口,而是理解「可靠传输」这件事在工业现场有多难。你想想看,一条 15 米的线,旁边就是大功率电机,数据还能不丢包——这本身就是工程艺术的体现。

下一章,我们会进入 SECS-II 的消息格式。到时候你会发现,SECS-I 传过来的那些字节,到底是怎么被解析成有意义的指令的。


专注资料整理