我正在为学校开发一个加载 dll 的项目。
加载的 dll 是我的程序和 Twincat 系统管理器之间的桥梁,它通过本地网络形成计算机和 PLC 之间的桥梁。
我需要通过从 plc 到我的程序的整个链来阅读变量。
这就是我这样做的方式:
Public Function adsReadReal(ByVal Variabelenaam As String) As Single
Dim ds = New TwinCAT.Ads.AdsStream(4 * 8) ' new data stream
Dim br = New System.IO.BinaryReader(ds) 'new binary
Dim hVar = New Integer
Try
ConState(1)
tcclient = New TcAdsClient
ConState(2)
tcclient.Connect(Form1.amsAdress, 801) 'connects the tcclient to the PLC
hVar = tcclient.CreateVariableHandle(Variabelenaam) 'creats a handle for the variable
tcclient.Read(hVar, ds) 'read it
ConState(5)
Return br.ReadSingle() 'convert it from binary to readable for vb
Catch ex As Exception
ConState(0)
PrintEx(ex) 'print out the exception
finally
tcclient.Dispose() 'make the object stop being used to prevent a lingering connection
End Try
Return False
End Function
现在程序加载一个TwinCAT.ADS.dll
在连接模块开始时调用的 dll。如果 Twincat 系统管理器正在运行程序正常结束,但当它不是时它崩溃并给我这个错误:
System.DllNotFoundException 未处理
Message="Kan DLL tcadsdll.dll niet laden: Kan opgegeven module niet vinden. (Uitzondering van HRESULT: 0x8007007E)"
Source="TwinCAT.Ads"
TypeName=""
StackTrace:
bij TwinCAT.Ads.Internal. TcAdsDllWrapper.TcAdsDll.AdsAmsUnRegisterRouterNotification()
bij TwinCAT.Ads.Internal.TcAdsDllWrapper.AmsUnRegisterRouterNotification(Boolean throwAdsException)
bij TwinCAT.Ads.Internal.TcLocalSystem.Dispose (Boolean disposing)
bij TwinCAT.Ads.Internal.TcLocalSystem.Finalize()
大致翻译为:
无法加载 DLL tcadsdll.dll:找不到给定的模块。(HRESULT 异常:0x8007007E)
这不是我导入的dll,所以它必须来自TwinCAT.ADS.dll
如何防止程序向我抛出此错误,而是和平关闭程序?我试图捕获每个可能的 dll 相关操作的所有异常。
来源也在 Bitbucket 上。我会应要求将其公开。
官方但相当不方便的 Beckhoff 网站上的一些链接:
编辑: 显然使用 tcclient.dispose() 会导致错误,因为使用了 finnaly 语句而不是在 try 块之后
编辑:这当前捕获了异常,但它不处理它。
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
AddHandler currentDomain.UnhandledException, AddressOf MyHandler
Dim tick As Byte = 0
Sub MyHandler(sender As Object, args As UnhandledExceptionEventArgs)
Dim ex As Exception = DirectCast(args.ExceptionObject, Exception)
MsgBox("exception tick" & Str(tick))
tick = tick + 1
PrintEx(ex)
End Sub
编辑: 异常没有被正确捕获,因为在 vs2008 中发生了几个错误,但是在我按 F5 后出现了勾号(继续)
当程序直接运行时,我只看到 1 Tick。然后windows给出一个错误。