1

私は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にあります。リクエストに応じて公開します。

公式だが非常に便利でないベッコフサイトのいくつかのリンク:

http://infosys.beckhoff.com/espanol.php?content=../content/1034/tcquickstart/html/tcquickstart_samplevisualbasicnet.htm&id=10449

編集: どうやら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はエラーを出します。

4

1 に答える 1

0

未処理の例外ハンドラーを試しましたか?

Dim currentDomain As AppDomain = AppDomain.CurrentDomain
AddHandler currentDomain.UnhandledException, AddressOf MyHandler

Sub MyHandler(sender As Object, args As UnhandledExceptionEventArgs)
   Dim e As Exception = DirectCast(args.ExceptionObject, Exception)
   Console.WriteLine("MyHandler caught : " + e.Message)
End Sub
于 2012-05-17T19:11:56.300 に答える