d611f66d43
Correzioni e migliorie
372 lines
16 KiB
VB.net
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
|