diff --git a/EgtBEAMWALL.Supervisor/LeftPanel/LeftPanelVM.vb b/EgtBEAMWALL.Supervisor/LeftPanel/LeftPanelVM.vb index 86a10f05..3a584eb4 100644 --- a/EgtBEAMWALL.Supervisor/LeftPanel/LeftPanelVM.vb +++ b/EgtBEAMWALL.Supervisor/LeftPanel/LeftPanelVM.vb @@ -40,7 +40,7 @@ Public Class LeftPanelVM Return m_SelChannel End Get Set(ByVal value As IdNameStruct) - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.SETCHANNEL, value.Id)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.SETCHANNEL, value.Id)) m_SelChannel = value End Set End Property @@ -86,7 +86,7 @@ Public Class LeftPanelVM Return m_SelOPMode End Get Set(ByVal value As OPState) - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.SETOPMODE, value.Id)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.SETOPMODE, value.Id)) ' se MDI If value.Id = OPModes.Mdi Then ' mostro pagina comandi MDI diff --git a/EgtBEAMWALL.Supervisor/MDIPage/MDIPageVM.vb b/EgtBEAMWALL.Supervisor/MDIPage/MDIPageVM.vb index 7a51acd9..ff27b773 100644 --- a/EgtBEAMWALL.Supervisor/MDIPage/MDIPageVM.vb +++ b/EgtBEAMWALL.Supervisor/MDIPage/MDIPageVM.vb @@ -163,7 +163,7 @@ Public Class MDIPageVM ''' Friend Sub SendMDI() If Not String.IsNullOrWhiteSpace(m_sMDICommand_Text) Then - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.MDI, m_sMDICommand_Text)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.MDI, m_sMDICommand_Text)) End If End Sub diff --git a/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/MachCommandMessagePanelVM.vb b/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/MachCommandMessagePanelVM.vb index 4a920b97..7182a374 100644 --- a/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/MachCommandMessagePanelVM.vb +++ b/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/MachCommandMessagePanelVM.vb @@ -427,11 +427,11 @@ Public Class MachCommandMessagePanelVM End Property Public Sub Disconnect() - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.DISCONNECT)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.DISCONNECT)) End Sub Public Sub SetOPState(OpState As Integer) - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.SETOPMODE)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.SETOPMODE)) End Sub Public ReadOnly Property Start_Command As ICommand @@ -442,7 +442,7 @@ Public Class MachCommandMessagePanelVM End Property Public Sub Start(ByVal param As Object) - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.START)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.START)) End Sub Public ReadOnly Property Stop_Command As ICommand @@ -453,7 +453,7 @@ Public Class MachCommandMessagePanelVM End Property Public Sub [Stop](ByVal param As Object) - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.STOP_)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.STOP_)) End Sub Public ReadOnly Property Reset_Command As ICommand @@ -464,7 +464,7 @@ Public Class MachCommandMessagePanelVM End Property Public Sub Reset(ByVal param As Object) - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.RESET)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.RESET)) ' annullo stato di pronto ad essere lavorato di tutti i programmi If Not IsNothing(Map.refProjectVM.SupervisorMachGroupPanelVM) Then Map.refProjectVM.SupervisorMachGroupPanelVM.ResetAllMachGroups() End Sub @@ -477,7 +477,7 @@ Public Class MachCommandMessagePanelVM End Property Public Sub [Step](ByVal param As Object) - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.STEP_)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.STEP_)) End Sub Public ReadOnly Property SetPoint_Command As ICommand @@ -488,7 +488,7 @@ Public Class MachCommandMessagePanelVM End Property Public Sub SetPoint(ByVal param As Object) - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.SETPOINT)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.SETPOINT)) End Sub @@ -500,7 +500,7 @@ Public Class MachCommandMessagePanelVM End Property Public Sub DeleteAlarms(ByVal param As Object) - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.DELETEALARMS)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.DELETEALARMS)) End Sub Public Function GetVarPathByName(Name As String) As String diff --git a/EgtBEAMWALL.Supervisor/MachManagingThread/MachManaging.vb b/EgtBEAMWALL.Supervisor/MachManagingThread/MachManaging.vb index 0e92d822..cd7b8d82 100644 --- a/EgtBEAMWALL.Supervisor/MachManagingThread/MachManaging.vb +++ b/EgtBEAMWALL.Supervisor/MachManagingThread/MachManaging.vb @@ -10,6 +10,9 @@ Imports EgtBEAMWALL.Supervisor.CommVar Public Class MachManaging + ' lock per aggiunta elemento a lista MachGroup + Private Shared Lock_CommandList As New Object + Private m_bConnected As Boolean = False Public ReadOnly Property bConnected As Boolean Get @@ -53,6 +56,22 @@ Public Class MachManaging Return m_CommandList End Get End Property + Friend Shared Sub AddToCommandList(value As ThreadCommand) + SyncLock Lock_CommandList + ' EgtOutLog("Inizio ciclo rimozioni") + For CommandIndex = m_CommandList.Count - 1 To 0 Step -1 + Dim Command As ThreadCommand = m_CommandList(CommandIndex) + If Command.ProcessingStatus = ThreadCommand.ProcessingStatuses.DONE Then + ' EgtOutLog("Inizio rimozione comando") + m_CommandList.Remove(Command) + ' EgtOutLog("Fine rimozione comando") + End If + Next + ' EgtOutLog("Fine ciclo rimozioni") + CommandList.Add(value) + ' EgtOutLog("Count dopo aggiunta: " & CommandList.Count) + End SyncLock + End Sub Private m_bStartPending As Boolean = False Public ReadOnly Property StartPending As Boolean @@ -638,7 +657,7 @@ Public Class MachManaging ' se non impostata data start If MachGroup.dtStartTime = DateTime.MinValue Then - EgtOutLog("Start date not set on Prod " & nP_Prod & " Machgroup " & nP_Machgroup) + ' EgtOutLog("Start date not set on Prod " & nP_Prod & " Machgroup " & nP_Machgroup) Dim dtStart As DateTime = MachGroup.dtEndTime - TimeSpan.FromSeconds(60) ' provo a recuperare tempo stimato If MachGroup.nCALC_TIME > 0 Then @@ -722,7 +741,7 @@ Public Class MachManaging End Function Private Function SendNextProgram() As Boolean - EgtOutLog("Inizio SendNextProgram") + ' EgtOutLog("Inizio SendNextProgram") Dim bSent As Boolean = False If (CurrentMachine.NCType = NCTypes.TPA AndAlso Not m_bStartPending AndAlso Tpa.opState = MachineOperatingState.Pending) OrElse (CurrentMachine.NCType = NCTypes.NUM_FLEXIUM AndAlso Not Num_Flexium.bIsTransferActive) OrElse @@ -730,20 +749,20 @@ Public Class MachManaging (CurrentMachine.NCType = NCTypes.NUM_AXIUM_PCTOOLKIT AndAlso Not Num_Axium_PCToolkit.bIsTransferActive) Then ' 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()) + ' EgtOutLog("Start " & DateTime.Now()) Dim bMachGroupNotReady As Boolean = False SyncLock m_Lock_SendProgram For Each MyMachGroup As MyMachGroupVM In Map.refProjectVM.SupervisorMachGroupPanelVM.MachGroupVMList - EgtOutLog("Ciclo su name: " & MyMachGroup.Name & " id: " & MyMachGroup.Id) + ' EgtOutLog("Ciclo su name: " & MyMachGroup.Name & " id: " & MyMachGroup.Id) If Not MyMachGroup.bSentToMachine AndAlso (MyMachGroup.dtStartTime = DateTime.MinValue OrElse (Map.refSupervisorManagerVM.CurrProd.nType = BWType.WALL AndAlso MyMachGroup.bResetWhileCutting)) Then - EgtOutLog(MyMachGroup.Name & " id: " & MyMachGroup.Id & " è da fare") + ' EgtOutLog(MyMachGroup.Name & " id: " & MyMachGroup.Id & " è da fare") ' verifico se ricalcolo finito If MyMachGroup.bReadyForMachining AndAlso If(CurrentMachine.NCType = NCTypes.NUM_FLEXIUM Or CurrentMachine.NCType = NCTypes.NUM_AXIUM_APSERVER OrElse CurrentMachine.NCType = NCTypes.NUM_AXIUM_PCTOOLKIT, Not MyMachGroup.bSendingToMachine, True) Then - EgtOutLog(MyMachGroup.Name & " id: " & MyMachGroup.Id & " pronto per essere lavorato") + ' EgtOutLog(MyMachGroup.Name & " id: " & MyMachGroup.Id & " pronto per essere lavorato") ' lo lancio bSent = SendProgram(MyMachGroup.CnFilePath(), MyMachGroup.Name) - EgtOutLog(MyMachGroup.Name & " id: " & MyMachGroup.Id & " mandato " & DateTime.Now() & " " & MyMachGroup.Name & " " & bSent.ToString()) + ' EgtOutLog(MyMachGroup.Name & " id: " & MyMachGroup.Id & " mandato " & DateTime.Now() & " " & MyMachGroup.Name & " " & bSent.ToString()) Select Case CurrentMachine.NCType Case NCTypes.TPA MyMachGroup.SetSentToMachine(bSent) @@ -755,7 +774,7 @@ Public Class MachManaging Else ' programma non ancora pronto, esco per attendere bMachGroupNotReady = True - EgtOutLog(MyMachGroup.Name & " id: " & MyMachGroup.Id & " non ancora pronto per essere mandato") + ' EgtOutLog(MyMachGroup.Name & " id: " & MyMachGroup.Id & " non ancora pronto per essere mandato") Exit For 'Return False End If @@ -763,7 +782,7 @@ Public Class MachManaging Next End SyncLock If bMachGroupNotReady Then Return False - EgtOutLog("End " & DateTime.Now()) + ' EgtOutLog("End " & DateTime.Now()) End If End If Return bSent @@ -771,10 +790,17 @@ Public Class MachManaging 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) + ' EgtOutLog("Inizio ciclo esecuzione comandi") + Dim nCommandCount As Integer = e.NewItems.Count + For CommandIndex = 0 To nCommandCount - 1 + Dim Command As ThreadCommand = e.NewItems(CommandIndex) + If Command.ProcessingStatus = ThreadCommand.ProcessingStatuses.WAITING Then + Command.SetProcessingStatus(ThreadCommand.ProcessingStatuses.PROCESSING) + ExecuteCommand(DirectCast(Command, ThreadCommand)) + Command.SetProcessingStatus(ThreadCommand.ProcessingStatuses.DONE) + End If Next + ' EgtOutLog("Fine ciclo esecuzione di " & nCommandCount & " comandi") End If End Sub @@ -1044,7 +1070,7 @@ Public Class MachManaging Num_Axium_APServer.StartTransfer() Return True Case NCTypes.NUM_AXIUM_PCTOOLKIT - EgtOutLog("Pre Download") + ' EgtOutLog("Pre Download") Dim nFileType As Integer = 0 If Integer.TryParse(ProgramId, nFileType) AndAlso nFileType > 0 Then Num_Axium_PCToolkit.FileDownload(nFileType * 10, ProgramPath) diff --git a/EgtBEAMWALL.Supervisor/MachManagingThread/MachManagingThread.vb b/EgtBEAMWALL.Supervisor/MachManagingThread/MachManagingThread.vb index 555b29f4..fcab3cb0 100644 --- a/EgtBEAMWALL.Supervisor/MachManagingThread/MachManagingThread.vb +++ b/EgtBEAMWALL.Supervisor/MachManagingThread/MachManagingThread.vb @@ -54,6 +54,12 @@ End Class Public Class ThreadCommand + Public Enum ProcessingStatuses + WAITING = 1 + PROCESSING = 2 + DONE = 3 + End Enum + Private m_CommandType As CommandTypes Public ReadOnly Property CommandType As CommandTypes Get @@ -95,6 +101,16 @@ Public Class ThreadCommand End Get End Property + Private m_ProcessingStatus As ProcessingStatuses = ProcessingStatuses.WAITING + Public ReadOnly Property ProcessingStatus As ProcessingStatuses + Get + Return m_ProcessingStatus + End Get + End Property + Friend Sub SetProcessingStatus(value As ProcessingStatuses) + m_ProcessingStatus = value + End Sub + Protected Sub New() End Sub diff --git a/EgtBEAMWALL.Supervisor/MainMenu/MainMenuVM.vb b/EgtBEAMWALL.Supervisor/MainMenu/MainMenuVM.vb index 709d9840..90bd998e 100644 --- a/EgtBEAMWALL.Supervisor/MainMenu/MainMenuVM.vb +++ b/EgtBEAMWALL.Supervisor/MainMenu/MainMenuVM.vb @@ -277,31 +277,31 @@ Public Class MainMenuVM Private Function InitINPUTS() As Boolean ' fermo e riavvio lettura variabili per includere quelle della pagina input - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.STOPREAD_NUMFLEXIUM)) - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.READ_NUMFLEXIUM)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.STOPREAD_NUMFLEXIUM)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.READ_NUMFLEXIUM)) Map.refMainWindowVM.NotifyPropertyChanged(NameOf(Map.refMainWindowVM.nSelTabPage)) Return True End Function Private Function ExitINPUTS() As Boolean ' fermo e riavvio lettura variabili per includere quelle della pagina input - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.STOPREAD_NUMFLEXIUM)) - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.READ_NUMFLEXIUM)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.STOPREAD_NUMFLEXIUM)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.READ_NUMFLEXIUM)) Return True End Function Private Function InitOUTPUTS() As Boolean ' fermo e riavvio lettura variabili per includere quelle della pagina input - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.STOPREAD_NUMFLEXIUM)) - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.READ_NUMFLEXIUM)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.STOPREAD_NUMFLEXIUM)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.READ_NUMFLEXIUM)) Map.refMainWindowVM.NotifyPropertyChanged(NameOf(Map.refMainWindowVM.nSelTabPage)) Return True End Function Private Function ExitOUTPUTS() As Boolean ' fermo e riavvio lettura variabili per includere quelle della pagina input - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.STOPREAD_NUMFLEXIUM)) - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.READ_NUMFLEXIUM)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.STOPREAD_NUMFLEXIUM)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.READ_NUMFLEXIUM)) Return True End Function diff --git a/EgtBEAMWALL.Supervisor/MainWindow/MainWindowVM.vb b/EgtBEAMWALL.Supervisor/MainWindow/MainWindowVM.vb index 66ccbc46..a1d1188c 100644 --- a/EgtBEAMWALL.Supervisor/MainWindow/MainWindowVM.vb +++ b/EgtBEAMWALL.Supervisor/MainWindow/MainWindowVM.vb @@ -234,7 +234,7 @@ Public Class MainWindowVM Return End If ' disconnetto comunicazione con macchina - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.DISCONNECT)) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.DISCONNECT)) ' termino thread di comunicazione con Db ed altri programmi ViewerOptimizerCommThread.StopThread() ' Verifico modifica parametri in Configurazione e chiedo il salvataggio diff --git a/EgtBEAMWALL.Supervisor/VariablesList/VariablesListVM.vb b/EgtBEAMWALL.Supervisor/VariablesList/VariablesListVM.vb index ab12b278..c541e01d 100644 --- a/EgtBEAMWALL.Supervisor/VariablesList/VariablesListVM.vb +++ b/EgtBEAMWALL.Supervisor/VariablesList/VariablesListVM.vb @@ -64,7 +64,7 @@ Public Class Variable Return CommVar.sValue End Get Set(value As String) - MachManaging.CommandList.Add(ThreadCommand.CreateCommand(CommandTypes.WRITE, {CommVar.nType}, Nothing, {CommVar.sAddress, value})) + MachManaging.AddToCommandList(ThreadCommand.CreateCommand(CommandTypes.WRITE, {CommVar.nType}, Nothing, {CommVar.sAddress, value})) NotifyPropertyChanged(NameOf(sValue)) End Set End Property