日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PCB SI9000阻抗计算引擎Web方式实现方法

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_ImpCalcReverseParamPublic Sub New(ByVal _ImpCalcParam As MOD_ImpCalcParam, ByVal _Enum_Resize As MOD_EnumImp.ImpCalcResize)Me.ImpCalcParam = _ImpCalcParamMe.Enum_Resize = _Enum_ResizeMe.RequestZo = _ImpCalcParam.ZoMe.WS_Sum = Me.ImpCalcParam.W1 + Me.ImpCalcParam.S1Me.WD_Sum = Me.ImpCalcParam.W1 + Me.ImpCalcParam.D1Me.SD_Sum = Me.ImpCalcParam.S1 + Me.ImpCalcParam.D1Me.W1W2_Diff = Me.ImpCalcParam.W1 - Me.ImpCalcParam.W2Me.CalcMaxCount = 20Me.ImpAccuracy = 0.01Me.min = 0.0Select Case Enum_ResizeCase MOD_EnumImp.ImpCalcResize.W1, MOD_EnumImp.ImpCalcResize.W1S1, MOD_EnumImp.ImpCalcResize.W1D1, MOD_EnumImp.ImpCalcResize.W1S1D1, MOD_EnumImp.ImpCalcResize.O1Me.max = Me.ImpCalcParam.W1 * 4Case MOD_EnumImp.ImpCalcResize.S1, MOD_EnumImp.ImpCalcResize.S1D1Me.max = Me.ImpCalcParam.S1 * 4Case MOD_EnumImp.ImpCalcResize.D1Me.max = Me.ImpCalcParam.D1 * 4Case MOD_EnumImp.ImpCalcResize.H1Me.max = Me.ImpCalcParam.H1 * 4Case MOD_EnumImp.ImpCalcResize.H2Me.max = Me.ImpCalcParam.H2 * 4Case MOD_EnumImp.ImpCalcResize.H3Me.max = Me.ImpCalcParam.H3 * 4Case MOD_EnumImp.ImpCalcResize.H4Me.max = Me.ImpCalcParam.H4 * 4Case MOD_EnumImp.ImpCalcResize.Er1Me.max = Me.ImpCalcParam.Er1 * 4Case MOD_EnumImp.ImpCalcResize.Er2Me.max = Me.ImpCalcParam.Er2 * 4Case MOD_EnumImp.ImpCalcResize.Er3Me.max = Me.ImpCalcParam.Er3 * 4Case MOD_EnumImp.ImpCalcResize.Er4Me.max = Me.ImpCalcParam.Er4 * 4Case MOD_EnumImp.ImpCalcResize.RErMe.max = Me.ImpCalcParam.REr * 4End SelectEnd 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) = NothingSelect Case Enum_ResizeCase MOD_EnumImp.ImpCalcResize.W1ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.min = ReverseParam.ImpCalcParam.W1ReverseParam.ImpCalcParam.W1 = (ReverseParam.max + ReverseParam.ImpCalcParam.W1) * 0.5ReverseParam.ImpCalcParam.W2 = ReverseParam.ImpCalcParam.W1 - ReverseParam.W1W2_DiffElseReverseParam.max = ReverseParam.ImpCalcParam.W1ReverseParam.ImpCalcParam.W1 = (ReverseParam.min + ReverseParam.ImpCalcParam.W1) * 0.5ReverseParam.ImpCalcParam.W2 = ReverseParam.ImpCalcParam.W1 - ReverseParam.W1W2_DiffEnd IfEnd Sub)Case MOD_EnumImp.ImpCalcResize.W1D1ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.min = ReverseParam.ImpCalcParam.W1ReverseParam.ImpCalcParam.W1 = (ReverseParam.max + ReverseParam.ImpCalcParam.W1) * 0.5ReverseParam.ImpCalcParam.W2 = ReverseParam.ImpCalcParam.W1 - ReverseParam.W1W2_DiffReverseParam.ImpCalcParam.D1 = ReverseParam.WD_Sum - ReverseParam.ImpCalcParam.W1ElseReverseParam.max = ReverseParam.ImpCalcParam.W1ReverseParam.ImpCalcParam.W1 = (ReverseParam.min + ReverseParam.ImpCalcParam.W1) * 0.5ReverseParam.ImpCalcParam.W2 = ReverseParam.ImpCalcParam.W1 - ReverseParam.W1W2_DiffReverseParam.ImpCalcParam.D1 = ReverseParam.WD_Sum - ReverseParam.ImpCalcParam.W1End IfEnd Sub)Case MOD_EnumImp.ImpCalcResize.W1S1ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.min = ReverseParam.ImpCalcParam.W1ReverseParam.ImpCalcParam.W1 = (ReverseParam.max + ReverseParam.ImpCalcParam.W1) * 0.5ReverseParam.ImpCalcParam.W2 = ReverseParam.ImpCalcParam.W1 - ReverseParam.W1W2_DiffReverseParam.ImpCalcParam.S1 = ReverseParam.WS_Sum - ReverseParam.ImpCalcParam.W1ElseReverseParam.max = ReverseParam.ImpCalcParam.W1ReverseParam.ImpCalcParam.W1 = (ReverseParam.min + ReverseParam.ImpCalcParam.W1) * 0.5ReverseParam.ImpCalcParam.W2 = ReverseParam.ImpCalcParam.W1 - ReverseParam.W1W2_DiffReverseParam.ImpCalcParam.S1 = ReverseParam.WS_Sum - ReverseParam.ImpCalcParam.W1End IfEnd Sub)Case MOD_EnumImp.ImpCalcResize.W1S1D1ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.min = ReverseParam.ImpCalcParam.W1ReverseParam.ImpCalcParam.W1 = (ReverseParam.max + ReverseParam.ImpCalcParam.W1) * 0.5ReverseParam.ImpCalcParam.W2 = ReverseParam.ImpCalcParam.W1 - ReverseParam.W1W2_DiffReverseParam.ImpCalcParam.S1 = ReverseParam.WS_Sum - ReverseParam.ImpCalcParam.W1ReverseParam.ImpCalcParam.D1 = ReverseParam.WD_Sum - ReverseParam.ImpCalcParam.W1ElseReverseParam.max = ReverseParam.ImpCalcParam.W1ReverseParam.ImpCalcParam.W1 = (ReverseParam.min + ReverseParam.ImpCalcParam.W1) * 0.5ReverseParam.ImpCalcParam.W2 = ReverseParam.ImpCalcParam.W1 - ReverseParam.W1W2_DiffReverseParam.ImpCalcParam.S1 = ReverseParam.WS_Sum - ReverseParam.ImpCalcParam.W1ReverseParam.ImpCalcParam.D1 = ReverseParam.WD_Sum - ReverseParam.ImpCalcParam.W1End IfEnd Sub)Case MOD_EnumImp.ImpCalcResize.S1ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.max = ReverseParam.ImpCalcParam.S1ReverseParam.ImpCalcParam.S1 = (ReverseParam.min + ReverseParam.ImpCalcParam.S1) * 0.5ElseReverseParam.min = ReverseParam.ImpCalcParam.S1ReverseParam.ImpCalcParam.S1 = (ReverseParam.max + ReverseParam.ImpCalcParam.S1) * 0.5End IfEnd Sub)Case MOD_EnumImp.ImpCalcResize.D1ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.max = ReverseParam.ImpCalcParam.D1ReverseParam.ImpCalcParam.D1 = (ReverseParam.min + ReverseParam.ImpCalcParam.D1) * 0.5ElseReverseParam.min = ReverseParam.ImpCalcParam.D1ReverseParam.ImpCalcParam.D1 = (ReverseParam.max + ReverseParam.ImpCalcParam.D1) * 0.5End IfEnd Sub)Case MOD_EnumImp.ImpCalcResize.S1D1ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.max = ReverseParam.ImpCalcParam.S1ReverseParam.ImpCalcParam.S1 = (ReverseParam.min + ReverseParam.ImpCalcParam.S1) * 0.5ReverseParam.ImpCalcParam.D1 = ReverseParam.SD_Sum - ReverseParam.ImpCalcParam.S1ElseReverseParam.min = ReverseParam.ImpCalcParam.S1ReverseParam.ImpCalcParam.S1 = (ReverseParam.max + ReverseParam.ImpCalcParam.S1) * 0.5ReverseParam.ImpCalcParam.D1 = ReverseParam.SD_Sum - ReverseParam.ImpCalcParam.S1End IfEnd Sub)Case MOD_EnumImp.ImpCalcResize.O1ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.max = ReverseParam.ImpCalcParam.O1ReverseParam.ImpCalcParam.O1 = (ReverseParam.min + ReverseParam.ImpCalcParam.O1) * 0.5ElseReverseParam.min = ReverseParam.ImpCalcParam.S1ReverseParam.ImpCalcParam.O1 = (ReverseParam.max + ReverseParam.ImpCalcParam.O1) * 0.5End IfEnd Sub)Case MOD_EnumImp.ImpCalcResize.T1ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.min = ReverseParam.ImpCalcParam.T1ReverseParam.ImpCalcParam.T1 = (ReverseParam.max + ReverseParam.ImpCalcParam.T1) * 0.5ElseReverseParam.max = ReverseParam.ImpCalcParam.T1ReverseParam.ImpCalcParam.T1 = (ReverseParam.min + ReverseParam.ImpCalcParam.T1) * 0.5End IfEnd Sub)Case MOD_EnumImp.ImpCalcResize.H1ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.max = ReverseParam.ImpCalcParam.H1ReverseParam.ImpCalcParam.H1 = (ReverseParam.min + ReverseParam.ImpCalcParam.H1) * 0.5ElseReverseParam.min = ReverseParam.ImpCalcParam.H1ReverseParam.ImpCalcParam.H1 = (ReverseParam.max + ReverseParam.ImpCalcParam.H1) * 0.5End IfEnd Sub)Case MOD_EnumImp.ImpCalcResize.Er1ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.min = ReverseParam.ImpCalcParam.Er1ReverseParam.ImpCalcParam.Er1 = (ReverseParam.max + ReverseParam.ImpCalcParam.Er1) * 0.5ElseReverseParam.max = ReverseParam.ImpCalcParam.Er1ReverseParam.ImpCalcParam.Er1 = (ReverseParam.min + ReverseParam.ImpCalcParam.Er1) * 0.5End IfEnd Sub)Case MOD_EnumImp.ImpCalcResize.H2ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.max = ReverseParam.ImpCalcParam.H2ReverseParam.ImpCalcParam.H2 = (ReverseParam.min + ReverseParam.ImpCalcParam.H2) * 0.5ElseReverseParam.min = ReverseParam.ImpCalcParam.H2ReverseParam.ImpCalcParam.H2 = (ReverseParam.max + ReverseParam.ImpCalcParam.H2) * 0.5End IfEnd Sub)Case MOD_EnumImp.ImpCalcResize.Er2ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.min = ReverseParam.ImpCalcParam.Er2ReverseParam.ImpCalcParam.Er2 = (ReverseParam.max + ReverseParam.ImpCalcParam.Er2) * 0.5ElseReverseParam.max = ReverseParam.ImpCalcParam.Er2ReverseParam.ImpCalcParam.Er2 = (ReverseParam.min + ReverseParam.ImpCalcParam.Er2) * 0.5End IfEnd Sub)Case MOD_EnumImp.ImpCalcResize.H3ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.max = ReverseParam.ImpCalcParam.H3ReverseParam.ImpCalcParam.H3 = (ReverseParam.min + ReverseParam.ImpCalcParam.H3) * 0.5ElseReverseParam.min = ReverseParam.ImpCalcParam.H3ReverseParam.ImpCalcParam.H3 = (ReverseParam.max + ReverseParam.ImpCalcParam.H3) * 0.5End IfEnd Sub)Case MOD_EnumImp.ImpCalcResize.Er3ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.min = ReverseParam.ImpCalcParam.Er3ReverseParam.ImpCalcParam.Er3 = (ReverseParam.max + ReverseParam.ImpCalcParam.Er3) * 0.5ElseReverseParam.max = ReverseParam.ImpCalcParam.Er3ReverseParam.ImpCalcParam.Er3 = (ReverseParam.min + ReverseParam.ImpCalcParam.Er3) * 0.5End IfEnd Sub)Case MOD_EnumImp.ImpCalcResize.H4ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.max = ReverseParam.ImpCalcParam.H4ReverseParam.ImpCalcParam.H4 = (ReverseParam.min + ReverseParam.ImpCalcParam.H4) * 0.5ElseReverseParam.min = ReverseParam.ImpCalcParam.H4ReverseParam.ImpCalcParam.H4 = (ReverseParam.max + ReverseParam.ImpCalcParam.H4) * 0.5End IfEnd Sub)Case MOD_EnumImp.ImpCalcResize.Er4ReturnReverse = New Action(Of MOD_ImpCalcReverseParam)(Sub(ReverseParam)If ReverseParam.ImpCalcParam.Zo > ReverseParam.RequestZo ThenReverseParam.min = ReverseParam.ImpCalcParam.Er4ReverseParam.ImpCalcParam.Er4 = (ReverseParam.max + ReverseParam.ImpCalcParam.Er4) * 0.5ElseReverseParam.max = ReverseParam.ImpCalcParam.Er4ReverseParam.ImpCalcParam.Er4 = (ReverseParam.min + ReverseParam.ImpCalcParam.Er4) * 0.5End IfEnd Sub)End SelectReturn ReturnReverseEnd Function End Class''' <summary> ''' 阻抗計算參數(正算) 繼承: 介質層參數+線路層參數+阻焊層參數 ''' </summary> ''' <remarks></remarks> <Serializable()> _ Public Class MOD_ImpCalcParamInherits 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_ImpParamSingalInherits 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_ImpParamDielectricInherits 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 View Code

