DDSU666电表modbus通讯 接入node red

说明

此接入方法仅针对正泰DDSU666带通讯功能的导轨电表,不一定适用于所有电表,但可参考使用。

参考

1、DDSU666说明书
2、视频教程 网易云课堂/HomeAssistant智能家居实战篇/485总线篇

第一步 准备

1、ddsu666电表一只
2、电脑一台 安装node-red 安装node-red-contrib-modbus节点
3、usb转485设备一个 或 485转ttl + ttl转usb

第二步

1、给电表通上电 (零线接3号端子、火线接1号端子:随便接反了也没关系)
2、观察电表LCD窗口。
3、现在进入一个拼人品的时候了,电表默认是走DL/T 645协议的,但有时候他不默认呢,比如我的默认是modbus协议。
4、观察你的电表是否显示如下画面


上边画面当前协议为modbus,下边画面当前协议为DL/T 645

5、此画面后跟着就是通讯地址


此处有一个电话标志 表示显示的是通讯类参数
上边表示modbus地址为98(十进制),下边为DL/T 645地址(进制未知)

6、观察获得波特率 baud-x:1200、2400、4800、9600



7、如果是modbus则进入第四步,DL/T 645 则进入第三步。

第三步

说明:此处内容、未经测试,仅参考视频得出、详细请参照视频教程。

1、视频教程请与网易云课堂搜索home assistant 或者qq群搜索ddsu 会找到相关视频,此视频网易云收费,此处就不提供,以免侵权。

2、根据所获得的645地址 补充指令

3、带入 校验和计算器 计算出校验值 取后两位 替换指令中的CS

4、使用 Commix 填入指令 发送后 即切换为modbus协议

5、查看电表LCD 是否切换为modbus 并获得相应地址和波特率

第四步

1、在nr里新建modbus getter节点 点击server 新建server

   按图填写

2、参照说明书 获取相应数据

3、获得 电压、电流、瞬时功率、功率因素等

4、获得 电网频率

5、获得 总电能,即用电量

 456所填Address为说明里2000H、200EH、4000H转换为十进制。

 Quantity为获取数据位数;4里是连续的六个数据总共获取12个、5是单个数据获取2个、6是单个数据获取两个。

6、参考说明可知、所获取的数据是两个8位的数据组合的float,而nr默认将获取的数据转化为十进制、需对其进行处理(此处理函数有一点小问题、但不影响使用,如有大神能优化一下感激不尽)。

至此 已完成ddsu666的接入

相关文档至于附件

175EC28702CFCEABFA1DD48326C33D07
提取码 af58
https://pan.baidu.com/s/18PRAE9Ed-PS1jll13atmeA

膜拜大佬,给大佬端茶

不错,不错最后的转换公式不太对,依据IEEE754数据格式类型,这个解析出来的数有点不对

是的 有点不对 后期修订

1 个赞

我买的电表默认是645协议的。按照图中的方法获取了通讯地址,但是就是切换不到modbus协议

看网易云课堂那个视频,里面有详细的切换教程

视频能发一份吗?QQ群搜不到。

牛逼,居然玩成功了,还玩了一年时间

嗯 目前我这一套除了iob里的小米节点要不定时重启外别的都很正常

这个流程有问题。

单精度浮点转换成十进制时候,没有补齐“0”,会导致输出结果不稳定。
修正一下就能用了。非常感谢!!

1 个赞

搞了个WIFI转485的网关,只需要串口相关的设置改成TCP就好了。Type:TCP、Host:192.168.1.XX、Port :8899、TCP Type:DEFAULT

求教大神,第一个电表信息2000H,连读12位获取6个信息,之后用函数分开,看了协议,这块是不是分别读6个地址也能实现哈(2000、2002、2004、2006、2008、200A)

非常感谢您的分享

不懂代码小白询问,是怎么补齐零呢?按教程抄作业,发现数据处理有时返回空值,有时处理的精度和表显有点差距,希望能指点一下。

大神,修订了吗?作业抄完,数据处理有点问题,小白不会自己改啊。

