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

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.dtcms.com/a/192485.html

相关文章:

  • 【ROS2】编译Qt实现的库,然后链接该库时,报错:/usr/bin/ld: XXX undefined reference to `vtable for
  • 密码学实验:凯撒密码
  • mysql 字段类型解释
  • Linux基础 -- 在内存中使用chroot修复eMMC
  • Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(七)
  • OpenCV CUDA模块中矩阵操作------矩阵元素求和
  • 每日算法刷题计划Day7 5.15:leetcode滑动窗口4道题,用时1h
  • STM32单片机内存分配详细讲解
  • 使用gitbook 工具编写接口文档或博客
  • 【C++】汇编角度分析栈攻击
  • 一文读懂--程序的编译汇编和链接
  • Datawhale 5月llm-universe 第2次笔记
  • Vue 3中ref
  • css画图形
  • BUUCTF——web刷题第一页题解
  • 漂亮的收款打赏要饭网HTML页面源码
  • leetcode-hot-100 (子串)
  • Apple Vision Pro空间视频创作革命:从180度叙事到沉浸式语法的重构——《Adventure》系列幕后技术深度解析
  • [c++项目]云备份项目测试
  • 抢购Python代码示例与技术解析
  • Java中的设计模式
  • C++:字符数组与字符串指针变量的大小
  • 35页AI应用PPT《DeepSeek如何赋能职场应用》DeepSeek本地化部署与应用案例合集
  • 【论文阅读】BEVFormer
  • P8803 [蓝桥杯 2022 国 B] 费用报销
  • TypeScript中文文档
  • 【Java项目脚手架系列】第七篇:Spring Boot + Redis项目脚手架
  • 配置别名路径 @
  • ArcGIS切片方案记录bundle文件
  • 机器学习笔记3