3 Star 3 Fork 2

RedGuy / PIMTest

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
PesgoControl.bas 17.97 KB
一键复制 编辑 原始数据 按行查看 历史
RedGuy 提交于 2014-08-07 11:49 . first commit
Attribute VB_Name = "PesgoControl"
Dim psg As Pesgo 'Pesgo控件名称
Dim ItemNum As Integer '项目数
Public DisplayMode As Integer
Dim Point_Index As Integer
Dim ItemFlag As Integer
Sub SetPesgo(Name As Pesgo) '设置Pesgo控件名称
Set psg = Name
End Sub
Function ReadItemNum() As Integer '返回项目数
On Error Resume Next
ItemNum = UBound(MyItemConf()) - LBound(MyItemConf()) + 1 '项目数
ReadItemNum = ItemNum
End Function
Sub LoadPesgo() '加载窗体时Pesgo显示设置
With psg
.FontSize = PEFS_LARGE '字体大小
'.MainTitle = "PIM MEASUREMENTS"
.MainTitle = "交 调 测 试"
.MainTitleFont = "幼圆"
.MainTitleBold = True
.SubTitle = "" '子标题
'.XAxisLabel = "频率,MHz" '横坐标
'.YAxisLabel = "交调,dBm" '纵坐标
.XAxisLabel = "" '横坐标
.YAxisLabel = "" '纵坐标
.ManualScaleControlX = PEMSC_MINMAX
.ManualScaleControlY = PEMSC_MINMAX
.ManualMinY = -150 '起始x
.ManualMaxY = 50 '终止x
.ManualMinX = 0 '起始y
.ManualMaxX = 6000 '终止y
'.Points = 100
.AllowZooming = PEAZ_HORZANDVERT
.QuickStyle = PEQS_MEDIUM_INSET
'.QuickStyle = PEQS_DARK_INSET
.PlottingMethod = SGPM_LINE
.BitmapGradientMode = True
.GridLineControl = PEGLC_BOTH
.YAxisLongTicks = True
.XAxisLongTicks = True
.GridStyle = PEGS_THIN
.TickStyle = PETS_DOT
End With
End Sub
Sub PesgoIni() '根据配置文件设置Pesgo参数
Call ReadItemNum '读测试项目数量
Call SetPesgoScale '确定Scale边界
Call AddReferenceValue '画参考线
'AddBorderFrequency '画边界频率线
End Sub
Sub SetPesgoScale() '计算Scale边界
On Error Resume Next
Dim MinPIMFre As Double, MaxPIMFre As Double '交调频率最小、最大值
Dim MinPIMRefVal As Double, MaxPIMRefVal As Double '交调参考值最小、最大值
Dim PIMFre() As Double, PIMRefVal() As Double '交调频率、参考值数组
ReDim PIMFre(ItemNum - 1) As Double, PIMRefVal(ItemNum - 1) As Double
For i = 0 To ItemNum - 1
With MyItemConf(LBound(MyItemConf()) + i)
PIMFre(i) = .PIMFrequency
PIMRefVal(i) = .ReferenceValue
End With
Next i
Select Case ItemNum
Case 1
MinPIMFre = PIMFre(LBound(PIMFre())) - 5 '最小交调频率
MaxPIMFre = PIMFre(LBound(PIMFre())) + 5 '最大
MinPIMRefVal = PIMRefVal(LBound(PIMFre())) - 70 '最小交调门限
MaxPIMRefVal = PIMRefVal(LBound(PIMFre())) + 30 '最大
Case Is > 1
MinPIMFre = FindValue(PIMFre(), "Min")
MaxPIMFre = FindValue(PIMFre(), "Max")
MinPIMRefVal = FindValue(PIMRefVal(), "Min") - 70
MaxPIMRefVal = FindValue(PIMRefVal(), "Max") + 30
End Select
With psg
'.YAxisLabel = YLable '纵坐标
.ManualMinX = MinPIMFre '起始x
.ManualMaxX = MaxPIMFre '终止x
.ManualMinY = MinPIMRefVal '起始y
.ManualMaxY = MaxPIMRefVal '终止y
.ManualXAxisLine = (.ManualMaxX - .ManualMinX) / 10 '坐标轴标记间隔设置
.ManualXAxisTick = .ManualXAxisLine / 4
.ManualYAxisLine = (.ManualMaxY - .ManualMinY) / 10
.ManualYAxisTick = .ManualYAxisLine / 4
'.MainTitle = TestName(Trim(MyTestConf.DataPath))
.MainTitle = Trim(MyTestConf.ProductName)
End With
End Sub
Function TestName(ByVal Name As String) As String
For i = Len(Name) To 1 Step -1
If Mid(Name, i, 1) = "\" Then
TestName = Mid(Name, i + 1, Len(Name) - i - 4)
Exit For
End If
Next i
End Function
Sub AddReferenceValue() '画参考线
On Error Resume Next
With psg
.Subsets = 1 '数量
.SubsetLabels(0) = "指标要求" '标签
.SubsetLineTypes(0) = PELT_MEDIUM_SOLID '线型
.PlottingMethods(0) = PEGPM_LINE
.SubsetColors(0) = .PEargb(255, 0, 225, 0)
Select Case MyInstrConf.AllStep
Case 1
.Points = 2 '从左到右拉参考线
.XData(0, 0) = .ManualMinX
.XData(0, 1) = .ManualMaxX
.YData(0, 0) = MyItemConf(1).ReferenceValue
.YData(0, 1) = MyItemConf(1).ReferenceValue
Case Else
Dim ArrX() As Double, ArrY() As Double '参考值
Dim SubArrX() As Double, SubArrY() As Double '参考线
ReDim ArrX(ItemNum - 1) As Double
ReDim ArrY(ItemNum - 1) As Double
For i = 0 To ItemNum - 1
ArrX(i) = MyItemConf(i + 1).PIMFrequency '参考值横坐标
ArrY(i) = MyItemConf(i + 1).ReferenceValue '参考值纵坐标
Next i
CRefLin ArrX(), ArrY(), SubArrX(), SubArrY() '画参考线点
For i = 0 To 2 * UBound(ArrX()) + 1 '参考线
If SubArrX(0) <> SubArrX(i) Then '有一个不相等则
.Points = 2 * ItemNum '扩充点数
For j = 0 To 2 * UBound(ArrX()) + 1 '参考线
.XData(0, j) = SubArrX(j)
.YData(0, j) = SubArrY(j)
Next j
.ManualMinX = .XData(0, 0) '起始y
.ManualMaxX = .XData(0, 2 * UBound(ArrX()) + 1) '终止y
Exit Sub
End If
Next i
.ManualMinX = SubArrX(LBound(SubArrX())) - 5 '起始x
.ManualMaxX = SubArrX(LBound(SubArrX())) + 5 '终止x
.ManualXAxisLine = (.ManualMaxX - .ManualMinX) / 10 '坐标轴标记间隔设置
.ManualXAxisTick = .ManualXAxisLine / 4
.Points = 2 '从左到右拉参考线
.XData(0, 0) = .ManualMinX
.YData(0, 0) = MyItemConf(1).ReferenceValue
.XData(0, 1) = .ManualMaxX
.YData(0, 1) = MyItemConf(1).ReferenceValue
End Select
End With
End Sub
Sub AddTestLine(ByVal Num As Integer)
With psg
'.YAxisLabel = YLable '纵坐标
.ManualMinX = MyItemConf(Num).PIMFrequency - 5 '起始y
.ManualMaxX = MyItemConf(Num).PIMFrequency + 5 '终止y
.ManualMinY = MyItemConf(Num).ReferenceValue - 60 '起始x
.ManualMaxY = MyItemConf(Num).ReferenceValue + 20 '终止x
.ManualXAxisLine = (.ManualMaxX - .ManualMinX) / 10 '坐标轴标记间隔设置
.ManualXAxisTick = .ManualXAxisLine / 4
.ManualYAxisLine = (.ManualMaxY - .ManualMinY) / 10
.ManualYAxisTick = .ManualYAxisLine / 4
.Subsets = Num '数量
'.SubsetLabels(.Subsets - 1) = "指标要求" '标签
.SubsetLineTypes(.Subsets - 1) = PELT_MEDIUM_SOLID '线型
.PlottingMethods(.Subsets - 1) = PEGPM_LINE
.Points = 2 '从左到右拉参考线
.XData(0, 0) = .ManualMinX
.XData(0, 1) = .ManualMaxX
.YData(0, 0) = MyItemConf(Num).ReferenceValue
.YData(0, 1) = MyItemConf(Num).ReferenceValue
End With
End Sub
Sub AddBorderFrequency() '画边界频率线
SetFre MyItemConf(1).Sig1Frequency '增加边界线y=sig1Frequency
SetFre MyItemConf(1).Sig2Frequency '增加边界线y=sig2Frequency
End Sub
Sub IniSubsets(ByVal Index As Integer, ByVal Fre As Double) '初始化 第Index条曲线
With psg
.SubsetLabels(Index) = "F" & Index & "=" & Fre & "MHz" & ", Power=" & MyItemConf(1).Sig1Target & "dBm"
.SubsetColors(Index) = vbRed
.SubsetLineTypes(Index) = PELT_DOT
End With
End Sub
Sub SetFre(ByVal Fre As Double) '描两点,画直线(频率值)
With psg
'(Fre,.ManualMinY),(Fre,.ManualMaxY)
For i = 0 To .Subsets - 1 '是否已经存在
If .XData(i, 0) = Fre Then Exit Sub
Next i
.Subsets = .Subsets + 1 '增加一条曲线
Index = .Subsets - 1 '曲线编号(0,1,....(Subsets-1))
.XData(Index, 0) = Fre
.XData(Index, 1) = .XData(Index, 0)
.YData(Index, 0) = .ManualMinY
.YData(Index, 1) = .ManualMaxY
End With
IniSubsets Index, Fre '设置
End Sub
'_______________________________________________显示测试结果_____
Sub DisplayValue(ByVal ItemNum As Integer)
Dim i As Integer
i = ItemNum
With MyItemConf(i)
TestForm.ListView1.ListItems(i).Selected = True '选中
TestForm.ListView1.ListItems(i).EnsureVisible '跟踪
TestForm.ListView1.ListItems(i).SubItems(10) = Format(.PIMValue, "#0.00")
TestForm.ListView1.ListItems(i).SubItems(11) = CStr(IIf(.PIMValue <= .ReferenceValue, "Pass", "Fail"))
If TestForm.ListView1.ListItems(i).SubItems(11) = "Fail" Then
For j = 1 To 11
TestForm.ListView1.ListItems(i).ListSubItems(j).ForeColor = vbRed
Next j
ElseIf TestForm.ListView1.ListItems(i).SubItems(11) = "Pass" Then
For j = 1 To 11
TestForm.ListView1.ListItems(i).ListSubItems(j).ForeColor = vbBlue
Next j
End If
TestForm.ListView1.Refresh
End With
End Sub
Sub DisplayPass()
Dim PassFlag As Boolean
PassFlag = True
For i = 1 To UBound(MyItemConf()) '遍历测试项
If TestForm.ListView1.ListItems(i).SubItems(11) = "Fail" Then
PassFlag = False
Exit For
End If
Next i
'Select Case PassFlag
' Case True
' TestForm.Shape_3.FillColor = &H80FF80
' Case False
' TestForm.Shape_3.FillColor = &HC0C0FF
'End Select
End Sub
'_______________________________________________显示测试结果_____
Sub DisplayResult(Fre As Variant, Pow As Variant)
With psg
.Subsets = 2
.SubsetLabels(1) = "交调值"
.SubsetColors(1) = .PEargb(255, 255, 0, 0)
.PlottingMethods(1) = PEGPM_POINTSPLUSSPLINE '点+线
.SubsetPointTypes(1) = PEPT_DOTSOLID '第二条线 (实心圆点)
.PointSize = PEPS_LARGE '点的大小
.SubsetLineTypes(1) = PELT_THIN_SOLID
.LabelBold = True
'Sort Fre, Pow
For i = LBound(MyItemConf()) To UBound(MyItemConf())
.XData(1, i - LBound(MyItemConf())) = Fre(i)
.YData(1, i - LBound(MyItemConf())) = Pow(i)
Next i
End With
End Sub
Sub DisplayPoint(ByVal i As Integer, ByVal Fre As Single, ByVal Power As Single)
Dim LineIndex As Integer, PointIndex As Integer
LineIndex = MyItemConf(i).StepIndex
PointIndex = MyItemConf(i).PointIndex - 1
If PointIndex = 0 And MyInstrConf.Mode <> 1 Then
Call IniLine(LineIndex, CStr(MyItemConf(i).Path & "面_固定F" & MyItemConf(i).Fixed)) '添加并初始化第LinIndex条线(第一条是参考线)
With psg
.XData(LineIndex, PointIndex) = Fre
.YData(LineIndex, PointIndex) = Power
End With
End If
If MyInstrConf.Mode = 1 Then
LineIndex = 1
Call IniLine(LineIndex, CStr(MyItemConf(i).Path & "-" & MyItemConf(i).PIMFrequency) & "(" & MyItemConf(i).PIMType & ")")
Clearpesgo1 i
Add_Line DisplayMode, Fre, Power, 5, 1000, i
Else
With psg
.XData(LineIndex, PointIndex) = Fre
.YData(LineIndex, PointIndex) = Power
.Subsets = LineIndex + 1 '添加线
.PlottingMethods(LineIndex) = PEGPM_POINTSPLUSSPLINE '点+线
.SubsetPointTypes(LineIndex) = PEPT_DOTSOLID '第(LineIndex + 1)条线 (实心圆点)
.SubsetLineTypes(LineIndex) = PELT_THIN_SOLID
End With
End If
End Sub
Sub IniLine(ByVal LineIndex As Integer, ByVal Subset_Lbl As String) '添加并初始化线
With psg
.Subsets = LineIndex + 1 '添加线
.SubsetLabels(LineIndex) = Subset_Lbl '标题
.SubsetColors(LineIndex) = IIf(LineIndex = 1, .PEargb(255, 255, 0, 0), .PEargb(255, 0, 0, 255))
.PlottingMethods(LineIndex) = PEGPM_POINTSPLUSSPLINE '点+线
.SubsetPointTypes(LineIndex) = PEPT_DOTSOLID '第(LineIndex + 1)条线 (实心圆点)
.PointSize = PEPS_LARGE '点的大小
.SubsetLineTypes(LineIndex) = PELT_THIN_SOLID
.LabelBold = True
End With
End Sub
Sub Add_Line(DisplayMode As Integer, ByVal Fre As Double, ByVal Pow As Double, ByVal xDeta As Integer, ByVal PointNum As Integer, ByVal ItemIndex As Integer)
With psg
.ShowAnnotations = True
.HorzLineAnnotation(0) = MyItemConf(ItemIndex).ReferenceValue
.HorzLineAnnotationType(0) = PELAT_MEDIUM_THICK_SOLID
.HorzLineAnnotationColor(0) = .PEargb(255, 0, 255, 0)
.HorzLineAnnotationText(0) = ""
.HorzLineAnnotationInFront(0) = PEAIF_DEFAULT
.HorzLineAnnotationAxis(0) = 0
If DisplayMode = 0 Then
Point_Index = 0
.Subsets = 2
.Points = 2
.ManualMinX = Fre - xDeta
.ManualMaxX = Fre + xDeta
.PlottingMethods(1) = PEGPM_LINE
.SubsetColors(1) = .PEargb(255, 255, 0, 0)
.SubsetPointTypes(1) = PEPT_DOTSOLID
.SubsetLineTypes(1) = PELT_MEDIUM_THICK_SOLID
.XData(1, 0) = Fre
.YData(1, 0) = Pow
.XData(1, 1) = Fre
.YData(1, 1) = .ManualMinY
ElseIf DisplayMode = 1 Then
If Point_Index = 999 Then
For i = 0 To 999
.XData(0, i) = 0
.YData(0, i) = 0
.XData(1, i) = 0
.YData(1, i) = 0
Next i
.Subsets = 0
.Points = 0
Point_Index = 0
End If
If Point_Index = 0 Then
.Subsets = 2
.Points = 1000
.ManualMinX = 1
.ManualMaxX = 100
End If
'.Points = Point_Index + 1
.ManualMinX = 1
.ManualMaxX = 500
.XData(1, Point_Index) = Point_Index
.YData(1, Point_Index) = Pow
.PlottingMethods(1) = PEGPM_LINE
.SubsetPointTypes(1) = PEPT_DOTSOLID
.SubsetLineTypes(1) = PELT_MEDIUM_THICK_SOLID
.SubsetColors(0) = .PEargb(255, 0, 255, 0)
.SubsetColors(1) = .PEargb(255, 255, 0, 0)
Point_Index = Point_Index + 1
If Point_Index > 100 Then
.ManualMinX = Point_Index - 100
.ManualMaxX = Point_Index
End If
End If
End With
End Sub
Sub Clearpesgo1(ByVal ItemIndex As Integer)
If ItemIndex = ItemFlag Then Exit Sub
ItemFlag = ItemIndex
With psg
For i = 0 To .Points - 1
.XData(0, i) = 0
.YData(0, i) = 0
.XData(1, i) = 0
.YData(1, i) = 0
Next i
.Subsets = 0
.Points = 0
Point_Index = 0
End With
End Sub
Sub ClearList(ByVal StartIndex As Integer, ByVal EndIndex As Integer)
With TestForm.ListView1
For i = StartIndex To EndIndex
.ListItems(i).SubItems(10) = ""
.ListItems(i).SubItems(11) = ""
Next i
End With
End Sub
Function FindValue(Arr() As Double, ValueType As String) As Double '最大最小值
Dim ArrNum As Integer
ArrNum = UBound(Arr()) - LBound(Arr()) + 1
If ArrNum < 2 Then Exit Function
FindValue = Arr(LBound(Arr()))
Select Case ValueType
Case "Max" '最大"Max"
For i = LBound(Arr()) + 1 To UBound(Arr())
FindValue = IIf(FindValue > Arr(i), FindValue, Arr(i))
Next i
Case "Min" '最大"Min"
For i = LBound(Arr()) + 1 To UBound(Arr())
FindValue = IIf(FindValue < Arr(i), FindValue, Arr(i))
Next i
End Select
End Function
Sub CRefLin(ArrX() As Double, ArrY() As Double, SubArrX() As Double, SubArrY() As Double)
'将折点线变成梯度线:(ArrX,ArrY)——>>(SubArrX,SubArrY)
Sort ArrX(), ArrY() '排序
Dim ArrNum As Integer
ArrNum = UBound(ArrX()) - LBound(ArrX()) + 1 '被扩充点数
If ArrNum < 2 Then Exit Sub
ReDim Preserve SubArrX(2 * ArrNum - 1) As Double '扩充为2倍数量Arr()点
ReDim Preserve SubArrY(2 * ArrNum - 1) As Double
For i = 1 To UBound(ArrX()) '扩充除首尾点的其他点
SubArrX(2 * i - 1) = (ArrX(i - 1) + ArrX(i)) / 2
SubArrY(2 * i - 1) = ArrY(i - 1)
SubArrX(2 * i) = SubArrX(2 * i - 1)
SubArrY(2 * i) = ArrY(i)
Next i
SubArrX(0) = 1.5 * ArrX(0) - 0.5 * ArrX(1) '扩充第一个点
SubArrY(0) = ArrY(0)
SubArrX(UBound(SubArrX())) = 1.5 * ArrX(UBound(ArrX())) - 0.5 * ArrX(UBound(ArrX()) - 1) '扩充最后一个点
SubArrY(UBound(SubArrX())) = ArrY(UBound(ArrX()))
End Sub
Sub Sort(Arr1() As Double, Arr2() As Double) '筛选排序,从小到大
Dim T As Double
Dim S As Double
If UBound(Arr1()) <> UBound(Arr2()) Then Exit Sub
For i = 0 To UBound(Arr1()) - 1
For j = i + 1 To UBound(Arr1())
If Arr1(i) > Arr1(j) Then
T = Arr1(i)
Arr1(i) = Arr1(j)
Arr1(j) = T
S = Arr2(i)
Arr2(i) = Arr2(j)
Arr2(j) = S
End If
Next j
Next i
End Sub
Visual Basic
1
https://gitee.com/fangguanlin/PIMTest.git
git@gitee.com:fangguanlin/PIMTest.git
fangguanlin
PIMTest
PIMTest
master

搜索帮助