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?
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: