Please Help

Gozer1

New Member
Joined
Feb 19, 2020
Messages
4
Office Version
  1. 365
Platform
  1. Windows
Im Getting "Run-time error '-2146233080 (80131508)': Index was outside the bounds of the array" If i Run this program more than 11 times with Differnt IP address strings.
It seems as thou there is a memory of what ipaddr string was, because i can re run this with any of the previous 11 strings but when i try a 12th string it will error. I can shut down the project and restart it and it will allow 11 more strings and then stop. Is there a memory that i can clear to keep from having to shut it down? Or is this problem built into the EipExcelComm_Lib? Any help is appreciated.
Here is the Code, It simply sets an search IP address for a PLC and Slot number of the processor, and grabs tag values to paste into a cell.



Sub readFromPLC()

Dim TagAdress As String, iRow As Integer
Dim ipaddr As String, plc_slot As Integer
Dim EipCommClient As New EipExcelComm
ipaddr = vbNullString
ipaddr = ActiveWorkbook.Worksheets("VarTab").Cells(2, 9).Value
plc_slot = ActiveWorkbook.Worksheets("VarTab").Cells(3, 9).Value
EipCommClient.setPlcIPAddress (ipaddr)
EipCommClient.setPlcSlot (plc_slot)

iRow = 3
Do Until IsEmpty(ActiveWorkbook.Worksheets("VarTab").Cells(iRow, 3))
TagAdress = ActiveWorkbook.Worksheets("VarTab").Cells(iRow, 3).Value
ActiveWorkbook.Worksheets("VarTab").Cells(iRow, 4).Value = EipCommClient.GetData(TagAdress)
iRow = iRow + 1
Loop

EipCommClient.Close

End Sub
 

Excel Facts

Format cells as currency
Select range and press Ctrl+Shift+4 to format cells as currency. (Shift 4 is the $ sign).
Presumably you have PLC specific software (HMI). Whenever you don't have problems with that software, the bug has to be in the EipExcelComm_lib.dll. It seems to be an interface between Excel and the HMI drivers, which drivers interact with the PLC. Although I am not familiar with PLC/HMI stuff, the run-time error you're getting originates in the "mscorlib.dll" which is part of the .NET framework. The HMI drivers seem to be written with Visual Studio, so I am pretty sure about that.
The VBA script above uses early binding with the EipExcelComm library. This means you had to make a reference to it in the VBA editor to make this script able to work. Whenever you're interested there might be a way to get things as desired. More info however is needed.
 
Upvote 0
Thank You for the reply, What info is needed to get this working? Im guessing one of the .dll files will need to be altered.
 
Upvote 0
You are welcome Gozer1.
Modifying those files is not my intention. However, in order to gain insight into what's going on "under the hood", I do need those files indeed. You may post a link to those files (WeTransfer/DropBox). Whenever using DropBox please be sure to confirm sharing the files. What I need to know and need to have access to:
- the Excel workbook that contains your script;
- the EipExcelComm file used in that script;
- in which folder on your disk the EipExcelComm file is located; (full path name)
- the HMI driver file(s), preferably in its original form, as installable package if there is; (__.exe / __.msi)
- in which folder on your disk in your current situation this (these) file(s) is (are) located (after installation).

Anyway, the error is not caused by your script. I have a suspicion of what it's all about, but I don't know for sure. It will take me some time to investigate.
 
Upvote 0

This is where you can download the EipExcelComm and the excel sheet that grabs the data from a plc. It can be run without actually connecting to a plc too. It will just return message that it could not be reached. But it will still give you the "Run-time error '-2146233080 (80131508)': Index was outside the bounds of the array" on the 12 IP address used. You can end the macro and use any of the previous 11 IP addresses and it works.
 
Upvote 0
It took me a bit more time diving into the issue you are having then I initially thought. I expected using a few WinAPI calls and modifying the VBA code the matter could be resolved. I was very wrong. Nevertheless, I think I have a solution for your problem. First of all a few side notes so you are able to see where I am getting at.
Excel/VBA lets you the opportunity making use of functions exposed by DLL files, in your situation the EipExcelComm_lib.dll. There are two ways to make that happen: early binding and late binding. The first way lets Excel take care of loading and unloading the dll, we just have to make a proper reference to the dll. The second way is doing things ourselves using proper VBA code. As of your post #1 code I could tell early binding was used. In general Excel is referencing a few dll's on default (for UserForms and stuff like that...), additional references are stored in the Excel workbook (the VBA part of it) in which the references are made. Whenever a workbook is opened Excel will check for additional references and will load the required dll in its memory space (simply put). Afterwards, whenever a workbook is closed the dll will be unloaded. This therefore means copying the entire VBA code from a workbook with references to a particular dll and pasting the code in a random workbook will not work.

My first approach consisted of getting rid of the early binding and taking care of loading and unloading the dll myself. As of your post #1 code the names of the used functions were known. However, those names were not exposed in a way they should (or like I expected). Long story short, the EipExcelComm_lib.dll turned out to be a 64 bits binary with an additional .tlb file. Presumably the .tlb file was needed to be able running within the memory space of both 32-bits and 64 bits processes and for exposing the dll's functions in a different way. Anyway, the WinAPI functions I have used so far for plain dll's (other than those that are part of Windows, they already reside in memory or are known in the registry) did not work, so I got stuck here.

My second approach consisted of splitting the necessary VBA code into two workbooks; one for retrieving the data and the other for displaying the results. It crossed my mind whenever the retrieving task should error out due to the dll's response, its workbook simply could be closed by the displaying task and then reopened. The reference to the dll would be gone, the dll and its dependents would be unloaded and in the next stage reloaded again. Problem solved. It turned out the dll was not unloaded at all! I could not figure out the cause of this behaviour. It had to be the way in which the dll was constructed (not by the rules...) but I wasn't sure about that.

My third approach consisted of bypassing the EipExcelComm_lib.dll by emulating its actions with VBA code. Using dotPeek it turned out the source code of the dll consisted of only a few lines of code and just a handful of function calls to the HMI driver, so there were opportunities. Unfortunately, the latter also turned out to be a dll with a special way on exposing its functions (and much, much more lines of code...). As far as I'm concerned messing around with undocumented code is not an option (in addition there is such a thing as legislation). At this point I left this approach for what it was.

My final approach was an alternative to the second. Launching a separate instance of Excel had to be going to work, I knew that for sure, and it did (I should have thought about that a bit earlier LOL). In the meantime I could not let go of the ddl issue and came across the following: "In .NET Framework, there is no way to unload an individual assembly without unloading all of the application domains that contain it. Even if the assembly goes out of scope, the actual assembly file will remain loaded until all application domains that contain it are unloaded." This explains a lot (!) although it doesn't answer the question why the HMI driver errors out on the 12th IP address. The person who wrote the code can but for sure he was not aware of this bug.

Back now to Excel. I have changed the worksheet's layout and have added some buttons. As I mentioned before, the first workbook is calling the second one. The second one has a reference to the EipExcelComm_Lib.dll. In the current situation its path is: C:\Program Files (x86)\Default Company Name\Setup_EipExcelComm. For your convenience you can download the two workbooks on WeTransfer
Whenever you prefer to built the workbooks on your own then take the following into account:
- Both workbooks must have the same base name
- The 1st workbook has to be saved as "Macro-Enabled" (...obvious) ending on .XLSM
- The 2nd workbook has to be saved as "Binary" ending on .XLSB
- They have to be located together in the same folder
- The retrieved PLC data is displayed on Sheet1 (CodeName) of the 1st workbook
- My VBA code uses CodeNames so "Sheet1" is "hardcoded"; it alows users to change sheetnames on the sheet tabs without bothering the program progress
- The 2nd workbook has to have a valid reference to the lib file otherwise the code will not compile

Hopefully this works for you.
 
Upvote 0
This goes in the ThisWorkbook Module of the first (xlsm) workbook:
VBA Code:
Option Explicit

Private modXLapp  As Application

' ==== built-in event ====

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ' ensure the newly launched instance of Excel will be released on closing
    Set Me.xlApp = Nothing
End Sub

' ==== ensure a proper handling of the new instance of Excel =====

Public Property Get xlApp() As Application
    If modXLapp Is Nothing Then
        Set modXLapp = New Application
        modXLapp.Visible = True
    End If
    Set xlApp = modXLapp
End Property

Public Property Set xlApp(ByVal argapp As Application)
    If Not argapp Is Nothing Then
        ' launch a separate instance of Excel
        Set modXLapp = argapp
        modXLapp.Visible = True                     ' <<< may be changed to FALSE
    Else
        ' release newly launched instance of Excel
        If Not modXLapp Is Nothing Then
            modXLapp.Quit
            Set modXLapp = Nothing
        End If
    End If
End Property


This goes in a regular Module of the first (xlsm) workbook:
VBA Code:
Option Explicit
Option Base 1

' display current row in cell ...
Private Const cCurRow       As String = "$B$3"

' data row starts at ...
Private Const cFirstRow     As Long = 5

' column numbers on data sheet & items in array Storage
Private Enum P
    IPAddress = 1
    SlotNr = 2
    TagName = 3
    Value = 4
    Msg = 5
    Error = 6
End Enum

Private Enum E
    None = 0
    PLC_Err = 1
    VBA_Err = 2
End Enum

' macro and user controls
Public bAbort   As Boolean
Public bBusy    As Boolean

'  ======== BUTTONS ==========

Public Sub Run_PLC()
    Sheet1.Range(cCurRow) = cFirstRow
    Call GetPLCdata
End Sub

Public Sub Resume_PLC()
    Call GetPLCdata
End Sub

Public Sub Abort_PLC()
    bAbort = True
End Sub

Public Sub ClearValues()
    Dim LastRow As Long
    With Sheet1
        LastRow = .Cells(.Rows.Count, P.Value).End(xlUp).Row
        If Not LastRow < cFirstRow Then
            .Range(Cells(cFirstRow, P.Value), Cells(LastRow, P.Value)).ClearContents
        End If
    End With
End Sub

Public Sub ClearMessages()
    Dim LastRow As Long
    With Sheet1
        LastRow = .Cells(.Rows.Count, P.Msg).End(xlUp).Row
        If Not LastRow < cFirstRow Then
            .Range(Cells(cFirstRow, P.Msg), Cells(LastRow, P.Msg)).ClearContents
        End If
    End With
End Sub

' =========== SOME TOOLS ===========

Public Function StripFileExt(ByRef argFileName As String) As String
    ' get base of filename (without extension)
    Dim lLen    As Long
    lLen = InStrRev(argFileName, ".", -1, vbTextCompare)
    If lLen = 0 Then
        StripFileExt = argFileName
    Else
        lLen = 1 + Len(argFileName) - lLen
        StripFileExt = Left(argFileName, Len(argFileName) - lLen)
    End If
End Function

Public Function FileExists(ByRef argFullFileName As String) As Boolean
    FileExists = True
    On Error Resume Next
    If (GetAttr(argFullFileName) And vbDirectory) = vbDirectory Then FileExists = False
    On Error GoTo 0
End Function

' ======== GET THE JOB DONE  ============

Private Sub GetPLCdata()

    Dim oXL                     As Application
    Dim oWb2                    As Workbook
    Dim Storage(P.Error)        As Variant

    Dim bHandshake              As Boolean
    Dim sHelperWbk              As String
    Dim iRow                    As Long

    ' in case of repetitive button clicks
    If bBusy Then Exit Sub

    bAbort = False
    bBusy = True

    ' don't throw errors & don't mess up the worksheet on resume
    Err.Clear
    On Error Resume Next
    iRow = Sheet1.Range(cCurRow)
    If Err.Number = 0 Then
        If iRow < cFirstRow Then
            iRow = cFirstRow
            Sheet1.Range(cCurRow) = cFirstRow
        End If
    Else
        Err.Clear
        iRow = cFirstRow
        Sheet1.Range(cCurRow) = cFirstRow
    End If
    On Error GoTo 0

