bgworker

Status
Niet open voor verdere reacties.

tbg

Nieuwe gebruiker
Lid geworden
23 feb 2010
Berichten
1
Voor een project waar ik met een groot aantal variabelen in meerdere beckhoff PLC's verbinding moet maken heb ik een proggramma ontwikkeld waar in de Form load event de verbinding met alle plc's word gemaakt.
Echter de eerste keer verbinding maken met alle plc's duurt zodanig lang dat ik de data die de PLC's waarmee al verbinding is al terug sturen niet kan opvangen met de private sub OnNotification. Dit komt doordat het programma nog druk bezig is met connectie maken met diverse andere plc's.
Als het programma helemaal is opgestart werkt het wel ok, maar ik wil ook het opstarten goed werkend hebben.
Ik los het nu even op met een timer en een tellertje waardoor ik per programma cyclus maar één conectie maak, de volgende cyclus de volgende enz.
totdat alle verbindingen gemaakt zijn. Dit moet mooier kunnen lijkt me.
Ik dacht daarvoor backgroundworkers te gebruiken voor het maken voor elke connectie met de PLC's. de bgworkers verzorgen de connectie, waardoor het hoofdprogramma niet geblokkeerd word en de inkomende data uit de plc's goed kan worden afgehandeld
In de form Load start ik dan de bgWorkers met daarin de code voor connect en Addhandler.
Dit krijg ik helaas niet voor elkaar op deze manier, heeft iemand suggesties waar het fout gaat?





Code:
Imports TwinCAT.Ads
Imports System.IO

Public Class Form1
    Inherits System.Windows.Forms.Form

    Private tcClient As TcAdsClient
    Private hConnect() As Integer
    Private dataStream As AdsStream
    Private binRead As BinaryReader
    Private bgWorker As System.ComponentModel.BackgroundWorker


    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim bgworker As New System.ComponentModel.BackgroundWorker
        bgworker.WorkerReportsProgress = True
        bgworker.WorkerSupportsCancellation = True
        AddHandler bgworker.DoWork, AddressOf bgWorker_DoWork
        AddHandler bgworker.CancelAsync, AddressOf bgworker_CancelAsync
        AddHandler bgworker.RunWorkerCompleted, AddressOf  bgworker_RunWorkerCompleted
        bgworker.RunWorkerAsync()
    End Sub


    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        Try
            tcClient.Dispose()
        Catch err As Exception
            MessageBox.Show(err.Message)
        End Try
    End Sub


    Private Sub OnNotification(ByVal sender As Object, ByVal e As AdsNotificationEventArgs)
        Dim time As New DateTime()
        time = DateTime.FromFileTime(e.TimeStamp)
        e.DataStream.Position = e.Offset
        Dim strValue As String = ""

        If (e.NotificationHandle = hConnect(0)) Then
            strValue = binRead.ReadBoolean().ToString()
        ElseIf (e.NotificationHandle = hConnect(1)) Then
            strValue = binRead.ReadInt16().ToString()
        ElseIf (e.NotificationHandle = hConnect(2)) Then
            strValue = binRead.ReadInt32().ToString()
        ElseIf (e.NotificationHandle = hConnect(3)) Then
            strValue = binRead.ReadByte().ToString()
        ElseIf (e.NotificationHandle = hConnect(4)) Then
            strValue = binRead.ReadDouble().ToString()
        ElseIf (e.NotificationHandle = hConnect(5)) Then
            strValue = binRead.ReadSingle().ToString()
        ElseIf (e.NotificationHandle = hConnect(6)) Then
            strValue = New String(binRead.ReadChars(11))
        End If

        Dim tb As New TextBox()
        tb = CType(e.UserData, TextBox)
        tb.Text = String.Format("DateTime: {0},{1}ms; {2}", time, time.Millisecond, strValue)
    End Sub



Private Sub bgWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
        Dim dataStream As New AdsStream(31)
        'Encoding wird auf ASCII gesetzt, um Strings lesen zu können
        binRead = New BinaryReader(dataStream, System.Text.Encoding.ASCII)
        'Instanz der Klasse TcAdsClient erzeugen
        tcClient = New TcAdsClient()
        'Verbindung mit Port 801 auf dem lokalen Computer herstellen
        tcClient.Connect(801)

        ReDim hConnect(7)

        Try
            hConnect(0) = tcClient.AddDeviceNotification("MAIN.boolVal", dataStream, 0, 1, _
                AdsTransMode.OnChange, 100, 0, tbBool)
            hConnect(1) = tcClient.AddDeviceNotification("MAIN.intVal", dataStream, 1, 2, _
                AdsTransMode.OnChange, 100, 0, tbInt)
            hConnect(2) = tcClient.AddDeviceNotification("MAIN.dintVal", dataStream, 3, 4, _
                AdsTransMode.OnChange, 100, 0, tbDint)
            hConnect(3) = tcClient.AddDeviceNotification("MAIN.sintVal", dataStream, 7, 1, _
                AdsTransMode.OnChange, 100, 0, tbSint)
            hConnect(4) = tcClient.AddDeviceNotification("MAIN.lrealVal", dataStream, 8, 8, _
                AdsTransMode.OnChange, 100, 0, tbLreal)
            hConnect(5) = tcClient.AddDeviceNotification("MAIN.realVal", dataStream, 16, 4, _
                AdsTransMode.OnChange, 100, 0, tbReal)
            hConnect(6) = tcClient.AddDeviceNotification("MAIN.stringVal", dataStream, 20, 11, _
                AdsTransMode.OnChange, 100, 0, tbString)

            ' Handle events (1):
            AddHandler tcClient.AdsNotification, AddressOf OnNotification
        Catch err As Exception
            MessageBox.Show(err.Message)
        End Try
    End Sub


    Private Sub bgworker_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs)

    End Sub


    Private Sub bgworker_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)

    End Sub
End Class
 
Laatst bewerkt door een moderator:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan