Imports System.Collections.ObjectModel Imports System.Collections.Specialized Imports System.Windows.Threading Imports EgtBEAMWALL.Core.ConstMachComm Imports ISOCNC.Remoting Imports EgtUILib Class MachManaging Private m_bConnected As Boolean = False Public ReadOnly Property bConnected As Boolean Get Return m_bConnected End Get End Property Private m_Tpa As TPAComm = Nothing Public ReadOnly Property Tpa As TPAComm Get Return m_Tpa End Get End Property Private Shared WithEvents m_CommandList As New ObservableCollection(Of ThreadCommand) Public Shared ReadOnly Property CommandList As ObservableCollection(Of ThreadCommand) Get Return m_CommandList End Get End Property Private m_bStartPending As Boolean = False Friend Sub ResetStartPending() m_bStartPending = False End Sub Sub New() ' imposto in Map Map.SetRefMachManaging(Me) AddHandler m_CommandList.CollectionChanged, AddressOf CommandList_CollectionChanged ' mi connetto alla macchina Connect() End Sub Private Sub OnDispose() RemoveHandler m_CommandList.CollectionChanged, AddressOf CommandList_CollectionChanged End Sub Friend Sub Timer_Tick() 'Dim bCancel As Boolean = False 'callback(0, "Init", bCancel) ' leggo tutte le variabili Tpa.RWVariableManager.RefreshAllVars() ' eseguo ciclo principale Dim nReset_State As Integer Dim nP_Prod As Integer Dim nP_Machgroup As Integer Dim nP_Part As Integer Dim nP_State As Integer Tpa.RWVariableManager.ReadVar(P_PROD, nP_Prod) Tpa.RWVariableManager.ReadVar(P_MACHGROUP, nP_Machgroup) Tpa.RWVariableManager.ReadVar(P_PART, nP_Part) Tpa.RWVariableManager.ReadVar(P_STATE, nP_State) Tpa.RWVariableManager.ReadVar(RESET_STATE, nReset_State) ' verifico se scattato stato reset If nReset_State <> 0 Then ' resetto tutti i programmi If Not IsNothing(Map.refProjectVM.SupervisorMachGroupPanelVM) Then Map.refProjectVM.SupervisorMachGroupPanelVM.ResetAllMachGroups() ' resetto variabili P Tpa.RWVariableManager.WriteVar(P_PROD, 0) Tpa.RWVariableManager.WriteVar(P_MACHGROUP, 0) Tpa.RWVariableManager.WriteVar(P_PART, 0) Tpa.RWVariableManager.WriteVar(P_STATE, 0) ' cancello tutti i programmi da memoria CN RemoveAllProgram() ' azzero variabile reset Tpa.remObject.SetVariableCommand(CInt(ISOCNC.Remoting.VariableCommands.WriteVar), RWVariableManager.GetReadVarFromName(RESET_STATE).sAddress, "0") Return ' se macchina pronta e non sta tagliando alcun pezzo ElseIf nP_Prod = 0 AndAlso nP_Machgroup = 0 AndAlso nP_Part = 0 AndAlso nP_State = PartState.NULL Then ' verifico se c'e' un programma da lanciare SendNextProgram() ' attesa per essere sicuro che abbia scritto e riletto variabili Threading.Thread.Sleep(300) ElseIf nP_Prod <> 0 AndAlso nP_Machgroup <> 0 AndAlso nP_Part <> 0 Then If nP_State = PartState.START Then ' scrivo data start su Db pezzo Dim dtStart As DateTime = DateTime.Now() DbControllers.m_PartController.UpdateStart(nP_Prod, nP_Machgroup, nP_Part, dtStart) ' recupero gruppo di lavorazione del pezzo Dim MachGroup As MyMachGroupVM = Map.refProjectVM.SupervisorMachGroupPanelVM.MachGroupVMList.FirstOrDefault(Function(x) x.Id = nP_Machgroup) ' recupero pezzo Dim Part As PartVM = MachGroup.PartVMList.FirstOrDefault(Function(x) x.nPartId = nP_Part) ' scrivo stato start Part.nState = 1 Part.dtStartTime = dtStart Part.NotifyPropertyChanged(NameOf(Part.nState)) ' azzero variabile per far ripartire macchina Tpa.RWVariableManager.WriteVar(P_STATE, 0) ' se nessun pezzo della barra diverso da quello corrente e' in start If Not MachGroup.PartVMList.Any(Function(x) x.nPartId <> nP_Part AndAlso x.nState = 1) Then ' scrivo data start su Db barra DbControllers.m_MachGroupController.UpdateStart(nP_Prod, nP_Machgroup, dtStart) ' scrivo stato start MachGroup.MyMachGroupM.SetState(1) MachGroup.dtStartTime = dtStart MachGroup.NotifyPropertyChanged(NameOf(MachGroup.nState)) ' e' primo pezzo della barra che parte, quindi mando programma successivo SendNextProgram() End If ' attesa per essere sicuro che abbia scritto e riletto variabili Threading.Thread.Sleep(300) ElseIf nP_State = PartState.END_ Then ' scrivo data end su Db pezzo Dim dtEnd As DateTime = DateTime.Now() DbControllers.m_PartController.UpdateEnd(nP_Prod, nP_Machgroup, nP_Part, dtEnd) ' recupero gruppo di lavorazione del pezzo Dim MachGroup As MyMachGroupVM = Map.refProjectVM.SupervisorMachGroupPanelVM.MachGroupVMList.FirstOrDefault(Function(x) x.Id = nP_Machgroup) ' recupero pezzo Dim Part As PartVM = MachGroup.PartVMList.FirstOrDefault(Function(x) x.nPartId = nP_Part) ' scrivo stato end Part.nState = 2 Part.dtEndTime = dtEnd Part.NotifyPropertyChanged(NameOf(Part.nState)) ' azzero variabile per far ripartire macchina Tpa.RWVariableManager.WriteVar(P_STATE, 0) ' se tutti i pezzi della barra sono in end If MachGroup.PartVMList.All(Function(x) x.nState >= 2) Then ' scrivo data end su Db barra DbControllers.m_MachGroupController.UpdateEnd(nP_Prod, nP_Machgroup, dtEnd) ' scrivo stato end MachGroup.MyMachGroupM.SetState(2) MachGroup.dtEndTime = dtEnd MachGroup.NotifyPropertyChanged(NameOf(MachGroup.nState)) ' azzero tutte le variabilli per iniziare barra successiva Tpa.RWVariableManager.WriteVar(P_PROD, 0) Tpa.RWVariableManager.WriteVar(P_MACHGROUP, 0) Tpa.RWVariableManager.WriteVar(P_PART, 0) Tpa.RWVariableManager.WriteVar(P_STATE, 0) End If LabelPrinter.SetTestPrintVariables(nP_Prod, nP_Machgroup, nP_Part) LabelPrinter.Print() ' attesa per essere sicuro che abbia scritto e riletto variabili Threading.Thread.Sleep(300) End If End If End Sub Private m_Lock_SendProgram As New Object Private Sub SendNextProgram() If Not m_bStartPending AndAlso (Tpa.opState = MachineOperatingState.Pending Or Tpa.opState = MachineOperatingState.Start) Then ' verifico se c'e' un programma da lanciare If Not IsNothing(Map.refProjectVM.SupervisorMachGroupPanelVM) Then EgtOutLog("Start " & DateTime.Now()) SyncLock m_Lock_SendProgram For Each MyMachGroup As MyMachGroupVM In Map.refProjectVM.SupervisorMachGroupPanelVM.MachGroupVMList If MyMachGroup.dtStartTime = DateTime.MinValue AndAlso MyMachGroup.bReadyForMachining Then ' lo lancio SendProgram(MyMachGroup.CnFilePath()) Exit For End If Next End SyncLock EgtOutLog("End " & DateTime.Now()) End If End If End Sub Private Sub CommandList_CollectionChanged(sender As Object, e As NotifyCollectionChangedEventArgs) If Not IsNothing(e.NewItems) Then For Each Command In e.NewItems ExecuteCommand(DirectCast(Command, ThreadCommand)) m_CommandList.Remove(Command) Next End If End Sub Private Sub ExecuteCommand(Command As ThreadCommand) Select Case Command.CommandType Case CommandTypes.CONNECT Connect() Case CommandTypes.DISCONNECT Disconnect() Case CommandTypes.START Start() Case CommandTypes.STOP_ Stop Case CommandTypes.RESET Reset() Case CommandTypes.STEP_ Step_() Case CommandTypes.SETPOINT SetPoint() Case CommandTypes.SENDPROG SendProgram(Command.sVariable) Case CommandTypes.REMOVEPROG RemoveProgram(Command.nVariable, Command.sVariable) Case CommandTypes.REMOVEALLPROG RemoveAllProgram() Case CommandTypes.READ Tpa.RWVariableManager.RefreshVar(Command.sVariable) Case CommandTypes.WRITE Tpa.RWVariableManager.WriteVar(Command.sVariable, Command.sVariable(1)) Case CommandTypes.DELETEALARMS DeleteAlarms() Case CommandTypes.SETOP End Select End Sub Public Sub Connect() Try m_Tpa = New TPAComm(Me) m_bConnected = Tpa.remObject.OnConnect() m_ResultCallbackDlg(CommandTypes.CONNECT, CommandStates.OK, ResultTypes.EXECUTED, "") ' creo classe di gestione variabili Catch ex As Exception m_ResultCallbackDlg(CommandTypes.CONNECT, CommandStates.ERROR_, ResultTypes.EXECUTED, "Errore: impossibile connettersi!") Return End Try End Sub Public Sub Disconnect() Dim bOk As Boolean = Tpa.remObject.OnClose() m_bConnected = Not bOk m_ResultCallbackDlg(CommandTypes.DISCONNECT, If(bOk, CommandStates.OK, CommandStates.ERROR_), ResultTypes.EXECUTED, "") ' chiudo classe Tpa Me.OnDispose() m_Tpa.OnDispose() ' termino thread di comunicazione CommunicationThread.StopThread() End Sub Public Sub SetOPState() End Sub Public Sub Start() Dim bOk As Boolean = Tpa.remObject.SetCommand(CInt(ISOCNC.Remoting.Commands.Start)) m_bStartPending = bOk m_ResultCallbackDlg(CommandTypes.START, If(bOk, CommandStates.OK, CommandStates.ERROR_), ResultTypes.EXECUTED, "") End Sub Public Sub [Stop]() Dim bOk As Boolean = Tpa.remObject.SetCommand(CInt(ISOCNC.Remoting.Commands.[Stop])) m_ResultCallbackDlg(CommandTypes.STOP_, If(bOk, CommandStates.OK, CommandStates.ERROR_), ResultTypes.EXECUTED, "") End Sub Public Sub Reset() Dim bOk As Boolean = Tpa.remObject.SetCommand(CInt(ISOCNC.Remoting.Commands.[End])) m_ResultCallbackDlg(CommandTypes.RESET, If(bOk, CommandStates.OK, CommandStates.ERROR_), ResultTypes.EXECUTED, "") End Sub Public Sub Step_() Dim bOk As Boolean = Tpa.remObject.SetCommand(CInt(ISOCNC.Remoting.Commands.Step)) m_ResultCallbackDlg(CommandTypes.STEP_, If(bOk, CommandStates.OK, CommandStates.ERROR_), ResultTypes.EXECUTED, "") End Sub Public Sub SetPoint() Dim bOk As Boolean = Tpa.remObject.SetCommand(CInt(ISOCNC.Remoting.Commands.SetPoint)) m_ResultCallbackDlg(CommandTypes.SETPOINT, If(bOk, CommandStates.OK, CommandStates.ERROR_), ResultTypes.EXECUTED, "") End Sub Public Sub SendProgram(ProgramPath As String) If Tpa.opState = MachineOperatingState.Pending Then Tpa.remObject.RemoveAllProgramsFromList() End If 'If bOk Then Dim bOk As Boolean = False ProgramPath = ProgramPath.Replace("\\", "\") bOk = Tpa.remObject.AddProgramToList(ProgramPath) Threading.Thread.Sleep(1000) bOk = Tpa.remObject.SetCommand(CInt(ISOCNC.Remoting.Commands.Start_Program_Soft)) 'End If m_ResultCallbackDlg(CommandTypes.SENDPROG, If(bOk, CommandStates.OK, CommandStates.ERROR_), ResultTypes.EXECUTED, "") End Sub Public Sub RemoveProgram(ProgramIndex As Integer, ProgramPath As String) Dim bOk As Boolean Dim sError As String = "" If ProgramIndex > 0 Then bOk = Tpa.remObject.RemoveProgramFromListAtIndex(ProgramIndex) ElseIf Not String.IsNullOrEmpty(ProgramPath) Then bOk = Tpa.remObject.RemoveProgramFromList(ProgramPath) Else bOk = False sError = "Errore: nessun parametro passato" End If m_ResultCallbackDlg(CommandTypes.REMOVEPROG, If(bOk, CommandStates.OK, CommandStates.ERROR_), ResultTypes.EXECUTED, sError) End Sub Public Sub RemoveAllProgram() Dim bOk As Boolean = Tpa.remObject.RemoveAllProgramsFromList() m_ResultCallbackDlg(CommandTypes.REMOVEALLPROG, If(bOk, CommandStates.OK, CommandStates.ERROR_), ResultTypes.EXECUTED, "") End Sub Public Sub DeleteAlarms() Dim bOk As Boolean = Tpa.remObject.DeleteAlarms(CInt(AlarmType.ISO)) bOk = Tpa.remObject.DeleteAlarms(CInt(AlarmType.Message)) bOk = Tpa.remObject.DeleteAlarms(CInt(AlarmType.Cycle)) bOk = Tpa.remObject.DeleteAlarms(CInt(AlarmType.System)) m_ResultCallbackDlg(CommandTypes.DELETEALARMS, If(bOk, CommandStates.OK, CommandStates.ERROR_), ResultTypes.EXECUTED, "") End Sub End Class