SUB_REPEAT:
    ' ensure it's the right helper workbook
    bHandshake = False

    With ThisWorkbook
        ' compose filename of helper workbook
        sHelperWbk = .Path & "\" & StripFileExt(.Name) & ".xlsb"
    End With

    ' check whether helper workbook exists
    If FileExists(sHelperWbk) Then

        ' launch separate instance of Excel
        Set oXL = ThisWorkbook.xlApp

        If oXL.Visible = True Then
            oXL.WindowState = xlMinimized       ' <<<<<<  may be changed (xlNormal / xlMaximized)
        End If

        ' open helper workbook                  ' <<<<<<  the helper wkb must have a reference to the EipExcelComm_Lib.DLL file
        On Error Resume Next
        Set oWb2 = oXL.Workbooks.Open(sHelperWbk)
        On Error GoTo 0

        If Not oWb2 Is Nothing Then

            ' are we dealing with our helper workbook?
            On Error Resume Next
            bHandshake = oXL.Run("'" & sHelperWbk & "'!PLC_Confirm")
            On Error GoTo 0

            If bHandshake Then
                With Sheet1
                    Do Until IsEmpty(.Rows(iRow).Cells(1, P.IPAddress))

                        ' enable user to abort
                        DoEvents
                        If bAbort Then
                            Storage(P.Error) = E.None
                            Exit Do
                        End If

                        With .Rows(iRow)
                            .Cells(1, P.Value).ClearContents

                            ' some initialization
                            Storage(P.Value) = ""
                            Storage(P.Msg) = ""
                            Storage(P.Error) = E.None

                            ' provide info to helper workbook
                            Storage(P.IPAddress) = .Cells(1, P.IPAddress).Text
                            Storage(P.SlotNr) = .Cells(1, P.SlotNr).Text
                            Storage(P.TagName) = .Cells(1, P.TagName).Text

                            ' fire PLC macro in helper workbook
                            oXL.Run "'" & sHelperWbk & "'!PLC_Push", Storage
                            DoEvents

                            ' store results
                            Storage(P.Value) = oXL.Run("'" & sHelperWbk & "'!PLC_Pop_Value")
                            Storage(P.Error) = oXL.Run("'" & sHelperWbk & "'!PLC_Pop_Error")
                            Storage(P.Msg) = oXL.Run("'" & sHelperWbk & "'!PLC_Pop_Msg")
                            DoEvents

                            ' display results
                            .Cells(1, P.Value).Value = Storage(P.Value)
                            If Storage(P.Error) = E.VBA_Err Then
                                ' just display the message but keep running
                                .Cells(1, P.Msg).Value = Storage(P.Msg)
                            ElseIf Storage(P.Error) = E.PLC_Err Then
                                ' display message and reload
                                .Cells(1, P.Msg).Value = Storage(P.Msg)
                                Exit Do
                            End If
                            DoEvents
                        End With

                        iRow = iRow + 1
                        Sheet1.Range(cCurRow) = iRow
                    Loop
                End With
            Else
                MsgBox "File " & sHelperWbk & " seems to be the wrong Helper Workbook.", vbExclamation, "EipPlc"
            End If
        Else
            MsgBox "Failed to open Helper Workbook: " & sHelperWbk, vbExclamation, "EipPlc"
        End If
    Else
        MsgBox "File " & sHelperWbk & " does not exist.", vbExclamation, "EipPlc"
    End If

    ' close helper workbook
    If Not oWb2 Is Nothing Then
        oWb2.Close SaveChanges:=False
        Set oWb2 = Nothing
    End If
    
    ' quit separate instance of Excel
    Set oXL = Nothing
    Set ThisWorkbook.xlApp = Nothing
    
    ' check whether we are really done
    If Storage(P.Error) = E.PLC_Err Then GoTo SUB_REPEAT
    bBusy = False
End Sub


This goes in a regular Module of the second (xlsb) workbook:
VBA Code:
Option Explicit
Option Base 1

Private Enum P
    IPAddress = 1
    SlotNr = 2
    TagName = 3
    Value = 4
    Msg = 5
    Error = 6
End Enum

Private Enum E
    None = 0
    PLC_Err = 1
    VBA_Err = 2
End Enum

Private EEC                As EipExcelComm     ' <<<< Reference as "EipExcelCom_lib" (VBE > Tools > References dialog)
Private Storage(P.Error)   As Variant

Public Function PLC_Confirm() As Boolean
    PLC_Confirm = True
End Function

Public Sub PLC_Push(ByVal argData As Variant)
    Storage(P.IPAddress) = argData(P.IPAddress)
    Storage(P.SlotNr) = argData(P.SlotNr)
    Storage(P.TagName) = argData(P.TagName)
    Storage(P.Value) = argData(P.Value)
    Storage(P.Msg) = argData(P.Msg)
    Storage(P.Error) = argData(P.Error)
    Call ReadFromPLC
End Sub

Public Function PLC_Pop_Value() As Variant
    PLC_Pop_Value = Storage(P.Value)
End Function

Public Function PLC_Pop_Msg() As String
    PLC_Pop_Msg = Storage(P.Msg)
End Function

Public Function PLC_Pop_Error() As Long
    PLC_Pop_Error = Storage(P.Error)
End Function

Private Sub ReadFromPLC()

    Dim sTmp    As String

    Set EEC = New EipExcelComm
    
    ' messages from AdvancedHMIDrivers.dll (deliberately raised as errors) are
    ' catched by EipExcelComm_lib.dll and passed on as data
    ' unexpected errors however are not handled, so we do it ourselves
    On Error GoTo SUB_ERROR_EEC

    ' set IP Address
    EEC.setPlcIPAddress (Storage(P.IPAddress))
    
    ' set Slot >>> has to be a Long or Integer (not a String)!!!!
    On Error Resume Next
    EEC.setPlcSlot (Storage(P.SlotNr))
    If Err.Number <> 0 Then GoTo SUB_ERROR_VBA
    
    ' retrieve data
    On Error GoTo SUB_ERROR_EEC
    Storage(P.Value) = EEC.GetData(Storage(P.TagName))
    GoTo SUB_DONE

SUB_ERROR_VBA:
    Storage(P.Error) = E.VBA_Err
    sTmp = " VBA "
    GoTo SUB_ERROR
    
SUB_ERROR_EEC:
    sTmp = " HMI "
    Storage(P.Error) = E.PLC_Err
    
SUB_ERROR:
    Storage(P.Msg) = "A" & sTmp & "error occurred!" & vbCrLf & _
                          "number: " & Err.Number & vbCrLf & _
                          "description: " & Err.Description & vbCrLf & _
                          "source: " & Err.Source & vbCrLf & _
                          "Last DLL error: " & Err.LastDllError
    Err.Clear
    
SUB_DONE:
    On Error GoTo 0
    If Not EEC Is Nothing Then
        EEC.Close
        Set EEC = Nothing
    End If
End Sub
 

Attachments

  • Screenshot_1.jpg
    Screenshot_1.jpg
    181.3 KB · Views: 12
  • Screenshot_2.jpg
    Screenshot_2.jpg
    76 KB · Views: 13
Upvote 0
WOW, Thank you.
I have a problem thou... I have a workbook with a macro running that grabs the data every 10 seconds or so from the HMI's. I have this running in a loop reading several IP addresses and logging the tag values based every time I receive a different value. The problem started when i added the 12th machine IP address to the macro. Im not sure if its feasible to open and close a helping workbook every 10 seconds. Here is the code that's running. I originally posted the simple code that was only grabing data when requested.

Sub Repeat_1Min()
Call readFromBirtha
Call readFromLCB
Call readFromLHCell1
Call readFromLHCell2
Call readFromLHCell3
Call readFromRHCell1
Call readFromRHCell2
Call readFromRHCell3
Call readFromGertrude
Call readFromG05BeamAssy
Call readFromG05TowLug
'(The 12 address will stop the macro, Commented it out for now)
'Call readFromG01BeamAssy
Call Report
Call Minute
End Sub

Sub readFromBirtha()
'DECLARE THE VARIABLES USED IN THE LOGIC BELOW
Dim TagAdress1 As String, TagAdress2 As String, TagAdress3 As String, TagAdress4 As String, TagAdress5 As String, TagAdress6 As String, iRow As Integer, nRow As Integer, lRow As Integer
Dim ipaddr As String, plc_slot As Integer
Dim EipCommClient As New EipExcelComm
ipaddr = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(2, 9).Value
plc_slot = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(3, 9).Value
nRow = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(3, 5).Value
lRow = nRow - 1
EipCommClient.setPlcIPAddress (ipaddr)
EipCommClient.setPlcSlot (plc_slot)


'LIST OF THE PLC TAGS AND WHERE TO PLACE THE DATA
TagAdress1 = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(3, 3).Value
TagAdress2 = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(4, 3).Value
TagAdress3 = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(5, 3).Value
TagAdress4 = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(6, 3).Value
TagAdress5 = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(7, 3).Value
TagAdress6 = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(8, 3).Value
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(3, 4).Value = EipCommClient.GetData(TagAdress1)
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(4, 4).Value = EipCommClient.GetData(TagAdress2)
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(5, 4).Value = EipCommClient.GetData(TagAdress3)
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(6, 4).Value = EipCommClient.GetData(TagAdress4)
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(7, 4).Value = EipCommClient.GetData(TagAdress5)
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(8, 4).Value = EipCommClient.GetData(TagAdress6)
'LOOKING IF THE PLC IS SIGNALING A DOWNTIME EVENT, (DOWNTIME EVENT IS AUTO MODE ALARMS PRESENT WHEN MACHINE IS PULLED OUT OF AUTO, OR CYCLE TIMER LAPSES, BERTHA IS SET TO 60 SECONDS IN THE PLC)
If Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(8, 4).Value = True Then GoTo 1 Else GoTo 2
1
'LOOK TO SEE IF DATA HAS BEEN CAPTURED YET(IF TRUE THEN CAPTURE IF FALSE THEN GOTO END
If Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(4, 6).Value = True Then GoTo 3 Else GoTo 4
3
'ADD 1 TO THE RECORD NUMBER FOR NEXT CYCLE
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(3, 5).Value + 1
'SET THE DATA RECORDED SO NEXT SCAN DOESNT ADD REPEAT DATA TO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(4, 6).Value = False
'MOVE THE COMBINED ALARM STRINGS AND TIME STAMP INTO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("BirthaDownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(10, 6).Value
'GOTO THE END
GoTo 4

2 'Move True Into The Data Recorded Memory Box Cell (E,4)(TRUE = READY FOR NEXT RECORD, ALARMS CLEARED)(FALSE = DATA CAPTURED)

