WinCC中访问SQL SERVER数据库
有两种身份验证方式可以连接到SQL Server数据库,它们是Windows身份验证和SQL身份验证。在本文中,WinCC将使用Windows身份验证进行连接,但我展示了使用SQL身份验证连接到SQL Server的连接字符串。
注意:在本文中,我假设您已经安装了SQL Server。 我使用过SQL Server 2008,但这里完成的所有步骤对SQL Server 2005都有效。在本文中,我创建了一个数据库,因此我们可以进行读取和插入。 对于许多实际情况,工厂或系统已经有一个数据库。 因此,唯一需要的就是在WinCC中操作。
创建SQL Server数据库
在“Database”上单击鼠标右键,然后单击“New Database...”(新建数据库)
在“Database name:”上键入“SQL_WINCC”(或您想要的任何名称)
在“Database> SQL_WINCC”下,右键单击“New Table ...”(新表),然后创建这些列,如下图所示。
最后将其命名为“Table_1”。
SQL_WINCC 数据库看起来是这样...
注意:我没有在“Table_1”中创建索引或主键,因为SQL Server配置不是本文的重点! 但在实际系统中,强烈建议创建它们。
创建WinCC应用程序
打开WinCC项目管理器,然后单击“New”(新建)
选择“Single-User Project”(单用户项目),然后选择“OK”(确定)。
将其命名为“WinccSql”,然后“Create”(创建)。
WinCC Explorer中看起来会是这样
创建内部标签
在“WinccSql”下的WinCC项目管理器中,双击“Tag Management”(变量管理)
单击“Tag Management > Internal Tags”(标记管理>内部标记)并创建这12个标记。
这些标签将在主屏幕中使用。 其中一些保存来自SQL Server的数据,而其他的保存插入到SQL Server的数据。
配置屏幕
在“WinccSql”下的WinCC项目管理器中,双击“Graphics Designer”(图形编辑器)。 将打开一个名为“NewPdl_1”的空白页面,就像这样。
使用“矩形”,“静态文本”和“I / O域”对象,按下图这样摆放。
按下图这样,在“属性> I / O域>输出/输入>输出值”中,将它们绑定到相应变量:
将绑定了变量“TAG_STRING_INSERT”,“TAG_STRING_11”和“TAG_STRING_21”对象的“属性> I / O域>输出/输入>数据格式”更改为STRING。
创建VB脚本
介绍
与数据库通信的最简单方法是使用VB-Script,它基本上需要4个步骤。
- 连接配置
- 命令配置
- 记录集配置
- 管理从数据库返回的数据
连接配置基本上具有以下参数:
- 数据提供商 Provider
- 数据服务器(服务器名称)
- 初始目录(要连接的数据库)
- 认证
在本文中,我使用此连接字符串:
Provider=SQLOLEDB;Data Source=MAWINWINCC;InitialCatalog=SQL_WINCC;Trusted_connection=yes;
“Trusted_connection”表示连接将通过Windows身份验证完成。 对于SQL身份验证,连接字符串将如下所示:
Provider=SQLOLEDB;Password=1234567890;Persist Security Info=True;User ID=sql_user;Initial Catalog=SQL_WINCC;Data Source=MAWIN\WINCC
“Insert”按钮的VB脚本
单击“插入”按钮并浏览到“事件>静态文本>鼠标>鼠标单击> VBS操作”。 现在在那里复制这个脚本。
'connection对象 Dim cn 'recordset记录集对象 Dim rs 'command命令对象 Dim mc Dim sql Dim column1 Dim column2 Dim column3 Dim column4 Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") Set mc = CreateObject("ADODB.Command") '相当于是adUseClient枚举值,表示用在客户端中 cn.CursorLocation = 3 '连接字符串 cn.ConnectionString = "Provider=SQLOLEDB;Data Source=MA1815\WINCC;Initial Catalog=SQL_WINCC;Trusted_connection=yes;" '打开连接 cn.Open 'Read the tags that will be inserted into database column1 = HMIRuntime.Tags.Item("TAG_STRING_INSERT").Read column2 = HMIRuntime.Tags.Item("TAG_INT_1_INSERT").Read column3 = HMIRuntime.Tags.Item("TAG_INT_2_INSERT").Read column4 = HMIRuntime.Tags.Item("TAG_INT_3_INSERT").Read 'SQL语句 sql = "INSERT INTO TABLE_1 (COLUMN_1, COLUMN_2, COLUMN_3, COLUMN_4) VALUES ('" & column1 & "', " & column2 &", " & column3 & ", " & column4 & ")" '配置命令对象 Set mc.ActiveConnection = cn '表示命令中的文字是一个SQL语句 mc.CommandType = 1 mc.CommandText = sql '执行命令 rs.Open mc, , 2, 1 '关闭连接 cn.Close
点击OK按钮
Select按钮的脚本
单击“选择”按钮并浏览到“事件>静态文本>鼠标>鼠标单击> VBS操作”。 现在在那里复制这个脚本
Dim cn 'connection 连接对象 Dim rs 'record set 记录集对象 Dim mc 'command 命令对象 Dim i Dim sql Dim column1 Dim column2 Dim column3 Dim column4 Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") Set mc = CreateObject("ADODB.Command") '相当于是adUseClient枚举值,表示用在客户端中 cn.CursorLocation = 3 '连接字符串 cn.ConnectionString = "Provider=SQLOLEDB;Data Source=MA1815\WINCC;Initial Catalog=SQL_WINCC;Trusted_connection=yes;" '打开连接 cn.Open '在本文中,我为了方便起见,限制在2个寄存器内,但您可以从SQL中读取一些数据,然后将它们写入网格中,比如 sql = "SELECT TOP 2 COLUMN_1, COLUMN_2, COLUMN_3, COLUMN_4 FROM TABLE_1" '配置Command对象 Set mc.ActiveConnection = cn '表示CommandText中的是一个SQL语句 mc.CommandType = 1 mc.CommandText = sql '执行SQL命令 rs.Open mc, , 2, 1 '假如找到了至少一条记录 If rs.RecordCount > 0 Then rs.MoveFirst '循环以获取从数据库读取的所有数据 For i = 1 To rs.RecordCount '从数据库中读取数据 column1 = rs(0) column2 = rs(1) column3 = rs(2) column4 = rs(3) 'TAG_STRING_11 或 TAG_STRING_21 或 ... TAG_STRING_n1 HMIRuntime.Tags.Item("TAG_STRING_" & i & "1" ).Write column1 'TAG_INT_12 或 TAG_INT_22 或 ... TAG_INT_n2 HMIRuntime.Tags.Item("TAG_INT_" & i & "2").Write column2 'TAG_INT_13 或 TAG_INT_23 或 ... TAG_INT_n3 HMIRuntime.Tags.Item("TAG_INT_" & i & "3").Write column3 'TAG_INT_14 或 TAG_INT_24 或 ... TAG_INT_n4 HMIRuntime.Tags.Item("TAG_INT_" & i & "4").Write column4 '继续下一条 rs.MoveNext Next End If '关闭记录集 rs.Close '关闭连接 cn.Close
现在,单击“OK”。
完成了! 运行WinCC!:)