根据文档《DLT645-2007最新通信协议》,提炼几个重点(以读取A相电压为例)
1、硬件连接
本次实验只连接了电表的电源(引脚1和引脚3)和RS485(引脚11和引脚12)
2、前导字节
在主站发送信息之前,先发送 4 个字节 FEH,以唤醒接收方。
3、数据帧格式
说明 | 代码 | 十六进制 |
帧起始符 | 68H | 68H |
地址域 | A0 | AAH |
A1 | AAH | |
A2 | AAH | |
A3 | AAH | |
A4 | AAH | |
A5 | AAH | |
帧起始符 | 68H | 68H |
控制码 | C | 11H |
数据域长度 | L | 04H |
数据域(数据标识) | DI0 | 00+33H=33H |
DI1 | 01+33H=34H | |
DI2 | 01+33H=34H | |
DI3 | 02+33H=35H | |
校验码 | CS | B1H |
帧结束符 | 16H | 16H |
注:
地址域写成AAH的原因:
数据域(数据标识)的来源:
4、校验码CS的计算
MATLAB代码:
%% CSDN:地址全为AA——A 相电压——DI3:DI0=02 01 01 00
str='68 AA AA AA AA AA AA 68 11 04 33 34 34 35';
data_hex = sscanf(str,'%x');
result=dec2hex(sum(data_hex))
运行结果:
取后两位,CS=B1H
5、串口设置
1、波特率:2400
2、校验位:偶校验(even)
3、数据位:8,停止位:1
6、实验
串口工具下载地址:UartAssist串口调试助手 V5.0.3-软件工具-野人家园http://www.cmsoft.cn/resource/101.html
7、实验结果分析
十六进制 | 说明 |
FE | 前导字节 |
68 | 帧起始符 |
98 | 地址域:A0 |
69 | 地址域:A1 |
01 | 地址域:A2 |
07 | 地址域:A3 |
05 | 地址域:A4 |
21 | 地址域:A5 |
68 | 帧起始符 |
91 | 控制码 |
06 | 数据域长度 |
33 | 数据域:数据标识:DI0 |
34 | 数据域:数据标识:DI1 |
34 | 数据域:数据标识:DI2 |
35 | 数据域:数据标识:DI3 |
66 | 数据域:A相电压:低位 |
54 | 数据域:A相电压:高位 |
F1 | 校验码 |
16 | 帧结束符 |
A相电压解读:
依据1
MATLAB代码:
%% A 相电压数据解读
str='66 54';
x33H='33';
data_hex = sscanf(str,'%x');%以16进制读入str,输出10进制
data_hex_x33H=sscanf(x33H,'%x');
tmp_dec =dec2hex(data_hex-data_hex_x33H);
tmp_hex = str2num(tmp_dec);
VA=(tmp_hex(1)+tmp_hex(2)*100)/10
运行结果:
附图-电表
地址域高位
地址域低位
使用电量(猜的)
功率
电压UA
电流LA
功率因数
参考:
DLT645-2007电能表通讯协议_Jason噗噗的博客-CSDN博客_dlt645-2007DLT645-2007通讯协议:1.发送的帧格式:1.1 帧起始符 0x68H 这个不多说,记住就好;1.2 地址域A0-A5地址域由 6 个字节构成,每字节 2 位 BCD 码,地址长度可达12位十进制数。每块表具有唯一的通信地址,且与物理层信道无关。当使用的地址码长度不足 6 字节时,高位用“0”补足。通信地址999...https://blog.csdn.net/u013184273/article/details/98083050
DL/T 645-2007多功能电表通信规约_纸短情长ZF的博客-CSDN博客_dlt6142007通讯协议中华人民共和国电力行业标准 DL/T 645-2007 多功能电表通信规约解析最近在给一家企业做能源管理系统(EMS),用C#做上位机采集用电、用水、用汽等信息,其中常用的接线方式为RS485,常用通信协议为MODBUS协议。在做电能表数据采集的时候,电表的协议是 DL/T 645-2007,之前花了好多时间寻找资料,解析协议,所以特此记录一下。整个EMS系统的通信方式为:主机发送请求——从机接收请求——从机返回数据——主机接收数据下图是实际在厂区中安装的一块电能表,我印象中这种表好像是https://blog.csdn.net/m0_49284219/article/details/112978577