?

?二.寫反射類阻抗計算方法

? ? ? ? ?正算代碼實現:? ? ??

#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 DoubleDim result As Double = 0.0TryDim 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)CatchEnd TrymodParam.Zo = resultReturn (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 ImpCalcDelegateDim impcalc As ImpCalcDelegate = NothingTryDim 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)CatchEnd TryReturn impcalcEnd Function #End Region#End Region View Code

? ? ? ? ?反算代碼實現:

#Region "阻抗計算--------反算"''' <summary>''' 深復制 序列化實現''' </summary>''' <typeparam name="T"></typeparam>''' <param name="RealObject"></param>''' <returns></returns>Public Function ToClone(Of T)(ByVal RealObject As T) As TUsing objectStream As Stream = New MemoryStream()'利用 System.Runtime.Serialization序列化與反序列化完成引用對象的復制 Dim formatter As IFormatter = New BinaryFormatter()formatter.Serialize(objectStream, RealObject)objectStream.Seek(0, SeekOrigin.Begin)Return CType(formatter.Deserialize(objectStream), T)End UsingEnd 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_ImpCalcReverseParamDim CalcCount As IntegerDim 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.ImpAccuracyReverseResizeDelegate(ReverseParam)impcalcDelegate(ReverseParam.ImpCalcParam)CalcCount += 1If CalcCount > ReverseParam.CalcMaxCount ThenExit WhileEnd IfEnd WhileIf Not CalcCount > ReverseParam.CalcMaxCount ThenReverseParam.isOK = TrueElseReverseParam.ImpCalcParam = NothingReverseParam.isOK = FalseEnd IfReturn ReverseParamEnd 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_ImpCalcReverseParamReverseParam = ImpCalcMenthodReverse(MethodName, modParam, _Enum_Resize)If ReverseParam.isOK ThenReverseParamList.Add(ReverseParam)End IfReturn ReverseParamListEnd Function #End Region View Code

? ? ? 阻抗線調整類型Enum枚舉類:

''' <summary>''' 反算阻抗枚舉 線寬1 線距2 線到銅4''' </summary>''' <remarks></remarks>Public Enum ImpCalcResize #Region "線路層【線寬,線距,線到銅】調整"''' <summary>''' 線寬 調整''' </summary>''' <remarks></remarks>W1 = 1''' <summary>''' 線距 調整''' </summary>''' <remarks></remarks>S1 = 2''' <summary>''' 線寬+線距 調整''' </summary>''' <remarks></remarks>W1S1 = 3''' <summary>''' 線到銅 調整''' </summary>''' <remarks></remarks>D1 = 4''' <summary>'''線寬+線到銅 調整''' </summary>''' <remarks></remarks>W1D1 = 5''' <summary>''' 線距+線到銅 調整''' </summary>''' <remarks></remarks>S1D1 = 6''' <summary>''' 線寬+線距+線到銅 調整''' </summary>''' <remarks></remarks>W1S1D1 = 7''' <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 RegionEnd Enum View Code

?

三.寫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

?

轉載于:https://www.cnblogs.com/pcbren/p/9538575.html

總結

以上是生活随笔為你收集整理的PCB SI9000阻抗计算引擎Web方式实现方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。