模拟量弹窗用指针仪表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