[{“id”:“428321c0dbb64a7d”,“type”:“function”,“z”:“3942f299d75a5758”,“name”:“16进制转浮点”,“func”:“var data_hex1 = ‘0000’+msg.payload[0].toString(16);\nvar data_hex2 = ‘0000’+msg.payload[1].toString(16);\n\nvar data_hex = data_hex1.substr(-4) + data_hex2.substr(-4);\n\nmsg.payload = Buffer.from(data_hex, ‘hex’).readFloatBE().toFixed(2)*1\nreturn msg;”,“outputs”:1,“noerr”:0,“initialize”:"",“finalize”:"",“libs”:[],“x”:360,“y”:540,“wires”:[[“790e0b53abed321b”]]}]

“零线接3号端子、火线接1号端子” 接线方式有问题吧,一接直接跳闸了;

常规电表的接线啊,这块能出问题

重新优化过的,功率因为数据是KW所以需要乘以1000变为W

[{“id”:“d9b93914a707aa85”,“type”:“mqtt out”,“z”:“2c507211.89ab3e”,“name”:“”,“topic”:“stat/power2/V1”,“qos”:“2”,“retain”:“true”,“respTopic”:“”,“contentType”:“”,“userProps”:“”,“correl”:“”,“expiry”:“”,“broker”:“84108b1c.bb18c8”,“x”:880,“y”:1920,“wires”:[]},{“id”:“23eb3a9a.33d1de”,“type”:“debug”,“z”:“2c507211.89ab3e”,“name”:“”,“active”:true,“tosidebar”:true,“console”:false,“tostatus”:false,“complete”:“false”,“x”:930,“y”:2180,“wires”:[]},{“id”:“46308ee.bf226f”,“type”:“function”,“z”:“2c507211.89ab3e”,“name”:“瞬时电压”,“func”:“var data_hex1 = ‘0000’ + msg.payload[0].toString(16);\nvar data_hex2 = ‘0000’ + msg.payload[1].toString(16);\n\nvar data_hex = data_hex1.substr(-4) + data_hex2.substr(-4);\n\nmsg.payload = Buffer.from(data_hex, ‘hex’).readFloatBE().toFixed(2) * 1;\n\nreturn msg;\n”,“outputs”:1,“noerr”:3,“initialize”:“”,“finalize”:“”,“libs”:[],“x”:520,“y”:1920,“wires”:[[“2157d580.48ee42”,“23eb3a9a.33d1de”]]},{“id”:“2157d580.48ee42”,“type”:“rbe”,“z”:“2c507211.89ab3e”,“name”:“”,“func”:“rbe”,“gap”:“”,“start”:“”,“inout”:“out”,“property”:“payload”,“x”:650,“y”:1920,“wires”:[[“d9b93914a707aa85”]]},{“id”:“eee3b2b7.cccc8”,“type”:“function”,“z”:“2c507211.89ab3e”,“name”:“瞬时电流”,“func”:“var data_hex1 = ‘0000’ + msg.payload[2].toString(16);\nvar data_hex2 = ‘0000’ + msg.payload[3].toString(16);\n\nvar data_hex = data_hex1.substr(-4) + data_hex2.substr(-4);\n\nmsg.payload = Buffer.from(data_hex, ‘hex’).readFloatBE().toFixed(4) * 1;\n\nreturn msg;\n”,“outputs”:1,“noerr”:3,“initialize”:“”,“finalize”:“”,“libs”:[],“x”:520,“y”:1980,“wires”:[[“76b62388.f9a77c”,“23eb3a9a.33d1de”]]},{“id”:“76b62388.f9a77c”,“type”:“rbe”,“z”:“2c507211.89ab3e”,“name”:“”,“func”:“rbe”,“gap”:“”,“start”:“”,“inout”:“out”,“property”:“payload”,“x”:650,“y”:1980,“wires”:[[]]},{“id”:“bb05fa57.1f35c”,“type”:“function”,“z”:“2c507211.89ab3e”,“name”:“有功功率”,“func”:“var data_hex1 = ‘0000’ + msg.payload[4].toString(16);\nvar data_hex2 = ‘0000’ + msg.payload[5].toString(16);\n\nvar data_hex = data_hex1.substr(-4) + data_hex2.substr(-4);\n\nmsg.payload = parseFloat((Buffer.from(data_hex, ‘hex’).readFloatBE() * 1000).toFixed(2));\n\nreturn msg;\n\n”,“outputs”:1,“noerr”:0,“initialize”:“”,“finalize”:“”,“libs”:[],“x”:520,“y”:2040,“wires”:[[“fa1e670e.dc3f9”,“23eb3a9a.33d1de”]]},{“id”:“fa1e670e.dc3f9”,“type”:“rbe”,“z”:“2c507211.89ab3e”,“name”:“”,“func”:“rbe”,“gap”:“”,“start”:“”,“inout”:“out”,“property”:“payload”,“x”:650,“y”:2040,“wires”:[[]]},{“id”:“f4a2f9ce.03a61”,“type”:“function”,“z”:“2c507211.89ab3e”,“name”:“无功功率”,“func”:“var data_hex1 = ‘0000’ + msg.payload[6].toString(16);\nvar data_hex2 = ‘0000’ + msg.payload[7].toString(16);\n\nvar data_hex = data_hex1.substr(-4) + data_hex2.substr(-4);\n\nmsg.payload = parseFloat((Buffer.from(data_hex, ‘hex’).readFloatBE() * 1000).toFixed(2));\n\nreturn msg;\n”,“outputs”:1,“noerr”:0,“initialize”:“”,“finalize”:“”,“libs”:[],“x”:520,“y”:2100,“wires”:[[“53e5a4be.0aed6c”]]},{“id”:“53e5a4be.0aed6c”,“type”:“rbe”,“z”:“2c507211.89ab3e”,“name”:“”,“func”:“rbe”,“gap”:“”,“start”:“”,“inout”:“out”,“property”:“payload”,“x”:650,“y”:2100,“wires”:[[]]},{“id”:“4444d5e3.6c39fc”,“type”:“function”,“z”:“2c507211.89ab3e”,“name”:“视在功率”,“func”:“var data_hex1 = ‘0000’ + msg.payload[8].toString(16);\nvar data_hex2 = ‘0000’ + msg.payload[9].toString(16);\n\nvar data_hex = data_hex1.substr(-4) + data_hex2.substr(-4);\n\nmsg.payload = parseFloat((Buffer.from(data_hex, ‘hex’).readFloatBE() * 1000).toFixed(2));\n\nreturn msg;\n”,“outputs”:1,“noerr”:0,“initialize”:“”,“finalize”:“”,“libs”:[],“x”:520,“y”:2160,“wires”:[[“1c38bac5.68d96d”]]},{“id”:“1c38bac5.68d96d”,“type”:“rbe”,“z”:“2c507211.89ab3e”,“name”:“”,“func”:“rbe”,“gap”:“”,“start”:“”,“inout”:“out”,“property”:“payload”,“x”:650,“y”:2160,“wires”:[[]]},{“id”:“a6c19189.af6c2”,“type”:“function”,“z”:“2c507211.89ab3e”,“name”:“功率因数”,“func”:“var data_hex1 = ‘0000’ + msg.payload[10].toString(16);\nvar data_hex2 = ‘0000’ + msg.payload[11].toString(16);\n\nvar data_hex = data_hex1.substr(-4) + data_hex2.substr(-4);\n\nmsg.payload = Buffer.from(data_hex, ‘hex’).readFloatBE().toFixed(2) * 1;\n\nreturn msg;\n”,“outputs”:1,“noerr”:3,“initialize”:“”,“finalize”:“”,“libs”:[],“x”:520,“y”:2220,“wires”:[[“aac74e5c.ecc75”]]},{“id”:“aac74e5c.ecc75”,“type”:“rbe”,“z”:“2c507211.89ab3e”,“name”:“”,“func”:“rbe”,“gap”:“”,“start”:“”,“inout”:“out”,“property”:“payload”,“x”:650,“y”:2220,“wires”:[[]]},{“id”:“71251d46.7de6ac”,“type”:“modbus-getter”,“z”:“2c507211.89ab3e”,“name”:“”,“showStatusActivities”:false,“showErrors”:false,“showWarnings”:true,“logIOActivities”:false,“unitid”:“9”,“dataType”:“HoldingRegister”,“adr”:“8192”,“quantity”:“12”,“server”:“902e06fe3e85f8f8”,“useIOFile”:false,“ioFile”:“”,“useIOForPayload”:false,“emptyMsgOnFail”:false,“keepMsgProperties”:false,“delayOnStart”:false,“startDelayTime”:“”,“x”:260,“y”:1980,“wires”:[[“46308ee.bf226f”,“eee3b2b7.cccc8”,“bb05fa57.1f35c”,“f4a2f9ce.03a61”,“4444d5e3.6c39fc”,“a6c19189.af6c2”],[]]},{“id”:“6caba6b7.f6748”,“type”:“inject”,“z”:“2c507211.89ab3e”,“name”:“start”,“props”:[{“p”:“payload”},{“p”:“topic”,“vt”:“str”}],“repeat”:“5”,“crontab”:“”,“once”:false,“onceDelay”:0.1,“topic”:“”,“payload”:“”,“payloadType”:“date”,“x”:70,“y”:1980,“wires”:[[“71251d46.7de6ac”,“a2e9f0e2.757058”,“a7f005c5.002b38”]]},{“id”:“a2e9f0e2.757058”,“type”:“modbus-getter”,“z”:“2c507211.89ab3e”,“name”:“”,“showStatusActivities”:false,“showErrors”:false,“showWarnings”:true,“logIOActivities”:false,“unitid”:“9”,“dataType”:“HoldingRegister”,“adr”:“8206”,“quantity”:“2”,“server”:“902e06fe3e85f8f8”,“useIOFile”:false,“ioFile”:“”,“useIOForPayload”:false,“emptyMsgOnFail”:false,“keepMsgProperties”:false,“delayOnStart”:false,“startDelayTime”:“”,“x”:180,“y”:2280,“wires”:[[“43fbf015e97a1901”],[]]},{“id”:“4b11f216.74c22c”,“type”:“function”,“z”:“2c507211.89ab3e”,“name”:“电网频率”,“func”:“var data_hex1 = ‘0000’ + msg.payload[0].toString(16);\nvar data_hex2 = ‘0000’ + msg.payload[1].toString(16);\n\nvar data_hex = data_hex1.substr(-4) + data_hex2.substr(-4);\n\nmsg.payload = Buffer.from(data_hex, ‘hex’).readFloatBE().toFixed(2) * 1;\n\nreturn msg;\n”,“outputs”:1,“noerr”:3,“initialize”:“”,“finalize”:“”,“libs”:[],“x”:520,“y”:2280,“wires”:[[“7473f78.3e10a08”,“23eb3a9a.33d1de”]]},{“id”:“7473f78.3e10a08”,“type”:“rbe”,“z”:“2c507211.89ab3e”,“name”:“”,“func”:“rbe”,“gap”:“”,“start”:“”,“inout”:“out”,“property”:“payload”,“x”:650,“y”:2280,“wires”:[[]]},{“id”:“a7f005c5.002b38”,“type”:“modbus-getter”,“z”:“2c507211.89ab3e”,“name”:“”,“showStatusActivities”:false,“showErrors”:false,“showWarnings”:true,“logIOActivities”:false,“unitid”:“9”,“dataType”:“HoldingRegister”,“adr”:“16384”,“quantity”:“2”,“server”:“902e06fe3e85f8f8”,“useIOFile”:false,“ioFile”:“”,“useIOForPayload”:false,“emptyMsgOnFail”:false,“keepMsgProperties”:false,“delayOnStart”:false,“startDelayTime”:“”,“x”:180,“y”:2340,“wires”:[[“4dd233bc9d7042a1”],[]]},{“id”:“1d5de1de.232736”,“type”:“function”,“z”:“2c507211.89ab3e”,“name”:“总用电量”,“func”:“var data_hex1 = ‘0000’ + msg.payload[0].toString(16);\nvar data_hex2 = ‘0000’ + msg.payload[1].toString(16);\n\nvar data_hex = data_hex1.substr(-4) + data_hex2.substr(-4);\n\nmsg.payload = Buffer.from(data_hex, ‘hex’).readFloatBE().toFixed(2) * 1;\n\nreturn msg;\n”,“outputs”:1,“noerr”:3,“initialize”:“”,“finalize”:“”,“libs”:[],“x”:520,“y”:2340,“wires”:[[“54cca990.6e2ef”,“23eb3a9a.33d1de”]]},{“id”:“54cca990.6e2ef”,“type”:“rbe”,“z”:“2c507211.89ab3e”,“name”:“”,“func”:“rbe”,“gap”:“”,“start”:“”,“inout”:“out”,“property”:“payload”,“x”:650,“y”:2340,“wires”:[[]]},{“id”:“de0cf31c.e52d08”,“type”:“comment”,“z”:“2c507211.89ab3e”,“name”:“DDSU666 modbus电表数据读取 地址98”,“info”:“”,“x”:150,“y”:1920,“wires”:[]},{“id”:“43fbf015e97a1901”,“type”:“delay”,“z”:“2c507211.89ab3e”,“name”:“”,“pauseType”:“delay”,“timeout”:“10”,“timeoutUnits”:“milliseconds”,“rate”:“1”,“nbRateUnits”:“1”,“rateUnits”:“second”,“randomFirst”:“1”,“randomLast”:“5”,“randomUnits”:“seconds”,“drop”:false,“allowrate”:false,“outputs”:1,“x”:370,“y”:2280,“wires”:[[“4b11f216.74c22c”]]},{“id”:“4dd233bc9d7042a1”,“type”:“delay”,“z”:“2c507211.89ab3e”,“name”:“”,“pauseType”:“delay”,“timeout”:“10”,“timeoutUnits”:“milliseconds”,“rate”:“1”,“nbRateUnits”:“1”,“rateUnits”:“second”,“randomFirst”:“1”,“randomLast”:“5”,“randomUnits”:“seconds”,“drop”:false,“allowrate”:false,“outputs”:1,“x”:370,“y”:2340,“wires”:[[“1d5de1de.232736”]]},{“id”:“84108b1c.bb18c8”,“type”:“mqtt-broker”,“name”:“hass”,“broker”:“192.168.31.34”,“port”:“1883”,“clientid”:“”,“autoConnect”:true,“usetls”:false,“protocolVersion”:“4”,“keepalive”:“60”,“cleansession”:true,“birthTopic”:“”,“birthQos”:“0”,“birthPayload”:“”,“birthMsg”:{},“closeTopic”:“”,“closeQos”:“0”,“closePayload”:“”,“closeMsg”:{},“willTopic”:“”,“willQos”:“0”,“willPayload”:“”,“willMsg”:{},“userProps”:“”,“sessionExpiry”:“”},{“id”:“902e06fe3e85f8f8”,“type”:“modbus-client”,“name”:“”,“clienttype”:“tcp”,“bufferCommands”:true,“stateLogEnabled”:false,“queueLogEnabled”:false,“failureLogEnabled”:true,“tcpHost”:“192.168.31.154”,“tcpPort”:“502”,“tcpType”:“DEFAULT”,“serialPort”:“/dev/ttyUSB”,“serialType”:“RTU-BUFFERD”,“serialBaudrate”:“9600”,“serialDatabits”:“8”,“serialStopbits”:“1”,“serialParity”:“none”,“serialConnectionDelay”:“100”,“serialAsciiResponseStartDelimiter”:“0x3A”,“unit_id”:1,“commandDelay”:1,“clientTimeout”:1000,“reconnectOnTimeout”:true,“reconnectTimeout”:2000,“parallelUnitIdsAllowed”:true,“showWarnings”:true,“showLogs”:true}]