nRow = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(3, 5).Value
If Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(4, 6).Value = True Then GoTo 4 Else GoTo 5
'MOVE STRING DATA RUNNING WITH NO ALARMS AT XX:XX.XX TIME STAMP
5 Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(4, 6).Value = True
'ADJUST RECORD NUMBER VARIABLE TO ADD THE NEXT STRING TO RECORD RUNNING WITH NO ALARMS TIME STAMP TO THE RECORD
Workbooks("AlarmLogs.xlsm").Worksheets("BirthaDownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(9, 6).Value

'ADD 1 TO THE NEXT VARIABLE RECORD LOCATION
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(3, 5).Value + 1
'Move Time Stamp Intolog for how long machinewas down
Workbooks("AlarmLogs.xlsm").Worksheets("BirthaDownTimeLog").Cells(lRow, 2).Value = Workbooks("AlarmLogs.xlsm").Worksheets("BirthaDownTimeLog").Cells(5, 6).Value
4


EipCommClient.Close

End Sub

Sub readFromLCB()
'DECLARE THE VARIABLES USED IN THE LOGIC BELOW
Dim TagAdress1 As String, TagAdress2 As String, TagAdress3 As String, TagAdress4 As String, TagAdress5 As String, TagAdress6 As String, iRow As Integer, nRow As Integer, lRow As Integer
Dim ipaddr As String, plc_slot As Integer
Dim EipCommClient As New EipExcelComm
ipaddr = Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(2, 9).Value
plc_slot = Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(3, 9).Value
nRow = Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(3, 5).Value
lRow = nRow - 1
EipCommClient.setPlcIPAddress (ipaddr)
EipCommClient.setPlcSlot (plc_slot)


'LIST OF THE PLC TAGS AND WHERE TO PLACE THE DATA
TagAdress1 = Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(3, 3).Value
TagAdress2 = Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(4, 3).Value
TagAdress3 = Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(5, 3).Value
TagAdress4 = Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(6, 3).Value
TagAdress5 = Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(7, 3).Value
TagAdress6 = Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(8, 3).Value
Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(3, 4).Value = EipCommClient.GetData(TagAdress1)
Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(4, 4).Value = EipCommClient.GetData(TagAdress2)
Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(5, 4).Value = EipCommClient.GetData(TagAdress3)
Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(6, 4).Value = EipCommClient.GetData(TagAdress4)
Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(7, 4).Value = EipCommClient.GetData(TagAdress5)
Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(8, 4).Value = EipCommClient.GetData(TagAdress6)
'LOOKING IF THE PLC IS SIGNALING A DOWNTIME EVENT, (DOWNTIME EVENT IS AUTO MODE ALARMS PRESENT WHEN MACHINE IS PULLED OUT OF AUTO, OR CYCLE TIMER LAPSES, BERTHE IS SET TO 60 SECONDS IN THE PLC)
If Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(8, 4).Value = True Then GoTo 1 Else GoTo 2
1
'LOOK TO SEE IF DATA HAS BEEN CAPTURED YET(IF TRUE THEN CAPTURE IF FALSE THEN GOTO END
If Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(4, 6).Value = True Then GoTo 3 Else GoTo 4
3
'ADD 1 TO THE RECORD NUMBER FOR NEXT CYCLE
Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(3, 5).Value + 1
'SET THE DATA RECORDED SO NEXT SCAN DOESNT ADD REPEAT DATA TO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(4, 6).Value = False
'MOVE THE COMBINED ALARM STRINGS AND TIME STAMP INTO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("LCBDownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(10, 6).Value
'GOTO THE END
GoTo 4

2 'Move True Into The Data Recorded Memory Box Cell (E,4)(TRUE = READY FOR NEXT RECORD, ALARMS CLEARED)(FALSE = DATA CAPTURED)

nRow = Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(3, 5).Value
If Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(4, 6).Value = True Then GoTo 4 Else GoTo 5
'MOVE STRING DATA RUNNING WITH NO ALARMS AT XX:XX.XX TIME STAMP
5 Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(4, 6).Value = True
'ADJUST RECORD NUMBER VARIABLE TO ADD THE NEXT STRING TO RECORD RUNNING WITH NO ALARMS TIME STAMP TO THE RECORD
Workbooks("AlarmLogs.xlsm").Worksheets("LCBDownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(9, 6).Value

'ADD 1 TO THE NEXT VARIABLE RECORD LOCATION
Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LowerCB").Cells(3, 5).Value + 1
'Move Time Stamp Intolog for how long machinewas down
Workbooks("AlarmLogs.xlsm").Worksheets("LCBDownTimeLog").Cells(lRow, 2).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LCBDownTimeLog").Cells(5, 6).Value
4


EipCommClient.Close

End Sub

Sub readFromLHCell1()
'DECLARE THE VARIABLES USED IN THE LOGIC BELOW
Dim TagAdress1 As String, TagAdress2 As String, TagAdress3 As String, TagAdress4 As String, TagAdress5 As String, TagAdress6 As String, iRow As Integer, nRow As Integer, lRow As Integer
Dim ipaddr As String, plc_slot As Integer
Dim EipCommClient As New EipExcelComm
ipaddr = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(2, 9).Value
plc_slot = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(3, 9).Value
nRow = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(3, 5).Value
lRow = nRow - 1
EipCommClient.setPlcIPAddress (ipaddr)
EipCommClient.setPlcSlot (plc_slot)


'LIST OF THE PLC TAGS AND WHERE TO PLACE THE DATA
TagAdress1 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(3, 3).Value
TagAdress2 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(4, 3).Value
TagAdress3 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(5, 3).Value
TagAdress4 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(6, 3).Value
TagAdress5 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(7, 3).Value
TagAdress6 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(8, 3).Value
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(3, 4).Value = EipCommClient.GetData(TagAdress1)
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(4, 4).Value = EipCommClient.GetData(TagAdress2)
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(5, 4).Value = EipCommClient.GetData(TagAdress3)
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(6, 4).Value = EipCommClient.GetData(TagAdress4)
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(7, 4).Value = EipCommClient.GetData(TagAdress5)
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(8, 4).Value = EipCommClient.GetData(TagAdress6)
'LOOKING IF THE PLC IS SIGNALING A DOWNTIME EVENT, (DOWNTIME EVENT IS AUTO MODE ALARMS PRESENT WHEN MACHINE IS PULLED OUT OF AUTO, OR CYCLE TIMER LAPSES, BERTHE IS SET TO 60 SECONDS IN THE PLC)
If Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(8, 4).Value = True Then GoTo 1 Else GoTo 2
1
'LOOK TO SEE IF DATA HAS BEEN CAPTURED YET(IF TRUE THEN CAPTURE IF FALSE THEN GOTO END
If Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(4, 6).Value = True Then GoTo 3 Else GoTo 4
3
'ADD 1 TO THE RECORD NUMBER FOR NEXT CYCLE
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(3, 5).Value + 1
'SET THE DATA RECORDED SO NEXT SCAN DOESNT ADD REPEAT DATA TO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(4, 6).Value = False
'MOVE THE COMBINED ALARM STRINGS AND TIME STAMP INTO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1DownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(10, 6).Value
'GOTO THE END
GoTo 4

2 'Move True Into The Data Recorded Memory Box Cell (E,4)(TRUE = READY FOR NEXT RECORD, ALARMS CLEARED)(FALSE = DATA CAPTURED)

nRow = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(3, 5).Value
If Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(4, 6).Value = True Then GoTo 4 Else GoTo 5
'MOVE STRING DATA RUNNING WITH NO ALARMS AT XX:XX.XX TIME STAMP
5 Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(4, 6).Value = True
'ADJUST RECORD NUMBER VARIABLE TO ADD THE NEXT STRING TO RECORD RUNNING WITH NO ALARMS TIME STAMP TO THE RECORD
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1DownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(9, 6).Value

'ADD 1 TO THE NEXT VARIABLE RECORD LOCATION
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1").Cells(3, 5).Value + 1
'Move Time Stamp Intolog for how long machinewas down
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1DownTimeLog").Cells(lRow, 2).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1DownTimeLog").Cells(5, 6).Value
4


EipCommClient.Close

End Sub

Sub readFromLHCell2()
'DECLARE THE VARIABLES USED IN THE LOGIC BELOW
Dim TagAdress1 As String, TagAdress2 As String, TagAdress3 As String, TagAdress4 As String, TagAdress5 As String, TagAdress6 As String, iRow As Integer, nRow As Integer, lRow As Integer
Dim ipaddr As String, plc_slot As Integer
Dim EipCommClient As New EipExcelComm
ipaddr = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(2, 9).Value
plc_slot = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(3, 9).Value
nRow = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(3, 5).Value
lRow = nRow - 1
EipCommClient.setPlcIPAddress (ipaddr)
EipCommClient.setPlcSlot (plc_slot)


'LIST OF THE PLC TAGS AND WHERE TO PLACE THE DATA
TagAdress1 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(3, 3).Value
TagAdress2 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(4, 3).Value
TagAdress3 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(5, 3).Value
TagAdress4 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(6, 3).Value
TagAdress5 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(7, 3).Value
TagAdress6 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(8, 3).Value
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(3, 4).Value = EipCommClient.GetData(TagAdress1)
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(4, 4).Value = EipCommClient.GetData(TagAdress2)
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(5, 4).Value = EipCommClient.GetData(TagAdress3)
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(6, 4).Value = EipCommClient.GetData(TagAdress4)
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(7, 4).Value = EipCommClient.GetData(TagAdress5)
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(8, 4).Value = EipCommClient.GetData(TagAdress6)
'LOOKING IF THE PLC IS SIGNALING A DOWNTIME EVENT, (DOWNTIME EVENT IS AUTO MODE ALARMS PRESENT WHEN MACHINE IS PULLED OUT OF AUTO, OR CYCLE TIMER LAPSES, BERTHE IS SET TO 60 SECONDS IN THE PLC)
If Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(8, 4).Value = True Then GoTo 1 Else GoTo 2
1
'LOOK TO SEE IF DATA HAS BEEN CAPTURED YET(IF TRUE THEN CAPTURE IF FALSE THEN GOTO END
If Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(4, 6).Value = True Then GoTo 3 Else GoTo 4
3
'ADD 1 TO THE RECORD NUMBER FOR NEXT CYCLE
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(3, 5).Value + 1
'SET THE DATA RECORDED SO NEXT SCAN DOESNT ADD REPEAT DATA TO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(4, 6).Value = False
'MOVE THE COMBINED ALARM STRINGS AND TIME STAMP INTO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2DownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(10, 6).Value
'GOTO THE END
GoTo 4

2 'Move True Into The Data Recorded Memory Box Cell (E,4)(TRUE = READY FOR NEXT RECORD, ALARMS CLEARED)(FALSE = DATA CAPTURED)

nRow = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(3, 5).Value
If Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(4, 6).Value = True Then GoTo 4 Else GoTo 5
'MOVE STRING DATA RUNNING WITH NO ALARMS AT XX:XX.XX TIME STAMP
5 Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(4, 6).Value = True
'ADJUST RECORD NUMBER VARIABLE TO ADD THE NEXT STRING TO RECORD RUNNING WITH NO ALARMS TIME STAMP TO THE RECORD
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2DownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(9, 6).Value

'ADD 1 TO THE NEXT VARIABLE RECORD LOCATION
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2").Cells(3, 5).Value + 1
'Move Time Stamp Intolog for how long machinewas down
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2DownTimeLog").Cells(lRow, 2).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2DownTimeLog").Cells(5, 6).Value
4


EipCommClient.Close

End Sub


Sub readFromLHCell3()
'DECLARE THE VARIABLES USED IN THE LOGIC BELOW
Dim TagAdress1 As String, TagAdress2 As String, TagAdress3 As String, TagAdress4 As String, TagAdress5 As String, TagAdress6 As String, iRow As Integer, nRow As Integer, lRow As Integer
Dim ipaddr As String, plc_slot As Integer
Dim EipCommClient As New EipExcelComm
ipaddr = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(2, 9).Value
plc_slot = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(3, 9).Value
nRow = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(3, 5).Value
lRow = nRow - 1
EipCommClient.setPlcIPAddress (ipaddr)
EipCommClient.setPlcSlot (plc_slot)


'LIST OF THE PLC TAGS AND WHERE TO PLACE THE DATA
TagAdress1 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(3, 3).Value
TagAdress2 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(4, 3).Value
TagAdress3 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(5, 3).Value
TagAdress4 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(6, 3).Value
TagAdress5 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(7, 3).Value
TagAdress6 = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(8, 3).Value
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(3, 4).Value = EipCommClient.GetData(TagAdress1)
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(4, 4).Value = EipCommClient.GetData(TagAdress2)
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(5, 4).Value = EipCommClient.GetData(TagAdress3)
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(6, 4).Value = EipCommClient.GetData(TagAdress4)
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(7, 4).Value = EipCommClient.GetData(TagAdress5)
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(8, 4).Value = EipCommClient.GetData(TagAdress6)
'LOOKING IF THE PLC IS SIGNALING A DOWNTIME EVENT, (DOWNTIME EVENT IS AUTO MODE ALARMS PRESENT WHEN MACHINE IS PULLED OUT OF AUTO, OR CYCLE TIMER LAPSES, BERTHE IS SET TO 60 SECONDS IN THE PLC)
If Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(8, 4).Value = True Then GoTo 1 Else GoTo 2
1
'LOOK TO SEE IF DATA HAS BEEN CAPTURED YET(IF TRUE THEN CAPTURE IF FALSE THEN GOTO END
If Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(4, 6).Value = True Then GoTo 3 Else GoTo 4
3
'ADD 1 TO THE RECORD NUMBER FOR NEXT CYCLE
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(3, 5).Value + 1
'SET THE DATA RECORDED SO NEXT SCAN DOESNT ADD REPEAT DATA TO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(4, 6).Value = False
'MOVE THE COMBINED ALARM STRINGS AND TIME STAMP INTO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3DownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(10, 6).Value
'GOTO THE END
GoTo 4

2 'Move True Into The Data Recorded Memory Box Cell (E,4)(TRUE = READY FOR NEXT RECORD, ALARMS CLEARED)(FALSE = DATA CAPTURED)

nRow = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(3, 5).Value
If Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(4, 6).Value = True Then GoTo 4 Else GoTo 5
'MOVE STRING DATA RUNNING WITH NO ALARMS AT XX:XX.XX TIME STAMP
5 Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(4, 6).Value = True
'ADJUST RECORD NUMBER VARIABLE TO ADD THE NEXT STRING TO RECORD RUNNING WITH NO ALARMS TIME STAMP TO THE RECORD
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3DownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(9, 6).Value

