PCB SI9000阻抗计算引擎Web方式实现方法
在笔者从业这么多年,PCB行业阻抗计算工具都是用Polar公司的阻抗计算工具SI9000,或早期上个版 本SI8000
Prolar是老牌公司,但也不断在推出新的产品,可以进去去了解一下 https://www.polarinstruments.com/
一直以来在我印象里,好东西都是外国公司创造,但近些年推出【中国制造2025】,中国企业崛起,
在一个创新开放的城市,深圳一家创业公司也推出阻抗计算工具了深圳市赛硕尔科技有限公司
大家可以了解一下 http://www.sisolver.com/ 号称阻抗理论计算精度超过Prolar. 支持国产,加油
一.将单个参数改为Model类做为参数传递
原为单个值参数:
改后Mod参数:
Model参数类
''' <summary>
''' 阻抗计算参数(反算)
''' </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 =
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 *
Case MOD_EnumImp.ImpCalcResize.S1, MOD_EnumImp.ImpCalcResize.S1D1
Me.max = Me.ImpCalcParam.S1 *
Case MOD_EnumImp.ImpCalcResize.D1
Me.max = Me.ImpCalcParam.D1 *
Case MOD_EnumImp.ImpCalcResize.H1
Me.max = Me.ImpCalcParam.H1 *
Case MOD_EnumImp.ImpCalcResize.H2
Me.max = Me.ImpCalcParam.H2 *
Case MOD_EnumImp.ImpCalcResize.H3
Me.max = Me.ImpCalcParam.H3 *
Case MOD_EnumImp.ImpCalcResize.H4
Me.max = Me.ImpCalcParam.H4 *
Case MOD_EnumImp.ImpCalcResize.Er1
Me.max = Me.ImpCalcParam.Er1 *
Case MOD_EnumImp.ImpCalcResize.Er2
Me.max = Me.ImpCalcParam.Er2 *
Case MOD_EnumImp.ImpCalcResize.Er3
Me.max = Me.ImpCalcParam.Er3 *
Case MOD_EnumImp.ImpCalcResize.Er4
Me.max = Me.ImpCalcParam.Er4 *
Case MOD_EnumImp.ImpCalcResize.REr
Me.max = Me.ImpCalcParam.REr *
End Select
End Sub
''' <summary>
''' 反算结果OK
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property isOK As Boolean
''' <summary>
''' 阻抗计算参数(正算)
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property ImpCalcParam As MOD_ImpCalcParam
''' <summary>
''' 反算调整类型
''' </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>
''' 反算最大次数
''' </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>
''' 获取反算调整类型的委托
''' </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>
''' 阻抗计算参数(正算) 继承: 介质层参数+线路层参数+阻焊层参数
''' </summary>
''' <remarks></remarks>
<Serializable()> _
Public Class MOD_ImpCalcParam
Inherits MOD_ImpParamDielectric
''' <summary>
''' 计算阻抗值结果
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property Zo() As Double
End Class ''' <summary>
''' 阻焊层参数 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>
''' 阻焊介电常数(与阻抗值大小成反比)
''' </summary>
Public Property CEr() As Double
End Class
''' <summary>
''' 线路层参数 2/3 继承: 阻焊层参数
''' </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>
''' 介质层参数 3/3 继承: 线路层参数+阻焊层参数
''' </summary>
''' <remarks></remarks>
<Serializable()> _
Public Class MOD_ImpParamDielectric
Inherits MOD_ImpParamSingal
''' <summary>
''' H1介质层厚度(与阻抗值大小成正比)
''' </summary>
Public Property H1() As Double
''' <summary>
''' H1介电常数(与阻抗值大小成反比)
''' </summary>
Public Property Er1() As Double
''' <summary>
''' H2介质层厚度(与阻抗值大小成正比)
''' </summary>
Public Property H2() As Double
''' <summary>
''' H2介电常数(与阻抗值大小成反比)
''' </summary>
Public Property Er2() As Double
''' <summary>
''' H3介质层厚度(与阻抗值大小成正比)
''' </summary>
Public Property H3() As Double
''' <summary>
''' H3介电常数(与阻抗值大小成反比)
''' </summary>
Public Property Er3() As Double
''' <summary>
''' H4介质层厚度(与阻抗值大小成正比)
''' </summary>
Public Property H4() As Double
''' <summary>
''' H4介电常数(与阻抗值大小成反比)
''' </summary>
Public Property Er4() As Double
''' <summary>
''' 【内层差分阻抗】2条线间距中间纯胶介电常数(与阻抗值大小成反比)
''' </summary>
Public Property REr() As Double
End Class
二.写反射类阻抗计算方法
正算代码实现:
#Region "阻抗计算--------正算"
#Region "阻抗模型--------方法名+MOD类参数传递(反射直接出结果)"
''' <summary>
''' 反射调用阻抗计算方法并返回结果
''' </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类参数传递(反射委托方式)"
''' <summary>
''' 定义阻抗计算委托方法
''' </summary>
''' <param name="modParam"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Delegate Function ImpCalcDelegate(ByVal modParam As MOD_ImpCalcParam) As Double
''' <summary>
''' 获取阻抗计算的委托方法
''' </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
反算代码实现:
#Region "阻抗计算--------反算"
''' <summary>
''' 深复制 序列化实现
''' </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序列化与反序列化完成引用对象的复制
Dim formatter As IFormatter = New BinaryFormatter()
formatter.Serialize(objectStream, RealObject)
objectStream.Seek(, SeekOrigin.Begin)
Return CType(formatter.Deserialize(objectStream), T)
End Using
End Function
''' <summary>
''' 反算---循环调用阻抗计算方法并返回反回计算是否成功
''' </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 +=
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>
''' 反算---循环调用阻抗计算方法并返回计算多种结果(应用于差分线2线中心距调整)可以得到多种阻抗匹配结果
''' </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
阻抗线调整类型Enum枚举类:
''' <summary>
''' 反算阻抗枚举 线宽1 线距2 线到铜4
''' </summary>
''' <remarks></remarks>
Public Enum ImpCalcResize
#Region "线路层【线宽,线距,线到铜】调整"
''' <summary>
''' 线宽 调整
''' </summary>
''' <remarks></remarks>
W1 =
''' <summary>
''' 线距 调整
''' </summary>
''' <remarks></remarks>
S1 =
''' <summary>
''' 线宽+线距 调整
''' </summary>
''' <remarks></remarks>
W1S1 =
''' <summary>
''' 线到铜 调整
''' </summary>
''' <remarks></remarks>
D1 =
''' <summary>
'''线宽+线到铜 调整
''' </summary>
''' <remarks></remarks>
W1D1 =
''' <summary>
''' 线距+线到铜 调整
''' </summary>
''' <remarks></remarks>
S1D1 =
''' <summary>
''' 线宽+线距+线到铜 调整
''' </summary>
''' <remarks></remarks>
W1S1D1 =
''' <summary>
''' 【层间差分阻抗】2条线路偏移距离
''' </summary>
''' <remarks></remarks>
O1
''' <summary>
''' 线路铜厚
''' </summary>
''' <remarks></remarks>
#End Region #Region "层叠结构【介质层厚度,介质电常数】调整"
T1
''' <summary>
''' H1介质层厚度
''' </summary>
''' <remarks></remarks>
H1
''' <summary>
''' H1介电常数
''' </summary>
''' <remarks></remarks>
Er1
''' <summary>
''' H2介质层厚度
''' </summary>
''' <remarks></remarks>
H2
''' <summary>
''' H2介电常数
''' </summary>
''' <remarks></remarks>
Er2
''' <summary>
''' H3介质层厚度
''' </summary>
''' <remarks></remarks>
H3
''' <summary>
''' H3介电常数
''' </summary>
''' <remarks></remarks>
Er3
''' <summary>
''' H4介质层厚度
''' </summary>
''' <remarks></remarks>
H4
''' <summary>
''' H4介电常数
''' </summary>
''' <remarks></remarks>
Er4
''' <summary>
''' 【内层差分阻抗】2条线间距中间纯胶介电常数
''' </summary>
''' <remarks></remarks>
REr #End Region End Enum
三.写Web服务接口
选择性挺多的,可以用WebService,WCF,WebAPI都可能,这里不贴代码了。
四.凝问解答
1.为要什么封装为Web,初衷是什么 ?
初衷是解决客户端没安装SI9000照样可以计算阻抗
现状:每个客户端需要安装安装SI9000工具,没安装不能计算阻抗.基于此问题思考新方法。
解决方式:通过在在服务端安装后SI9000,通过Web接口封装为服务开放出来供客户端都可以调用,
获取阻抗计算结果与反算结果。
2.阻抗计算是调用哪个DLL计算的 ?
调用了:CalcEngineBEMDll.dll 阻抗计算引擎计算,这个DLL在SI9000安装目录里面
3.如果不安装SI9000,工程直接调用CalcEngineBEMDll.dll是否可以计算阻抗呢?
经过笔者测试,不行的,必须安装SI9000才可以,
4.那么安装SI8000与SI9000的CalcEngineBEMDll.dll计算结果是否相同?
阻抗计算结果是有细微不同的,SI8000升级为SI9000有部份接口参数做了少许优化。
5.如果只安装SI8000,却想拥有SI9000的计算结果是否可以呢?
当然可以的,安装S8000后,将SI9000的CalcEngineBEMDll.dll
替到SI8000的CalcEngineBEMDll.dll就可以了
6. 阻抗反算是什么意思?
阻抗反算是:通过指定阻抗值不变,反算出线宽,线距,介质层厚等信息.
7. 阻抗反算计算精度有多高?
精度由反算次数决定+阻抗精确度决定,当阻抗可以调得出来的情况下,
反算次数正常情况下20次,精度可以高达:0.001欧姆
8. 阻抗反算计算的原理是什么?
通过二分折半算法与各参数对阻抗的正反比关系计算得出。
1.折半算法可以baidu.本例子上文代码中也有写。
2.参数正反比关系如下:
9.是否有Prolar SI9000所有图片模型呢?
有啊,这里整理分享如下:
http://pcbren.cn/ShareFiles/ProlarSI9000阻抗模大图png无logo.rar
http://pcbren.cn/ShareFiles/ProlarSI9000阻抗模小图jpg无logo.rar
10.SI9000有多少种阻抗模型,每种阻抗模型对应的参考层与参数是怎么样关系?
经笔记整理统计有93种.对应的参考层与参数清单整理如下:
图片太大小, 可以通过如下链接查图片查看
https://images2018.cnblogs.com/blog/733296/201808/733296-20180826191328826-1524965727.png
PCB SI9000阻抗计算引擎Web方式实现方法的更多相关文章
- PCB Web版SI9000阻抗计算器
在几个月前写过一遍关于: PCB SI9000阻抗计算引擎Web方式实现方法 ,最近开始参考Polar SI9000的界面,将阻抗计算器转为网页版的方式实现. 一.Web版SI9000阻抗计算器 ...
- PCB Polar SI9000阻抗模型图片文字识别方法
用过Polar SI9000的都知道,阻抗模型图片可以进行用户鼠标交互,那么它的是如何实现的呢,下面就讲一下如何实现此功能的方法 一.看看Polar SI9000阻抗模型图片交互效果 鼠标点击阻抗 ...
- 【Spark深入学习 -13】Spark计算引擎剖析
----本节内容------- 1.遗留问题解答 2.Spark核心概念 2.1 RDD及RDD操作 2.2 Transformation和Action 2.3 Spark程序架构 2.4 Spark ...
- Flink学习笔记-新一代Flink计算引擎
说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...
- 交互式计算引擎REOLAP篇
交互式计算引擎ROLAP篇 摘自:<大数据技术体系详解:原理.架构与实践> 一.Impala Impala最初由Cloudera公司开发的,其最初设计动机是充分结合传统数据库与大数据系 ...
- JStorm 是一个分布式实时计算引擎
alibaba/jstorm JStorm 是一个分布式实时计算引擎. JStorm 是一个类似Hadoop MapReduce的系统, 用户按照指定的接口实现一个任务,然后将这个任务递交给JStor ...
- PCB的阻抗控制
多层板的结构: 通常我们所说的多层板是由芯板和半固化片互相层叠压合而成的,芯板是一种硬质的.有特定厚度的.两面包铜的板材,是构成印制板的基础材料.而半固化片构成所谓的浸润层,起到粘合芯板的作用,虽然也 ...
- Spark源码剖析 - 计算引擎
本章导读 RDD作为Spark对各种数据计算模型的统一抽象,被用于迭代计算过程以及任务输出结果的缓存读写.在所有MapReduce框架中,shuffle是连接map任务和reduce任务的桥梁.map ...
- 腾讯大数据之TDW计算引擎解析——Shuffle
转自 https://www.csdn.net/article/2014-05-19/2819831-TDW-Shuffle/1 摘要:腾讯分布式数据仓库基于开源软件Hadoop和Hive进行构建,T ...
随机推荐
- allegro中出光绘文件遇到问题的解决办法
一:设置好光绘文件参数后,选择check dabase before artwork后,点击生成光绘时出现错误告警信息: database has errors:artwork generati ...
- hdu - 2822 Dogs (优先队列+bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=2822 给定起点和终点,问从起点到终点需要挖几次只有从# 到 .或者从. 到 . 才需要挖一次. #includ ...
- Rikka with Phi 线段树
Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds ...
- LOAP& its implimenlation
LDAP 概念 LDAP的英文全称是Lightweight Directory Access Protocol,简称为LDAP,LDAP是轻量目录访问协议,LDAP是轻量目录访问协议.简单的说来,LD ...
- SQL Server转sqlite数据库
下载地址:http://files.cnblogs.com/jason-davis/SQL_Server_To_SQLite_DB_Converter_bin.zip 下载地址:http://file ...
- component and slot
component and slot 使用: 1.component panel <article class="message"> <div class=&qu ...
- [Spring] Properties for project configuration
We might have some project specific configuration need to setup. The good approach to do this in Spr ...
- 11gR2 RAC环境重建ASM SPFILE
有关11gR2 ASM spfile说明能够看 http://blog.csdn.net/robo23/article/details/41930051 下面粘出spfile重新启动过程: +++1) ...
- 【剑指Offer】俯视50题之31 - 40题
面试题31连续子数组的最大和 面试题32从1到n整数中1出现的次数 面试题33把数组排成最小的数 面试题34丑数 面试题35第一个仅仅出现一次的字符 面试题36数组中的逆序对 面试题37两个链表的第一 ...
- iOS单例设计模式具体解说(单例设计模式不断完好的过程)
在iOS中有非常多的设计模式,有一本书<Elements of Reusable Object-Oriented Software>(中文名字为<设计模式>)讲述了23种软件设 ...