Secs/Gem第六讲(基于secs4net项目的ChatGpt介绍)

发布于:2025-05-16 ⋅ 阅读:(78) ⋅ 点赞:(0)

好的,那我们进入:


第六讲:如何启用设备的事件通报?——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,使设备真正“开始通报”

这就是一个典型的“设备激活流程”。


一、为什么要做事件注册?设备不是自动上报吗?

设备不会随便发事件的。它必须知道:

  1. 哪些 CEID(事件 ID)需要通知你
  2. 每个 CEID 对应用哪个 RPTID(数据包)
  3. 每个 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

一套流程做下来,设备才会开始“主动告诉你发生了什么”。


下一讲:

第七讲:为什么主机断电后设备就不通报事件了?——状态持久化、自动重连、重新激活机制全解

咱们继续揭开真实工程系统“怎么保证运行稳定”的真相。

只需你说一声:“继续”。