ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DLMS/COSEM 蓝皮书解读(二十二):M-Bus slave port setup(class_id = 25)—— 有线 M-Bus 从站端口配置

DLMS/COSEM 蓝皮书解读(二十二):M-Bus slave port setup(class_id = 25)—— 有线 M-Bus 从站端口配置 DLMS/COSEM 蓝皮书解读二十二M-Bus slave port setupclass_id 25—— 有线 M-Bus 从站端口配置系列说明本系列基于 DLMS UA《Blue Book蓝皮书第 16 版 · 第 2 部分》一个接口类一篇。第 21 篇讲了IEC twisted pair (1) setupclass_id 24它建模的是 Euridis 体系的载波双绞线介质。本篇的M-Bus slave port setupclass_id 25换了一种更常见的物理介质——有线 M-Bus解决的是当一个 COSEM 服务器电表/热表/水表通过有线 M-Bus 与 COSEM 客户端通信时这个从站端口怎么配置支持哪些波特率、总线地址怎么分配、上电后到底有没有被分配到地址。上篇回顾第 21 篇我们把载波双绞线通道建模完了。但工程现场还有大量设备挂在有线 M-Bus总线上EN 13757 体系它和载波双绞线是完全不同的物理介质、不同的寻址方式。本篇M-Bus slave port setup就是 M-Bus 从站侧那块端口身份证速率菜单和上一篇形成不同介质、同一主题设备如何被主站找到并通信的对照。0. 为什么需要这个类先说命名的一处变化蓝皮书特意强调了蓝皮书原文M-Bus slave port setup, Overview“The name of this IC has been changed from ‘M-BUS port setup’ to ‘M-Bus slave port setup’, to indicate that it serves to set up data exchange when a COSEM server communicates with a COSEM client using wired M-Bus.”改名是为了明确角色它是slave从站侧的端口配置。在 M-Bus 里表计是从站slave网关/集中器是主站master。这个类就是给从站端口用的——描述这个端口能跑哪些波特率、当前总线地址是多少、地址分配状态如何。蓝皮书原文M-Bus slave port setup, Overview“This IC allows modelling and configuring communication channels according to . Several communication channels can be configured.”为什么需要它因为 M-Bus 有一套特有的开局/协商机制主站发开场报文opening telegram时从站必须先以某个约定好的低波特率在听这就是default_baud开场之后双方可以协商切换到更高的波特率这就是avail_baud这张速率菜单M-Bus 从站的总线地址有两种来历——手动设定或自动分配而且上电后可能还没分到地址这就是addr_state和bus_address要回答的。没有这个类主站就无从知道该用多快的速度去敲这个从站的门、它现在叫几号。背景说明非蓝皮书原文属 M-Bus / EN 13757 领域常识帮助理解M-Bus 的主站以300 baud发开场报文是经典做法总线地址通常 1–250 为主地址primary address0保留用于次地址secondary address即 8 字节唯一序列号寻址与广播。下文的取值、地址范围若与你的设备对象列表冲突以设备为准。1. 类蓝图蓝皮书原文M-Bus slave port setup“M-Bus slave port setup 0…n class_id 25, version 0”M-Bus slave port setup 0...n class_id 25, version 0属性静态/动态数据类型MinMaxDefShort namelogical_namestaticoctet-stringxdefault_baudstaticenum050x 0x08avail_baudstaticenum07x 0x10addr_statestaticenumx 0x18bus_addressstaticunsignedx 0x20没有方法Specific methods 一栏为空。全部为static属性靠 SET 配置。2. 属性逐条解读2.1 logical_name标识本M-Bus slave port setup对象实例。6 字节 OBISstatic基址x。蓝皮书原文logical_name“Identifies the ‘M-Bus slave port setup’ object instance.”2.2 default_baud开场序列opening sequence使用的波特率——即主站发开场报文时从站监听的波特率。蓝皮书原文default_baud“Defines the baud rate for the opening sequence.”enum 值波特率(0)300 baud(3)2 400 baud(5)9 600 baud属性表给出 Min 0、Max 5、Def 0。原文只明确列出了 (0)/(3)/(5) 三个取值300 / 2400 / 9600按原文忠实呈现开场波特率就是这三个档位之一。2.3 avail_baud开局之后可以协商切换到的波特率菜单。蓝皮书原文avail_baud“Defines the baud rates that can be negotiated after startup.”enum 值波特率(0)300 baud(1)600 baud(2)1 200 baud(3)2 400 baud(4)4 800 baud(5)9 600 baud(6)19 200 baud(7)38 400 baud属性表 Min 0、Max 7。avail_baud比default_baud的档位全得多0–7 八个档因为它表示的是协商上限菜单而default_baud只是开场那一刻听哪个速度。2.4 addr_state自上次上电以来设备是否已被分配过地址。蓝皮书原文addr_state“Defines whether or not the device has been assigned an address since last power up of the device.”enum 值含义(0)Not assigned an address yet —— 尚未分配到地址(1)Assigned an address either by manual setting, or by automated method —— 已通过手动或自动方式分配到地址2.5 bus_address设备当前在总线上的地址。蓝皮书原文bus_address“The currently assigned address on the bus for the device.”蓝皮书原文 NOTE“If no bus address is assigned, the value is 0.”staticunsignedShort namex 0x20。关键陷阱未分配地址时bus_address 0而addr_state 0也表示未分配——两者要配合看不能单独拿bus_address当有效地址。3. 没有方法纯配置对象本类没有 ACTION 方法。所有行为都靠 SET 属性完成。它和上一篇IEC twisted pair (1) setup一样是通信介质侧的配置容器区别只是介质从载波双绞线换成了有线 M-Bus。真正通信拉起的动作由 M-Bus 链路层主站发开场报文、协商速率、分配/查询地址完成不在本类的方法里。4. 【实战举例】示例 1一块有线 M-Bus 热表的端口配置以下 OBIS/取值为示例非蓝皮书原文实际以设备对象列表为准属性取值说明logical_name0-0:24.0.0.255示例 OBISdefault_baud(0) 300 baud开场监听 300M-Bus 经典开场速率avail_baud(0)(3)(5) 300/2400/9600协商菜单含 300、2400、9600addr_state(1) Assigned已分配到地址bus_address12总线主地址 12avail_baud若想表达300 2400 9600三档因为是 enum单值实际建模时通常每个可选档位一个属性实例或按厂商约定存放位图——蓝皮书原文只说它是enum未规定多档并存的具体编码故此处仅示意菜单包含这些档具体多速率如何表达请以设备对象列表为准。logical_name的 A-XDR0-0:24.0.0.255→00 00 18 00 00 FFoctet-string 标签0B0B 06 00 00 18 00 00 FF示例 2上电 → 分配地址 的状态流转设备刚上电addr_state 0Not assignedbus_address 0主站通过手动设定或自动方法把地址 12 写进去SET bus_address 12地址写入成功后addr_state应由设备更新为1Assignedbus_address 12此后主站用bus_address 12寻址该从站。注意原文只规定addr_state描述自上次上电以来是否分配到地址未规定是哪个动作去翻转它具体是 SET 触发还是自动分配自动翻转取决于设备实现。读到addr_state 0时主站应走分配地址流程而非直接读数据。示例 3SN 短名访问端口属性base name 为x由 logical_name 派生的 13 位短名。各属性短名属性Short namedefault_baudx 0x08avail_baudx 0x10addr_statex 0x18bus_addressx 0x20例如读bus_address直接 GET 短名x 0x20其unsigned类型 GET 响应示意unsigned 标签11长度 1值 1211 01 0C 示例A-XDR 编码示意unsigned 标签以 0x11/17 为例示例 4与上一篇IEC twisted pair (1) setup的对照维度M-Bus slave port setup (25)IEC twisted pair (1) setup (24)介质有线 M-BusEN 13757载波双绞线IEC 62056-3-1速率建模default_baud开场 avail_baud协商菜单comm_speed单值端口速率地址bus_addressunsigned addr_stateprimary_address_list主站地址列表/ ADS版本仅 v0v0弃用/ v1DLMS/COSEM角色强调明确slave从站主从均在介质描述中示例 5一次典型的 M-Bus 开场→读表 时序default_baud / avail_baud 如何配合以下时序为工程示意非蓝皮书原文步骤清单波特率为示例取值主站 从站 (M-Bus slave port setup) | | |-- 开场报文 300 baud -------------| 从站以 default_baud(0)300 在听 |-- 应答含 avail_baud 菜单 ------| avail_baud 声明可协商到 9600 |-- 协商切换到 9600 baud ----------| 双方按 avail_baud 升速 | 后续 GET/SET 9600 baud | 高速稳定通信要点default_baud是敲门速度avail_baud是进屋后能跑多快。主站开场必须用default_baud之后才能协商升到avail_baud允许的档位。若avail_baud不含 9600 而主站想升到 9600协商会失败、退回default_baud。示例 6一个小区 200 块表的地址规划addr_state / bus_address 落表以下地址为示例非蓝皮书原文表号bus_addressaddr_state说明1#11主地址 1已分配……1200#2001主地址 200已分配新装表00出厂未分配主站先走分配流程M-Bus 主地址通常 1–250 可用0 保留给次地址寻址/广播。addr_state 0且bus_address 0的表主站应先发分配地址命令SETbus_address再按新地址通信不能直接拿 0 当有效地址去读数据。示例 7一块双 M-Bus 端口表0…n 多实例M-Bus slave port setup的基数写的是0...n——意味着一个设备可以挂多个 M-Bus 从站端口每个端口一个实例以下 OBIS/地址为示例非蓝皮书原文实例logical_namedefault_baudavail_baudbus_address说明端口 A0-0:24.0.0.255300300/2400/960012主 M-Bus 总线端口 B0-1:24.0.0.25524002400/960013调试/备用总线这就呼应了原文 Overview 那句“Several communication channels can be configured.”主站枚举对象列表时会看到两个M-Bus slave port setup实例各自独立配置速率与地址。示例 8default_baud 的 A-XDR 读取示例用 SN 读default_baud短名x 0x08其 GET 响应是enum16 01 00 示例enum 标签 0x16/22长度 1值 0 300 baud若值取 (5) 9600作为开场速率偏激进不推荐响应为16 01 05。主站读到default_baud后才知道该用哪个速率发开场报文读到avail_baud后才知道能协商到多快。两者是敲门速度和进屋速度的关系缺一不可。示例 9现场部署 M-Bus 从站端口的核对清单以下清单为工程归纳非蓝皮书原文取值以设备对象列表为准定开场速率default_baud设为0300 baud。除非主站明确用 2400/9600 开场否则保持 300——这是 M-Bus 互操作最稳的一档。定协商菜单avail_baud至少包含你实际要用的高波特率如 2400/9600且必须覆盖default_baud之上的目标档。定地址来源决定地址是手动设定还是自动分配。手动则在出厂/运维时 SETbus_address自动则上电后由主站分配。回读确认SET 完bus_address后回读addr_state确认变1Assigned并确认bus_address ≠ 0。多端口分别配置若设备有多个 M-Bus 端口0...n每个M-Bus slave port setup实例独立配速率与地址别只配一个。主站侧对齐主站开场速率 default_baud、协商上限 ≤avail_baud、寻址用bus_address三者任一对不上都会读不到表。5. 工程上容易踩的坑default_baud 必须和主站开场速率对齐从站只以default_baud监听开场报文。若设备设成 2400 而主站用 300 开场主站根本敲不开门表现为彻底读不到表——先确认开场速率匹配。avail_baud 是菜单不是当前速率协商后的实际速率由主从协商决定avail_baud只声明我能到多快。别把avail_baud当成当前工作速率去排错。bus_address 0 不是有效地址原文 NOTE 明确未分配地址时值为 0且addr_state 0也表未分配。判定表有没有地址要两者一起看单看bus_address容易误判成0 号表。addr_state 翻转时机未规定蓝皮书没说哪个动作翻转addr_state。排错时别假设我 SET 了 bus_address 它就一定变 1要实际回读确认。default_baud 只有 300/2400/9600 三档属性表 Max5但 enum 只定义了 (0)/(3)/(5)。若看到 1/2/4 之类的值不是标准档位属于保留/未定义别当成有效配置。多速率并存如何表达原文没细说avail_baud是单enum多档并存的具体编码位图 or 多实例原文未规定。做对象列表建模时以设备厂商约定为准不要臆测。M-Bus 与载波双绞线别混用本类只管有线 M-Bus 从站载波双绞线请回到 class_id 24。两者介质、地址语义、速率模型都不同主站接入逻辑要分介质实现。avail_baud 必须覆盖 default_baud 之上的协商目标若default_baud 300但avail_baud没列 2400/9600主站就只能停在 300无法升速。规划avail_baud时确保包含你实际要用的高波特率档。6. 小结 下期预告本篇要点M-Bus slave port setupclass_id 25, version 0建模有线 M-Bus 从站端口无方法、全 staticdefault_baud 开场监听速率300/2400/9600 三档缺省 300avail_baud 协商速率菜单0–7 八档addr_state0未分配 / 1已分配与bus_address配合表达地址状态bus_address 0 即未分配改名自M-BUS port setup强调它是slave从站侧配置。下一篇第 23 篇Utility tablesclass_id 26—— 通用表数据封装。本篇和前几篇都在讲通信端口怎么配下一篇话题一转讲一个与介质无关、纯数据载体的类它把任意表table数据ANSI 标准表或厂商自定义表封装成一个 COSEM 对象用table_ID标识、用buffer存内容并支持按偏移/按索引的选择性访问——可以看作是 DLMS 世界里搬运非 DLMS 原生数据结构的通用集装箱。参考资料DLMS UA《Blue Book Ed.16 Part 2 – COSEM interface classes》M-Bus slave port setup(class_id 25, version 0) 章节。文中属性名、数据类型、Short name 偏移、enum 取值、引文均与原文一致示例中的 OBIS、配置取值、A-XDR 字节、M-Bus 地址范围/开场速率为帮助理解而构造或属 EN 13757 领域常识实际以设备对象列表为准。
返回列表