Files
Emmanuele Sassi 6e4645875b - Primo commit
- Tpa funzionante
2021-09-29 11:35:42 +02:00

372 lines
16 KiB
VB.net

Imports System.Collections.ObjectModel
Imports System.Collections.Specialized
Imports ISOCNC.Remoting
Imports EgtUILib
Imports EgtWPFLib5
Imports System.IO
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.nProduction_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.nProduction_State = 2
' Part.dtEndTime = dtEnd
' Part.NotifyPropertyChanged(NameOf(Part.nCALC_State))
' ' resetto stato redo
' Part.bRedo = False
' ' 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.sVariables(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