Files
egtbeamwall/EgtBEAMWALL.Supervisor/MachManagingThread/MachManaging.vb
T
Emmanuele Sassi d611f66d43 Modifiche comunicazione tra Opt e Sup
Correzioni e migliorie
2021-08-02 15:32:39 +02:00

372 lines
16 KiB
VB.net

Imports System.Collections.ObjectModel
Imports System.Collections.Specialized
Imports EgtBEAMWALL.Core.ConstMachComm
Imports ISOCNC.Remoting
Imports EgtUILib
Imports EgtWPFLib5
Imports System.IO
Imports EgtBEAMWALL.Core
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
Public ReadOnly Property StartPending As Boolean
Get
Return m_bStartPending
End Get
End Property
Friend Sub ResetStartPending()
m_bStartPending = False
End Sub
' prossima barra di cui mando i parametri di carico
Private m_NextBarId As Integer
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)
' se non ancora fatto, preparo variabili barra successiva
If m_NextBarId = 0 Then
SetNextBarVars()
End If
Dim TestOpState As Integer = Tpa.remObject.MachineOperativeStatus
' 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() toglie programma default per pending
' azzero variabile reset
Tpa.remObject.SetVariableCommand(CInt(ISOCNC.Remoting.VariableCommands.WriteVar),
RWVariableManager.GetReadVarFromName(RESET_STATE).sAddress, "0")
' resetto prossima barra e variabili V
m_NextBarId = 0
For Index = 1 To 6
Tpa.RWVariableManager.WriteVar(VPAR & Index.ToString(), 0)
Next
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) AndAlso
Tpa.opState = MachineOperatingState.Pending AndAlso Tpa.remObject.MachineOperativeStatus = MachineOperatingState.Pending Then
' verifico se c'e' un programma da lanciare
SendNextProgram()
' attesa per essere sicuro che abbia scritto e riletto variabili
Threading.Thread.Sleep(300)
' verifico stati inizio e fine pezzi
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)
DbControllers.m_PartController.UpdateStatus(nP_Prod, nP_Machgroup, nP_Part, ItemState.WIP)
' 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.nCALC_State = 1
Part.dtStartTime = dtStart
Part.NotifyPropertyChanged(NameOf(Part.nCALC_State))
' 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.nCALC_State = 1) Then
' scrivo data start su Db barra
DbControllers.m_MachGroupController.UpdateStart(nP_Prod, nP_Machgroup, dtStart)
DbControllers.m_MachGroupController.UpdateStatus(nP_Prod, nP_Machgroup, ItemState.WIP)
' scrivo stato start
MachGroup.MyMachGroupM.SetProductionState(1)
MachGroup.dtStartTime = dtStart
MachGroup.NotifyPropertyChanged(NameOf(MachGroup.nCALC_State))
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)
DbControllers.m_PartController.UpdateStatus(nP_Prod, nP_Machgroup, nP_Part, ItemState.Produced)
' 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.nCALC_State = 2
Part.dtEndTime = dtEnd
Part.NotifyPropertyChanged(NameOf(Part.nCALC_State))
' 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.nCALC_State >= 2) Then
' scrivo data end su Db barra
DbControllers.m_MachGroupController.UpdateEnd(nP_Prod, nP_Machgroup, dtEnd)
DbControllers.m_MachGroupController.UpdateStatus(nP_Prod, nP_Machgroup, ItemState.Produced)
' scrivo stato end
MachGroup.MyMachGroupM.SetProductionState(2)
MachGroup.dtEndTime = dtEnd
MachGroup.NotifyPropertyChanged(NameOf(MachGroup.nCALC_State))
' 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
If Map.refMachCommandMessagePanelVM.bPrinterLink Then
LabelPrinter.SetTestPrintVariables(nP_Prod, nP_Machgroup, nP_Part)
LabelPrinter.Print()
End If
' 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 Function SetNextBarVars() As Boolean
' verifico se c'e' un programma da lanciare
If Not IsNothing(Map.refProjectVM.SupervisorMachGroupPanelVM) Then
For Each MyMachGroup As MyMachGroupVM In Map.refProjectVM.SupervisorMachGroupPanelVM.MachGroupVMList
If Not MyMachGroup.bSentToMachine AndAlso MyMachGroup.dtStartTime = DateTime.MinValue AndAlso MyMachGroup.bReadyForMachining Then
' leggo valori parametri V da file
Dim dVPars(10) As Double
Dim Lines() As String = File.ReadAllLines(MyMachGroup.CnFilePath())
Dim sVs() As String = Lines(0).Split(";"c)
For VParIndex = 1 To sVs.Length - 1
Dim VPar() As String = sVs(VParIndex).Split("="c)
VPar(1) = VPar(1).Trim
StringToDouble(VPar(1), dVPars(VParIndex))
Next
' li scrivo nel CN
For Index = 1 To 10
Tpa.RWVariableManager.WriteVar(VPAR & Index.ToString(), dVPars(Index))
Next
m_NextBarId = MyMachGroup.Id
Return True
End If
Next
End If
Return False
End Function
Private Function SendNextProgram() As Boolean
Dim bSent As Boolean = False
If Not m_bStartPending AndAlso Tpa.opState = MachineOperatingState.Pending 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())
SyncLock m_Lock_SendProgram
For Each MyMachGroup As MyMachGroupVM In Map.refProjectVM.SupervisorMachGroupPanelVM.MachGroupVMList
If Not MyMachGroup.bSentToMachine AndAlso MyMachGroup.dtStartTime = DateTime.MinValue AndAlso MyMachGroup.bReadyForMachining Then
' lo lancio
bSent = SendProgram(MyMachGroup.CnFilePath())
EgtOutLog("Mandato " & DateTime.Now() & " " & MyMachGroup.Name & " " & bSent.ToString())
MyMachGroup.SetSentToMachine(bSent)
m_NextBarId = 0
Exit For
End If
Next
End SyncLock
EgtOutLog("End " & DateTime.Now())
End If
End If
Return bSent
End Function
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
MachineCommThread.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 Function SendProgram(ProgramPath As String) As Boolean
If Tpa.opState = MachineOperatingState.Pending Then
Tpa.remObject.RemoveAllProgramsFromList()
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))
m_ResultCallbackDlg(CommandTypes.SENDPROG, If(bOk, CommandStates.OK, CommandStates.ERROR_), ResultTypes.EXECUTED, "")
Return bOk
End If
Return False
End Function
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