王勇平,张英豪
(广州致新电力科技有限公司,广东 广州 510540)
电力系统通信规约(协议)是指通信双方必须共同遵守的约定,也叫做通信控制规程或传输控制规程。通信规约的内容主要分为信息传送的具体步骤和信息传送格式两部分。其中,信息传送格式包括收发方式、传送速率、帧结构、帧同步字、位同步方式以及抗干扰措施等[1-3]。随着科学技术的不断发展,电力系统调度运行的信息传输要求不断提高,促使信息传输方式已逐步走向数字化和网络化。为此,国际电工委员会电力系统控制及其通信技术委员(ITCTC57)根据形势发展的要求,制定调度自动化和变电站自动化系统的数据通信标准,以适应和引导电力系统调度自动化的发展,规范调度自动化和远动设备的技术性能[4]。基于Modbus的传感器通信在数据采集方面有着广泛应用,常见的通信方式有基于串口(RTU)方式和基于传输控制协议(Transmission Control Protocol,TCP)方式两类[5]。
Modbus通信协议基本可以分为上位机查询和下位机回应两个部分的通信过程[6]。
主机先确定通信链路中所有从机设备的地址信息,然后上位机发送数据查询指令。为保证上位机能够准确查询到下位机状态信息,上位机的查询指令中必须有和下位机一致的地址信息,同时保证此通信中下位机收到的数据是上位机发送的。下位机通过上位机数据中的功能码执行上位机所要完成的具体功能,同时在数据中还包含有下位机相应功能码的辅助信息。上位机发送的数据中还包含校验码,在Modbus中一般是CRC16。校验码主要是用来检测下位机收到的查询请求是否正确。在请求数据中加上校验码,可有效验证通信过程中数据是否被完整且正确接收[7]。
下位机接收到上位机的请求后,对此数据帧进行请求应答即响应。在响应的数据中也必须包含相应的功能码。功能码[8]是对下位机接收到上位机发送数据的执行情况的响应,响应中包括功能码的实现情况和校验码,以说明数据的接收是否准确和读写操作的执行情况等。
传感器通信主要根据通信接口分为Modbus TCP和Modbus RTU串行两大类。
在一次网络通信中,TCP协议要求每个通信对象必须要知道此通信链路中每个节点的地址和端口号[9]。根据地址和端口号确定一个通信节点,识别通信节点中发送的数据,并且产生对应的响应。响应时,通信节点将数据通过Modbus发出。其他网络中包含了此Modbus数据转换的包结构。这种转换为网络解决节地址和路由路径错误检测提供了借鉴。
将传感器与其接收装置接电后,通过网线将传感器接收装置和PC连接进行网络通信。此通信是基于网络传输的,在应用程序中应用Socket技术,通过传感器接收装置的IP和端口号建立连接。通信中传感器接收装置为下位机,应用程序为上位机。
将传感器与其检测装置接电后,通过串口可与应用程序端实现通信。此通信中,传感器内置寄存器作为通信中的下位机,而应用程序为上位机。
Modbus协议定义了一个比较简单且和底层通信无关的协议数据单元(Protocol Data Unit,PDU)[10],包括功能码和数据。Modbus协议的数据帧由地址域、功能码、数据单元以及校验码组成。上位机和下位机的数据格式也是如此,只是在数据单元中稍有区别。上位机的数据单元由寄存器地址和寄存器数量组成,而下位机数据单元由数据字节数量和响应数据组成。
上位机请求数据示例:01 03 00 00 00 02 C4 0B
下位机响应数据示例:01 03 04 02 DB 01 16 0B EE
Modbus常见功能码有01(读线圈状态)、02(读(开关)输入状态)、03(读保持寄存器)、04(读输入寄存器)、05(写单个线圈)、06(写单个保持寄存器)、15(写多个线圈)以及16(写多个保持寄存器)。
上位机接收到下位机的响应数据后,要按照一定的解析规则,在下位机返回消息帧中的数据单元中解析16进制的消息帧。每种传感器的解析规则都不相同,因此需要相应传感器的通信规约文档,以说明下位机响应的数据中传感器采集的监测量字节数和比例转换关系。
数据解析以下位机响应报文(16进制)01 03 04 02 92 FF 9B 5A 3D为例。温度计算规则是,若温度小于0 ℃,则以补码形式上传,其中16进制的FF9B转10进制是-101,再根据转换关系除以10,得到真实温度为-10.1 ℃。同理,可得相对湿度为65.8%。
在应用程序中,使用的开发语言是Java,故根据实际业务需求在MySQL数据库中建立数据采集表,在程序中使用定时任务将采集的数据解析后封装为对应的对象,并使用MyBatis进行数据存储。
在Java中实现Modbus通信时,根据通信规约不同,使用的实现方式也不相同,主要分为Modbus TCP和Modbus RTU。
3.5.1 用Java实现Modbus TCP传感器数据采集
程序中,TCP方式采集传感器数据的实现方式如下。
(1)用Socket getSocketConn(String host,int port)接口获取Socket连接对象,用此接口建立应用程序与传感器接收装置之间的网络通信连接。接口中,host参数表示下位机IP,参数port表示下位机端口。
(2)用String getResponseCode(Socket socket,String reqCode,int len)接口获取下位机响应。接口中,socket参数表示建立网络连接的Socket对象,参数reqCode表示应用程序需要发送的请求数据,参数len表示请求数据中寄存器数量。
(3)用List
(4)用List
(5)用void socketClose(Socket socket)接口关闭网络通信连接。接口中,参数socket表示建立网络连接的Socket对象。
(6)用List
3.5.2 用Java实现Modbus RTU传感器数据采集
程序中,RTU方式采集传感器数据的实现方式如下。
(1)用ArrayList
(2)用SerialPort openPort(String portName,int baudrate)接口获取串口连接对象。接口中,参数portName表示串口名称,参数baudrate表示串口波特率。
(3)用void sendToPort(SerialPort serialPort,byte[] order)接口实现上位机向下位机发送数据查询请求。接口中,参数serialPort表示串口连接对象,参数order表示发送数据。
(4)用byte[] readFromPort(SerialPort serialPort)接口从下位机获取响应结果。接口中,参数serialPort表示串口连接对象。
(5)用void closePort(SerialPort serialPort)接口关闭串口连接。接口中,参数serialPort表示串口连接对象。
(6)用T getJdrkTempAndHum(int comNum)接口解析传感器响应,以获取业务数据对象。接口中,参数comNum表示串口序号。
(7)用List
研究的技术主要通过ModBus TCP/IP和ModBus RTU两种通信方式,分别实现电气设备传感器数据的采集和存储,方便了数据采集系统的快速集成开发。这不仅简化了通信规约解析的开发工作,也为电气设备智能化运维的数据采集分析提供了有效的实践借鉴意义。目前,数据采集方案已经实际应用于多个项目,且采集程序运行稳定,对基于ModBus通信协议下的数据采集分析应用场景具有借鉴意义。