APP下载

基于Linux的智能电表数据采集实现

2017-09-29靖卫兵纪松波

软件导刊 2017年9期
关键词:智能电表

靖卫兵 纪松波

摘 要:随着科技的迅速发展,精密用电设备也越来越多,它们对电流、电压、功率等基本参数要求较高。为了完整地反映用电设备的运行状态,需要对多个用电参数进行采集。在Linux操作系统开发环境下,通过分析智能电表使用的通信协议Dl645-1997,编写串口驱动,使用RS-485接口与智能电表通信,最后通过编写、移植QT应用程序,完成对电量、电流、电压和功率的采集和精确显示。该系统能够实时采集用电器的用电参数,为其安全运行提供保障,也为今后工业电量数据采集和远程传输提供参考,具有良好的应用前景。

关键词:智能电表;嵌入式Linux;通信协議;Qt移植

DOI:10.11907/rjdk.172440

中图分类号:TP319 文献标识码:A 文章编号:1672-7800(2017)009-0158-03

Abstract:With the rapid development of science and technology, precision electrical equipment is also increasing, they are the current, voltage, power and other basic parameters require a higher. In order to be able to complete the operation of the electrical equipment, the need for multiple electrical parameters to be collected. In this paper, the Linux operating system development environment, through the analysis of smart meters using the communication protocol Dl645-1997, the preparation of serial port driver, the use of RS-485 interface and smart meter communication, and finally through the preparation, transplantation QT application to complete the power, Voltage, and power acquisition and accurate display. This system can collect the electrical parameters of the electrical appliance in real time, provide security for its safe operation, and provide reference for the later industrial data acquisition and remote transmission, and has high application prospect.

Key Words:smart meter; embedded linux; communication protocol; Qt transplant

0 引言

我国经济的快速发展带动了各行业对电能的大量需求,因而迫切需要对电能供应进行科学管理。与此同时,越来越多的智能电表在生产生活中得到广泛应用,通过读取智能电表中的电量、电流、电压和功率,从而监测用电设备的运行状态,为用电设备的安全运行提供安全保障。Dl645-1997协议成为国际智能电表普遍采用的一种主流通信协议,只是采集用电量作为电费征收依据的传统方式很难满足工业实际中电力系统采集数据的全面性、可靠性方面的需要[1]。本文基于中华人民共和国电力行业标准Dl645-1997多功能电表通信规约,提出了一种基于Tiny4412为核心处理器的嵌入式智能电表数据采集的设计方案和实现方法。利用RS-485接口并结合智能电表通信规约,使用智能电表完成智能电表数据的采集。通过移植Qt完成电表数据采集工作。

1 Dl645-1997通信协议

Dl645-1997协议是中华人民共和国电力行业标准关于多功能电表的通信规约,制定该标准是为了统一和规范多功能电能表与数据终端设备进行数据交换时的物理连接和协议。采用一对多的主从工作方式,主机至少可以与一台从机通信,而从机的地址必须唯一[2]。

1.1 字节格式

该协议的每字节含8位二进制码,传输时加上一个起始位(0)表示传输方向、一个偶校验位P和一个停止位(1)共11位。D0是字节的最低有效位,D7是字节的最高有效位,字节格式如图1所示。

1.2 帧格式

帧是传输信息的基本单位,读取智能电表的信息时,主机必须按照此帧格式给电表发送数据,电表在收到正确的主机数据帧时,会查看主机帧格式中的地址会否与本地址相符合,只有两个地址一致时,电表才会将正确的电表数据回传给主机[3]。帧格式如表1所示。

BCD码:地址长度为12位十进制数,低地址位在先,高地址位在后。控制码的格式如图2所示,其中D7=0时表示由主站发出的命令帧,D7=1:由从站发出的应答帧;D6=0:从站正确应答,D6=1:从站对异常信息的应答;D5=0:无后续数据帧;D5=1:有后续数据帧;D4-D0:请求及应答功能码,当其为00001表示读数据,00010时表示读后续数据,00011时重读数,00100为写数据,01010:写设备地址,01100:更改通信速率。控制码决定是向电表读数据还是写数据,既能够读电表中的各种数据,也能写数据改变设备的地址和通信波特率。endprint

