Skip to content

DLMS/COSEM 驱动

dc3-driver-dlms 把 DLMS/COSEM 计量设备接入 IoT DC3——以电表等计量表为目标,按 OBIS 编码周期性读取 COSEM 对象属性。

DLMS/COSEM(Device Language Message Specification / Companion Specification for Energy Metering)是电力、水、气、热等公用事业计量领域的国际标准协议(IEC 62056)。设备里的每个可读量(如有功电能、电压、时钟)被建模为一个 COSEM 对象,用 OBIS 编码(形如 1.0.1.8.0.255)唯一标识,每个对象又有若干带编号的属性(attribute),其中属性 2 通常是"当前值"。本驱动用 Gurux DLMS 库构建/解析 DLMS 帧,作为客户端(client)通过 TCP 或串口连到表计,按位号上配置的 OBIS 编码取属性值。

适用场景:抄表系统对接电表/水表/气表、能源管理平台采集计量数据。

  • 驱动名 / codeDLMS/COSEM Driver / DlmsDriver
  • 类型DRIVER_CLIENT(主动连表计)

当前为骨架实现

该驱动目前是模板骨架:Gurux 客户端能生成 DLMS 帧,但传输层收发尚未实现——当前实现 read() / write() 直接抛异常(读失败抛 ReadPointException、写失败抛 WritePointException),SDK 据此记录失败并对连接退避,而非返回伪造的采集值或写成功;health() 仅检查客户端对象是否已缓存(无真实连通探测)。请把它当作接入新表计的起点,而非生产可用的成品。下文的属性表与采集周期均取自真实配置,可照填,但实际取数行为仍待补全。

驱动配置(设备级 driver-attribute

接入一台 DLMS/COSEM 设备时,在设备上填这些属性

属性code类型默认值说明
Transport TypetransportTypeSTRINGTCP传输方式(TCP, SERIAL)
HosthostSTRINGlocalhost远端设备地址(TCP 模式)
PortportINT4059远端设备端口(TCP 模式)
Serial PortserialPortSTRING/dev/ttyUSB0串口路径(SERIAL 模式)
Baud RatebaudRateINT9600波特率(SERIAL 模式)
Client AddressclientAddressINT16DLMS 客户端地址(公共客户端=16)
Server AddressserverAddressINT1DLMS 服务端地址
AuthenticationauthenticationSTRINGNONE认证方式(NONE, LOW, HIGH)
PasswordpasswordSTRING(空)认证密码

TCP 与 SERIAL 二选一

transportType=TCP 时,只看 host / porttransportType=SERIAL 时,只看 serialPort / baudRate。另一组属性按当前传输方式被忽略,不必删。clientAddress / serverAddress / authentication / password 两种方式都用。

位号配置(point-attribute

每个采集位号上填,用 OBIS 编码定位要读的 COSEM 对象:

属性code类型默认值说明
Object TypeobjectTypeSTRINGREGISTERDLMS 对象类型(REGISTER, CLOCK, DATA 等)
Logical NamelogicalNameSTRING(空)对象逻辑名 / OBIS 编码(例 1.0.1.8.0.255
Attribute IDattributeIdINT2属性编号(2=当前值)

OBIS 编码定位"读哪个量"

logicalName 是 6 段 OBIS 编码,唯一标识表里的一个计量量,例如 1.0.1.8.0.255 是"总有功电能"。attributeId=2 取该对象的"当前值"属性。位号的数据类型(PointpointTypeFlag)要和对象属性的实际类型对得上。

DLMS/COSEM 是只读抄表语义,本驱动不提供写命令——application.ymlcommand-attribute 为空,因此没有写命令配置表。

采集与健康

  • 采集周期:默认 read cron 0/30 * * * * ?(每 30 秒读一轮);另有 custom 周期任务 cron 0/5 * * * * ?(每 5 秒)——当前实现的 schedule() 为空操作,该任务暂不执行任何逻辑。
  • 健康/在线:设备健康检查默认 cron 0/15 * * * * ?,租约超时 45 秒——在线状态机制见设备

最小接入示例

把 IP 192.168.1.20:4059 的一只电表接进来,读总有功电能:

  1. DLMS/COSEM Driver 创建设备,driver 属性填 transportType=TCPhost=192.168.1.20port=4059clientAddress=16serverAddress=1authentication=NONE
  2. 给设备绑定的物模型加一个电能位号pointTypeFlag=DOUBLEREAD_ONLY),point 属性填 objectType=REGISTERlogicalName=1.0.1.8.0.255attributeId=2
  3. 启动驱动,30 秒内会触发一轮读——但当前 read() 直接抛 ReadPointException,SDK 记录读失败并退避,位号值里暂时不会有采集值;待传输层补全后才能真正采到值。

易错点

Host/Port 与传输方式必须匹配

host / port 只在 transportType=TCP 下生效。若把 transportType 设成 SERIAL 却只填了 host,驱动会走串口分支去找 serialPort,连不上表计。改传输方式时,记得同步填对应那一组属性。

clientAddress 默认是公共客户端

clientAddress=16 对应 DLMS 的"公共客户端"(public client),多数表计允许其无认证读取基础计量量。要读受保护的对象,需改用更高权限的客户端地址,并把 authentication 调到 LOW / HIGH 配上 password

延伸阅读

Released under the AGPL-3.0 License · 基于 AGPL-3.0 协议发布