好的,那我们进入:
第六讲:如何启用设备的事件通报?——S2F33/S2F35/S2F37 的批量注册与激活
关键词:S2F33、S2F35、S2F37、Link Event-Report、Define Report、Enable Event、VID-RPTID-CEID 绑定、通报控制
本讲目标
你将学会:
- 什么是 CEID、RPTID、VID 的绑定关系?
- 为什么要配置这些?设备为什么不自动发?
- 如何用 S2F33 建立 CEID 和 RPTID 的映射
- 如何用 S2F35 定义 RPTID 和 VID 的对应表
- 如何用 S2F37 启用 CEID,使设备真正“开始通报”
这就是一个典型的“设备激活流程”。
一、为什么要做事件注册?设备不是自动上报吗?
设备不会随便发事件的。它必须知道:
- 哪些 CEID(事件 ID)需要通知你
- 每个 CEID 对应用哪个 RPTID(数据包)
- 每个 RPTID 又包含哪些 VID(变量)
这些都要 主机主动发指令来设置。
也就是说:
主机不先发指令激活,设备是“哑巴”。
二、事件注册三步走
整个过程是 三步三报文:
步骤 | 报文 | 作用 |
---|---|---|
第一步 | S2F33 | 建立 CEID 到 RPTID 的映射(Link Event Report) |
第二步 | S2F35 | 建立 RPTID 到 VID 的映射(Define Report) |
第三步 | S2F37 | 启用 CEID,让设备开始通报(Enable Event) |
我们来一个个讲。
三、S2F33 - Link Event Report
格式如下:
var s2f33 = new SecsMessage(2, 33, "S2F33", SecsFormat.List,
Item.L(
Item.L(
Item.U2(ceid), // CEID = 1(例如“批次开始”)
Item.L(Item.U2(rptid)) // 绑定的 Report ID = 100
),
Item.L(
Item.U2(ceid2),
Item.L(Item.U2(rptid2))
)
)
);
意思就是:
把 CEID=1 的事件,绑定到 Report ID=100 的报文。
你也可以一次性绑定多个 CEID 和 RPTID。
四、S2F35 - Define Report(定义每个 RPTID 包含哪些变量)
格式如下:
var s2f35 = new SecsMessage(2, 35, "S2F35", SecsFormat.List,
Item.L(
Item.L(
Item.U2(rptid),
Item.L(Item.U2(vid1), Item.U2(vid2), Item.U2(vid3))
),
Item.L(
Item.U2(rptid2),
Item.L(Item.U2(vid4), Item.U2(vid5))
)
)
);
意思就是:
把 RPTID=100 这个数据包里,装入 VID1、VID2、VID3 这三个变量。
五、S2F37 - Enable Event(启用事件)
设备默认是“关闭事件通报”的。你必须启用。
格式如下:
var s2f37 = new SecsMessage(2, 37, "S2F37", SecsFormat.List,
Item.L(Item.U2(ceid1), Item.U2(ceid2), Item.U2(ceid3))
);
也可以启用所有:
var s2f37 = new SecsMessage(2, 37, "S2F37", SecsFormat.List, Item.A("ALL"));
表示 “你有什么事件就全启用了”,非常方便。
六、你可能疑惑的点
Q1:我怎么知道设备有哪些 CEID 和 VID?
A:通常设备会提供 “Variable Table”、“Event Table”、“Report Table”,也叫 SDD(SEMI Data Dictionary),或者你可以发 S1F13 查询(SVID)或 S1F1+S1F3+S1F5 拿变量名。
Q2:我每次启动都要发这些吗?
A:大多数设备 掉电会丢掉这些设置,所以建议在每次上线时自动发送一次(放在 Init 阶段)
Q3:如果我忘记 S2F33 或 S2F35,设备还会发事件吗?
A:不会。S6F11 报文结构都是靠你绑定的,设备默认不发,或者发的是空数据。
七、典型代码封装(EAP Init 时调用)
await gem.SendAsync(DefineReports());
await gem.SendAsync(LinkEventReports());
await gem.SendAsync(EnableAllEvents());
分别是:
private SecsMessage DefineReports()
{
return new SecsMessage(2, 35, "S2F35", SecsFormat.List,
Item.L(
Item.L(Item.U2(100), Item.L(Item.U2(3001), Item.U2(3002))), // RPTID 100 => VID 3001, 3002
Item.L(Item.U2(101), Item.L(Item.U2(3003)))
)
);
}
private SecsMessage LinkEventReports()
{
return new SecsMessage(2, 33, "S2F33", SecsFormat.List,
Item.L(
Item.L(Item.U2(1), Item.L(Item.U2(100))), // CEID 1 => RPTID 100
Item.L(Item.U2(2), Item.L(Item.U2(101)))
)
);
}
private SecsMessage EnableAllEvents()
{
return new SecsMessage(2, 37, "S2F37", SecsFormat.List, Item.A("ALL"));
}
第六讲 · 小结
你现在掌握了三条最重要的事件注册指令:
报文 | 名称 | 用途 |
---|---|---|
S2F33 | Link Event Report | 让设备知道每个事件该发哪个数据包 |
S2F35 | Define Report | 告诉设备每个数据包里该放哪些变量 |
S2F37 | Enable Event | 真正启用事件,让设备开始发 S6F11 |
一套流程做下来,设备才会开始“主动告诉你发生了什么”。
下一讲:
第七讲:为什么主机断电后设备就不通报事件了?——状态持久化、自动重连、重新激活机制全解
咱们继续揭开真实工程系统“怎么保证运行稳定”的真相。
只需你说一声:“继续”。