'ADD 1 TO THE NEXT VARIABLE RECORD LOCATION
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3").Cells(3, 5).Value + 1
'Move Time Stamp Intolog for how long machinewas down
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3DownTimeLog").Cells(lRow, 2).Value = Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3DownTimeLog").Cells(5, 6).Value
4


EipCommClient.Close

End Sub


Sub readFromRHCell1()
'DECLARE THE VARIABLES USED IN THE LOGIC BELOW
Dim TagAdress1 As String, TagAdress2 As String, TagAdress3 As String, TagAdress4 As String, TagAdress5 As String, TagAdress6 As String, iRow As Integer, nRow As Integer, lRow As Integer
Dim ipaddr As String, plc_slot As Integer
Dim EipCommClient As New EipExcelComm
ipaddr = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(2, 9).Value
plc_slot = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(3, 9).Value
nRow = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(3, 5).Value
lRow = nRow - 1
EipCommClient.setPlcIPAddress (ipaddr)
EipCommClient.setPlcSlot (plc_slot)


'LIST OF THE PLC TAGS AND WHERE TO PLACE THE DATA
TagAdress1 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(3, 3).Value
TagAdress2 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(4, 3).Value
TagAdress3 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(5, 3).Value
TagAdress4 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(6, 3).Value
TagAdress5 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(7, 3).Value
TagAdress6 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(8, 3).Value
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(3, 4).Value = EipCommClient.GetData(TagAdress1)
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(4, 4).Value = EipCommClient.GetData(TagAdress2)
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(5, 4).Value = EipCommClient.GetData(TagAdress3)
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(6, 4).Value = EipCommClient.GetData(TagAdress4)
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(7, 4).Value = EipCommClient.GetData(TagAdress5)
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(8, 4).Value = EipCommClient.GetData(TagAdress6)
'LOOKING IF THE PLC IS SIGNALING A DOWNTIME EVENT, (DOWNTIME EVENT IS AUTO MODE ALARMS PRESENT WHEN MACHINE IS PULLED OUT OF AUTO, OR CYCLE TIMER LAPSES, BERTHE IS SET TO 60 SECONDS IN THE PLC)
If Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(8, 4).Value = True Then GoTo 1 Else GoTo 2
1
'LOOK TO SEE IF DATA HAS BEEN CAPTURED YET(IF TRUE THEN CAPTURE IF FALSE THEN GOTO END
If Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(4, 6).Value = True Then GoTo 3 Else GoTo 4
3
'ADD 1 TO THE RECORD NUMBER FOR NEXT CYCLE
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(3, 5).Value + 1
'SET THE DATA RECORDED SO NEXT SCAN DOESNT ADD REPEAT DATA TO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(4, 6).Value = False
'MOVE THE COMBINED ALARM STRINGS AND TIME STAMP INTO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1DownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(10, 6).Value
'GOTO THE END
GoTo 4

2 'Move True Into The Data Recorded Memory Box Cell (E,4)(TRUE = READY FOR NEXT RECORD, ALARMS CLEARED)(FALSE = DATA CAPTURED)

nRow = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(3, 5).Value
If Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(4, 6).Value = True Then GoTo 4 Else GoTo 5
'MOVE STRING DATA RUNNING WITH NO ALARMS AT XX:XX.XX TIME STAMP
5 Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(4, 6).Value = True
'ADJUST RECORD NUMBER VARIABLE TO ADD THE NEXT STRING TO RECORD RUNNING WITH NO ALARMS TIME STAMP TO THE RECORD
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1DownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(9, 6).Value

'ADD 1 TO THE NEXT VARIABLE RECORD LOCATION
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1").Cells(3, 5).Value + 1
'Move Time Stamp Intolog for how long machinewas down
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1DownTimeLog").Cells(lRow, 2).Value = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1DownTimeLog").Cells(5, 6).Value
4


EipCommClient.Close

End Sub

Sub readFromRHCell2()
'DECLARE THE VARIABLES USED IN THE LOGIC BELOW
Dim TagAdress1 As String, TagAdress2 As String, TagAdress3 As String, TagAdress4 As String, TagAdress5 As String, TagAdress6 As String, iRow As Integer, nRow As Integer, lRow As Integer
Dim ipaddr As String, plc_slot As Integer
Dim EipCommClient As New EipExcelComm
ipaddr = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(2, 9).Value
plc_slot = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(3, 9).Value
nRow = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(3, 5).Value
lRow = nRow - 1
EipCommClient.setPlcIPAddress (ipaddr)
EipCommClient.setPlcSlot (plc_slot)


'LIST OF THE PLC TAGS AND WHERE TO PLACE THE DATA
TagAdress1 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(3, 3).Value
TagAdress2 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(4, 3).Value
TagAdress3 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(5, 3).Value
TagAdress4 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(6, 3).Value
TagAdress5 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(7, 3).Value
TagAdress6 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(8, 3).Value
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(3, 4).Value = EipCommClient.GetData(TagAdress1)
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(4, 4).Value = EipCommClient.GetData(TagAdress2)
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(5, 4).Value = EipCommClient.GetData(TagAdress3)
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(6, 4).Value = EipCommClient.GetData(TagAdress4)
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(7, 4).Value = EipCommClient.GetData(TagAdress5)
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(8, 4).Value = EipCommClient.GetData(TagAdress6)
'LOOKING IF THE PLC IS SIGNALING A DOWNTIME EVENT, (DOWNTIME EVENT IS AUTO MODE ALARMS PRESENT WHEN MACHINE IS PULLED OUT OF AUTO, OR CYCLE TIMER LAPSES, BERTHE IS SET TO 60 SECONDS IN THE PLC)
If Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(8, 4).Value = True Then GoTo 1 Else GoTo 2
1
'LOOK TO SEE IF DATA HAS BEEN CAPTURED YET(IF TRUE THEN CAPTURE IF FALSE THEN GOTO END
If Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(4, 6).Value = True Then GoTo 3 Else GoTo 4
3
'ADD 1 TO THE RECORD NUMBER FOR NEXT CYCLE
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(3, 5).Value + 1
'SET THE DATA RECORDED SO NEXT SCAN DOESNT ADD REPEAT DATA TO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(4, 6).Value = False
'MOVE THE COMBINED ALARM STRINGS AND TIME STAMP INTO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2DownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(10, 6).Value
'GOTO THE END
GoTo 4

2 'Move True Into The Data Recorded Memory Box Cell (E,4)(TRUE = READY FOR NEXT RECORD, ALARMS CLEARED)(FALSE = DATA CAPTURED)

nRow = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(3, 5).Value
If Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(4, 6).Value = True Then GoTo 4 Else GoTo 5
'MOVE STRING DATA RUNNING WITH NO ALARMS AT XX:XX.XX TIME STAMP
5 Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(4, 6).Value = True
'ADJUST RECORD NUMBER VARIABLE TO ADD THE NEXT STRING TO RECORD RUNNING WITH NO ALARMS TIME STAMP TO THE RECORD
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2DownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(9, 6).Value

'ADD 1 TO THE NEXT VARIABLE RECORD LOCATION
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2").Cells(3, 5).Value + 1
'Move Time Stamp Intolog for how long machinewas down
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2DownTimeLog").Cells(lRow, 2).Value = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2DownTimeLog").Cells(5, 6).Value
4


EipCommClient.Close

End Sub


Sub readFromRHCell3()
'DECLARE THE VARIABLES USED IN THE LOGIC BELOW
Dim TagAdress1 As String, TagAdress2 As String, TagAdress3 As String, TagAdress4 As String, TagAdress5 As String, TagAdress6 As String, iRow As Integer, nRow As Integer, lRow As Integer
Dim ipaddr As String, plc_slot As Integer
Dim EipCommClient As New EipExcelComm
ipaddr = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(2, 9).Value
plc_slot = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(3, 9).Value
nRow = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(3, 5).Value
lRow = nRow - 1
EipCommClient.setPlcIPAddress (ipaddr)
EipCommClient.setPlcSlot (plc_slot)


'LIST OF THE PLC TAGS AND WHERE TO PLACE THE DATA
TagAdress1 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(3, 3).Value
TagAdress2 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(4, 3).Value
TagAdress3 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(5, 3).Value
TagAdress4 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(6, 3).Value
TagAdress5 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(7, 3).Value
TagAdress6 = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(8, 3).Value
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(3, 4).Value = EipCommClient.GetData(TagAdress1)
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(4, 4).Value = EipCommClient.GetData(TagAdress2)
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(5, 4).Value = EipCommClient.GetData(TagAdress3)
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(6, 4).Value = EipCommClient.GetData(TagAdress4)
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(7, 4).Value = EipCommClient.GetData(TagAdress5)
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(8, 4).Value = EipCommClient.GetData(TagAdress6)
'LOOKING IF THE PLC IS SIGNALING A DOWNTIME EVENT, (DOWNTIME EVENT IS AUTO MODE ALARMS PRESENT WHEN MACHINE IS PULLED OUT OF AUTO, OR CYCLE TIMER LAPSES, BERTHE IS SET TO 60 SECONDS IN THE PLC)
If Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(8, 4).Value = True Then GoTo 1 Else GoTo 2
1
'LOOK TO SEE IF DATA HAS BEEN CAPTURED YET(IF TRUE THEN CAPTURE IF FALSE THEN GOTO END
If Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(4, 6).Value = True Then GoTo 3 Else GoTo 4
3
'ADD 1 TO THE RECORD NUMBER FOR NEXT CYCLE
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(3, 5).Value + 1
'SET THE DATA RECORDED SO NEXT SCAN DOESNT ADD REPEAT DATA TO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(4, 6).Value = False
'MOVE THE COMBINED ALARM STRINGS AND TIME STAMP INTO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3DownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(10, 6).Value
'GOTO THE END
GoTo 4

2 'Move True Into The Data Recorded Memory Box Cell (E,4)(TRUE = READY FOR NEXT RECORD, ALARMS CLEARED)(FALSE = DATA CAPTURED)

nRow = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(3, 5).Value
If Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(4, 6).Value = True Then GoTo 4 Else GoTo 5
'MOVE STRING DATA RUNNING WITH NO ALARMS AT XX:XX.XX TIME STAMP
5 Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(4, 6).Value = True
'ADJUST RECORD NUMBER VARIABLE TO ADD THE NEXT STRING TO RECORD RUNNING WITH NO ALARMS TIME STAMP TO THE RECORD
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3DownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(9, 6).Value

'ADD 1 TO THE NEXT VARIABLE RECORD LOCATION
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3").Cells(3, 5).Value + 1
'Move Time Stamp Intolog for how long machinewas down
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3DownTimeLog").Cells(lRow, 2).Value = Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3DownTimeLog").Cells(5, 6).Value
4


EipCommClient.Close

End Sub


Sub readFromGertrude()
'DECLARE THE VARIABLES USED IN THE LOGIC BELOW
Dim TagAdress1 As String, TagAdress2 As String, TagAdress3 As String, TagAdress4 As String, TagAdress5 As String, TagAdress6 As String, iRow As Integer, nRow As Integer, lRow As Integer
Dim ipaddr As String, plc_slot As Integer
Dim EipCommClient As New EipExcelComm
ipaddr = Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(2, 9).Value
plc_slot = Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(3, 9).Value
nRow = Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(3, 5).Value
lRow = nRow - 1
EipCommClient.setPlcIPAddress (ipaddr)
EipCommClient.setPlcSlot (plc_slot)


'LIST OF THE PLC TAGS AND WHERE TO PLACE THE DATA
TagAdress1 = Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(3, 3).Value
TagAdress2 = Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(4, 3).Value
TagAdress3 = Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(5, 3).Value
TagAdress4 = Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(6, 3).Value
TagAdress5 = Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(7, 3).Value
TagAdress6 = Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(8, 3).Value
Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(3, 4).Value = EipCommClient.GetData(TagAdress1)
Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(4, 4).Value = EipCommClient.GetData(TagAdress2)
Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(5, 4).Value = EipCommClient.GetData(TagAdress3)
Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(6, 4).Value = EipCommClient.GetData(TagAdress4)
Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(7, 4).Value = EipCommClient.GetData(TagAdress5)
Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(8, 4).Value = EipCommClient.GetData(TagAdress6)
'LOOKING IF THE PLC IS SIGNALING A DOWNTIME EVENT, (DOWNTIME EVENT IS AUTO MODE ALARMS PRESENT WHEN MACHINE IS PULLED OUT OF AUTO, OR CYCLE TIMER LAPSES, BERTHE IS SET TO 60 SECONDS IN THE PLC)
If Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(8, 4).Value = True Then GoTo 1 Else GoTo 2
1
'LOOK TO SEE IF DATA HAS BEEN CAPTURED YET(IF TRUE THEN CAPTURE IF FALSE THEN GOTO END
If Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(4, 6).Value = True Then GoTo 3 Else GoTo 4
3
'ADD 1 TO THE RECORD NUMBER FOR NEXT CYCLE
Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(3, 5).Value + 1
'SET THE DATA RECORDED SO NEXT SCAN DOESNT ADD REPEAT DATA TO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(4, 6).Value = False
'MOVE THE COMBINED ALARM STRINGS AND TIME STAMP INTO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("GertrudeDownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(10, 6).Value
'GOTO THE END
GoTo 4

