作者 | 主题 |
---|---|
xiatianyun 侠圣 经验值:4876 发帖数:741 精华帖:10 |
楼主 2023-07-20 15:57:43
主题:经典WinCC7.5Sp2 仪表圆弧图形报警角度的脚本设计 模拟量弹窗用指针仪表WinCC Gauge Control显示,但我没研究明白它的报警区如何显示,所以还是参考LBP的做法,配合圆弧来指示报警区。 这里就不给出Gauge了,只截取圆弧。 控制圆弧的起始角度和结束角度就可以控制显示报警区指示。 圆弧的角度问题实在是反人性,0度是X坐标的正向,顺时针增加到360度和0度重回。也可以逆时针用负角度表示。 起始和结束都以顺时针方向来划分,幸好这样。 接受大于360度的角度,自己会处理成360度内的角度,这个是我的分析。 LBP处理脚本不能实现任意刻度角度下的角度适配,只能处理180度如图所示的刻度。 比如下图所示的圆弧刻度LBP就需要自己修改脚本来适应: 偷懒是每个技术员的基本需求和技能修炼。 ---------------------------------------------------------- 刻度一共有5条圆弧构成,其中基本圆弧cirNoraml是最重要的圆弧,设置它的两个控制角度也就设置了刻度角度。这样需要打开画面时自动把其他四条圆弧的控制角度先设置成和cirNormal一致。这样并不需要组态时设置其他圆弧的角度。 在某个圆弧的几何属性中处理模拟量范围限值、报警限值改变的事件,以此来修改报警圆弧的角度: Function StartAngle_Trigger(ByVal Item) Dim NormObj, HHObj, HObj, LObj, LLObj Dim min, max, spanValue Dim startDeg, endDeg, spanDeg Dim degreePer1 Dim x, y ' 记忆各个控制点的原始数据,方便做不合理情况的处理比较。 Dim HH, H, L, LL
Set NormObj = ScreenItems("cirNormal") Set LLObj = ScreenItems("cirAlarmLow") Set LObj = ScreenItems("cirWarningLow") Set HObj = ScreenItems("cirWarningHigh") Set HHObj = ScreenItems("cirAlarmHigh")
min = SmartTags(".Cfg_Y1").Value max = SmartTags(".Cfg_Y2").Value spanValue = max - min
' show decimal point ScreenItems("gau").ShowDecimalPoint = (spanValue / 5) < 1
startDeg = NormObj.StartAngle endDeg = NormObj.EndAngle startDeg = startDeg Mod 360 endDeg = endDeg Mod 360 If startDeg < 0 Then startDeg = startDeg + 360 End If If endDeg < 0 Then endDeg = endDeg + 360 End If If endDeg < startDeg Then spanDeg = 360 - startDeg + endDeg Else spanDeg = endDeg - startDeg End If
degreePer1 = spanDeg/spanValue
'--------------------------------------------------------- ' 处理HH圆弧 x = SmartTags(".Cfg_LimitAH").Value y = (x - min) * degreePer1 HH = y
' 适配仪表弧度 y = (y + startDeg) Mod 360
' 修正防止出现不合理情况 If y = endDeg Then y = endDeg - 1 HHObj.Visible = False Else HHObj.Visible = True End if
' 设置HH圆弧的起始角度 HHObj.StartAngle = y
'---------------------------------------------------------- '处理LL圆弧 x = SmartTags(".Cfg_LimitAL").Value y = (x - min) * degreePer1 LL = y ' 适配仪表弧度 y = (y + startDeg) Mod 360 ' 修正防止出现不合理情况 If y = startDeg Then y = startDeg + 1 LLObj.Visible = False Else LLObj.Visible = True End If
' 设置LL圆弧的结束角度 LLObj.EndAngle = y
'---------------------------------------------------------- '处理L圆弧 ' 设置L圆弧的开始角度为LL圆弧的结束角度 LObj.StartAngle = LLObj.EndAngle
x = SmartTags(".Cfg_LimitWL").Value y = (x - min) * degreePer1 L = y
' 适配仪表弧度 y = (y + startDeg) Mod 360
' 修正防止出现不合理情况 If L = LL Or LL > L Then y = LObj.StartAngle + 1 LObj.Visible = False Else LObj.Visible = True End If
' 设置L圆弧的结束角度 LObj.EndAngle = y
'---------------------------------------------------------- '处理H圆弧 ' 设置H圆弧的结束角度为HH圆弧的开始角度 HObj.EndAngle = HHObj.StartAngle
x = SmartTags(".Cfg_LimitWH").Value y = (x - min) * degreePer1 H = y
' 适配仪表弧度 y = (y + startDeg) Mod 360
' 修正防止出现不合理情况 If H = HH Or H > HH Then y = HObj.EndAngle - 1 HObj.Visible = False Else HObj.Visible = True End If
' 设置L圆弧的结束角度 HObj.StartAngle = y
HMIRuntime.Trace "LL= " & LL & " L= " & L & " H= " & H & " HH= " & HH & vbNewLine End Function |