Private Sub ConnectStateMachine()
While True
Select Case Me.ADSConnectState
Case ADS2.ADSConnectState.ADSInitialize
SendConnectMsg("Initialize " + Me.ADSAdress.ToString + ":" + Me.ADSPort.ToString)
Me.ADSConnectState = ADS2.ADSConnectState.ADSTryConnectToPLC
If Not RunThreads Then
Me.ADSConnectState = ADS2.ADSConnectState.ADSExit
End If
Case ADS2.ADSConnectState.ADSTryConnectToPLC
SendConnectMsg("Connecting " + Me.ADSAdress.ToString + ":" + Me.ADSPort.ToString)
Try
Connect()
Me.ADSConnectState = ADS2.ADSConnectState.ADSWaitOnRun
Catch ex As TwinCAT.Ads.AdsException
Me.ADSConnectState = ADS2.ADSConnectState.ADSTryConnectToPLC
End Try
If (Not RunThreads) Then
Me.ADSConnectState = ADS2.ADSConnectState.ADSExit
End If
Case ADS2.ADSConnectState.ADSWaitOnRun
SendConnectMsg("Check for PLC-state RUN at " + Me.ADSAdress.ToString + ":" + Me.ADSPort.ToString)
Try
If Me.ADSClient.ReadState().AdsState = TwinCAT.Ads.AdsState.Run Then
Me.ADSConnectState = ADS2.ADSConnectState.ADSCheckPLCProgram
End If
Catch ex As TwinCAT.Ads.AdsException
Disconnect()
Me.ADSConnectState = ADS2.ADSConnectState.ADSTryConnectToPLC
End Try
If (Not RunThreads) Then
Me.ADSConnectState = ADS2.ADSConnectState.ADSExit
End If
Case ADS2.ADSConnectState.ADSCheckPLCProgram
SendConnectMsg("Check for PLC-program at " + Me.ADSAdress.ToString + ":" + Me.ADSPort.ToString)
Try
Dim plc_version As New PLCVarString(Me, ".VERSION", 1)
Me.ADSConnectState = ADS2.ADSConnectState.ADSConnectFields
plc_version.Dispose()
Catch ex As TwinCAT.Ads.AdsException
Me.ADSConnectState = ADS2.ADSConnectState.ADSCheckPLCProgram
End Try
If (Not RunThreads) Then
Me.ADSConnectState = ADS2.ADSConnectState.ADSExit
End If
Case ADS2.ADSConnectState.ADSConnectFields
SendConnectMsg("Connecting PLC vars at " + Me.ADSAdress.ToString + ":" + Me.ADSPort.ToString)
Try
Me.GetPLCVars()
Dim plc_version As New PLCVarString(Me, ".VERSION", 50)
Me.ADSConnectState = ADS2.ADSConnectState.ADSConnectFields
plc_version.Dispose()
Me.ADSConnectState = ADS2.ADSConnectState.ADSConnected
Catch ex As TwinCAT.Ads.AdsException
Me.DropPLCVars()
Me.ADSConnectState = ADS2.ADSConnectState.ADSCheckPLCProgram
End Try
If (Not RunThreads) Then
Me.ADSConnectState = ADS2.ADSConnectState.ADSExit
End If
Case ADS2.ADSConnectState.ADSConnected
SendConnectMsg("Connected at " + Me.ADSAdress.ToString + ":" + Me.ADSPort.ToString)
SyncLock Me.lock
If Me.ADSConnectState = ADS2.ADSConnectState.ADSConnected Then
Try
If Me.ADSClient.ReadState().AdsState <> TwinCAT.Ads.AdsState.Run Then
Me.ADSConnectState = ADS2.ADSConnectState.ADSWaitOnRun
Me.DropPLCVars()
End If
Catch ex As TwinCAT.Ads.AdsException
Me.ADSConnectState = ADS2.ADSConnectState.ADSCleanUp
End Try
End If
If (Not RunThreads) Then
Me.ADSConnectState = ADS2.ADSConnectState.ADSExit
End If
End SyncLock
Case ADS2.ADSConnectState.ADSCleanUp
SendConnectMsg("Clean up " + Me.ADSAdress.ToString + ":" + Me.ADSPort.ToString)
Me.ADSCleanUp()
Me.ADSConnectState = ADS2.ADSConnectState.ADSTryConnectToPLC
Case ADS2.ADSConnectState.ADSExit
SendConnectMsg("Closed " + Me.ADSAdress.ToString + ":" + Me.ADSPort.ToString)
Me.ADSCleanUp()
Exit While
End Select
Thread.Sleep(timePLC)
End While
End Sub