2 'Move True Into The Data Recorded Memory Box Cell (E,4)(TRUE = READY FOR NEXT RECORD, ALARMS CLEARED)(FALSE = DATA CAPTURED)

nRow = Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(3, 5).Value
If Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(4, 6).Value = True Then GoTo 4 Else GoTo 5
'MOVE STRING DATA RUNNING WITH NO ALARMS AT XX:XX.XX TIME STAMP
5 Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(4, 6).Value = True
'ADJUST RECORD NUMBER VARIABLE TO ADD THE NEXT STRING TO RECORD RUNNING WITH NO ALARMS TIME STAMP TO THE RECORD
Workbooks("AlarmLogs.xlsm").Worksheets("GertrudeDownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(9, 6).Value

'ADD 1 TO THE NEXT VARIABLE RECORD LOCATION
Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude").Cells(3, 5).Value + 1
'Move Time Stamp Intolog for how long machinewas down
Workbooks("AlarmLogs.xlsm").Worksheets("GertrudeDownTimeLog").Cells(lRow, 2).Value = Workbooks("AlarmLogs.xlsm").Worksheets("GertrudeDownTimeLog").Cells(5, 6).Value
4


EipCommClient.Close

End Sub

Sub readFromG05BeamAssy()
'DECLARE THE VARIABLES USED IN THE LOGIC BELOW
Dim TagAdress1 As String, TagAdress2 As String, TagAdress3 As String, TagAdress4 As String, TagAdress5 As String, TagAdress6 As String, iRow As Integer, nRow As Integer, lRow As Integer
Dim ipaddr As String, plc_slot As Integer
Dim EipCommClient As New EipExcelComm
ipaddr = Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(2, 9).Value
plc_slot = Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(3, 9).Value
nRow = Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(3, 5).Value
lRow = nRow - 1
EipCommClient.setPlcIPAddress (ipaddr)
EipCommClient.setPlcSlot (plc_slot)


'LIST OF THE PLC TAGS AND WHERE TO PLACE THE DATA
TagAdress1 = Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(3, 3).Value
TagAdress2 = Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(4, 3).Value
TagAdress3 = Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(5, 3).Value
TagAdress4 = Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(6, 3).Value
TagAdress5 = Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(7, 3).Value
TagAdress6 = Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(8, 3).Value
Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(3, 4).Value = EipCommClient.GetData(TagAdress1)
Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(4, 4).Value = EipCommClient.GetData(TagAdress2)
Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(5, 4).Value = EipCommClient.GetData(TagAdress3)
Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(6, 4).Value = EipCommClient.GetData(TagAdress4)
Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(7, 4).Value = EipCommClient.GetData(TagAdress5)
Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(8, 4).Value = EipCommClient.GetData(TagAdress6)
'LOOKING IF THE PLC IS SIGNALING A DOWNTIME EVENT, (DOWNTIME EVENT IS AUTO MODE ALARMS PRESENT WHEN MACHINE IS PULLED OUT OF AUTO, OR CYCLE TIMER LAPSES, BERTHE IS SET TO 60 SECONDS IN THE PLC)
If Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(8, 4).Value = True Then GoTo 1 Else GoTo 2
1
'LOOK TO SEE IF DATA HAS BEEN CAPTURED YET(IF TRUE THEN CAPTURE IF FALSE THEN GOTO END
If Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(4, 6).Value = True Then GoTo 3 Else GoTo 4
3
'ADD 1 TO THE RECORD NUMBER FOR NEXT CYCLE
Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(3, 5).Value + 1
'SET THE DATA RECORDED SO NEXT SCAN DOESNT ADD REPEAT DATA TO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(4, 6).Value = False
'MOVE THE COMBINED ALARM STRINGS AND TIME STAMP INTO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssyDownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(10, 6).Value
'GOTO THE END
GoTo 4

2 'Move True Into The Data Recorded Memory Box Cell (E,4)(TRUE = READY FOR NEXT RECORD, ALARMS CLEARED)(FALSE = DATA CAPTURED)

nRow = Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(3, 5).Value
If Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(4, 6).Value = True Then GoTo 4 Else GoTo 5
'MOVE STRING DATA RUNNING WITH NO ALARMS AT XX:XX.XX TIME STAMP
5 Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(4, 6).Value = True
'ADJUST RECORD NUMBER VARIABLE TO ADD THE NEXT STRING TO RECORD RUNNING WITH NO ALARMS TIME STAMP TO THE RECORD
Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssyDownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(9, 6).Value

'ADD 1 TO THE NEXT VARIABLE RECORD LOCATION
Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy").Cells(3, 5).Value + 1
'Move Time Stamp Intolog for how long machinewas down
Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssyDownTimeLog").Cells(lRow, 2).Value = Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssyDownTimeLog").Cells(5, 6).Value
4


EipCommClient.Close

End Sub

Sub readFromG05TowLug()
'DECLARE THE VARIABLES USED IN THE LOGIC BELOW
Dim TagAdress1 As String, TagAdress2 As String, TagAdress3 As String, TagAdress4 As String, TagAdress5 As String, TagAdress6 As String, iRow As Integer, nRow As Integer, lRow As Integer
Dim ipaddr As String, plc_slot As Integer
Dim EipCommClient As New EipExcelComm
ipaddr = Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(2, 9).Value
plc_slot = Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(3, 9).Value
nRow = Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(3, 5).Value
lRow = nRow - 1
EipCommClient.setPlcIPAddress (ipaddr)
EipCommClient.setPlcSlot (plc_slot)


'LIST OF THE PLC TAGS AND WHERE TO PLACE THE DATA
TagAdress1 = Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(3, 3).Value
TagAdress2 = Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(4, 3).Value
TagAdress3 = Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(5, 3).Value
TagAdress4 = Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(6, 3).Value
TagAdress5 = Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(7, 3).Value
TagAdress6 = Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(8, 3).Value
Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(3, 4).Value = EipCommClient.GetData(TagAdress1)
Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(4, 4).Value = EipCommClient.GetData(TagAdress2)
Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(5, 4).Value = EipCommClient.GetData(TagAdress3)
Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(6, 4).Value = EipCommClient.GetData(TagAdress4)
Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(7, 4).Value = EipCommClient.GetData(TagAdress5)
Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(8, 4).Value = EipCommClient.GetData(TagAdress6)
'LOOKING IF THE PLC IS SIGNALING A DOWNTIME EVENT, (DOWNTIME EVENT IS AUTO MODE ALARMS PRESENT WHEN MACHINE IS PULLED OUT OF AUTO, OR CYCLE TIMER LAPSES, BERTHE IS SET TO 60 SECONDS IN THE PLC)
If Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(8, 4).Value = True Then GoTo 1 Else GoTo 2
1
'LOOK TO SEE IF DATA HAS BEEN CAPTURED YET(IF TRUE THEN CAPTURE IF FALSE THEN GOTO END
If Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(4, 6).Value = True Then GoTo 3 Else GoTo 4
3
'ADD 1 TO THE RECORD NUMBER FOR NEXT CYCLE
Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(3, 5).Value + 1
'SET THE DATA RECORDED SO NEXT SCAN DOESNT ADD REPEAT DATA TO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(4, 6).Value = False
'MOVE THE COMBINED ALARM STRINGS AND TIME STAMP INTO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLugDownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(10, 6).Value
'GOTO THE END
GoTo 4

2 'Move True Into The Data Recorded Memory Box Cell (E,4)(TRUE = READY FOR NEXT RECORD, ALARMS CLEARED)(FALSE = DATA CAPTURED)

nRow = Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(3, 5).Value
If Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(4, 6).Value = True Then GoTo 4 Else GoTo 5
'MOVE STRING DATA RUNNING WITH NO ALARMS AT XX:XX.XX TIME STAMP
5 Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(4, 6).Value = True
'ADJUST RECORD NUMBER VARIABLE TO ADD THE NEXT STRING TO RECORD RUNNING WITH NO ALARMS TIME STAMP TO THE RECORD
Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLugDownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(9, 6).Value

'ADD 1 TO THE NEXT VARIABLE RECORD LOCATION
Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug").Cells(3, 5).Value + 1
'Move Time Stamp Intolog for how long machinewas down
Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLugDownTimeLog").Cells(lRow, 2).Value = Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLugDownTimeLog").Cells(5, 6).Value
4


EipCommClient.Close

End Sub

Sub readFromG01BeamAssy()
'DECLARE THE VARIABLES USED IN THE LOGIC BELOW
Dim TagAdress1 As String, TagAdress2 As String, TagAdress3 As String, TagAdress4 As String, TagAdress5 As String, TagAdress6 As String, iRow As Integer, nRow As Integer, lRow As Integer
Dim ipaddr As String, plc_slot As Integer
Dim EipCommClient As New EipExcelComm
ipaddr = Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(2, 9).Value
plc_slot = Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(3, 9).Value
nRow = Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(3, 5).Value
lRow = nRow - 1
On Error Resume Next
EipCommClient.setPlcIPAddress (ipaddr)
EipCommClient.setPlcSlot (plc_slot)


'LIST OF THE PLC TAGS AND WHERE TO PLACE THE DATA
TagAdress1 = Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(3, 3).Value
TagAdress2 = Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(4, 3).Value
TagAdress3 = Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(5, 3).Value
TagAdress4 = Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(6, 3).Value
TagAdress5 = Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(7, 3).Value
TagAdress6 = Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(8, 3).Value
Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(3, 4).Value = EipCommClient.GetData(TagAdress1)
Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(4, 4).Value = EipCommClient.GetData(TagAdress2)
Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(5, 4).Value = EipCommClient.GetData(TagAdress3)
Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(6, 4).Value = EipCommClient.GetData(TagAdress4)
Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(7, 4).Value = EipCommClient.GetData(TagAdress5)
Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(8, 4).Value = EipCommClient.GetData(TagAdress6)
'LOOKING IF THE PLC IS SIGNALING A DOWNTIME EVENT, (DOWNTIME EVENT IS AUTO MODE ALARMS PRESENT WHEN MACHINE IS PULLED OUT OF AUTO, OR CYCLE TIMER LAPSES, BERTHE IS SET TO 60 SECONDS IN THE PLC)
If Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(8, 4).Value = True Then GoTo 1 Else GoTo 2
1
'LOOK TO SEE IF DATA HAS BEEN CAPTURED YET(IF TRUE THEN CAPTURE IF FALSE THEN GOTO END
If Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(4, 6).Value = True Then GoTo 3 Else GoTo 4
3
'ADD 1 TO THE RECORD NUMBER FOR NEXT CYCLE
Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(3, 5).Value + 1
'SET THE DATA RECORDED SO NEXT SCAN DOESNT ADD REPEAT DATA TO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(4, 6).Value = False
'MOVE THE COMBINED ALARM STRINGS AND TIME STAMP INTO THE LOG
Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssyDownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(10, 6).Value
'GOTO THE END
GoTo 4

2 'Move True Into The Data Recorded Memory Box Cell (E,4)(TRUE = READY FOR NEXT RECORD, ALARMS CLEARED)(FALSE = DATA CAPTURED)

nRow = Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(3, 5).Value
If Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(4, 6).Value = True Then GoTo 4 Else GoTo 5
'MOVE STRING DATA RUNNING WITH NO ALARMS AT XX:XX.XX TIME STAMP
5 Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(4, 6).Value = True
'ADJUST RECORD NUMBER VARIABLE TO ADD THE NEXT STRING TO RECORD RUNNING WITH NO ALARMS TIME STAMP TO THE RECORD
Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssyDownTimeLog").Cells(nRow, 3).Value = Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(9, 6).Value

