WinCC与S7-1500 RH冗余系统的通信解析
作者: 张占领 - 西门子工业技术支持中心
来源:西门子文档“WinCC_S71500R_GS”
写在前面(文中超链接仅在微信公众号“智能制造之家 ”有效)
前面我们介绍了很多WinCC相关的知识:
WinCC V7.5典型架构及选型指南
WinCC的虚拟化架构与技术
WinCC与第三方系统数据交互—IndustrialDataBridge
WinCC与MES的生产工单和批次数据交互
WinCC是如何承接上层MES和下层PLC的通信的?
也介绍了西门子的冗余系统:
什么是冗余系统—记1515R冗余编程组态调试
什么是软冗余——S7-300/400软冗余调试学习
今天来聊一聊WinCC与西门子S7-1500R/H系统的通信~
WinCC与S7-1500R/H冗余系统通信有2种方式
以下为本次采用的软件和硬件:
软件:
WinCC : SIMATIC WinCC V7.5 SP1
Step7:SIMATIC STEP7 Professional V16
硬件:
CPU 1515R-2 PN
IM 155-6 PN
方法1:系统IP通信
WinCC通过S7-1500R/H的系统IP通信,这时S7-1500R/H的2个CPU被看作1个PLC,系统IP自动连接到主PLC。当主PLC宕机后,WinCC通过此系统IP自动切换到备用PLC上。这种方式组态简单,与单PLC无异,WinCC通信连接中的IP地址输入S7-1500R的系统IP即可。
这种方式适用PC是单网卡的网络结构
这种连接方式下支持符号访问,也支持AS 读取变量,我们着重介绍方法2
方法2:通过系统变量通信
WinCC V7.5 SP1 开始支持通过”系统变量“控制的S7-1500R/H冗余通信。可支持单网卡的网络,也可支持双网卡的冗余网络。
原理:WinCC与主PLC的固定IP通信,监视”通讯连接状态的系统变量“,当主PLC宕机后,WinCC通过“通信控制变量”切换到备用PLC的固定IP进行通讯。
组态步骤如下:
第一步:创建连接
在WinCC中创建CPU1的连接,用其固定IP地址
第二步:创建系统变量
在WinCC连接下,手动创建系统变量,变量名格式为“@连接名称@变量名称”。变量地址为空或者使用PLC中没有用到的地址。其变量名称和数据类型如下
各系统变量的作用如下:
“@<connectionname>@ForceConnectionState” :用来建立/终止冗余连接,设置为1:建立连接,设置为0:断开连接。这里此变量建议设置初始值为1“@<connectionname>@ConnectionState” :用来反馈冗余连接状态, 值为1时代表连接已经建立,值为0时代表连接已经断开“@<connectionname>@ConfiguredAddress” :用来反馈所组态的连接参数属性。格式为“AccessPoint=访问点名称;IPAddress=PLC IP地址;”“@<connectionname>@AlternativeAddress” :设置与备用 CPU(CPU2) 的连接的参数属性,格式为“AccessPoint=访问点名称;IPAddress=备用PLC IP地址;”,需要设置初始值 备用连接和组态的连接可以使用同一个访问名,也可以使用不同的访问名。使用不的访问名时,WinCC可以指定两块网卡分别连接S7-1500R的两个CPU。“@<connectionname>@CurrentAddress” :反馈当前连接的参数属性。“@<connectionname>@UseAlternativeAddress” : 设置使用组态的连接还是备用连接,设置为1:使用备用连接,设置为0:使用组态的连接。“@<connectionname>@OpStateConfiguredAddress ” :读取S7-1500R的CPU1 当前的操作模式,0: not connected,4: STOP,6: STARTUP,8: RUN,22: SYNCUP。“@<connectionname>@>@OpStateConfiguredAddress” :读取S7-1500R的CPU2 当前的操作模式,0: not connected,4: STOP,6: STARTUP,8: RUN,22: SYNCUP。“@<connectionname>@RedundantCPUs” :指示所连接的控制器是否冗余,设置为1:代表所连接的PLC是S7-1500R/H,设置为0代表所连接的PLC是非冗余的S7-1200/1500。这里设置初值为1。第三步:变量赋初值
为“@AlternativeAddress”和 “@RedundantCPUs” 赋初值。
“@AlternativeAddress”为“AccessPoint=CP_H1_1:;IPAddress=192.168.1.2; ”“@RedundantCPUs”为1。第四步:创建全局动作
通过变量“@UseAlternativeAddress”设定WinCC的连接参数,包括访问点和PLC IP地址。
注意:修改“@UseAlternativeAddress”的值后,需重新置位 “@ForceConnectionState”。
1、创建全局VBS动作
创建全局VBS动作,自动切换WinCC连接参数,包括下面2种情况:
(1)当前连接中断
(2)S7-1500/1200 被置STOP模式
判断方法:
(1)@ConnectionState=0代表当前连接中断。
(2)WinCC连接正常时(@ConnectionState=1)
当@UseAlternativeAddress = 0并且@OpStateConfiguredAddress = 4时,代表当前WinCC连接到CPU1,并且所连接的CPU为STOP模式。当@UseAlternativeAddress = 1并且@ OpStateAlternativeAddress = 4时,代表当前WinCC连接到CPU2,并且所连接的CPU为STOP模式。VBS动作脚本
以上脚本可以在WinCC帮助中搜索‘VBS381’来获取
2、VBS动作的触发器
当WinCC连接中断或所连CPU的操作模式变为STOP时,需要触发切换脚本。
设置VBS动作的触发器
相关推荐
工业以太网网络拓扑、冗余环网入门与实例分析—PN
西门子WinCC OA的冗余、分布式及混合模式浅析:从软件架构到实例应用
使用S7-1200和1500 轻松连接物联网MQTT 消息服务器
当树莓派+S7-1500与阿里云跨界相遇-自动化工程师的数字化之路
第五步:启动运行
在WinCC启动列表中选择“全局脚本运行系统”,然后激活WinCC运行系统。
可以看到,当WinCC与主PLC连接网络中断或主PLC变成STOP模式时,WinCC连接都会切换连接至备用PLC,保证正常通信。
说明:
1、WinCC使用两块网卡和S7-1500R/H通信
WinCC可组态不同的网卡进行通信。设置变量“@AlternativeAddress”使连接不同的访问名,本文中,主连接使用访问名“CP_H1_1:”,备用连接使用访问名“CP_H1_2:”,这样WinCC就可以使用两块不同的网卡分别连接冗余的两个CPU。
2、如何确保WinCC连接到主CPU
WinCC通过系统IP与S7-1500R/H通信时,是系统主动识别并连接到主CPU的。但WinCC通过系统变量控制通信连接的方式,则不一定,需要确保WinCC中设定的主连接(如IP地址)是指向当前实际的主CPU (S7-1500面板上显示P为主CPU,B为备CPU).
硬核专辑
工业热点 | 数据采集 | 应用与库(西门子、罗克韦尔、倍福等)
WinCC技术 | 工业网络 | MES技术相关| 工业巨头战略布局 | 工业通讯案例
仿真与虚拟调试 | 职业感悟、认知提升 | 自动化控制标准合集
解析工业网络中的交换、路由、VLAN,工业网络的个人进阶指南|原创
2020-09-16
工业软件:一文讲透国内外MES/MOM市场格局,主流厂商及其优势行业
2020-09-19
工业网络的两层与三级-从PLM、MES到SCADA、PLC的连接
2020-09-15
工业互联网平台核心技术之一:数据集成与边缘处理
2020-09-12
到底是什么让工程师成了一份苦逼的工作??
2020-09-09
工业软件巨头解读:西门子是一家软件公司,达索是一家“3D体验”公司
2020-09-08
西门子、施耐德、罗克韦尔PLC程序设计漏洞探秘
2020-09-07
一文了解西门子、达索、施耐德、罗克韦尔等巨头数字化工厂仿真软件
2020-08-27
WinCC (TIA Portal) 访问 SQL SERVER数据库
2020-08-22
134页官方PPT解读西门子数字化工业服务
2020-08-24
WinCC与MES的生产工单和批次数据交互
2020-08-07
TIA Portal WinCC 使用VBS脚本调试的21个实用技巧
大家好,我是小智,智能制造之家号主(需要进群交流的,请点击文末的扩展链接加入)~
前面的文章中,我们已经从TIA Portal WinCC,到 WinCC Classic,再到WinCC OA的架构,选型到与MES通讯,工业数据桥,虚拟化等通通聊了一遍(具体见文末)
但是不论是使用TIA Portal WinCC 、WinCC Classic还是WinCC OA,脚本调试、各种通讯总是必不可少,还记得在前面的文章:
自动化早已不是原来的自动化,为何你却还是原来的你
我就提醒大家多学习编程和网络相关知识,其实随着IT与OT的不断融合,即使你还是做的自动化,但是却与IT的界限越来越模糊,自动化的你们正在走进IT的同时,IT也正在向我们走来,今天的自动化,早已经不是单纯自动化~
今天我们就来聊一聊TIA Portal WinCC VBS脚本调试的一些使用技巧,如果对前面推出的其它文章感兴趣的请参看文末往期推荐~
1、为什么一个由内部变量的 “数值改变” 事件触发的脚本不被执行
如果使用一个内部变量调用另外一个内部变量,以此,例如被调用的变量又去执行一个脚本(比如,根据变量变化),此时一个安全机制会阻止这个功能被执行。
此安全功能是为了阻止连续的执行。
例如
在内部变量 “HMI_Tag_01” 属性下,“更改数值”事件去置位内部变量 “HMI_Tag_02” 中的某一位。
同时内部变量 “HMI_Tag_02” 的“更改数值”事件下又调用一个脚本。
结果: 这个脚本不会被执行。
解决办法
使用和控制器通讯的外部变量。请注意,通过使用外部变量可以规避上述安全机制。在项目运行时可能会产生问题。
2、 如何在一个脚本中访问数组中的元素?
对数组元素的访问是通过数组的名称和数组中由括号分隔的数组索引来实现的:“SmartTags("Array Name")(array index) ”
例如
访问数组 "DB10_HMI_Data" 的第二个元素 :
Dim Tag_01 'Internal script tag
Tag_01 = SmartTags("DB10_HMI_Data")(2)
注意
使用下面语法访问字符串类型数组中的元素:
Dim Tag_01 'Internal script tag
Tag_01 = SmartTags("DB10_HMI_Data[2]")
例如
通过一个循环描述数组 "DM10_HMI_Data" 的第一个元素至第十一个元素
Dim Tag_01
For Tag_01=0 to 10
SmartTags("DB10_HMI_Data")(Tag_01) = 5
Next
局部脚本的数组(该数组仅在此脚本中可用)可以使用同样的方式查询,对于多维数组,各个维度通过一个逗号分隔开。
例如
访问二维数组变量 "HMI_Data" 没有连接控制器。
Dim HMI_Data(10,10)
Dim Tag_01
Tag_01 = HMI_Data(0, 5)
注意
当使用控制器连接的数组元素时,推荐在脚本开始前将他们赋值给脚本内部变量,然后再使用内部变量进行其他工作。结束脚本前,将内部变量赋值给数组元素。
3、如何在控制器和脚本之间有效的赋值过程变量数组?
从控制器到一个脚本赋值,过程变量数组需要在一个循环中将数组元素一个一个赋值,参考示例。然而,也可以通过一个简单的指令把局部脚本的数组的值赋给过程变量数组。
例如
把控制器的数组 "CPU_Array" 的值赋给内部数组 "local_array" 和 把内部数组 "local_array" 的值赋给控制器的数组 "CPU_Array"
Dim local_array(10)
Dim i
...
' Copy from the CPU to the script:
For i = 0 To 9
local_array(i) = SmartTags("CPU_Array")(i)
Next
...
' Copy back to the CPU:
SmartTags("CPU_Array") = local_array
注意
使用数组可能导致较高的通信负载和数据不一致。
4、如何访问动态库 ( "动态链接库 ",DLLs)?
WinCC Comfort 和 Advanced 不能访问 DLLs。
WinCC Professional在用户定义的C函数里可以调用DLL函数 (DLL = Dynamic Link Library) 。
5、如何用VBS脚本确定鼠标当前的位置?
为了读取当前鼠标的位置,需要访问操作系统的 API (Application Programming Interface) 。
VBS 不支持通过 DLLs 访问操作系统的 API 。
6、为什么不能在脚本里使用 “ MsgBox ” 命令?
“MsgBox” 命令不能用于 WinCC Comfort 和 WinCC Advanced 版本是由于安全的原因。 “MsgBox”的弹出显示可能会覆盖掉元素操作,比如:阻止设备的快速操作。此外,消息框可能会阻止脚本的进一步执行。
解决办法
可以使用系统函数 ShowSystemAlarm。
7、如何在一个脚本中使用十六进制符号给变量赋值?
在脚本编辑器中把字符组合 "&h" 作为个十六进制常数的标识。
例如
Dim Tag_01
Tag_01 = &h45E ' Corresponds to the decimal value "1118"
8、如何在脚本里显示或隐藏各个层级?
使用层是 WinCC (TIA Portal) 开发系统的一个功能。层只能在这里组态及显示隐藏。
这个功能在操作面板或 PC 的运行系统中不可用。所以不能用脚本显示或隐藏“层”。
解决办法
在 “ 属性>动画>可见性 ” 组态变量,根据变量值控制相关对象的显示或隐藏。
9、如何在脚本中合并字符串?
可以使用 “ & ” 来合并字符串:
例如
将 "Tag_Text_01", "Tag_Text_02" 和 "Tag_Text_03" 合并成新字符串 "Tag_01"
Dim Tag_01, Tag_Text_01, Tag_Text_02, Tag_Text_03
Tag_01 = Tag_Text_01 & Tag_Text_02 & Tag_Text_03
注意
VB函数 CStr (Expression) 将相应的表达式转换为“字符串”类型。 这样在连接字符串转换之前可以避免运行时出现错误。
10、在脚本中如何在单独的字符串之间插入一个通配符(空格)?
为了在两个文本之间插入任意数量的空格,可以使用两个引号 " "。“空格”的数量取决于两个引号间的距离 " "。
连接下一个字符需要再次使用连接操作 "&"。
例如
将字符串 "Tag_Text_01", "Tag_Text_02" 和 "Tag_Text_03" 还有空格组合成一个新的字符串 "Tag_01"
Dim Tag_01, Tag_Text_01, Tag_Text_02, Tag_Text_03
Tag_01 = Tag_Text_01 & " " & Tag_Text_02 & " " & Tag_Text_03
11、如何组态带返回值和参数的脚本?
脚本类型必须是 “ Function ” 才可以有返回值。所以,请在TIA Portal 中添加新 VB 函数的 "Properties > General > Settings" 类型的下拉列表框中选择 “Function” 。
在 “ Parameter ” 表格中您以创建脚本变量用来将内部变量或控制器变量传入在脚本需要的时候。
组态函数返回值,在脚本中为脚本的名称分配表达式。
例如
组态函数类型,。按下面所示,在TIA Portal 组态名称为 “ VBFunction_1 ” 脚本函数的参数和返回值:
图. 01
例如,
脚本在按钮的 “ Click ” 的事件中被使用。
图. 02
在脚本中使用 "HMI_Tag_1" 的值赋给"Parameter_1" ,"HMI_Tag_2" 的值赋给"Parameter_2" ,必须有一行脚本定义了返回值。
例如
下面的例子的返回值是两个传入参数的乘积:
VB_Function_1= Parameter_1 * Parameter_2
"VB_Function_1" 是这个函数的名字,在执行这个脚本后,"HMI_Tag_3" 获得这个函数的返回值是 "HMI_Tag_1" * "HMI_Tag_2" 。
注意
定义一个 "by reference" 的参数 ,这意味着作为 "By_Ref " 参数,仅对脚本中定义的和引用的变量产生影响,对 HMI 内部变量或者控制器变量不起作用。
12、什么能导致“最大嵌套深度到达”消息被触发?
如果太多的脚本在结束前调用自己或者调用其他脚本,会引起到达最大嵌套深度消息。
解决方法
检查脚本过程的处理,如有必要,减少脚本的嵌套。
13、如何确定当前画面的编号和画面名称?
通过预定义 VB 函数 “HmiRuntime.BaseScreenName ” 的返回值提供了当前画面的名字。
注意
不能使用脚本通过相关画面的“属性”直接读取画面名称/编号。
也可以使用“画面编号”区域指针。
14、如何在脚本中使用多路复用变量?
多路复用变量不能用在脚本中。
15、如何在脚本里使用 HMI UDT 变量?
可以使用“SmartTags” 访问数据类型是HMI UDT的变量元素(用户定义的数据类型)。
例如
访问 UDT 变量 " Recipe " 的元素 "x"
SmartTags("Recipe.x")
注意
这适用于在项目中已创建库类型 HMI UDT的实例。不能直接访问库类型。
16、如何在脚本中保存变量值当他们在两个脚本之间调用?
在两个脚本间相互传递数据需要使用全局变量。全局变量可以是 HMI 或者 PLC 变量。
脚本中定义的变量总是在脚本结束时删除。
17、如何通过脚本修改文本域的内容?
文本域的文本在运行时可以通过修改相应的对象属性而改变。
例如
在画面 "MachineData" 中,将文本 "NewText" 分配给 文本域 "Text_Field_01" :
Dim obj
Set obj = HmiRuntime.Screens("MachineData").ScreenItems("Text_Field_01")
obj.Text = "NewText"
注意
文本的变化只是“暂时”的。当屏幕更改后这个被修改后的文本将被组态的文本覆盖。
18、如何在脚本中从密码列表或用户视图中读取用户密码?
由于安全原因这个功能在 WinCC (TIA Portal) 中不能实现。
19、如何通过脚本关闭 WinCC 运行系统和关闭PC和面板?
通过系统函数 “StopRuntime” 可以关闭 WinCC 运行系统和操作系统 。
可以通过修改 "StopRuntime" 函数的参数方式选择仅关闭运行系统或者将运行系统和操作系统都关闭。
ParameterMeaning
0 = hmiStopRuntime
Ends on the Runtime
1 = hmiStopRuntimeAndOperationSystem
Ends both the Runtime and the OS
例如
StopRuntime hmiStopRuntime
StopRuntime 1
注意
Windows-based 面板的操作系统不能通过这种方式关闭。
20、如何在脚本中访问一个画面或者模板的对象?
组态 “Runtime” 对象的属性 “ ActiveScreen ”,可以找到画面上组态对象的名字和修改相关的属性。
例如
把激活屏幕中的对象 "Circle_01" 设置为不显示
HmiRuntime.ActiveScreen.ScreenItems("Circle_01").Visible=False
注意
在画面中被组态对象必须有唯一的名字。对象的属性修改仅是暂时的,当屏幕更改后视图使用组态时的配置。
21、如何在运行时选择一个画面对象(例如输入输出域)?
获得一个对象的焦点通过 "Activate" 功能,文本输入会直接自动指向那个对象。
例如
获得屏幕 "Screen_1" 的 输入/输出域 "IOField_1" 的焦点
HMIRuntime.Screens("Screen_1").ScreenItems("IOField_1").Activate
来源:自动化工程与技术
相关问答
PLC脚本编程什么意思?
简单说一下PLC全称可编程逻辑控制器,可见其本质就是一种控制器,这种控制器可大致看作由处理器、寄存器、输入输出组成。PLC编程的本质就是制定一套程序,让...
各种组态软件里面的脚本编程怎么学?
工业行业的这些电气工程师,让他们写点脚本都困难,PLC里面还专门搞了梯形图来适应他们,然而我学PLC都不需要练习梯形图,直接用SCL语言搞定。他们用的组态软件...
触摸屏脚本程序是不是可以实现PLC编程实现的功能?简化PLC程序,请大神们指点?
如果原来是面板上的开关按钮,现在全部能用触摸屏通过控制PLC的辅助寄存器实现,只不过PLC程序中原来的输入点x要用辅助寄存器m替换掉。因此可以用较少的输入点...
WinCC中C脚本数据类型全总结,C脚本如何读写WinCC的变量?
连接?如果我没有理解错的话可能你是想读写wincc变量吧?在脚本中,C脚本基本是这样的语句:FloatF;F=GetTagFloat(“TAG1”)这样就可以读出TAG1的数值,不...
西门子300编程软件有哪些?-ZOL问答
脚本CD_1\STEP7\Disk1\setup.msiCD_1\STEP7\HF1\Disk1\setup.msiCD_1\S7PCT\Disk1\setup.msiCD_1\S7-Plcsim\D...
组态王通讯问题???-盖德问答-化工人互助问答社区
态王连控制器,控制器下面io设备挂tdc400吧。要是tdc400自...wincc与组态王通过opc通讯应该可以的那组态王与触摸屏之间能否实现通讯?该如何实现...
30几岁想学习机械自动化编程,PLC。求推荐入门?
看看电气设计方面的📖书,入门很快的,然后学习PLC,抖音有些老师在直播,不想走弯路的话就出几百块去学习一下,比自己一个人摸索强多了。自动化控制大的方面包...
软件开发都有哪些?
一、从行业上划分,软件开发有以下:1、手机MacOS(苹果的),Linux,Palm(最大特色是不能后台),BlackBerry(黑莓)WindowsPhone(WP,不错的系统,)An.....
wincc用c脚本怎样使plc的常开按钮按下后一直保持接通?
此种动作建议在PLC内部实现(按钮按下置位一个中间Mx.x),最好不用wincc的C脚本(工控机出问题或关机,可能出现意想不到的问题)。此种动作建议在PLC内部实现(按...
PLC如何替换输出点?
直接在触摸屏修改变量地址或者添加脚本将该变量赋值给另外一个新变量(地址为新输出点)就可以了,不用动下位。直接在触摸屏修改变量地址或者添加脚本将该变量...