I have created a DLL that does the PLC work and is called from a "Main" application.
I feel like I need to close or dispose the EthernetIPforSLCMicroCom PLC driver.
I tried using "USING/End USING" instead of Dim to create "EthernetCommsSLCL3" and also "EthernetCommsSLCL3.CloseConnection()" but doth seemed to stop the communications permanently.
Do you have any advice? (Sorry for the lengthy code, I wanted to be sure everything was there for clarification)
Thanks!!!
Also, is there a way to format my code when I post it?
------------------------------------------------------------------------------
'L3 Variables
Dim tmrL3 As New System.Timers.Timer
Dim PLCAddressL3 As String = "10.124.233.16"
'Dim SLCBitToReadL3 As String = "B21:2/4"
Dim SLCIntToReadL3 As String = "N7:200"
Dim SLCBitToWrite1L3 As String = "B21:2/5"
Dim SLCBitToWrite2L3 As String = "B21:2/6"
Dim SLCHeartbeatBitL3 As String = "B21:2/7"
'PLCAddress-PLC IP ADDRESS
'SLCBitToRead-Label Applied
'SLCBitToWrite1-Stop RollFormer
'SLCBitToWrite2-Start RollFormer
'SLCHeartbeatBit-Monitor Communications B/W APP and PLC
Dim MachineRunning As Boolean
Dim MachineNotRunning As Boolean
Public BitWrittenStartL3 As Boolean
Public BitWrittenStopL3 As Boolean
Public MachineStatusL3 As Int32 = 0
Dim MachineStatusChangedL3 As Int32 = 0
Dim HeartbeatL3 As Boolean
_____________________________________________________________
Public Sub initializeTimerL3()
tmrL3.Interval = 1500
tmrL3.Enabled = True
AddHandler tmrL3.Elapsed, AddressOf tmr_elapsedL3
Using writer As New StreamWriter(Application.StartupPath & "\SLC_DLL Diagnostic Log" &
System.DateTime.Now.ToString("yyyyMMdd") & ".log", True, System.Text.Encoding.ASCII)
writer.WriteLine(vbCrLf & DateAndTime.Now & vbCrLf & "Status:L3 DLL initialized by main app")
writer.Close()
End Using
End Sub
______________________________________________________________
'These functions will be called from the print application to start and stop the machine. If the variables are in the correct state, the PLC
'tag will be written And the VB variable immediately turned off.
'If the variables are "stuck" on for some reason, they are turned off and the correct variable set
'The "returned" variable is feedback to the main application.
Public Function MachineOn() As Boolean
'NOTE:This is how to call this function from another class
'mainObj.MachineOn()
Using writer As New StreamWriter(Application.StartupPath & "\SLC_DLL Diagnostic Log" &
System.DateTime.Now.ToString("yyyyMMdd") & ".log", True, System.Text.Encoding.ASCII)
writer.WriteLine(vbCrLf & DateAndTime.Now & vbCrLf & "Status:L3 Machine Started Function Active in DLL")
writer.Close()
End Using
'Checks and sets appropriate variables in preperation for writing the "ON" signal to the PLC
If BitWrittenStartL3 = False And BitWrittenStopL3 = False Then
BitWrittenStartL3 = True
MachineRunning = True
Else
'Resets variables
BitWrittenStartL3 = False
BitWrittenStopL3 = False
'Sets correct state
BitWrittenStartL3 = True
MachineRunning = True
End If
Return MachineRunning
End Function
_________________________________________________________
Public Function MachineOff() As Boolean
Using writer As New StreamWriter(Application.StartupPath & "\SLC_DLL Diagnostic Log" &
System.DateTime.Now.ToString("yyyyMMdd") & ".log", True, System.Text.Encoding.ASCII)
writer.WriteLine(vbCrLf & DateAndTime.Now & vbCrLf & "Status:L3 Machine Stopped Function Active in DLL")
writer.Close()
End Using
'Checks and sets appropriate variables in prep for writing the "OFF" signal to the PLC
If BitWrittenStopL3 = False And BitWrittenStartL3 = False Then
BitWrittenStopL3 = True
MachineNotRunning = True
Else
'Resets variables
BitWrittenStopL3 = False
BitWrittenStartL3 = False
'Sets correct state
BitWrittenStopL3 = True
MachineNotRunning = True
End If
Return MachineNotRunning
End Function
_________________________________________________________
'This code runs continuously on a pulse after the DLL is started to update PLC info
Public Sub tmr_elapsedL3()
Try
Dim EthernetCommsSLCL3 As New AdvancedHMIDrivers.EthernetIPforSLCMicroCom
EthernetCommsSLCL3.IPAddress = PLCAddressL3
EthernetCommsSLCL3.PollRateOverride = 1000
'If Application Then sets BitWrittenStart To True, PLC will be updated With True Else False
'BitWrittenStart set True will start the Rollformer
If BitWrittenStartL3 = True Then
EthernetCommsSLCL3.Write(SLCBitToWrite1L3, 1)
Using writer As New StreamWriter(Application.StartupPath & "\SLC_DLL Diagnostic Log" &
System.DateTime.Now.ToString("yyyyMMdd") & ".log", True, System.Text.Encoding.ASCII)
writer.WriteLine(vbCrLf & DateAndTime.Now & vbCrLf & "Status:PLC START bit written to 1")
writer.Close()
End Using
BitWrittenStartL3 = False
Else
EthernetCommsSLCL3.Write(SLCBitToWrite1L3, 0)
End If
'If application sets BitWrittenStop to True, PLC will be updated with True else False
'BitWrittenStop set True will stop the Rollformer
If BitWrittenStopL3 = True Then
EthernetCommsSLCL3.Write(SLCBitToWrite2L3, 1)
Using writer As New StreamWriter(Application.StartupPath & "\SLC_DLL Diagnostic Log" &
System.DateTime.Now.ToString("yyyyMMdd") & ".log", True, System.Text.Encoding.ASCII)
writer.WriteLine(vbCrLf & DateAndTime.Now & vbCrLf & "Status:PLC STOP bit written to 1")
writer.Close()
End Using
BitWrittenStopL3 = False
Else
EthernetCommsSLCL3.Write(SLCBitToWrite2L3, 0)
End If
'Machine Status value from PLC for reference in Print Application
'TRIGGERED EVERY TIME THE TIMER COMPLETES
MachineStatusL3 = EthernetCommsSLCL3.Read(SLCIntToReadL3)
'If the machine status value changes, log that value to the diagnostic file
If MachineStatusChangedL3 <> MachineStatusL3 Then
MachineStatusChangedL3 = MachineStatusL3
Using writer As New StreamWriter(Application.StartupPath & "\SLC_DLL Diagnostic Log" &
System.DateTime.Now.ToString("yyyyMMdd") & ".log", True, System.Text.Encoding.ASCII)
writer.WriteLine(vbCrLf & DateAndTime.Now & vbCrLf & "Status:PLC status value changed to " & MachineStatusChangedL3 & vbCrLf _
& "(10=started 20=Stopped 30=Print App bypassed)")
writer.Close()
End Using
End If
'Handshake to verify good communications between PLC and Application
'TRIGGERED EVERY TIME THE TIMER COMPLETES
HeartbeatL3 = EthernetCommsSLCL3.Read(SLCHeartbeatBitL3)
If HeartbeatL3 = True Then
EthernetCommsSLCL3.Write(SLCHeartbeatBitL3, 0)
End If
'EthernetCommsSLCL3.CloseConnection()
Catch ex As Exception
'create error/Status log and document exception or status with date and time
'File is named with today's date to keep file sizes small
Using writer As New StreamWriter(Application.StartupPath & "\SLC_DLL Diagnostic Log" &
System.DateTime.Now.ToString("yyyyMMdd") & ".log", True, System.Text.Encoding.ASCII)
writer.WriteLine(vbCrLf & DateAndTime.Now & vbCrLf & ex.ToString)
writer.Close()
End Using
End Try
End Sub