'ADD 1 TO THE NEXT VARIABLE RECORD LOCATION
Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(3, 5).Value = Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy").Cells(3, 5).Value + 1
'Move Time Stamp Intolog for how long machinewas down
Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssyDownTimeLog").Cells(lRow, 2).Value = Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssyDownTimeLog").Cells(5, 6).Value
4


EipCommClient.Close

End Sub


Sub Report()

If VBA.Format(VBA.Now - 1, "MMM-dd-yyyy") <> Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(19, 2).Value Then GoTo 1 Else GoTo 2

1
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(18, 3).Value = False
Call Report_Out
2
If Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(19, 5).Value <> Hour(Time) Then GoTo 3 Else GoTo 4
3 Workbooks("AlarmLogs.xlsm").Save
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(19, 4).Value = Time
4

End Sub


Sub Minute()

'THIS TIME SETS HOW OFTEN TO AUTOMATICALLY REFRESH,(PULLING DATA FROM THE PLC EVERY 10 SECONDS)
Application.OnTime Now + TimeValue("00:00:08"), "Repeat_1Min"

End Sub

Sub Report_Out()

If Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(18, 3).Value = False Then GoTo 1 Else GoTo 2

1
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha List").Cells(1, 4).Value = Workbooks("AlarmLogs.xlsm").Worksheets("BirthaDownTimeLog").Cells(8, 6).Value
Range("A:Q").Select
Range(Selection, Selection.End(xlDown)).Select
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha List").Sort.SortFields.Clear
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha List").Sort.SortFields.Add Key:=Range( _
"D:D"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With Workbooks("AlarmLogs.xlsm").Worksheets("Birtha List").Sort
.SetRange Range("A:Q")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha List").Range("A1:Q3000").AutoFilter Field:=4, Criteria1:="<>0", Operator:=xlFilterValues