数据长度表示数据域的字节数。数据域DATA:数据域包括数据标识和数据、密码等,其结构随控制码的功能而改变。其中,数据标示指电表装置中各种不同类型、不同属性的数据。该协议使用2个字节的4个字段分别标示数据的类型和属性。这2个字节为DI1和DI0,4个字段分别为DI1H、DI1L、DI0H、DI0L,其中DI0L为最低级标识字段,DI1H为最高级标识段,如图3所示。当DI1H为1001,DI1L为0000时,表示为当前有功电能量,DI0H为0001,DI0L为0000时,表示正向总电能。如果要读取电表的正向有功总电能,数据域data从高到低位为1001 0000 0001 0000。其它类型的数据域data类似,

可参考协议附录A。传输时发送方按字节进行加33H处理,接收方按字节进行减33H处理且所有数据项均先传送低位字节,后传送高位字节。

校验码CS:从帧起始符开始到校验码之前的所有各字节的模256的和,即各字节二进制算术和,不计超过256的溢出值。结束符号16H:标识一帧信息的结束,其值为16H=00010110B。

1.3 主机请求帧

当主机需要读取数据时需要按照表1帧格式发送给电表。例如若要读取电表的正向总电能,通过上述分析可知,需要向电表发送0x68,0x11,0x11,0x11,0x11,0x11,0x11,0x68,0x1,0x2,0x43,0xc3,0xd9,0x16。其中,0x68和0x16分别是帧头和帧尾,0x11,0x11,0x11,0x11,0x11,0x11是为了方便自己提前设置的设备地址。0x1是控制码表示由主站发出的命令帧,0x2表示数据域有两个字节,数据域data为1001000000010000B,数据域需要经过加33H处理,且数据传输先低位再高位。校验码是各字节之和的后8位即oxd9。读取电表其它数据也类似,只是控制码、数据域data和校验码不同。

1.4 从机应答帧

电表收到主机发的请求帧后,会给主机返回一个应答帧。应答帧的帧格式与主机的请求帧很类似。读取数据的数据域后,数据也经过加33H自动处理,且先接收低位数据。

2 系统结构

2.1 Linux操作系统

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux可以运行在多种硬件平台上,如具有X86、SPARC、Alpha等处理器的平台。此外,Linux还是一种嵌入式操作系统,可以运行在平板电脑、机顶盒或游戏机上。Linux内核是Linux系统的核心程序,主要完成任务调度、内存管理、IO设备管理等功能[5],主要为应用程序提供一个稳定良好的运行环境。应用程序是为方便用户操作而提供的程序,驱动程序实现了操作系统对硬件的有效管理,应用程序实现了方便用户操作的目的。

2.2 串口驱动

在认识串口驱动之前必须先了解Linux tty子系统。Linux tty子系统包含tty核心、tty线路规程和tty驱动。tty核心是对整个tty设备的抽象,对用户提供统一的接口,tty线路规程是对传输数据的格式化,tty驱动则是面向tty设备的硬件驱动[6],在此即是串口驱动。当用户使用write()函数向串口发送数据时,write函数会通过系统调用来找到file_operations里的.write函数指针,其中tty_write()函数与.write指针相对应。ttt_write()函数又会找到线路规程中的tty_ldisc_ops,并调用其中的n_tty_write()函数。n_tty_write()函数又会引用tty_operation结构中的uart_write()函数。uart_write()函数最终找到串口驱动里的write()函数,最终将数据发送给硬件设备。当应用程序读串口时,首先响应tty核心中的tty_read()函数,然后在该函数中调用线路规程中的n_tty_read()函数,该函数不会继续调用其它函数,首先会设置应用程序为阻塞状态[7],如果没有数据可读,则通过调度让阻塞生效。如果有数据可读,在线路规程read_buffer()函数中将数据读走,read_buffer()函数中的数据来源于串口驱动,串口驱动接受到硬件的数据后,就会送到线路规程中的read_buffer()函数中去,当应用程序需要读数据时,只需在read_buffer()函数中读取即可。串口驱动接收数据的途径为:串口驱动通过注册接受中断,然后读取UFCON和UFSTAT两个寄存器中的数据,通过UFSTAT寄存器可以判断RxFIFO中数据量的大小,如果为0,退出中断处理,若非0则在URXH寄存器中取出接受到的数据,然后通过调用uart_insert_char()函数将数据存放到串口驱动中的buf中[8],数据接受完毕后,再调用tty_filp_buffer_push函数将串口驱动接受到的数据送到线路规程中的read_buf中,读串口数据完毕。读写过程如图4所示。

