这个貌似很早之前就遇到过的一个问题了,但由于以前的个人习惯不好,竟然没有记录下问题的解决方法,不知各位工程师中有多少会有这个不好的习惯呢?
言归正传,问题是啥呢?这是前一段热线上遇到的一个客户的抱怨:我组态了一条离散量报警,在该报警中我还使用了过程值块用于记录报警发生时我所关心的关键模拟量值(这个功能相信有很多用户也都用过,没用过的就请参考帮助了)。最终测试时发现我每次触发报警后模拟量值都会被记录到报警消息的过程值块中,但问题是这个值每次都是上一周期的值,这可没有满足我的需求啊。
一听到此心里还窃喜:还好这问题我早遇到过。可是回头一想我好像也记不清该如何解决了,这才深刻体会到好脑子不如烂笔头,于是只能重新测试后再告知客户了。
最后得到的解决方法有两种:
方法1:
通过组态模拟量报警可以解决该问题,但前提是要触发的报警与要获取的过程值是同一个变量,但如果不是该方法就无法解决该问题了。
方法2:
需要修改注册表,可参照 FAQ :
http://support.automation.siemens.com/WW/view/en/22269712
首先解释一下该 FAQ :
熟悉 WinCC 的工程师应该会知道在 WinCC 中的报警可以有两种方式来产生:1、WinCC 非集成方式的组态,所有报警都需要关联到触发变量上;2、WinCC 集成组态方式下的消息上发机制。
我们现在所提及的完全是方式 1 ,而在这种方式下的报警需要由所关联的变量来触发的,因此在 WinCC 中需要不断的去轮询触发变量的状态,也就意味着这个轮询是有一个周期的,在默认情况下这个周期为 500 ms 。而在一些特殊情况下如果需要提高这个轮询的周期,这就是这篇 FAQ 的目的所在了(当然我们是强烈建议使用默认配置的)。
而针对目前客户所遇到的这个问题的主要原因在于报警变量的轮询周期要快于或等于了附加过程值的轮询周期,所以导致了在消息中被附加的过程值实际要慢于报警变量的值。那么解决方法自然就有了:
"CycleSetValues"= "00000003" // 确认变量 (默认值 3)
"CycleAlarms"= "00000003" // 报警变量 (默认值 3)
"CyclePValues"= "00000000" // 过程值变量 (默认值 0)
当然问题到此是解决了,但是其实背后的一些问题是值得探讨的,有兴趣的工程师们也大可发表一些看法我们再进一步的进行讨论。