Workbooks("AlarmLogs.xlsm").Worksheets("LCB List").Cells(1, 4).Value = Workbooks("AlarmLogs.xlsm").Worksheets("BirthaDownTimeLog").Cells(8, 6).Value
Workbooks("AlarmLogs.xlsm").Worksheets("LCB List").Sort.SortFields.Clear
Workbooks("AlarmLogs.xlsm").Worksheets("LCB List").Sort.SortFields.Add Key:=Range( _
"D:D"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With Workbooks("AlarmLogs.xlsm").Worksheets("LCB List").Sort
.SetRange Range("A:Q")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Workbooks("AlarmLogs.xlsm").Worksheets("LCB List").Range("A1:Q3000").AutoFilter Field:=4, Criteria1:="<>0", Operator:=xlFilterValues

Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1 List").Cells(1, 4).Value = Workbooks("AlarmLogs.xlsm").Worksheets("BirthaDownTimeLog").Cells(8, 6).Value
Range("A:Q").Select
Range(Selection, Selection.End(xlDown)).Select
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1 List").Sort.SortFields.Clear
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1 List").Sort.SortFields.Add Key:=Range( _
"D:D"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1 List").Sort
.SetRange Range("A:Q")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1 List").Range("A1:Q3000").AutoFilter Field:=4, Criteria1:="<>0", Operator:=xlFilterValues

Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2 List").Cells(1, 4).Value = Workbooks("AlarmLogs.xlsm").Worksheets("BirthaDownTimeLog").Cells(8, 6).Value
Range("A:Q").Select
Range(Selection, Selection.End(xlDown)).Select
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2 List").Sort.SortFields.Clear
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2 List").Sort.SortFields.Add Key:=Range( _
"D:D"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2 List").Sort
.SetRange Range("A:Q")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2 List").Range("A1:Q3000").AutoFilter Field:=4, Criteria1:="<>0", Operator:=xlFilterValues

Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3 List").Cells(1, 4).Value = Workbooks("AlarmLogs.xlsm").Worksheets("BirthaDownTimeLog").Cells(8, 6).Value
Range("A:Q").Select
Range(Selection, Selection.End(xlDown)).Select
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3 List").Sort.SortFields.Clear
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3 List").Sort.SortFields.Add Key:=Range( _
"D:D"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3 List").Sort
.SetRange Range("A:Q")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3 List").Range("A1:Q3000").AutoFilter Field:=4, Criteria1:="<>0", Operator:=xlFilterValues

Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1 List").Cells(1, 4).Value = Workbooks("AlarmLogs.xlsm").Worksheets("BirthaDownTimeLog").Cells(8, 6).Value
Range("A:Q").Select
Range(Selection, Selection.End(xlDown)).Select
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1 List").Sort.SortFields.Clear
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1 List").Sort.SortFields.Add Key:=Range( _
"D:D"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1 List").Sort
.SetRange Range("A:Q")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1 List").Range("A1:Q3000").AutoFilter Field:=4, Criteria1:="<>0", Operator:=xlFilterValues

Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2 List").Cells(1, 4).Value = Workbooks("AlarmLogs.xlsm").Worksheets("BirthaDownTimeLog").Cells(8, 6).Value
Range("A:Q").Select
Range(Selection, Selection.End(xlDown)).Select
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2 List").Sort.SortFields.Clear
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2 List").Sort.SortFields.Add Key:=Range( _
"D:D"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2 List").Sort
.SetRange Range("A:Q")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2 List").Range("A1:Q3000").AutoFilter Field:=4, Criteria1:="<>0", Operator:=xlFilterValues

Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3 List").Cells(1, 4).Value = Workbooks("AlarmLogs.xlsm").Worksheets("BirthaDownTimeLog").Cells(8, 6).Value
Range("A:Q").Select
Range(Selection, Selection.End(xlDown)).Select
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3 List").Sort.SortFields.Clear
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3 List").Sort.SortFields.Add Key:=Range( _
"D:D"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3 List").Sort
.SetRange Range("A:Q")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3 List").Range("A1:Q3000").AutoFilter Field:=4, Criteria1:="<>0", Operator:=xlFilterValues

Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude List").Cells(1, 4).Value = Workbooks("AlarmLogs.xlsm").Worksheets("BirthaDownTimeLog").Cells(8, 6).Value
Range("A:Q").Select
Range(Selection, Selection.End(xlDown)).Select
Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude List").Sort.SortFields.Clear
Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude List").Sort.SortFields.Add Key:=Range( _
"D:D"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude List").Sort
.SetRange Range("A:Q")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude List").Range("A1:Q3000").AutoFilter Field:=4, Criteria1:="<>0", Operator:=xlFilterValues

Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy List").Cells(1, 4).Value = Workbooks("AlarmLogs.xlsm").Worksheets("BirthaDownTimeLog").Cells(8, 6).Value
Range("A:Q").Select
Range(Selection, Selection.End(xlDown)).Select
Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy List").Sort.SortFields.Clear
Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy List").Sort.SortFields.Add Key:=Range( _
"D:D"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy List").Sort
.SetRange Range("A:Q")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy List").Range("A1:Q3000").AutoFilter Field:=4, Criteria1:="<>0", Operator:=xlFilterValues

Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug List").Cells(1, 4).Value = Workbooks("AlarmLogs.xlsm").Worksheets("BirthaDownTimeLog").Cells(8, 6).Value
Range("A:Q").Select
Range(Selection, Selection.End(xlDown)).Select
Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug List").Sort.SortFields.Clear
Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug List").Sort.SortFields.Add Key:=Range( _
"D:D"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug List").Sort
.SetRange Range("A:Q")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug List").Range("A1:Q3000").AutoFilter Field:=4, Criteria1:="<>0", Operator:=xlFilterValues


Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy List").Cells(1, 4).Value = Workbooks("AlarmLogs.xlsm").Worksheets("BirthaDownTimeLog").Cells(8, 6).Value
Range("A:Q").Select
Range(Selection, Selection.End(xlDown)).Select
Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy List").Sort.SortFields.Clear
Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy List").Sort.SortFields.Add Key:=Range( _
"D:D"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy List").Sort
.SetRange Range("A:Q")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy List").Range("A1:Q3000").AutoFilter Field:=4, Criteria1:="<>0", Operator:=xlFilterValues


Call Save_YesterDays_File
2
End Sub

Sub Save_YesterDays_File()

Dim myCSVFileName As String
Dim myWB As Workbook
Dim tempWB As Workbook
Dim rngToSave As Range

Application.DisplayAlerts = False
On Error GoTo err

Set myWB = ThisWorkbook
myCSVFileName = "W:\WGA-Engineering\DownTimeTracking" & "\" & "DownTime-" & VBA.Format(VBA.Now - 1, "MMM-dd-yyyy") & ".xlsx"


Workbooks.Open Filename:="W:\WGA-Engineering\DownTimeTracking\DownTime-.xlsx"


Workbooks("AlarmLogs.xlsm").Worksheets("Birtha List").Range("A1:E100").Copy

Workbooks("DownTime-.xlsx").Worksheets("Bertha").Range("A1").PasteSpecial xlPasteFormats
Workbooks("DownTime-.xlsx").Worksheets("Bertha").Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Worksheets("Bertha").Range("A:E").EntireColumn.AutoFit
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha List").AutoFilterMode = False


Workbooks("AlarmLogs.xlsm").Worksheets("LCB List").Range("A1:E40").Copy

Workbooks("DownTime-.xlsx").Worksheets("LCB").Range("A1").PasteSpecial xlPasteFormats
Workbooks("DownTime-.xlsx").Worksheets("LCB").Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Worksheets("LCB").Range("A:E").EntireColumn.AutoFit
Workbooks("AlarmLogs.xlsm").Worksheets("LCB List").AutoFilterMode = False


Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1 List").Range("A1:E40").Copy

Workbooks("DownTime-.xlsx").Worksheets("LHCell1").Range("A1").PasteSpecial xlPasteFormats
Workbooks("DownTime-.xlsx").Worksheets("LHCell1").Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Worksheets("LHCell1").Range("A:E").EntireColumn.AutoFit
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell1 List").AutoFilterMode = False


Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2 List").Range("A1:E40").Copy

Workbooks("DownTime-.xlsx").Worksheets("LHCell2").Range("A1").PasteSpecial xlPasteFormats
Workbooks("DownTime-.xlsx").Worksheets("LHCell2").Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Worksheets("LHCell2").Range("A:E").EntireColumn.AutoFit
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell2 List").AutoFilterMode = False


Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3 List").Range("A1:E40").Copy

Workbooks("DownTime-.xlsx").Worksheets("LHCell3").Range("A1").PasteSpecial xlPasteFormats
Workbooks("DownTime-.xlsx").Worksheets("LHCell3").Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Worksheets("LHCell3").Range("A:E").EntireColumn.AutoFit
Workbooks("AlarmLogs.xlsm").Worksheets("LHCell3 List").AutoFilterMode = False


Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1 List").Range("A1:E40").Copy

Workbooks("DownTime-.xlsx").Worksheets("RHCell1").Range("A1").PasteSpecial xlPasteFormats
Workbooks("DownTime-.xlsx").Worksheets("RHCell1").Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Worksheets("RHCell1").Range("A:E").EntireColumn.AutoFit
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell1 List").AutoFilterMode = False


Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2 List").Range("A1:E40").Copy

Workbooks("DownTime-.xlsx").Worksheets("RHCell2").Range("A1").PasteSpecial xlPasteFormats
Workbooks("DownTime-.xlsx").Worksheets("RHCell2").Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Worksheets("RHCell2").Range("A:E").EntireColumn.AutoFit
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell2 List").AutoFilterMode = False


Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3 List").Range("A1:E40").Copy

Workbooks("DownTime-.xlsx").Worksheets("RHCell3").Range("A1").PasteSpecial xlPasteFormats
Workbooks("DownTime-.xlsx").Worksheets("RHCell3").Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Worksheets("RHCell3").Range("A:E").EntireColumn.AutoFit
Workbooks("AlarmLogs.xlsm").Worksheets("RHCell3 List").AutoFilterMode = False


Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude List").Range("A1:E40").Copy

Workbooks("DownTime-.xlsx").Worksheets("Gertrude").Range("A1").PasteSpecial xlPasteFormats
Workbooks("DownTime-.xlsx").Worksheets("Gertrude").Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Worksheets("Gertrude").Range("A:E").EntireColumn.AutoFit
Workbooks("AlarmLogs.xlsm").Worksheets("Gertrude List").AutoFilterMode = False


Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy List").Range("A1:E40").Copy

Workbooks("DownTime-.xlsx").Worksheets("G05BeamAssy").Range("A1").PasteSpecial xlPasteFormats
Workbooks("DownTime-.xlsx").Worksheets("G05BeamAssy").Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Worksheets("G05BeamAssy").Range("A:E").EntireColumn.AutoFit
Workbooks("AlarmLogs.xlsm").Worksheets("G05BeamAssy List").AutoFilterMode = False


Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug List").Range("A1:E40").Copy

Workbooks("DownTime-.xlsx").Worksheets("G05TowLug").Range("A1").PasteSpecial xlPasteFormats
Workbooks("DownTime-.xlsx").Worksheets("G05TowLug").Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Worksheets("G05TowLug").Range("A:E").EntireColumn.AutoFit
Workbooks("AlarmLogs.xlsm").Worksheets("G05TowLug List").AutoFilterMode = False

Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy List").Range("A1:E40").Copy

Workbooks("DownTime-.xlsx").Worksheets("G01BeamAssy").Range("A1").PasteSpecial xlPasteFormats
Workbooks("DownTime-.xlsx").Worksheets("G01BeamAssy").Range("A1").PasteSpecial xlPasteValuesAndNumberFormats
Worksheets("G01BeamAssy").Range("A:E").EntireColumn.AutoFit
Workbooks("AlarmLogs.xlsm").Worksheets("G01BeamAssy List").AutoFilterMode = False



Workbooks("DownTime-.xlsx").SaveAs Filename:=myCSVFileName, FileFormat:=51, CreateBackup:=False
'Close myCSVFileName
Set tempWB = ActiveWorkbook
With tempWB
.Close
End With
Workbooks("AlarmLogs.xlsm").SaveAs Filename:="W:\WGA-Engineering\DownTimeTracking\AlarmLogs.xlsm", FileFormat:=52, CreateBackup:=False


err:
Application.DisplayAlerts = True

Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(20, 2).Value = myCSVFileName
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(18, 3).Value = True
Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(19, 2).Value = VBA.Format(VBA.Now - 1, "MMM-dd-yyyy")

End Sub
 
Upvote 0
Im not sure if its feasible to open and close a helping workbook every 10 seconds. Here is the code that's running. I originally posted the simple code that was only grabing data when requested.
You are welcome. What you're asking for is possible. You probably will have to adjust the layout of your current worksheets. Or the VBA code has to be adapted to the layout of your worksheets. The same applies to the other workbook you are using.
Just a remark: in this way no one is able to assist since the over 1000 lines of code you have posted are related to two workbooks, both with different sheets of wich nobody knows how it looks like but you.
 
Upvote 0
Like I said you posted a lot of code. However, it all turned out to be very repetitive. I changed my original code. It concerns the standard module and the ThisWorkbook module, both of the first workbook. One generally applicable "ReadFrom ~" procedure calls the code in the second workbook and replaces all other similar procedures. I have left the rest of your original procedures untouched. The code of the second workbook as in my post #7 has not changed.
For this to work you need to add a worksheet to your workbook and set it up as in the attached image. The numbers in the sequence column have to start with 1 and should be consecutively, the worksheets mentioned must actually exist (my code checks on existence and validity). The code name of this added sheet should be included in the declaration section of your "Repeat_1min" procedure. This code name can be retrieved within VBE > Project Explorer (CTRL-R) and unfolding the Microsoft Excel Objects folder. The code name of each sheet is up front, the tab name is between brackets.
Im not sure if its feasible to open and close a helping workbook every 10 seconds.
In principle, this should not be a problem. 8,640 rows of data per worksheet is well below the maximum. It all depends on the total cycle duration, which depends on the response time of the PLC and the speed of your computer. Within my test environment (dual core VM with conventional disk) without PLC, I recorded a time of 37 seconds for 12 IP addresses and 1 tag per IP (instead of 6). Then I turned to 6 tags per IP address and I simulated the response of the PLC by an useless 500,000 iterate on a just booted VM. The first run lasted 11 seconds, each subsequent run lasted 6 seconds. This is where the disk cache kicked in when the 2nd workbook was closed en reopened. Note that the tests ran without the report / save process.

This goes in the ThisWorkbook module of the first workbook:
VBA Code:
Option Explicit

Private modXLapp    As Application
Private modWbkHlp   As Workbook


' ==== built-in event ====

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ' ensure the newly launched instance of Excel will be released on closing
    Set Me.xlApp = Nothing
End Sub


' ==== ensure a proper handling of the helper workbook in a separate instance of Excel ====

Public Property Get xlApp() As Application
    Dim sTmp    As String
    If modXLapp Is Nothing Then
        Set modXLapp = New Application
        modXLapp.Visible = cAppIsVisible
    Else
        ' premature (manual) closing of the 2nd Excel must be taken into account
        On Error Resume Next
        sTmp = modXLapp.Caption
        If err.Number <> 0 Then
            err.Clear
            Set modXLapp = Nothing
        Else
            modXLapp.Visible = cAppIsVisible
        End If
    End If
    Set xlApp = modXLapp
End Property

Public Property Set xlApp(ByVal argApp As Application)
    If argApp Is Nothing Then
        ' quit newly launched instance of Excel
        If Not modXLapp Is Nothing Then
            modXLapp.Quit
            Set modXLapp = Nothing
        End If
    Else
        ' launch a separate instance of Excel
        Set modXLapp = argApp
        modXLapp.Visible = cAppIsVisible
    End If
End Property


Public Property Get WbkHelper() As Workbook
    Dim sTmp    As String
    ' premature (manual) closing of the wbk must be taken into account
    On Error Resume Next
    sTmp = modWbkHlp.Name
    If err.Number <> 0 Then
        err.Clear
        Set WbkHelper = Nothing
    Else
        Set WbkHelper = modWbkHlp
    End If
End Property

Public Property Set WbkHelper(ByVal argWbk As Workbook)
    If argWbk Is Nothing Then
        ' whenever helper workbook needs to be closed
        If Not modWbkHlp Is Nothing Then
            modWbkHlp.Close SaveChanges:=False
            Set modWbkHlp = Nothing
            Set Me.xlApp = Nothing
        End If
    Else
        ' ensure helper workbooks availability
        Set modWbkHlp = argWbk
    End If
End Property


This goes in a standard module of the first workbook:
VBA Code:
Option Explicit
Option Base 1

Public Const cTableShtNmsAddress    As String = "$B$3"      ' address of table's top left cell on the Home Sheet
Public Const cAppIsVisible          As Boolean = True       ' may be changed (True / False)
Public Const cAppWindowState        As Long = xlMinimized   ' may be changed (xlNormal / xlMaximized / xlMinimized)

' items in array Storage
Private Enum P
    IPAddress = 1
    SlotNr = 2
    TagName = 3
    Value = 4
    Msg = 5
    Error = 6
End Enum

' error constants returned by helper wbk
Private Enum E
    None = 0
    PLC_Err = 1
    VBA_Err = 2
End Enum

Private bCycleIsBusy    As Boolean

Sub Repeat_1Min()
    
    Dim oWs As Worksheet
    
    Set oWs = Sheet1            ' <<<<<< Home Sheet with 3 column table & cycle duration
'             ^^^^^^ change accordingly!

    ' put some cycle duration information on Home Sheet
    oWs.Range("D18:D19").Value = Now
    oWs.Range("D18:D19").NumberFormat = "[$-F400]h:mm:ss AM/PM"
    oWs.Range("D20").NumberFormat = "[h]:mm:ss;@"
    oWs.Range("D20").Formula = "=D19-D18"
''    Call readFromBirtha
''    Call readFromLCB
''    Call readFromLHCell1
''    Call readFromLHCell2
''    Call readFromLHCell3
''    Call readFromRHCell1
''    Call readFromRHCell2
''    Call readFromRHCell3
''    Call readFromGertrude
''    Call readFromG05BeamAssy
''    Call readFromG05TowLug
''    '(The 12 address will stop the macro, Commented it out for now)
''    'Call readFromG01BeamAssy
    Call GetPLCdata_R2(argWsHome:=oWs) '  <<<<<<  replaces the above calls
'    Call Report
'    Call Minute
    
    ' done
    oWs.Range("D19").Value = Now
    Set oWs = Nothing
End Sub


' ======== GET THE JOB DONE  ============

Private Sub GetPLCdata_R2(ByRef argWsHome As Worksheet)

    ' this Method iterates through a 3 column table on the Home Sheet (taken as argument)  with:
    '  - consecutive numbers starting with 1
    '  - sheet names (base data)
    '  - sheet names (down time)
    ' this Method has dependencies

    Dim oXL                     As Application
    Dim oWb                     As Workbook
    Dim oWs                     As Worksheet
    Dim arrAll_IPsheets()       As Variant
    Dim bHandshake              As Boolean
    Dim bIsValid                As Boolean
    Dim sHelperWbk              As String
    Dim IPcount                 As Long
    Dim lToStartWith            As Long

    ' in case of an OnTime interval less than cycle duration
    If bCycleIsBusy Then Exit Sub
    bCycleIsBusy = True

    ' some initialization & precaution
    Set oWs = argWsHome
    If oWs Is Nothing Then Exit Sub

    ' 3 items per IP Address: [SequenceNr], [sheet with IP, Slot, Tags and Values], [sheet DownTimeLog]
    ReDim arrAll_IPsheets(oWs.Range(cTableShtNmsAddress).End(xlDown).Row, 3)
    arrAll_IPsheets = oWs.Cells(Range(cTableShtNmsAddress).Row, Range(cTableShtNmsAddress).Column).CurrentRegion.Value

    ' prevent type mismatch during cycle
    bIsValid = CheckTblRecords(arrAll_IPsheets)

    If bIsValid Then

        ' table has column headings, ignore them
        lToStartWith = 2

SUB_START:
        ' ensure it's the right helper workbook
        bHandshake = False
        
        ' open helper workbook
        Set oWb = MyHelperWorkbook

        If oWb Is Nothing Then
            'do nothing, user has already been alerted
        Else
            Set oXL = oWb.Parent
            sHelperWbk = oWb.FullName
            Set oWb = Nothing

            ' are we dealing with our helper workbook?
            On Error Resume Next
            bHandshake = oXL.Run("'" & sHelperWbk & "'!PLC_Confirm")
            On Error GoTo 0

            If bHandshake Then
                ' continue where we left off when EipExcelComm_lib threw a spanner
                For IPcount = lToStartWith To UBound(arrAll_IPsheets)

                        lToStartWith = ReadToSheet(argXLapp:=oXL, argHelperWbkName:=sHelperWbk, _
                                                                 argSequenceNr:=arrAll_IPsheets(IPcount, 1), _
                                                                argBaseShtName:=arrAll_IPsheets(IPcount, 2), _
                                                            argDownTimeShtName:=arrAll_IPsheets(IPcount, 3))
                    If Not lToStartWith = 0 Then GoTo SUB_REPEAT
                Next
            Else
                MsgBox "File " & sHelperWbk & " seems to be the wrong Helper Workbook.", vbExclamation, "EipPlc"
            End If
            Set oXL = Nothing
        End If
        GoTo SUB_DONE
    Else
        MsgBox "Table on sheet " & oWs.Name & " is not valid!" & vbCrLf & "Check Sequence numbers and Worksheet names.", vbExclamation, "EipPlc"
        GoTo SUB_ERROR
    End If

SUB_REPEAT:

    ' close helper wbk and quit separate instance of Excel
    Set oXL = Nothing
    Set ThisWorkbook.WbkHelper = Nothing
    GoTo SUB_START
    
SUB_ERROR:

SUB_DONE:
    Set oWs = Nothing
    bCycleIsBusy = False
End Sub


Private Function CheckTblRecords(ByRef argArray As Variant) As Boolean

    ' this Function returns FALSE if the table on the home sheet contains erroneous data

    Dim n               As Long
    Dim arrTable()      As Variant
    Dim oWs             As Worksheet

    ReDim arrTable(UBound(argArray, 1), UBound(argArray, 2))
    On Error Resume Next
    ' check on Sequence Numbers
    For n = 2 To UBound(argArray)
        arrTable(n, 1) = CLng(argArray(n, 1))
        If err.Number <> 0 Then GoTo SUB_ERROR
        If n - 1 <> arrTable(n, 1) Then GoTo SUB_ERROR
    Next n
    
    With ThisWorkbook
        ' check on Sheet Names (Base)
        For n = 2 To UBound(argArray)
            arrTable(n, 2) = Trim(argArray(n, 2))
            If err.Number <> 0 Then GoTo SUB_ERROR
            Set oWs = Nothing
            Set oWs = .Worksheets(argArray(n, 2))
            If oWs Is Nothing Then GoTo SUB_ERROR
        Next n
        ' check on Sheet Names (DownTimeLog)
        For n = 2 To UBound(argArray)
            arrTable(n, 3) = Trim(argArray(n, 3))
            If err.Number <> 0 Then GoTo SUB_ERROR
            Set oWs = Nothing
            Set oWs = .Worksheets(argArray(n, 3))
            If oWs Is Nothing Then GoTo SUB_ERROR
        Next n
    End With

SUB_DONE:
    Set oWs = Nothing
    CheckTblRecords = True
    Exit Function
    
SUB_ERROR:
'    MsgBox "Nr: " & err.Number & vbCrLf & _
'           "Dc: " & err.Description & vbCrLf & _
'           "Sc: " & err.Source, vbExclamation, "Failure ..."
    err.Clear
    CheckTblRecords = False
End Function


Private Function MyHelperWorkbook() As Workbook

    ' this Function opens the helper wbk provided it exists on disk
    ' this Function has dependencies and is a dependency for others

    Dim oXL             As Application
    Dim oWb             As Workbook
    Dim sWbName         As String

    ' check whether helper wbk is open by now
    Set oWb = ThisWorkbook.WbkHelper

    If oWb Is Nothing Then

        ' helper wbk is not available yet so compose its filename
        sWbName = ThisWorkbook.Path & "\" & StripFileExt(ThisWorkbook.Name) & ".xlsb"

        ' check whether helper wbk exists on disk
        If FileExists(sWbName) Then

            ' launch separate instance of Excel and store its reference for later use
            Set oXL = ThisWorkbook.xlApp
            If oXL.Visible = True Then
                oXL.WindowState = cAppWindowState
            End If

            ' open helper workbook              ' <<<<<<  the helper wbk must have a reference to the EipExcelComm_Lib.DLL file
            On Error Resume Next
            Set oWb = oXL.Workbooks.Open(sWbName)
            On Error GoTo 0

            If Not oWb Is Nothing Then
                ' return with reference to helper wbk
                Set MyHelperWorkbook = oWb
                ' also store its reference for later use
                Set ThisWorkbook.WbkHelper = oWb
                Set oWb = Nothing
            Else
                Set MyHelperWorkbook = Nothing
                MsgBox "Failed to open Helper Workbook: " & sWbName, vbExclamation, "EipPlc"
            End If
        Else
            Set MyHelperWorkbook = Nothing
            MsgBox "File " & sWbName & " does not exist.", vbExclamation, "EipPlc"
        End If
        Set oXL = Nothing

    Else
        ' helper wbk is available
        Set MyHelperWorkbook = oWb
        Set oWb = Nothing
    End If
End Function


Public Function ReadToSheet(ByRef argXLapp As Application, ByVal argHelperWbkName As String, _
                            ByVal argSequenceNr As Long, ByVal argBaseShtName As String, ByVal argDownTimeShtName As String) As Long

    ' ==== This Function: ====
    '  - reads from the PLC and writes results to the desired sheets (taken as arguments)
    '  - calls the ReadFromPLC() Method within the helper workbook
    '  - has dependencies and is also a dependency for others

    ' - returns 0 when completed successfully
    ' - returns current sequence number when the EipExcelComm_Lib errors out due to its 11 IP address limitation

    Dim nRow                As Integer
    Dim lRow                As Integer
    Dim oWs_DownTime        As Worksheet
    Dim Storage(P.Error)    As Variant
    Dim oXL                 As Application

    Set oXL = argXLapp

    ' assume failure & ignore column headings of SheetName Table
    ReadToSheet = argSequenceNr + 1

    ' set ref to the belonging down time sheet
    Set oWs_DownTime = ThisWorkbook.Sheets(argDownTimeShtName)

    ' target the desired base sheet
    With ThisWorkbook.Sheets(argBaseShtName)

        ' get record (row) number for next cycle
        nRow = .Cells(3, 5).Value

        ' get current record (row) for storing DownTime data
        lRow = nRow - 1

        ' ensure valid boolean in this cell (Tag_6) in first run
        .Cells(8, 4).Value = False

' =============== PLC DATA I/O SEQUENCE ==============================================

        ' some initialization
        Storage(P.Value) = ""
        Storage(P.Msg) = ""
        Storage(P.Error) = E.None                                               '  ============= FORMER CODE =============
                                                                                '  Dim EipCommClient As New EipExcelComm
        ' provide basic info
        Storage(P.IPAddress) = .Cells(2, 9).Value                               '  ipaddr = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(2, 9).Value
        Storage(P.SlotNr) = .Cells(3, 9).Value                                  '  plc_slot = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(3, 9).Value

        ' provide first tag
        Storage(P.TagName) = .Cells(3, 3).Value                                 '  TagAdress1 = Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(3, 3).Value
        ' fire PLC macro in helper workbook
        oXL.Run "'" & argHelperWbkName & "'!PLC_Push", Storage                  '  EipCommClient.setPlcIPAddress (ipaddr)
        DoEvents                                                                '  EipCommClient.setPlcSlot (plc_slot)
        ' get results and if succeeded: store Value on sheet
        Storage(P.Error) = oXL.Run("'" & argHelperWbkName & "'!PLC_Pop_Error")
'        Storage(P.Msg) = oXL.Run("'" & argHelperWbkName & "'!PLC_Pop_Msg")     '  <<< displaying message is not used anymore so commented out
        If Storage(P.Error) = E.PLC_Err Then GoTo SUB_ERROR
        Storage(P.Value) = oXL.Run("'" & argHelperWbkName & "'!PLC_Pop_Value")
        .Cells(3, 4).Value = Storage(P.Value)                                   '  Workbooks("AlarmLogs.xlsm").Worksheets("Birtha").Cells(3, 4).Value = EipCommClient.GetData(TagAdress1)

' ==============================================================================

            ' get results from SECOND and SUBSEQUENT tags (same IP address)
            Storage(P.TagName) = .Cells(4, 3).Value
            oXL.Run "'" & argHelperWbkName & "'!PLC_Push", Storage
            DoEvents
            Storage(P.Error) = oXL.Run("'" & argHelperWbkName & "'!PLC_Pop_Error")
            If Storage(P.Error) = E.PLC_Err Then GoTo SUB_ERROR
            Storage(P.Value) = oXL.Run("'" & argHelperWbkName & "'!PLC_Pop_Value")
            .Cells(4, 4).Value = Storage(P.Value)

                Storage(P.TagName) = .Cells(5, 3).Value
                oXL.Run "'" & argHelperWbkName & "'!PLC_Push", Storage
                DoEvents
                Storage(P.Error) = oXL.Run("'" & argHelperWbkName & "'!PLC_Pop_Error")
                If Storage(P.Error) = E.PLC_Err Then GoTo SUB_ERROR
                Storage(P.Value) = oXL.Run("'" & argHelperWbkName & "'!PLC_Pop_Value")
                .Cells(5, 4).Value = Storage(P.Value)

                    Storage(P.TagName) = .Cells(6, 3).Value
                    oXL.Run "'" & argHelperWbkName & "'!PLC_Push", Storage
                    DoEvents
                    Storage(P.Error) = oXL.Run("'" & argHelperWbkName & "'!PLC_Pop_Error")
                    If Storage(P.Error) = E.PLC_Err Then GoTo SUB_ERROR
                    Storage(P.Value) = oXL.Run("'" & argHelperWbkName & "'!PLC_Pop_Value")
                    .Cells(6, 4).Value = Storage(P.Value)

                        Storage(P.TagName) = .Cells(7, 3).Value
                        oXL.Run "'" & argHelperWbkName & "'!PLC_Push", Storage
                        DoEvents
                        Storage(P.Error) = oXL.Run("'" & argHelperWbkName & "'!PLC_Pop_Error")
                        If Storage(P.Error) = E.PLC_Err Then GoTo SUB_ERROR
                        Storage(P.Value) = oXL.Run("'" & argHelperWbkName & "'!PLC_Pop_Value")
                        .Cells(7, 4).Value = Storage(P.Value)

                            Storage(P.TagName) = .Cells(8, 3).Value
                            oXL.Run "'" & argHelperWbkName & "'!PLC_Push", Storage
                            DoEvents
                            Storage(P.Error) = oXL.Run("'" & argHelperWbkName & "'!PLC_Pop_Error")
                            If Storage(P.Error) = E.PLC_Err Then GoTo SUB_ERROR
                            Storage(P.Value) = oXL.Run("'" & argHelperWbkName & "'!PLC_Pop_Value")
                            .Cells(8, 4).Value = Storage(P.Value)


        'LOOKING IF THE PLC IS SIGNALING A DOWNTIME EVENT, (DOWNTIME EVENT IS AUTO MODE ALARMS PRESENT WHEN MACHINE IS PULLED OUT OF AUTO, OR CYCLE TIMER LAPSES, BERTHA IS SET TO 60 SECONDS IN THE PLC)
        If Not .Cells(8, 4).Value = True Then GoTo SUB_2

        'LOOK TO SEE IF DATA HAS BEEN CAPTURED YET(IF TRUE THEN CAPTURE IF FALSE THEN GOTO END
        If Not .Cells(4, 6).Value = True Then GoTo SUB_DONE

        'ADD 1 TO THE RECORD NUMBER FOR NEXT CYCLE
        .Cells(3, 5).Value = .Cells(3, 5).Value + 1

        'SET THE DATA RECORDED SO NEXT SCAN DOESNT ADD REPEAT DATA TO THE LOG
        .Cells(4, 6).Value = False

        'MOVE THE COMBINED ALARM STRINGS AND TIME STAMP INTO THE LOG
' >> remark: not sure if this is doing anything because cell [.CELLS(10, 6)] on each
'            of the 12 Base sheets is not being updated (according to your existing code)
        oWs_DownTime.Cells(nRow, 3).Value = .Cells(10, 6).Value
        GoTo SUB_DONE

SUB_2:
        'Move True Into The Data Recorded Memory Box Cell (E,4)(TRUE = READY FOR NEXT RECORD, ALARMS CLEARED)(FALSE = DATA CAPTURED)
        nRow = .Cells(3, 5).Value
        If .Cells(4, 6).Value = True Then GoTo SUB_DONE

        'MOVE STRING DATA RUNNING WITH NO ALARMS AT XX:XX.XX TIME STAMP

        .Cells(4, 6).Value = True
        'ADJUST RECORD NUMBER VARIABLE TO ADD THE NEXT STRING TO RECORD RUNNING WITH NO ALARMS TIME STAMP TO THE RECORD
        oWs_DownTime.Cells(nRow, 3).Value = .Cells(9, 6).Value

        'ADD 1 TO THE NEXT VARIABLE RECORD LOCATION
        .Cells(3, 5).Value = .Cells(3, 5).Value + 1

        'Move Time Stamp Intolog for how long machinewas down
' >> remark: not sure if this is doing anything because cell [.CELLS(5, 6)] on each
'            of the 12 DownTimeLog sheets is not being updated (according to your existing code)
        oWs_DownTime.Cells(lRow, 2).Value = oWs_DownTime.Cells(5, 6).Value

    End With

SUB_DONE:
    ' return with success flag
    ReadToSheet = 0

SUB_ERROR:
    Set oXL = Nothing
    Set oWs_DownTime = Nothing
End Function


Public Function StripFileExt(ByRef argFileName As String) As String
    ' get base of filename (without extension)
    Dim lLen    As Long
    lLen = InStrRev(argFileName, ".", -1, vbTextCompare)
    If lLen = 0 Then
        StripFileExt = argFileName
    Else
        lLen = 1 + Len(argFileName) - lLen
        StripFileExt = Left(argFileName, Len(argFileName) - lLen)
    End If
End Function

Public Function FileExists(ByRef argFullFileName As String) As Boolean
    FileExists = True
    On Error Resume Next
    If (GetAttr(argFullFileName) And vbDirectory) = vbDirectory Then FileExists = False
    On Error GoTo 0
End Function

Hopefully this works out for you. Success with your project!
 

Attachments

  • ScreenShot080.jpg
    ScreenShot080.jpg
    130.5 KB · Views: 6
Upvote 0

Forum statistics

Threads
1,214,650
Messages
6,120,734
Members
448,987
Latest member
marion_davis

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top