3 Qt移植

Qt是一个跨平台的C++應用程序开发框架,广泛应用于GUI程序。Qt中所有类型的GUI组件如按钮、标签等都派生于QWiget。Qt利用信号与槽机制代替传统的Callback来进行对象之间的沟通。当操作事件发生时,对象会发出一个信号,而槽则是一个函数接受一个特定的信号并且运行槽本身而设置的动作。信号与槽之间通过Qobject的静态方法connect来链接[9]。在Qt中没有特定的串口控制类,该项目中使用第三方的QextSerialPort类通过添加posix_qextserialport.h、qextserialbase.h及posix_qextserialport.cpp、qextserialbase.cpp实现电表的串口数据传输[10]。在界面文件widget.ui中,添加PushButton和LineEdit控件向串口中发送要读取数据的命令和显示数据。在读写串口之前需要先打开串口驱动文件,然后设置波特率、数据位、停止位和校验位。当PushButton被按下后,会将不同的读命令送到与其相关的槽函数中,在槽函数中调用写串口函数myCom->write((char*)s,14),s是存放命令的地址,14代表命令的大小,电表收到读命令后会返回相应的数据,Qt应用程序利用读串口函数QByteArray temp = myCom->readAll();QDataStream out(&temp,QIODevice::ReadWrite);接收电表返回的字符串,然后经过数据格式转换和数据分离后显示在LineEdit控件中,将数据代码调试正确后,使用qmake工具生成Makefile,然后使用make命令即可生成可执行应用程序myCom。将可执行文件拷贝到开发板中,修改启动脚本,即可开机运行此Qt程序。endprint

4 系统测试

将智能电表的RS485接口和开发板的RS485相连接,智能电表接一个用电器。启动开发板,会自动运行移植好的Qt应用程序,在应用程序中设置好串口工作时的波特率、数据位、停止位等参数。点击相应的按钮就能读取并显示相应的数据。测试表明,该系统能够准确读取电表中的总电能、瞬时电流、瞬时电压和瞬时功率。

5 结语

该智能电表采集系统以tiny4412处理器作为硬件平台,采用Linux技术,首先分析电表使用协议,结合RS-485接口,读取所需要的电表数据,然后通过移植Qt显示数据。经过测试,整个系统具有数据准确、稳定可靠、人机界面友好等特点,能够很好地适用于现代工业需求,应用前景十分广阔。

参考文献:

[1] 王平,张新东.基于智能仪表的数据采集系统设计[J].自动化与仪表,2009,24(4):9-10.

[2] 樊龍,张文爱.基于Modbus协议的智能电表数据采集传输系统的实现[J].制造业自动化,2014(2):120-121.

[3] 耿建坡,王永辉,陶鹏,等.智能电能表检测装置应用分析[J].河北电力技术,2012(3):4-5.

[4] 程淼,智能电能表的主要功能及其选用[J].知识经济,2011(4):127.

[5] 于海彬,王斌,陈兴林,等.基于Linux的SC16IS752的串口驱动程序设计[J].自动化与仪表,2013(12):38-39.

[6] 宋宝华.Linux设备驱动详解[M].北京:人民邮电出版社,2010.

[7] 于海彬,王斌,陈兴林.基于Linux的SC16IS752的串口驱动程序设计[J].自动化与仪表,2013(12):36-41.

[8] 吴俊安,江泽涛,涂斌.Linux下PC机串口与智能仪器间的数据通信[J].计算机与现代化,2005(7):39-42.

[9] 吴燕燕,贺锋涛.基于ARM9平台上Qt/Eebedded的移植与开发[J].液晶与显示,2013(12):261-263.

[10] 全威.基于Linux系统与Qt开发框架的虚拟仪表的显示应用研究[D].哈尔滨:哈尔滨理工大学,2017.

(责任编辑:孙 娟)endprint

猜你喜欢

智能电表
智能电表及抄表系统在线损管理中的应用探究
基于Si4438的无线智能电表设计