根据国家电监会关于电力系统二次防护的5号令的要求,通过配置单向隔离装置,将实时数据库(SIS系统)与辅助网络系统(水网、煤网、灰网)隔离。控制系统与接口机相连,数据只通过单向隔离装置指定端口单向通过数据接收工作站传送至实时数据库服务器。用户对实时数据的应用和分析访问实时数据库服务器,不对生产管理区造成安全威胁。基于此项安全要求,必须要有新的接口软件来代替原有的接口通讯模式(opc方式),即:数据发送采用UDP协议,辅网系统接口将获取或接收的控制系统原始数据发送到指定的地址和端口,实时数据库系统接口需要接收UDP数据包并解析即可获得标签点的实际数据。
Winsock控件提供了访问TCP和UDP网络服务非常简便的途径,只通过设置Winsock控件的属性并调用其方法,就可直接连接到一台远程计算机进行,并可实现双向数据交换。
WinSock主要支持两种类型的套接字:①流式套接字(Stream Socket)也称面向连接方式,该方式对应的是TCP协议,其传输特点是通信可靠性高,可以保证数据流的传输是可靠的、有序的、无重复的,可提供双向的数据流,数据被看作字节流,无长度限制。②数据报套接字(Datagram Socket)又称无连接方式,对应的是UDP协议,这种方式不提供数据传输的正确性、有序性和无重复性,因为它支持面向记录的数据流。因此,传输的数据可能丢失和重复,并且接收顺序混乱,报文长度是有限的。本系统选用数据报套接字方式。
3.辅助网络系统接口
本系统采用GE公司的iFix4.0作为辅助网络系统监控软件,iFix4.0具有可靠性高,稳定性好,功能强大的特点,尤其是iFix数据访问开发工具包(iFix DataBase Access Toolkit),该工具包允许应用程序编程人员访问iFix的实时和历史数据,该工具包主要包括了实时数据访问接口EDA,历史数据访问接口HDA。开发工具包中所提供的编程接口函数,是针对于Visual Basic语言所开发。
4.UDP方式发送协议简介
5.1.在创建的VB应用程序项目中应该首先添加2个模块(Module),这2个模块都是由iFix数据访问开发工具包提供的,其中一个模块是用于EDA编程接口使用的vdba.bas,另外一个模块是用于HDA编程接口使用的fixtools.bas,在vdba.bas模块中主要是基于VB格式的EDA接口函数,数据结构,常数的声明,而在fixtools.bas模块中主要是实现对fixtools.dll动态链接库的声明,基于VB格式的HDA接口函数,数据结构,常数的声明,此外还提供了其他函数声明,如iFix软件的安装路径,iFix是否正在运行。在添加了编程接口的声明模块后,就可以在VB应用程序中调用这些函数了。
5.2.执行VB工具栏“工程/部件” 命令,将Winsock控件添加到工程中, 并命名为“UDP”。程序采用UDP协议进行通信,其主要属性设定如下:
With UDP UDP协议参数设置
.Protocol = sckUDPProtocol 采用UDP协议
.RemoteHost = IP_REMOTE 远程计算机IP
.RemotePort = PORT_REMOTE 远程计算机端口
.LocalPort = PORT_LOCAL 本地端口号
.Bind PORT_LOCAL, IP_LOCAL 绑定本地端口、IP地址
End With
UDP协议设定完后,判断IFIX软件是否运行及从配置文件中读出IFIX数据库中的数据点的标签名,并把所有标签名按顺序存在(TagName)数组中。初始化工作完成。
5.3.创建读取开关量数据函数
G = eda_define_group(1, 0)
根据读取的iFix标签名(DI_TagName)数组,定义读取的一组标签的实时值“A_CV”
For i = 0 To DI_TagName - 1
DI(i) = eda_define_ntf(G, "FIX", DI_dataname(i), "A_CV", 0)
DI_datavalue(i) = 0
Next i
Call eda_lookup(G)
Call eda_wait(G)
Call eda_read(G)
Call eda_wait(G)
For i = 0 To DI_TagName – 1
将读取到的每个标签的实时数据读出赋值给变量
eda_err = eda_get_ascii(G, DI_TH(i), Value, 79)
DI_datavalue(i) = Trim(Format(Value, ""))
Next i
Call eda_delete_group(G)
将Timer控件添加到工程中,在属性中设置3000ms循环执行。
5.4.创建发送开关量数据函数
Private Sub DI_send()
……
Dim DI_send() As Byte
ReDim DI_send(LenB(DI_senddata(i)))
CopyMemory DI_b(0), DI_senddata(i), LenB(DI_senddata(i))
……
UDP.SendData DI_send
……
End Sub
5.5.创建读取模拟量数据函数
Private Sub AI_read_IFIX()
G = eda_define_group(1, 0)
根据读取的iFix标签名(AI_TagName)数组,定义读取的一组标签的实时值“F_CV”
For i = 0 To AI_TagName - 1
AI_TH(i) = eda_define_ntf(G, "FIX", AI_tagname(i), "F_CV", 0)
AI_datavalue(i) = 0
Next i
Call eda_lookup(G)
Call eda_wait(G)
Call eda_read(G)
Call eda_wait(G)
For i = 0 To AI_TagName - 1
将读取到的每个标签的实时数据读出赋值给变量
eda_err = eda_get_float(G, AI_TH(i), fvalue)
AI_datavalue(i) = Format(FVALUE, "####0.00")
Next i
Call eda_delete_group(G)
End Sub
5.6.创建发送模拟量数据函数
Private Sub AI_send()
……
Dim AI_send() As Byte
ReDim AI_send(LenB(AI_senddata(i)))
CopyMemory AI_send(0), AI_senddata(i), LenB(AI_senddata(i))
……
UDP.SendData AI_send
……
End Sub
5.7.执行VB工具栏“工程/部件” 命令,将Timer控件添加到工程中,并在属性设置中设置3000ms循环执行。编辑代码调用读取及发送程序。
Private Sub Timer1_Timer()
读取模拟量数据并发送
AI_read_IFIX
AI_send
读取数字量数据并发送
DI_read_IFIX
DI_send
End Sub
6.结束语
采用Winsock控件实现的UDP发送数据程序,已成功应用于甘肃永昌电厂辅助网络系统中,程序简单稳定,很容易实现辅助网络系统向SIS系统发送实时数据的功能,达到了理想的效果。
掌握并灵活应用iFix 软件的EDA,HDA编程接口,泡芙视频app下载安装就可以用VB6.0语言开发出符合不同SIS系统的应用程序。本文的论述对解决这类问题提供了一定参考价值。
参考文献:
[1].GE.Intelution公司.iFix Database Access Toolkit Help
[2].周轶峰,杨建新,《Visual Basic 6.0 实用编程技术》,中国水利水电出版社,1999