1 引言
目前国内的水电站从最初的“集中控制、功能分散方式”到当今流行的“全分层分布开放式运行方式”,已全部采用计算机控制系统取代过去以继电器常规控制方式,可实现“无人值班”(少人值守),大大提高了水电站的自动化水平。一般整个水电站监控系统在物理上分为两层:电站控制层和现地控制层。电站控制层(或称上位机系统)主要用于监控系统的组态、维护,水电站运行的监视、操作、信息管理、远动和优化控制等。现地控制层按控制对象分散方式一般设置为机组现地控制单元(LCU)、开关站及公用现地控制单元(LCU)和闸门现地控制单元(LCU),现地控制单元(LCU)主要采用PLC完成控制对象的数据采集与处理、控制与调节、安全运行监视、事件顺序记录(SOE)、数据及网络通讯等。
2 项目简介
湖南铜信溪水电站装设三台10MW水轮发电机组,整个监控系统采用“全分层分布开放式运行方式”,上位机系统设置二套操作员工作站、一套工程师工作站和一套通讯工作站,现地控制层设置三套机组LCU、一套开关站及公用LCU和一套闸门LCU。LCU主要采用西门子S7-300集成PROFINET接口的CPU315-2PN/DP模块,通过编程实现Modbus/TCP协议与上位机系统通讯;同时配置相应的数字量输入/输出模块和模拟量输入模块,完成机组、开关站、公用和闸门等设备的控制与调节。具体网络结构如图1所示。
3 CPU315-2PN/DP模块及Modbus/TCP协议
CPU315-2PN/DP是西门子2004年底推出的一款高性价比S7-300 CPU。通过集成的通信接口(MPI/DP,PN),该CPU可直接连接MPI网络、Profibus-DP网络、开放式工业以太网,以及基于工业以太网技术的新一代现场总线PROFINET。该CPU的推出,进一步增强了S7-300 PLC的通信功能,使S7-300连接以太网的成本大大降低,并为PROFINET技术的普及提供了强有力支持。集成的IE/PROFINET接口支持多种通讯服务:基于PROFINET的开放通讯 (PROFINET IO, PROFINET CBA)、S7 通讯、开放式IE通讯、SIMATIC NET OPC Server和PG/OP通讯。本项目就是采用开放式IE通讯编程实现Modbus/TCP协议与水电站上位机系统通讯。软硬件版本为V
Modbus/TCP协议是简单的、中立厂商的用于管理和控制自动化设备的Modbus系列通讯协议的派生产品。Modbus/TCP协议是一种面向TCP连接的协议,只有在建立了TCP连接后,才能以半双工的方式进行数据交换。Modbus/TCP协议结构要求请求和响应带有六个字节的前缀,具体结构如下:
byte 0: 事务处理标识符 –通常为 0
byte 1: 事务处理标识符 –通常为 0
byte 2: 协议标识符= 0
byte 3: 协议标识符= 0
byte 4: 长度字段 (上半部分字节) = 0 (所有的消息长度小于256)
byte 5: 长度字段 (下半部分字节) = 后面字节的数量
byte 6: 单元标识符 (原“从站地址”)
byte 7: MODBUS 功能代码
byte 8:寄存器地址(高字节)
byte 9:寄存器地址(低字节)
byte 10:寄存器数量(高字节,固定为0)
byte 11:寄存器数量(低字节)
byte 12:后面数据字节数量-----写寄存器时有效
byte 13:寄数据1(高字节)-----写寄存器时有效
byte 14:寄数据1(低字节)-----写寄存器时有效
需要注意的是Modbus/TCP协议所有的请求都是通过端口号502发送的,而CPU315-2PN/DP模块的端口号只能设置为2000至5000。
4 软件实现
4.1 编程指令说明
在CPU315-2PN/DP这一边,不是通过NetPro设置通讯连接,而是通过编写程序实现。为了能通过用户程序和其它与TCP/IP兼容的通讯伙伴通过开放式IE通讯实现交换数据,STEP7(V5.3+SP1或以上)提供了四个功能块(FB)和一个用户定义数据类型(UDT)用于组态连接和数据交换:
1) FB63“TSEND”:用于发送数据
2) FB64“TRCV”:用于接收数据
3) FB65“TCON”:用于建立连接
4) FB66“TDISCON”:用于断开连接
5) UDT65“TCON_PAR”:包括组态连接属性的数据结构
以上功能块(FB)包含在Standard Library > Communication Blocks库中。
开放式IE通讯只能通过TCP/IP 建立以太网连接,通讯是面向连接的,只有与通讯伙伴建立了连接后才能传送数据。
要编程建立连接,需要创建一个包含UDT65“TCON_PAR”数据结构的数据快(DB)。该数据结构包含建立连接所需的所有参数,需要为每个连接创建一个这样的数据结构。一个连接建立之后,将受到 CPU 的监控,如果中间发生了中断,则自动尝试重新建立连接。
4.2 程序执行过程
整个以太网通讯程序分成以下五个部分:
1) 初始化
初始化程序在OB100中执行,主要设置连接ID、CPU315-2PN/DP端口号、上位机系统中操作员工作站IP地址和开始等待建立连接标志(FB65_REQ=1)。
2) 建立连接
由开始等待建立连接标志(FB65_REQ=1)调用FB65等待上位机系统中操作员工作站请求建立连接。如果上位机系统中操作员工作站请求建立了连接,且FB65被无错误执行建立了连接(FB65_DONE=1),设置开始接收数据标志(FB64_EN_R=1)和复位开始等待建立连接标志(FB65_REQ=0)。如果上位机系统中操作员工作站没有请求建立连接或请求建立了连接FB65执行后有错误发生,则程序不做任何处理,还是等待建立连接。
3) 接收数据
由开始接收数据标志(FB64_EN_R=1)调用FB64开始接收数据。如果上位机系统中操作员工作站发送了数据,且被FB64被无错误接收后(FB64_BDR=1),则调用Modbus/TCP协议处理程序(FB74)对接收到的数据进行判断和处理。如果上位机系统中操作员工作站没有发送数据或发生了数据FB64执行后有错误发生,则程序不做任何处理,还是等待接收数据。
4) Modbus/TCP协议处理
首先判断接收数据数量、寄存器地址和功能码是否正确。如果正确,则进行读/写数据处理,并准备正确响应所需数据。如果错误,则设置非法数据地址或非法功能码标志,并准备错误响应所需数据。程序执行完成后设置发送数据标志(FB63_REQ=1)和复位开始接收数据标志(FB64_EN_R=0)。
5) 发送数据
由开始发送数据标志(FB63_REQ=1)调用FB63开始发送数据。不管发送完成是否正确,只要发送数据完成了就设置开始接收数据标志(FB64_EN_R=1)和复位发送数据标志(FB63_REQ=0),然后开始等待接收数据。
4.3 程序块
为了实现CPU315-2PN/DP与水电站上位机系统中操作员工作站的数据交换,PLC需要下表1所示程序块:
程序块 |
说明 |
OB100 |
当CPU重新启动时,OB100被运行。在该OB中设置连接ID、CPU端口号、操作员工作站IP地址和开始等待建立连接标志。 |
OB1 |
在每个周期都运行,主要调用以太网通讯控制程序(FB73)。 |
FB63 |
发送数据功能块,由以太网通讯控制程序(FB73)调用。 |
FB64 |
接收数据功能块,由以太网通讯控制程序(FB73)调用。 |
FB65 |
建立连接功能块,由以太网通讯控制程序(FB73)调用。 |
FB73 |
以太网通讯控制程序,用于实现以太网的通讯控制。 |
FB74 |
Modbus/TCP协议处理程序,实现对接收到的数据进行判断、处理并准备上传所需数据。 |
DB1 |
用于存放远方遥控数据,从操作员工作站写入的遥控数据保存在该DB中。 |
DB2 |
用于存放远方遥调数据,从操作员工作站写入的遥调数据保存在该DB中。 |
DB5 |
用于存放遥信数据,操作员工作站读取的遥信数据保存在该DB中。 |
DB6 |
用于存放遥测数据,操作员工作站读取的遥测数据保存在该DB中。 |
DB7 |
用于存放定值数据,操作员工作站读取/写入的定值数据保存在该DB中。 |
DB8 |
用于存放SOE数据,操作员工作站读取的SOE数据保存在该DB中。 |
DB83 |
FB73与操作员工作站1通讯背景数据块。 |
DB84 |
FB73与操作员工作站2通讯背景数据块。 |
DB105 |
具有2个UDT65连接属性的数据块,该DB封装了与操作员工作站1、2通讯的参数。 |
DB106 |
具有300个字节的字节数组的数据块,用于存放与操作员工作站1通讯的临时数据。 |
DB107 |
具有300个字节的字节数组的数据块,用于存放与操作员工作站2通讯的临时数据。 |
UDT65 |
以太网连接属性的数据结构,包含了组态连接所必须的参数。 |
表1:PLC所需程序块
为了正确组态连接参数,必须了解连接结构(UDT65)中每个参数的含义。连接结构(UDT65)的说明如下表2所示:
字节 |
参数 |
数据
类型 |
初始值 |
说明 |
0 |
block_length |
WORD |
64 |
本数据结构的长度(字节数),固定为64。 |
2 |
id |
WORD |
1 |
连接ID号(范围16#0001-16#FFFF),通过初始化程序设置。 |
4 |
connection_type |
BYTE |
1 |
连接类型,固定为1:兼容的TCP/IP协议。 |
5 |
active_est |
BOOL |
0 |
连接建立方式,0:被动,1:主动,固定为0,CPU作为服务器,等待建立连接请求。 |
6 |
local_device_id |
BYTE |
2 |
本地设备ID,固定为2:CPU集成以太网接口。 |
7 |
local_tsap_id_len |
BYTE |
2 |
本地站TSAP长度,固定为2:TSAP为端口号。 |
8 |
rem_subnet_id_len |
BYTE |
0 |
远程子网长度,不相关。 |
9 |
rem_staddr_len |
BYTE |
4 |
远程站地址长度,固定为4:有效的IP地址,IP地址位于rem_staddr4个字节。 |
10 |
rem_tsap_id_len |
BYTE |
0 |
远程站TSAP长度,不相关。 |
11 |
next_staddr_len |
BYTE |
0 |
下一站地址长度,不相关。 |
12 |
local_tsap_id
ARRAY[1..16] |
BYTE |
0 |
本地站端口号(范围2000-5000) |
28 |
rem_subnet_id
ARRAY[1..6] |
BYTE |
0 |
不相关 |
34 |
rem_staddr
ARRAY[1..6] |
BYTE |
0 |
远程站IP地址,通过初始化程序设置。 |
40 |
rem_tsap_id
ARRAY[1..16] |
BYTE |
0 |
远程站TSAP或端口号,不相关。 |
56 |
next_staddr |
BYTE |
0 |
不相关 |
62 |
spare |
WORD |
0 |
不相关 |
表2:连接结构(UDT65)说明
4.4 以太网通讯控制程序
以太网通讯控制程序采用面向对象的结构化编程方法,在一个功能块(FB73)中封装了以太网通讯的建立连接、接收数据、调用Modbus/TCP协议处理程序和发送数据等过程。为此必须声明用于以太网通讯控制程序(FB73)输入、输出和输入/输出参数。具体声明的参数如下表3所示:
地址 |
声明 |
名称 |
类型 |
初始值 |
说明 |
0.0 |
IN |
Con_ID |
Word |
0 |
连接ID号 |
2.0 |
IN_OUT |
TCON_Start |
Bool |
0 |
开始建立连接 |
4.0 |
IN_OUT |
Connect |
Any |
|
连接参数地址指针 |
14.0 |
IN_OUT |
Data |
Any |
|
存放通讯临时数据的数据块指针 |
24.0 |
STAT |
TCON_Done |
Bool |
0 |
建立连接正确完成标志 |
24.1 |
STAT |
TCON_Busy |
Bool |
0 |
正在建立连接标志 |
24.2 |
STAT |
TCON_Error |
Bool |
0 |
建立连接错误完成标志 |
24.3 |
STAT |
TSEND_Start |
Bool |
0 |
开始发送数据标志 |
24.4 |
STAT |
TSEND_Done |
Bool |
0 |
发送数据正确完成标志 |
24.5 |
STAT |
TSEND_Busy |
Bool |
0 |
正在发送数据标志 |
24.6 |
STAT |
TSEND_Error |
Bool |
0 |
发送数据错误完成标志 |
24.7 |
STAT |
TRCV_Start |
Bool |
0 |
开始接收数据标志 |
25.0 |
STAT |
TRCV_Done |
Bool |
0 |
接收数据正确完成标志 |
25.1 |
STAT |
TRCV_Busy |
Bool |
0 |
正在接收数据 |
25.2 |
STAT |
TRCV_Error |
Bool |
0 |
接收数据错误完成标志 |
26.0 |
STAT |
Rcvd_Len |
Int |
0 |
接收到数据的临时长度 |
28.0 |
STAT |
Byte_Count |
Int |
0 |
接收到数据的长度 |
30.0 |
STAT |
FB_TSend |
FB 63 |
|
发送数据功能块多重背景 |
52.0 |
STAT |
FB_TRcv |
FB 64 |
|
接收数据功能块多重背景 |
76.0 |
STAT |
FB_Tcon |
FB 65 |
|
建立连接功能块多重背景 |
96.0 |
STAT |
FB_ModbusTCP |
FB 74 |
|
Modbus/TCP协议处理功能块多重背景 |
表3:FB73声明的参数
通过FB73封装了以太网通讯控制程序,当需要与计算机建立一个连接时只需在OB1调用一次FB73,当需要建立多个连接时多次调用FB73即可。注意:CPU315-2PN/DP最多可建立八个TCP/IP连接。
4.5 Modbus/TCP协议处理程序
Modbus/TCP协议处理程序采用面向对象的结构化编程方法,在一个功能块(FB74)中封装了数据数量、数据地址和功能码判断,处理并准备上传所需数据等全部过程。为此必须声明用于Modbus/TCP协议处理程序(FB74)输入、输出和输入/输出参数。具体声明的参数如下表4所示:
地址 |
声明 |
名称 |
类型 |
初始值 |
说明 |
0.0 |
IN_OUT |
Byte_Count |
Int |
0 |
以太网通讯接收到数据的长度 |
2.0 |
IN_OUT |
Data_DB |
Int |
0 |
存放通讯临时数据的数据块 |
表4:FB74声明的参数
5 结束语
本程序的难点在于实现对不同数据块的读取和写入,通过Modbus/TCP协议结构中寄存器地址字节8 (寄存器高字节)对应数据块号、寄存器地址字节9 (寄存器低字节)对应数据块字节号就可解决。
自本系统运行以来,CPU315-2PN/DP与上位机系统操作员工作站1、2通讯一直正常,从未出现过通讯中断现象,有效地保证了湖南铜信溪水电站监控系统的正常运行, 应用这种方法不需要采用西门子公司OPC能有效降低整个水电站监控系统成本。可见,采用通过开放式IE通讯与上位机系统通讯是一种行之有效的方法,实现了读取遥信、遥测、定值、SOE和写入遥控、遥调和定值等功能,完全满足《DL/T578-1995水电厂计算机监控系统基本技术条件》实时性、可靠性和通讯安全性要求。由此看来,西门子PLC集成PROFINET接口的CPU模块采用开放式IE通讯与第三方智能设备通过以太网交换数据是一种值得推广的方式。
参考文献
1. 使用STEP7 V5.3编程手册 2004.1
2. 用于S7-300和S7-400的语句表编程参考手册 2004.1
3. 用于S7-300和S7-400的系统软件和标准功能参考手册 2005.7