当前位置: 首页 > ai >正文

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

好的,那我们进入:


第六讲:如何启用设备的事件通报?——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, 3002Item.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 100Item.L(Item.U2(2), Item.L(Item.U2(101)))));
}private SecsMessage EnableAllEvents()
{return new SecsMessage(2, 37, "S2F37", SecsFormat.List, Item.A("ALL"));
}

第六讲 · 小结

你现在掌握了三条最重要的事件注册指令:

报文名称用途
S2F33Link Event Report让设备知道每个事件该发哪个数据包
S2F35Define Report告诉设备每个数据包里该放哪些变量
S2F37Enable Event真正启用事件,让设备开始发 S6F11

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


下一讲:

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

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

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

http://www.xdnf.cn/news/6402.html

相关文章:

  • gRPC为什么高性能
  • 图神经网络如何模拟人类“理解场景”的过程?
  • 连接指定数据库时提示not currently accepting connections
  • 从代码学习深度学习 - 实战 Kaggle 比赛:图像分类 (CIFAR-10 PyTorch版)
  • Docker构建Nginx、PHP、MySQL及WordPress部署及解释
  • 2025 后端自学UNIAPP【项目实战:旅游项目】5、个人中心页面:微信登录,同意授权,获取用户信息
  • 作业帮Java后台开发面试题及参考答案(下)
  • 双重差分模型学习笔记2(理论)
  • TCVectorDB 向量数据库简介
  • GPU异步执行漏洞攻防实战:从CUDA Stream竞争到安全编程规范
  • 一文读懂--程序的编译汇编和链接
  • MarkitDown:AI时代的文档转换利器
  • 鸽巢原理/抽屉原理
  • RK3588 Uboot 读U盘配置ENV环境变量
  • 鸿蒙OSUniApp制作自定义的下拉菜单组件(鸿蒙系统适配版)#三方框架 #Uniapp
  • 湖北理元理律师事务所:债务优化如何实现“减负不降质”?
  • ChromaDB 向量库优化技巧实战
  • 如何在夸克浏览器里-安装梦精灵AI提示词管理工具
  • Apollo学习——planning模块(2)之planning_component
  • 《山东欧曼谛:美业梦想的启航港》
  • [Linux性能优化] 线程卡顿优化。Linux加入USB(HID)热插拔线程占用CPU优化。Linux中CPU使用率过高优化
  • 【steganalysis】Enhancing practicality and efficiency of deepfake detection
  • 【Linux专栏】Linux进程间关系和守护进程
  • 【Docker】Docker安装Redis
  • Claude官方63组提示词模板全解析:从工作到生活的AI应用指南
  • Mac 环境下 JDK 版本切换全指南
  • HDMI信号采集器连OBS没有声音的问题
  • 导入了lombok但是却不起作用,显示实际参数列表和形式参数列表的长度不同或者无法将类的构造器给到给定的类型
  • C# 实现雪花算法(Snowflake Algorithm)详解与应用
  • Redis(2):Redis + Lua为什么可以实现原子性