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 ...
随机推荐
- C++迭代器之'插入迭代器
1. 定义 插入型迭代器(Insert Iterator),又叫插入器(Inserter). 2. 作用 插入迭代器的主要功能为把一个赋值操作转换为把相应的值插入容器的操作.算法库对所有在容器上的操作 ...
- spring+orm框架的兼容问题
Springframework和Hibernate版本对应关系 org.springframework 3.0.x对应org.hibernate4.0.x版本 org.springframework ...
- windows 下 iptables
windows自带的防火墙就可以. 在命令行方式下输入netsh回车,再输入firewall回车,之后想干什么就干什么. 头一次见对图形化防火墙头晕的...
- Python模块:configparser、hashlib、(subprocess)
configparser模块: 此模块用于生成和修改常见配置文档. 一个常见配置文件(.ini的后缀名)格式如下: [DEFAULT] # DEFAULT 是指后面的字典里都会默认有的内容 Serve ...
- 运算符、流程控制、while循环
运算符: 1. 算术运算符: “ + ”.“ - ” .“ * ” .“ / ” 分别为加.减.乘.除. # % 是“取模运算符”,就是返回除法的余数.eg. a = 3, b=5, b % a 就是 ...
- msp430入门编程10
msp430中C语言操作端口I/O10 msp430中C语言的模块化头文件及实现11 msp430中C语言的模块化头文件及库文件12 msp430入门学习 msp430入门编程
- poj - 3041 Asteroids (二分图最大匹配+匈牙利算法)
http://poj.org/problem?id=3041 在n*n的网格中有K颗小行星,小行星i的位置是(Ri,Ci),现在有一个强有力的武器能够用一发光速将一整行或一整列的小行星轰为灰烬,想要利 ...
- [bzoj1059][ZJOI2007]矩阵游戏_二分图最大匹配
矩阵游戏 bzoj-1059 ZJOI-2007 题目大意:给定一个n*n的棋盘,上面有一些格子被染黑,剩下都是白色.你每次可以交换两列或者两行,问你能否通过一系列操作使得棋盘的主对角线上的格子全是黑 ...
- Minimum Depth of Binary Tree(二叉树DFS)
Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shor ...
- sql语句执行的很慢
一个 SQL 执行的很慢,我们要分两种情况讨论: 1.大多数情况下很正常,偶尔很慢,则有如下原因 (1).数据库在刷新脏页,例如 redo log 写满了需要同步到磁盘. (2).执行的时候,遇到锁, ...