Public Delegate Sub EventChangedVar(ByVal sender As Object, ByVal e As PLCVariableChangedEventArg)
Public Delegate Sub AsyncChangeEvent(ByRef v As System.Collections.Generic.List(Of PLCVarPoolElement))
Public Class PLCBase
Private PLCThread As Thread
Private prioA_thread As Thread
Private prioB_thread As Thread
Private prioC_thread As Thread
Private RunThreads As Boolean
Private timeA As Integer = 500
Private timeB As Integer = 2000
Private timeC As Integer = 4000
Private timePLC As Integer = 500
Private tcADS As TcAdsClient
Private ADSAdress As String
Private ADSPort As Integer
Private ADSTimeout As Integer = 100
Private ADSConnectState As ADSConnectState
Private ADSState As TwinCAT.Ads.AdsState
Private State As String
Private VarDic As System.Collections.Generic.Dictionary(Of String, PLCVarPoolElement)
Public Event OnPLCVarChange As PLCVarChangeHandler
Public Event OnPLCConnectMsg As PLCConnectMsgHandler
Private lock As New Object()
Public Sub New(ByVal ADSAdress As String, ByVal ADSPort As Integer)
MyBase.New()
Me.ADSAdress = ADSAdress
Me.ADSPort = ADSPort
VarDic = New System.Collections.Generic.Dictionary(Of String, PLCVarPoolElement)
End Sub
Public Sub New(ByVal ADSAdress As String, ByVal ADSPort As Integer, ByVal Timeout As Integer)
MyBase.New()
Me.ADSAdress = ADSAdress
Me.ADSPort = ADSPort
Me.ADSTimeout = Timeout
VarDic = New System.Collections.Generic.Dictionary(Of String, PLCVarPoolElement)
End Sub
Public Sub AddPLCVar(ByVal name As String, ByVal path As String, ByVal type As PLCType, ByVal timeclass As PLCTimeClass, Optional ByVal size As Integer = 1)
VarDic.Add(name, New PLCVarPoolElement(name, path, type, timeclass, size))
End Sub
Protected Sub GetPLCVars()
For Each element As PLCVarPoolElement In Me.VarDic.Values
Dim var As PLCVariable
Select Case element.PLCType
Case PLCType.PLCArrayInteger
var = New PLCVarArrayInteger(Me, element.PLCPath, element.PLCSize, element.PLCTimeClass)
Case PLCType.PLCArrayUInteger
var = New PLCVarArrayUInteger(Me, element.PLCPath, element.PLCSize, element.PLCTimeClass)
Case PLCType.PLCBoolean
var = New PLCVarBoolean(Me, element.PLCPath, element.PLCTimeClass)
Case PLCType.PLCDate
var = New PLCVarDate(Me, element.PLCPath, element.PLCTimeClass)
Case PLCType.PLCDInteger
var = New PLCVarDInteger(Me, element.PLCPath, element.PLCTimeClass)
Case PLCType.PLCUDInteger
var = New PLCVarUDInteger(Me, element.PLCPath, element.PLCTimeClass)
Case PLCType.PLCInteger
var = New PLCVarInteger(Me, element.PLCPath, element.PLCTimeClass)
Case PLCType.PLCUInteger
var = New PLCVarUInteger(Me, element.PLCPath, element.PLCTimeClass)
Case PLCType.PLCDouble
var = New PLCVarDouble(Me, element.PLCPath, element.PLCTimeClass)
Case PLCType.PLCString
var = New PLCVarString(Me, element.PLCPath, element.PLCSize, element.PLCTimeClass)
Case Else
'var = Nothing
Throw New PLCException("PLC type is not implementet!")
End Select
element.PLCVariable = var
Next
End Sub
Private Sub DropPLCVars()
For Each element As PLCVarPoolElement In Me.VarDic.Values
Try
If Not (element.PLCVariable Is Nothing) Then
element.PLCVariable.Dispose()
element.PLCVariable = Nothing
End If
Catch ex As Exception
End Try
Next
End Sub
Protected Sub Connect()
Me.tcADS = New TcAdsClient()
Me.tcADS.Synchronize = True
Me.tcADS.Connect(Me.ADSAdress, Me.ADSPort)
Me.tcADS.Timeout = ADSTimeout
AddHandler tcADS.AdsStateChanged, AddressOf AdsStateChangedEventHandler
End Sub
Protected Sub Disconnect()
Try
If Not (Me.tcADS Is Nothing) Then
SyncLock Me.tcADS
Me.tcADS.Dispose()
Me.tcADS = Nothing
End SyncLock
End If
Catch ex As TwinCAT.Ads.AdsException
End Try
End Sub
Private Sub SendConnectMsg(ByVal msg As String)
RaiseEvent OnPLCConnectMsg(Me, New PLCConnectMessageEventArg(msg))
End Sub
Private Sub PLCVarsRead(ByVal type As PLCTimeClass)
Dim vars As System.Collections.Generic.List(Of PLCVarPoolElement) = New System.Collections.Generic.List(Of PLCVarPoolElement)
SyncLock lock
For Each element As PLCVarPoolElement In VarDic.Values
If element.PLCTimeClass = type Then
Try
element.PLCVariable.Read()
If element.PLCVariable.Changed() Then
vars.Add(element)
End If
Catch ex As Exception
MsgBox(ex.Message.ToString)
Me.ADSConnectState = BECKADS2.ADSConnectState.ADSCleanUp
Return
End Try
End If
Next
End SyncLock
If vars.Count > 0 Then
RaiseEvent OnPLCVarChange(Me, New PLCVariableChangedEventArg(vars))
End If
End Sub
Private Sub PLCVarsRead2(ByVal type As PLCTimeClass)
Dim vars As System.Collections.Generic.List(Of PLCVarPoolElement) = New System.Collections.Generic.List(Of PLCVarPoolElement)
SyncLock lock
For Each element As PLCVarPoolElement In VarDic.Values
If element.PLCTimeClass = type Then
Try
element.PLCVariable.Read()
vars.Add(element)
Catch ex As Exception
MsgBox(ex.Message.ToString)
Me.ADSConnectState = BECKADS2.ADSConnectState.ADSCleanUp
Return
End Try
End If
Next
End SyncLock
If vars.Count > 0 Then
RaiseEvent OnPLCVarChange(Me, New PLCVariableChangedEventArg(vars))
End If
End Sub
Private Sub ADSCleanUp()
DropPLCVars()
Disconnect()
End Sub