私はdllがロードされている学校のプロジェクトに取り組んでいます。
ロードされるdllは、私のプログラムと、ローカルネットワークを介してコンピューターとPLCの間のブリッジを形成するTwincatSystemManagerの間のブリッジです。
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:
bijTwinCAT.Ads.Internal。 TcAdsDllWrapper.TcAdsDll.AdsAmsUnRegisterRouterNotification()
bij TwinCAT.Ads.Internal.TcAdsDllWrapper.AmsUnRegisterRouterNotification(Boolean throwAdsException)
bij TwinCAT.Ads.Internal.TcLocalSystem.Dispose (Boolean disposed)bij
TwinCAT.Ads
これは大まかに次のように翻訳されます。
DLLをロードできませんtcadsdll.dll:指定されたモジュールが見つかりません。(HRESULTでの例外:0x8007007E)
これは私がインポートしたdllではないので、TwinCAT.ADS.dll
プログラムがこのエラーをスローするのを防ぎ、代わりにプログラムを平和的に閉じるにはどうすればよいですか?私は可能なすべてのdll関連の操作のすべての例外をキャッチしようとしました。
また、ソースはBitbucketにあります。リクエストに応じて公開します。
公式だが非常に便利でないベッコフサイトのいくつかのリンク:
編集: どうやらtcclient.dispose()を使用すると、tryブロックの直後ではなくfinnalyステートメントが使用されたため、エラーが発生するようです。
編集:これは現在例外をキャッチしますが、それを処理しません。
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つしか表示されません。次に、windowsはエラーを出します。