PCB SI9000阻抗计算引擎Web方式实现方法
在筆者從業(yè)這么多年,PCB行業(yè)阻抗計(jì)算工具都是用Polar公司的阻抗計(jì)算工具SI9000,或早期上個(gè)版 本SI8000
Prolar是老牌公司,但也不斷在推出新的產(chǎn)品,可以進(jìn)去去了解一下 https://www.polarinstruments.com/
一直以來在我印象里,好東西都是外國(guó)公司創(chuàng)造,但近些年推出【中國(guó)制造2025】,中國(guó)企業(yè)崛起,
在一個(gè)創(chuàng)新開放的城市,深圳一家創(chuàng)業(yè)公司也推出阻抗計(jì)算工具了深圳市賽碩爾科技有限公司
大家可以了解一下http://www.sisolver.com/ 號(hào)稱阻抗理論計(jì)算精度超過Prolar. 支持國(guó)產(chǎn),加油
一.將單個(gè)參數(shù)改為Model類做為參數(shù)傳遞
原為單個(gè)值參數(shù):
改后Mod參數(shù):
Model參數(shù)類
''' <summary>
''' 阻抗計(jì)算參數(shù)(反算)
''' </summary>
''' <remarks></remarks>
<Serializable()> _
Public Class MOD_ImpCalcReverseParam
Public Sub New(ByVal _ImpCalcParam As MOD_ImpCalcParam, ByVal _Enum_Resize As MOD_EnumImp.ImpCalcResize)
Me.ImpCalcParam = _ImpCalcParam
Me.Enum_Resize = _Enum_Resize
Me.RequestZo = _ImpCalcParam.Zo
Me.WS_Sum = Me.ImpCalcParam.W1 + Me.ImpCalcParam.S1
Me.WD_Sum = Me.ImpCalcParam.W1 + Me.ImpCalcParam.D1
Me.SD_Sum = Me.ImpCalcParam.S1 + Me.ImpCalcParam.D1
Me.W1W2_Diff = Me.ImpCalcParam.W1 - Me.ImpCalcParam.W2
Me.CalcMaxCount = 20
Me.ImpAccuracy = 0.01
Me.min = 0.0
Select Case Enum_Resize
Case MOD_EnumImp.ImpCalcResize.W1, MOD_EnumImp.ImpCalcResize.W1S1, MOD_EnumImp.ImpCalcResize.W1D1, MOD_EnumImp.ImpCalcResize.W1S1D1, MOD_EnumImp.ImpCalcResize.O1
Me.max = Me.ImpCalcParam.W1 * 4
Case MOD_EnumImp.ImpCalcResize.S1, MOD_EnumImp.ImpCalcResize.S1D1
Me.max = Me.ImpCalcParam.S1 * 4
Case MOD_EnumImp.ImpCalcResize.D1
Me.max = Me.ImpCalcParam.D1 * 4
Case MOD_EnumImp.ImpCalcResize.H1
Me.max = Me.ImpCalcParam.H1 * 4
Case MOD_EnumImp.ImpCalcResize.H2
Me.max = Me.ImpCalcParam.H2 * 4
Case MOD_EnumImp.ImpCalcResize.H3
Me.max = Me.ImpCalcParam.H3 * 4
Case MOD_EnumImp.ImpCalcResize.H4
Me.max = Me.ImpCalcParam.H4 * 4
Case MOD_EnumImp.ImpCalcResize.Er1
Me.max = Me.ImpCalcParam.Er1 * 4
Case MOD_EnumImp.ImpCalcResize.Er2
Me.max = Me.ImpCalcParam.Er2 * 4
Case MOD_EnumImp.ImpCalcResize.Er3
Me.max = Me.ImpCalcParam.Er3 * 4
Case MOD_EnumImp.ImpCalcResize.Er4
Me.max = Me.ImpCalcParam.Er4 * 4
Case MOD_EnumImp.ImpCalcResize.REr
Me.max = Me.ImpCalcParam.REr * 4
End Select
End Sub
''' <summary>
''' 反算結(jié)果OK
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property isOK As Boolean
''' <summary>
''' 阻抗計(jì)算參數(shù)(正算)
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property ImpCalcParam As MOD_ImpCalcParam
''' <summary>
''' 反算調(diào)整類型
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property Enum_Resize As MOD_EnumImp.ImpCalcResize
''' <summary>
''' W與S之和
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property WS_Sum As Double '
''' <summary>
''' W與D之和
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property WD_Sum As Double
''' <summary>
''' S與D之和
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property SD_Sum As Double
''' <summary>
''' W1與W2差值
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property W1W2_Diff As Double
''' <summary>
''' 要求阻抗值
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property RequestZo As Double
''' <summary>
''' 反算最大次數(shù)
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property CalcMaxCount As Double
''' <summary>
''' 反算阻抗精度
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property ImpAccuracy As Double
''' <summary>
''' 最小值
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property min As Double
''' <summary>
''' 最大值
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property max As Double
''' <summary>
''' 獲取反算調(diào)整類型的委托
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Function GetImpCalcReverseResizeDelegate() As Action(Of MOD_ImpCalcReverseParam)
Dim ReturnReverse As Action(Of MOD_ImpCalcReverseParam) = Nothing
Select Case Enum_Resize
Case MOD_EnumImp.ImpCalcResize.W1
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.min = ReverseParam.ImpCalcParam.W1
ReverseParam.ImpCalcParam.W1 = (ReverseParam.max + ReverseParam.ImpCalcParam.W1) * 0.5
ReverseParam.ImpCalcParam.W2 = ReverseParam.ImpCalcParam.W1 - ReverseParam.W1W2_Diff
Else
ReverseParam.max = ReverseParam.ImpCalcParam.W1
ReverseParam.ImpCalcParam.W1 = (ReverseParam.min + ReverseParam.ImpCalcParam.W1) * 0.5
ReverseParam.ImpCalcParam.W2 = ReverseParam.ImpCalcParam.W1 - ReverseParam.W1W2_Diff
End If
End Sub)
Case MOD_EnumImp.ImpCalcResize.W1D1
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.min = ReverseParam.ImpCalcParam.W1
ReverseParam.ImpCalcParam.W1 = (ReverseParam.max + ReverseParam.ImpCalcParam.W1) * 0.5
ReverseParam.ImpCalcParam.W2 = ReverseParam.ImpCalcParam.W1 - ReverseParam.W1W2_Diff
ReverseParam.ImpCalcParam.D1 = ReverseParam.WD_Sum - ReverseParam.ImpCalcParam.W1
Else
ReverseParam.max = ReverseParam.ImpCalcParam.W1
ReverseParam.ImpCalcParam.W1 = (ReverseParam.min + ReverseParam.ImpCalcParam.W1) * 0.5
ReverseParam.ImpCalcParam.W2 = ReverseParam.ImpCalcParam.W1 - ReverseParam.W1W2_Diff
ReverseParam.ImpCalcParam.D1 = ReverseParam.WD_Sum - ReverseParam.ImpCalcParam.W1
End If
End Sub)
Case MOD_EnumImp.ImpCalcResize.W1S1
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.min = ReverseParam.ImpCalcParam.W1
ReverseParam.ImpCalcParam.W1 = (ReverseParam.max + ReverseParam.ImpCalcParam.W1) * 0.5
ReverseParam.ImpCalcParam.W2 = ReverseParam.ImpCalcParam.W1 - ReverseParam.W1W2_Diff
ReverseParam.ImpCalcParam.S1 = ReverseParam.WS_Sum - ReverseParam.ImpCalcParam.W1
Else
ReverseParam.max = ReverseParam.ImpCalcParam.W1
ReverseParam.ImpCalcParam.W1 = (ReverseParam.min + ReverseParam.ImpCalcParam.W1) * 0.5
ReverseParam.ImpCalcParam.W2 = ReverseParam.ImpCalcParam.W1 - ReverseParam.W1W2_Diff
ReverseParam.ImpCalcParam.S1 = ReverseParam.WS_Sum - ReverseParam.ImpCalcParam.W1
End If
End Sub)
Case MOD_EnumImp.ImpCalcResize.W1S1D1
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.min = ReverseParam.ImpCalcParam.W1
ReverseParam.ImpCalcParam.W1 = (ReverseParam.max + ReverseParam.ImpCalcParam.W1) * 0.5
ReverseParam.ImpCalcParam.W2 = ReverseParam.ImpCalcParam.W1 - ReverseParam.W1W2_Diff
ReverseParam.ImpCalcParam.S1 = ReverseParam.WS_Sum - ReverseParam.ImpCalcParam.W1
ReverseParam.ImpCalcParam.D1 = ReverseParam.WD_Sum - ReverseParam.ImpCalcParam.W1
Else
ReverseParam.max = ReverseParam.ImpCalcParam.W1
ReverseParam.ImpCalcParam.W1 = (ReverseParam.min + ReverseParam.ImpCalcParam.W1) * 0.5
ReverseParam.ImpCalcParam.W2 = ReverseParam.ImpCalcParam.W1 - ReverseParam.W1W2_Diff
ReverseParam.ImpCalcParam.S1 = ReverseParam.WS_Sum - ReverseParam.ImpCalcParam.W1
ReverseParam.ImpCalcParam.D1 = ReverseParam.WD_Sum - ReverseParam.ImpCalcParam.W1
End If
End Sub)
Case MOD_EnumImp.ImpCalcResize.S1
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.max = ReverseParam.ImpCalcParam.S1
ReverseParam.ImpCalcParam.S1 = (ReverseParam.min + ReverseParam.ImpCalcParam.S1) * 0.5
Else
ReverseParam.min = ReverseParam.ImpCalcParam.S1
ReverseParam.ImpCalcParam.S1 = (ReverseParam.max + ReverseParam.ImpCalcParam.S1) * 0.5
End If
End Sub)
Case MOD_EnumImp.ImpCalcResize.D1
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.max = ReverseParam.ImpCalcParam.D1
ReverseParam.ImpCalcParam.D1 = (ReverseParam.min + ReverseParam.ImpCalcParam.D1) * 0.5
Else
ReverseParam.min = ReverseParam.ImpCalcParam.D1
ReverseParam.ImpCalcParam.D1 = (ReverseParam.max + ReverseParam.ImpCalcParam.D1) * 0.5
End If
End Sub)
Case MOD_EnumImp.ImpCalcResize.S1D1
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.max = ReverseParam.ImpCalcParam.S1
ReverseParam.ImpCalcParam.S1 = (ReverseParam.min + ReverseParam.ImpCalcParam.S1) * 0.5
ReverseParam.ImpCalcParam.D1 = ReverseParam.SD_Sum - ReverseParam.ImpCalcParam.S1
Else
ReverseParam.min = ReverseParam.ImpCalcParam.S1
ReverseParam.ImpCalcParam.S1 = (ReverseParam.max + ReverseParam.ImpCalcParam.S1) * 0.5
ReverseParam.ImpCalcParam.D1 = ReverseParam.SD_Sum - ReverseParam.ImpCalcParam.S1
End If
End Sub)
Case MOD_EnumImp.ImpCalcResize.O1
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.max = ReverseParam.ImpCalcParam.O1
ReverseParam.ImpCalcParam.O1 = (ReverseParam.min + ReverseParam.ImpCalcParam.O1) * 0.5
Else
ReverseParam.min = ReverseParam.ImpCalcParam.S1
ReverseParam.ImpCalcParam.O1 = (ReverseParam.max + ReverseParam.ImpCalcParam.O1) * 0.5
End If
End Sub)
Case MOD_EnumImp.ImpCalcResize.T1
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.min = ReverseParam.ImpCalcParam.T1
ReverseParam.ImpCalcParam.T1 = (ReverseParam.max + ReverseParam.ImpCalcParam.T1) * 0.5
Else
ReverseParam.max = ReverseParam.ImpCalcParam.T1
ReverseParam.ImpCalcParam.T1 = (ReverseParam.min + ReverseParam.ImpCalcParam.T1) * 0.5
End If
End Sub)
Case MOD_EnumImp.ImpCalcResize.H1
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.max = ReverseParam.ImpCalcParam.H1
ReverseParam.ImpCalcParam.H1 = (ReverseParam.min + ReverseParam.ImpCalcParam.H1) * 0.5
Else
ReverseParam.min = ReverseParam.ImpCalcParam.H1
ReverseParam.ImpCalcParam.H1 = (ReverseParam.max + ReverseParam.ImpCalcParam.H1) * 0.5
End If
End Sub)
Case MOD_EnumImp.ImpCalcResize.Er1
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.min = ReverseParam.ImpCalcParam.Er1
ReverseParam.ImpCalcParam.Er1 = (ReverseParam.max + ReverseParam.ImpCalcParam.Er1) * 0.5
Else
ReverseParam.max = ReverseParam.ImpCalcParam.Er1
ReverseParam.ImpCalcParam.Er1 = (ReverseParam.min + ReverseParam.ImpCalcParam.Er1) * 0.5
End If
End Sub)
Case MOD_EnumImp.ImpCalcResize.H2
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.max = ReverseParam.ImpCalcParam.H2
ReverseParam.ImpCalcParam.H2 = (ReverseParam.min + ReverseParam.ImpCalcParam.H2) * 0.5
Else
ReverseParam.min = ReverseParam.ImpCalcParam.H2
ReverseParam.ImpCalcParam.H2 = (ReverseParam.max + ReverseParam.ImpCalcParam.H2) * 0.5
End If
End Sub)
Case MOD_EnumImp.ImpCalcResize.Er2
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.min = ReverseParam.ImpCalcParam.Er2
ReverseParam.ImpCalcParam.Er2 = (ReverseParam.max + ReverseParam.ImpCalcParam.Er2) * 0.5
Else
ReverseParam.max = ReverseParam.ImpCalcParam.Er2
ReverseParam.ImpCalcParam.Er2 = (ReverseParam.min + ReverseParam.ImpCalcParam.Er2) * 0.5
End If
End Sub)
Case MOD_EnumImp.ImpCalcResize.H3
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.max = ReverseParam.ImpCalcParam.H3
ReverseParam.ImpCalcParam.H3 = (ReverseParam.min + ReverseParam.ImpCalcParam.H3) * 0.5
Else
ReverseParam.min = ReverseParam.ImpCalcParam.H3
ReverseParam.ImpCalcParam.H3 = (ReverseParam.max + ReverseParam.ImpCalcParam.H3) * 0.5
End If
End Sub)
Case MOD_EnumImp.ImpCalcResize.Er3
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.min = ReverseParam.ImpCalcParam.Er3
ReverseParam.ImpCalcParam.Er3 = (ReverseParam.max + ReverseParam.ImpCalcParam.Er3) * 0.5
Else
ReverseParam.max = ReverseParam.ImpCalcParam.Er3
ReverseParam.ImpCalcParam.Er3 = (ReverseParam.min + ReverseParam.ImpCalcParam.Er3) * 0.5
End If
End Sub)
Case MOD_EnumImp.ImpCalcResize.H4
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.max = ReverseParam.ImpCalcParam.H4
ReverseParam.ImpCalcParam.H4 = (ReverseParam.min + ReverseParam.ImpCalcParam.H4) * 0.5
Else
ReverseParam.min = ReverseParam.ImpCalcParam.H4
ReverseParam.ImpCalcParam.H4 = (ReverseParam.max + ReverseParam.ImpCalcParam.H4) * 0.5
End If
End Sub)
Case MOD_EnumImp.ImpCalcResize.Er4
ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)
If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo Then
ReverseParam.min = ReverseParam.ImpCalcParam.Er4
ReverseParam.ImpCalcParam.Er4 = (ReverseParam.max + ReverseParam.ImpCalcParam.Er4) * 0.5
Else
ReverseParam.max = ReverseParam.ImpCalcParam.Er4
ReverseParam.ImpCalcParam.Er4 = (ReverseParam.min + ReverseParam.ImpCalcParam.Er4) * 0.5
End If
End Sub)
End Select
Return ReturnReverse
End Function
End Class
''' <summary>
''' 阻抗計(jì)算參數(shù)(正算) 繼承: 介質(zhì)層參數(shù)+線路層參數(shù)+阻焊層參數(shù)
''' </summary>
''' <remarks></remarks>
<Serializable()> _
Public Class MOD_ImpCalcParam
Inherits MOD_ImpParamDielectric
''' <summary>
''' 計(jì)算阻抗值結(jié)果
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property Zo() As Double
End Class
''' <summary>
''' 阻焊層參數(shù) 1/3
''' </summary>
''' <remarks></remarks>
<Serializable()> _
Public Class MOD_ImpParamSolderMask
''' <summary>
''' 基材上阻焊厚度 (與阻抗值大小成反比)
''' </summary>
Public Property C1() As Double
''' <summary>
''' 線路上阻焊厚度(與阻抗值大小成反比)
''' </summary>
Public Property C2() As Double
''' <summary>
''' 【外層差分阻抗】2條線間距中間阻焊厚度(與阻抗值大小成反比)
''' </summary>
Public Property C3() As Double
''' <summary>
''' 阻焊介電常數(shù)(與阻抗值大小成反比)
''' </summary>
Public Property CEr() As Double
End Class
''' <summary>
''' 線路層參數(shù) 2/3 繼承: 阻焊層參數(shù)
''' </summary>
''' <remarks></remarks>
<Serializable()> _
Public Class MOD_ImpParamSingal
Inherits MOD_ImpParamSolderMask
''' <summary>
''' 線路銅厚(與阻抗值大小成反比)
''' </summary>
Public Property T1() As Double
''' <summary>
''' 線底線寬(與阻抗值大小成反比)
''' </summary>
Public Property W1() As Double
''' <summary>
''' 線頂線寬(與阻抗值大小成反比)
''' </summary>
Public Property W2() As Double
''' <summary>
''' 【差分阻抗】線距(與阻抗值大小成正比)
''' </summary>
Public Property S1() As Double
''' <summary>
''' 【共面阻抗】線到銅距離(與阻抗值大小成正比)
''' </summary>
Public Property D1() As Double
''' <summary>
''' 【共面阻抗】銅皮線底線寬(與阻抗值大小成反比)
''' </summary>
Public Property G1() As Double
''' <summary>
''' 【共面阻抗】銅皮線頂線寬(與阻抗值大小成反比)
''' </summary>
Public Property G2() As Double
''' <summary>
''' 【層間差分阻抗】2條線路偏移距離(與阻抗值大小成正比)
''' </summary>
Public Property O1() As Double
End Class
''' <summary>
''' 介質(zhì)層參數(shù) 3/3 繼承: 線路層參數(shù)+阻焊層參數(shù)
''' </summary>
''' <remarks></remarks>
<Serializable()> _
Public Class MOD_ImpParamDielectric
Inherits MOD_ImpParamSingal
''' <summary>
''' H1介質(zhì)層厚度(與阻抗值大小成正比)
''' </summary>
Public Property H1() As Double
''' <summary>
''' H1介電常數(shù)(與阻抗值大小成反比)
''' </summary>
Public Property Er1() As Double
''' <summary>
''' H2介質(zhì)層厚度(與阻抗值大小成正比)
''' </summary>
Public Property H2() As Double
''' <summary>
''' H2介電常數(shù)(與阻抗值大小成反比)
''' </summary>
Public Property Er2() As Double
''' <summary>
''' H3介質(zhì)層厚度(與阻抗值大小成正比)
''' </summary>
Public Property H3() As Double
''' <summary>
''' H3介電常數(shù)(與阻抗值大小成反比)
''' </summary>
Public Property Er3() As Double
''' <summary>
''' H4介質(zhì)層厚度(與阻抗值大小成正比)
''' </summary>
Public Property H4() As Double
''' <summary>
''' H4介電常數(shù)(與阻抗值大小成反比)
''' </summary>
Public Property Er4() As Double
''' <summary>
''' 【內(nèi)層差分阻抗】2條線間距中間純膠介電常數(shù)(與阻抗值大小成反比)
''' </summary>
Public Property REr() As Double
End Class
View Code
二.寫反射類阻抗計(jì)算方法
正算代碼實(shí)現(xiàn):
#Region "阻抗計(jì)算--------正算"
#Region "阻抗模型--------方法名+MOD類參數(shù)傳遞(反射直接出結(jié)果)"
''' <summary>
''' 反射調(diào)用阻抗計(jì)算方法并返回結(jié)果
''' </summary>
''' <param name="MethodName"></param>
''' <param name="modParam"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function ImpCalcMenthod(ByVal MethodName As String, ByVal modParam As MOD_ImpCalcParam) As Double
Dim result As Double = 0.0
Try
Dim type As Type = Assembly.Load("CalcImpModelDLL").[GetType]("CalcImpModelDLL.ImpCalcModel")
Dim params_type As Type = GetType(MOD_ImpCalcParam)
Dim method As MethodInfo = type.GetMethod(MethodName, New Type() {params_type})
Dim parameters As Object() = New Object() {modParam}
result = CType(method.Invoke(Nothing, parameters), Double)
Catch
End Try
modParam.Zo = result
Return (result)
End Function
#End Region
#Region "阻抗模型--------方法名+MOD類參數(shù)傳遞(反射委托方式)"
''' <summary>
''' 定義阻抗計(jì)算委托方法
''' </summary>
''' <param name="modParam"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Delegate Function ImpCalcDelegate(ByVal modParam As MOD_ImpCalcParam) As Double
''' <summary>
''' 獲取阻抗計(jì)算的委托方法
''' </summary>
''' <param name="MethodName"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function GetImpCalcDelegate(ByVal MethodName As String) As ImpCalcDelegate
Dim impcalc As ImpCalcDelegate = Nothing
Try
Dim type As Type = Assembly.Load("CalcImpModelDLL").[GetType]("CalcImpModelDLL.ImpCalcModel")
Dim params_type As Type = GetType(MOD_ImpCalcParam)
Dim method As MethodInfo = type.GetMethod(MethodName, New Type() {params_type})
impcalc = CType([Delegate].CreateDelegate(GetType(ImpCalcDelegate), method), ImpCalcDelegate)
Catch
End Try
Return impcalc
End Function
#End Region
#End Region
View Code
反算代碼實(shí)現(xiàn):
#Region "阻抗計(jì)算--------反算"
''' <summary>
''' 深復(fù)制 序列化實(shí)現(xiàn)
''' </summary>
''' <typeparam name="T"></typeparam>
''' <param name="RealObject"></param>
''' <returns></returns>
Public Function ToClone(Of T)(ByVal RealObject As T) As T
Using objectStream As Stream = New MemoryStream()
'利用 System.Runtime.Serialization序列化與反序列化完成引用對(duì)象的復(fù)制
Dim formatter As IFormatter = New BinaryFormatter()
formatter.Serialize(objectStream, RealObject)
objectStream.Seek(0, SeekOrigin.Begin)
Return CType(formatter.Deserialize(objectStream), T)
End Using
End Function
''' <summary>
''' 反算---循環(huán)調(diào)用阻抗計(jì)算方法并返回反回計(jì)算是否成功
''' </summary>
''' <param name="MethodName"></param>
''' <param name="modParam"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function ImpCalcMenthodReverse(ByVal MethodName As String, ByVal modParam As MOD_ImpCalcParam, Optional ByVal _Enum_Resize As MOD_EnumImp.ImpCalcResize = MOD_EnumImp.ImpCalcResize.W1S1D1) As MOD_ImpCalcReverseParam
Dim CalcCount As Integer
Dim impcalcDelegate As ImpCalcDelegate = GetImpCalcDelegate(MethodName)
Dim modParamClone As MOD_ImpCalcParam = ToClone(Of MOD_ImpCalcParam)(modParam)
Dim ReverseParam As MOD_ImpCalcReverseParam = New MOD_ImpCalcReverseParam(modParamClone, _Enum_Resize)
Dim ReverseResizeDelegate As Action(Of MOD_ImpCalcReverseParam) = ReverseParam.GetImpCalcReverseResizeDelegate()
impcalcDelegate(ReverseParam.ImpCalcParam)
While Math.Abs((modParam.Zo - ReverseParam.ImpCalcParam.Zo)) > ReverseParam.ImpAccuracy
ReverseResizeDelegate(ReverseParam)
impcalcDelegate(ReverseParam.ImpCalcParam)
CalcCount += 1
If CalcCount > ReverseParam.CalcMaxCount Then
Exit While
End If
End While
If Not CalcCount > ReverseParam.CalcMaxCount Then
ReverseParam.isOK = True
Else
ReverseParam.ImpCalcParam = Nothing
ReverseParam.isOK = False
End If
Return ReverseParam
End Function
''' <summary>
''' 反算---循環(huán)調(diào)用阻抗計(jì)算方法并返回計(jì)算多種結(jié)果(應(yīng)用于差分線2線中心距調(diào)整)可以得到多種阻抗匹配結(jié)果
''' </summary>
''' <param name="MethodName"></param>
''' <param name="modParam"></param>
''' <param name="_Enum_Resize"></param>
''' <param name="isNotOK"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function ImpCalcMenthodReverseWhileToList(ByVal MethodName As String, ByVal modParam As MOD_ImpCalcParam, ByVal _Enum_Resize As MOD_EnumImp.ImpCalcResize, Optional ByVal isNotOK As Boolean = False) As List(Of MOD_ImpCalcReverseParam)
Dim ReverseParamList As New List(Of MOD_ImpCalcReverseParam)
Dim ReverseParam As MOD_ImpCalcReverseParam
ReverseParam = ImpCalcMenthodReverse(MethodName, modParam, _Enum_Resize)
If ReverseParam.isOK Then
ReverseParamList.Add(ReverseParam)
End If
Return ReverseParamList
End Function
#End Region
View Code
阻抗線調(diào)整類型Enum枚舉類:
''' <summary>
''' 反算阻抗枚舉 線寬1 線距2 線到銅4
''' </summary>
''' <remarks></remarks>
Public Enum ImpCalcResize
#Region "線路層【線寬,線距,線到銅】調(diào)整"
''' <summary>
''' 線寬 調(diào)整
''' </summary>
''' <remarks></remarks>
W1 = 1
''' <summary>
''' 線距 調(diào)整
''' </summary>
''' <remarks></remarks>
S1 = 2
''' <summary>
''' 線寬+線距 調(diào)整
''' </summary>
''' <remarks></remarks>
W1S1 = 3
''' <summary>
''' 線到銅 調(diào)整
''' </summary>
''' <remarks></remarks>
D1 = 4
''' <summary>
'''線寬+線到銅 調(diào)整
''' </summary>
''' <remarks></remarks>
W1D1 = 5
''' <summary>
''' 線距+線到銅 調(diào)整
''' </summary>
''' <remarks></remarks>
S1D1 = 6
''' <summary>
''' 線寬+線距+線到銅 調(diào)整
''' </summary>
''' <remarks></remarks>
W1S1D1 = 7
''' <summary>
''' 【層間差分阻抗】2條線路偏移距離
''' </summary>
''' <remarks></remarks>
O1
''' <summary>
''' 線路銅厚
''' </summary>
''' <remarks></remarks>
#End Region
#Region "層疊結(jié)構(gòu)【介質(zhì)層厚度,介質(zhì)電常數(shù)】調(diào)整"
T1
''' <summary>
''' H1介質(zhì)層厚度
''' </summary>
''' <remarks></remarks>
H1
''' <summary>
''' H1介電常數(shù)
''' </summary>
''' <remarks></remarks>
Er1
''' <summary>
''' H2介質(zhì)層厚度
''' </summary>
''' <remarks></remarks>
H2
''' <summary>
''' H2介電常數(shù)
''' </summary>
''' <remarks></remarks>
Er2
''' <summary>
''' H3介質(zhì)層厚度
''' </summary>
''' <remarks></remarks>
H3
''' <summary>
''' H3介電常數(shù)
''' </summary>
''' <remarks></remarks>
Er3
''' <summary>
''' H4介質(zhì)層厚度
''' </summary>
''' <remarks></remarks>
H4
''' <summary>
''' H4介電常數(shù)
''' </summary>
''' <remarks></remarks>
Er4
''' <summary>
''' 【內(nèi)層差分阻抗】2條線間距中間純膠介電常數(shù)
''' </summary>
''' <remarks></remarks>
REr
#End Region
End Enum
View Code
三.寫Web服務(wù)接口
選擇性挺多的,可以用WebService,WCF,WebAPI都可能,這里不貼代碼了。
四.凝問解答
1.為要什么封裝為Web,初衷是什么 ?
初衷是解決客戶端沒安裝SI9000照樣可以計(jì)算阻抗
現(xiàn)狀:每個(gè)客戶端需要安裝安裝SI9000工具,沒安裝不能計(jì)算阻抗.基于此問題思考新方法。
解決方式:通過在在服務(wù)端安裝后SI9000,通過Web接口封裝為服務(wù)開放出來供客戶端都可以調(diào)用,
獲取阻抗計(jì)算結(jié)果與反算結(jié)果。
2.阻抗計(jì)算是調(diào)用哪個(gè)DLL計(jì)算的 ?
調(diào)用了:CalcEngineBEMDll.dll 阻抗計(jì)算引擎計(jì)算,這個(gè)DLL在SI9000安裝目錄里面
3.如果不安裝SI9000,工程直接調(diào)用CalcEngineBEMDll.dll是否可以計(jì)算阻抗呢?
經(jīng)過筆者測(cè)試,不行的,必須安裝SI9000才可以,
4.那么安裝SI8000與SI9000的CalcEngineBEMDll.dll計(jì)算結(jié)果是否相同?
阻抗計(jì)算結(jié)果是有細(xì)微不同的,SI8000升級(jí)為SI9000有部份接口參數(shù)做了少許優(yōu)化。
5.如果只安裝SI8000,卻想擁有SI9000的計(jì)算結(jié)果是否可以呢?
當(dāng)然可以的,安裝S8000后,將SI9000的CalcEngineBEMDll.dll
替到SI8000的CalcEngineBEMDll.dll就可以了
6. 阻抗反算是什么意思?
阻抗反算是:通過指定阻抗值不變,反算出線寬,線距,介質(zhì)層厚等信息.
7. 阻抗反算計(jì)算精度有多高?
精度由反算次數(shù)決定+阻抗精確度決定,當(dāng)阻抗可以調(diào)得出來的情況下,
反算次數(shù)正常情況下20次,精度可以高達(dá):0.001歐姆
8. 阻抗反算計(jì)算的原理是什么?
通過二分折半算法與各參數(shù)對(duì)阻抗的正反比關(guān)系計(jì)算得出。
1.折半算法可以baidu.本例子上文代碼中也有寫。
2.參數(shù)正反比關(guān)系如下:
9.是否有Prolar SI9000所有圖片模型呢?
有啊,這里整理分享如下:
http://pcbren.cn/ShareFiles/ProlarSI9000阻抗模大圖png無logo.rar
http://pcbren.cn/ShareFiles/ProlarSI9000阻抗模小圖jpg無logo.rar
10.SI9000有多少種阻抗模型,每種阻抗模型對(duì)應(yīng)的參考層與參數(shù)是怎么樣關(guān)系?
經(jīng)筆記整理統(tǒng)計(jì)有93種.對(duì)應(yīng)的參考層與參數(shù)清單整理如下:
圖片太大小,可以通過如下鏈接查圖片查看
https://images2018.cnblogs.com/blog/733296/201808/733296-20180826191328826-1524965727.png
總結(jié)
以上是生活随笔為你收集整理的PCB SI9000阻抗计算引擎Web方式实现方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转] 在安卓设备上使用 Chrome
- 下一篇: Java核心技术笔记——第 12 章 反