|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
DLT645-2007规约的智能电表可以通过RS-485把表内数据按协议读写,站内有不少通过修改轮显数量将智能电表修改为功率计使用的;今天突发奇想,想使用LabVIEW为智能电表编写一个上位机,通过规约读取想要的几个参变量,并在程序内绘制成曲线,可带有.xml文件导出,方便长期的功率监测与测试。
先上测试版程序图:
测试版程序运行演示
现有程序的主要功能:通过串口读取电表内的电能量:当前正向总电能,变量:实时电压,实时电流(后续添加功率因数),并通过计算得出实时的视在功率并通过图表控件显示。
通讯的主要规范可见DL/T 645—2007内的帧格式;值得一提的是,在07规约内,帧内的数据域的传输十分特殊,数据项均先传送低位字节,后传送高位字节,除此之外在每个数据字节上+33h后再通过RS-485发出;在数据处理中需要特别注意。
规约的传输帧
按照规约的要求,数据帧应该进行如下处理:
帧处理流程
但为了简化程序并减少工作量(菜),在程序中,仅对数据做了以下处理:
程序的
由于RS-485为半双工总线,电表在收到主机完整的一帧请求帧后会立刻开始应答;在程序的处理中使用了简单粗暴的接收方法:在发送完成命令帧后等待1s;1s后将接收缓冲区的所有数据转换为一个字符串,当有多个命令需要发送时则依次执行,每一次产生的数据都通过一个临时变量存储。
程序使用顺序循环执行,在完成所有命令的抄读后同步进行数据处理,校验收取到的字符串长度合法后,直接使用截取字符串控件截取对应的数据域,并转换为16进制的字符串,完成这一步后,在循环内按字符串的字进行拆分,并转换为10进制数字,进行-3处理(消除发送时的+3)后按高低位再次将两个字拼合;处理完成一整个数据域后以数组形式输出,读取数组的对应元素并拼接后即可获得数值类型的明文(好阴间的写法)
下面演示一下功能:可见电表正常显示通讯状态;并且上位机读取的各项数据与电表相同,折线图显示正常
现有的缺点:
1:表号输入解析的部分还没做,命令帧的数据固定,不方便修改;后续优化会添加自动搜索表号功能,方便使用
2:数据帧的校验不严谨,存在误码可能
3:UI简陋,更多功能未跟进
讲在最后:在实际的使用过程中发现:与智能电表通信时的频率不宜过高,实测500mS的帧间隔对智能电表的负载过大(也有可能是我这电表老,MCU性能不足,11年的表);容易出现帧错误及反应卡顿,推测是频繁的串口中断对MCU的负载过高(电表的通信串口为偶校验),后续优化一点功能后会把源码发在论坛上,欢迎大佬评价!
|
打赏
-
查看全部打赏
|