From 75c02a762583b80253a10efd18b33495a38db7f4 Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Thu, 30 Apr 2026 14:58:16 +0200 Subject: [PATCH 01/10] EgtBEAMWALL.Supervisor 3.1.4.7: - aggiunta comunicazione con controllo Siemens attraverso Sharp7 --- .../Comms/SIEMENSSharp7Comm.vb | 516 ++++++++++++++++++ .../Constants/ConstCommVar.vb | 44 ++ .../EgtBEAMWALL.Supervisor.vbproj | 7 +- .../LeftPanel/LeftPanelVM.vb | 22 +- .../MachCommandMessagePanelVM.vb | 42 +- .../MachCommandPanelVM.vb | 58 ++ .../Support classes.vb | 55 ++ .../MachGroupPanel/MyMachGroupVM.vb | 80 ++- .../MachManagingThread/MachCommConst.vb | 2 + .../MachManagingThread/MachManaging.vb | 396 +++++++++++++- .../MachManagingThread/MachManagingThread.vb | 3 +- EgtBEAMWALL.Supervisor/MainMenu/MainMenuVM.vb | 2 +- .../My Project/AssemblyInfo.vb | 4 +- .../OpenProjectFileDialogVM.vb | 2 - .../RestartRawPart/RestartRawPartV.xaml | 12 + .../RestartRawPart/RestartRawPartV.xaml.vb | 3 + .../RestartRawPart/RestartRawPartVM.vb | 3 + .../RestartWnd/RestartWndV.xaml | 12 + .../RestartWnd/RestartWndV.xaml.vb | 3 + .../RestartWnd/RestartWndVM.vb | 3 + .../SceneHost/MySceneHostVM.vb | 4 +- .../Utility/CurrentMachine.vb | 4 + ExtLibs/Sharp7.net.dll | Bin 0 -> 63488 bytes 23 files changed, 1207 insertions(+), 70 deletions(-) create mode 100644 EgtBEAMWALL.Supervisor/Comms/SIEMENSSharp7Comm.vb create mode 100644 EgtBEAMWALL.Supervisor/MachCommandMessagePanel/MachCommandPanelVM.vb create mode 100644 EgtBEAMWALL.Supervisor/MachCommandMessagePanel/Support classes.vb create mode 100644 EgtBEAMWALL.Supervisor/RestartRawPart/RestartRawPartV.xaml create mode 100644 EgtBEAMWALL.Supervisor/RestartRawPart/RestartRawPartV.xaml.vb create mode 100644 EgtBEAMWALL.Supervisor/RestartRawPart/RestartRawPartVM.vb create mode 100644 EgtBEAMWALL.Supervisor/RestartWnd/RestartWndV.xaml create mode 100644 EgtBEAMWALL.Supervisor/RestartWnd/RestartWndV.xaml.vb create mode 100644 EgtBEAMWALL.Supervisor/RestartWnd/RestartWndVM.vb create mode 100644 ExtLibs/Sharp7.net.dll diff --git a/EgtBEAMWALL.Supervisor/Comms/SIEMENSSharp7Comm.vb b/EgtBEAMWALL.Supervisor/Comms/SIEMENSSharp7Comm.vb new file mode 100644 index 00000000..e0768da7 --- /dev/null +++ b/EgtBEAMWALL.Supervisor/Comms/SIEMENSSharp7Comm.vb @@ -0,0 +1,516 @@ +Imports System.Buffers.Binary +Imports EgtUILib +Imports EgtWPFLib5 +Imports Sharp7 + +Public Class SIEMENSSharp7Comm + + Private m_DBVariableList As New List(Of DBBuffer) ' Buffer list + + Private IntBuffer() As Byte = {0, 0} + Private BoolBuffer() As Byte = {0} + Private DIntBuffer() As Byte = {0, 0, 0, 0} + Private RealBuffer() As Byte = {0, 0, 0, 0} + Private StringBuffer(65536) As Byte ' Buffer + Private Client As New S7Client ' Client Object + + ' lista variabili in lettura + Private Shared m_ReadingVars(100) As CommVar + + ' lista dei messaggi di errore attivi + Private m_ActiveMessages As New List(Of SiemensReadMessages) + + Private m_MachManaging As MachManaging + Friend ReadOnly Property MachManaging As MachManaging + Get + Return m_MachManaging + End Get + End Property + + Private m_RefreshTime As Integer = 10 + Private m_WaitingRefreshTime As Integer = 20 + Private m_RefreshCounter As Integer = 0 + Private m_IsRefreshing As Boolean = False + + Public Sub New(MachManaging As MachManaging) + m_MachManaging = MachManaging + End Sub + + Public Shared Function InitVar(Variable As CommVar) As CommVar + Dim Index As Integer = Array.IndexOf(m_ReadingVars, Nothing) + m_ReadingVars(Index) = Variable + Return m_ReadingVars(Index) + End Function + + ' Avvio la connessione Hardware-Client + Friend Function InitConnection() As Boolean + ' Ip del PLC + Dim sIp As String = "" + GetPrivateProfileString(S_GENERAL, K_IP, "", sIp, CurrentMachine.sMachIniFile) + ' unità usate dal PLC (Rack e Slot) + Dim nRack As Integer = GetPrivateProfileInt(S_GENERAL, K_RACK, 0, CurrentMachine.sMachIniFile) + Dim nSlot As Integer = GetPrivateProfileInt(S_GENERAL, K_SLOT, 0, CurrentMachine.sMachIniFile) + Map.refMachManaging.DebugMessage(1, "Tentativo di connessione a CN Siemens con Sharp7") + Map.refMachManaging.DebugMessage(1, "IP: " & sIp) + Map.refMachManaging.DebugMessage(1, "Rack: " & nRack) + Map.refMachManaging.DebugMessage(1, "Slot: " & nSlot) + Dim nResult As Integer = Client.ConnectTo(sIp, nRack, nSlot) + If nResult = 0 Then + Map.refMachManaging.DebugMessage(1, "Connessione effettuata") + Else + Map.refMachManaging.DebugMessage(1, "Connessione fallita con codice di errore: " & nResult) + End If + ' se la connessione è restituisce 0 + Return nResult = 0 + End Function + + ' chiudo la connessione + Friend Sub CloseConnection() + Dim nResult As Integer = Client.Disconnect() + If Map.refMachManaging.Debug > 0 Then + If nResult = 0 Then + EgtOutLog("Disconnessione effettuata") + Else + EgtOutLog("Disconnessione fallita con codice di errore: " & nResult) + End If + End If + + End Sub + + Friend Sub RefreshConnection() + If m_RefreshCounter < m_RefreshTime Then + m_RefreshCounter += 1 + Else + ' riavvio connessione + m_IsRefreshing = True + CloseConnection() + InitConnection() + m_IsRefreshing = False + m_RefreshCounter = 0 + End If + End Sub + + Private Function WaitingRefresh() As Boolean + If Not m_IsRefreshing Then Return True + Dim WaitingCounter As Integer = 0 + While m_IsRefreshing < m_WaitingRefreshTime + If Not m_IsRefreshing Then Return True + Threading.Thread.Sleep(100) + End While + EgtOutLog("Waiting reconnection timeout!") + Return False + End Function + +#Region "Read Variables" + + Public Sub RefreshAllVars() + WaitingRefresh() + m_DBVariableList.Clear() + For Each Var In m_ReadingVars + ' rileggo solo variabili continue + If Not IsNothing(Var) AndAlso Var.nReadType = CommVar.ReadTypes.CONTINUOUS Then + Dim CompleteAddressSplit() As String = Var.sAddress.Split(":"c) + Dim nDBAddress As Integer = 0 + Integer.TryParse(CompleteAddressSplit(0), nDBAddress) + If nDBAddress = 0 Then Return + Dim DBBuffer As DBBuffer = m_DBVariableList.FirstOrDefault(Function(x) x.DBAddress = nDBAddress) + If IsNothing(DBBuffer) Then + Dim Buffer(65536) As Byte + Dim nAddressByte As Integer = 0 + Select Case nDBAddress + Case 301 + nAddressByte = 8 + Case 302 + nAddressByte = 34 + End Select + Map.refMachManaging.DebugMessage(1, "Lettura di " & nAddressByte & " byte dalla variabile " & nDBAddress) + Dim nResult As Integer = 1234567890 + Try + nResult = Client.DBRead(nDBAddress, 0, nAddressByte, Buffer) + Catch ex As Exception + nResult = 1234567890 + Map.refMachManaging.DebugMessage(1, "Lettura di " & nDBAddress & " ha generato un'eccezione") + Map.refMachManaging.DebugMessage(1, ex.ToString()) + End Try + If nResult = 0 Then + Map.refMachManaging.DebugMessage(1, "Lettura di " & nDBAddress & " effettuata") + If Map.refMachManaging.Debug > 1 Then + 'For Index = 0 To Buffer.Count - 1 + ' Map.refMachManaging.DebugMessage(2, Index & ": " & Buffer(Index)) + 'Next + End If + Else + Map.refMachManaging.DebugMessage(2, "Lettura fallita con codice di errore: " & nResult) + End If + If nResult = 0 Then + DBBuffer = New DBBuffer(nDBAddress, Buffer) + m_DBVariableList.Add(DBBuffer) + End If + End If + If Not IsNothing(DBBuffer) Then + Dim PositionAddressSplit() As String = CompleteAddressSplit(1).Split("."c) + Dim nStartIndex As Integer = 0 + Integer.TryParse(PositionAddressSplit(0), nStartIndex) + Select Case CompleteAddressSplit(2) + Case 1 + Dim nBytePositionIndex As Integer = 0 + Integer.TryParse(PositionAddressSplit(1), nBytePositionIndex) + Dim nPower As Integer = Math.Pow(2, nBytePositionIndex) + ' Dim bValue As Boolean = (TestBuffer(nStartIndex) And nPower) = nPower + Map.refMachManaging.DebugMessage(2, "Lettura variabile " & nDBAddress & ":" & nStartIndex & "." & nBytePositionIndex) + Var.SetValue(If((DBBuffer.DBValue(nStartIndex) And nPower) = nPower, 1, 0)) + Map.refMachManaging.DebugMessage(2, "Variabile " & nDBAddress & ":" & nStartIndex & "." & nBytePositionIndex & " (Tipo 1) = " & Var.sValue) + Case 2 + 'Dim x = BitConverter.ToInt16(TestBuffer, nStartIndex) + Dim nValue As Int16 = BitConverter.ToInt16(DBBuffer.DBValue, nStartIndex) + Map.refMachManaging.DebugMessage(2, "Lettura variabile " & nDBAddress & ":" & nStartIndex) + Var.SetValue(BinaryPrimitives.ReverseEndianness(nValue)) + Map.refMachManaging.DebugMessage(2, "Variabile " & nDBAddress & ":" & nStartIndex & " (Tipo 2) = " & Var.sValue) + Case 3 + ' Dim x = BitConverter.ToInt32(TestBuffer, nStartIndex) + Dim nValue As Integer = BitConverter.ToInt32(DBBuffer.DBValue, nStartIndex) + Map.refMachManaging.DebugMessage(2, "Lettura variabile " & nDBAddress & ":" & nStartIndex) + Var.SetValue(BinaryPrimitives.ReverseEndianness(nValue)) + Map.refMachManaging.DebugMessage(2, "Variabile " & nDBAddress & ":" & nStartIndex & " (Tipo 3) = " & Var.sValue) + End Select + End If + End If + Next + End Sub + + Friend Function WriteVariable(Address As String, Value As String) As Boolean + WaitingRefresh() + Dim CompleteAddressSplit() As String = Address.Split(":"c) + Dim nDBAddress As Integer = 0 + Integer.TryParse(CompleteAddressSplit(0), nDBAddress) + If nDBAddress = 0 Then Return False + Dim PositionAddressSplit() As String = CompleteAddressSplit(1).Split("."c) + Dim nStartIndex As Integer = 0 + Integer.TryParse(PositionAddressSplit(0), nStartIndex) + Select Case CompleteAddressSplit(2) + Case 1 + ' rileggo int16 + Dim Buffer(1) As Byte + Client.DBRead(nDBAddress, nStartIndex, 1, Buffer) + Dim nBytePositionIndex As Integer = 0 + Integer.TryParse(PositionAddressSplit(1), nBytePositionIndex) + Dim nPower As Integer = Math.Pow(2, nBytePositionIndex) + Dim nNewValue As Integer = 0 + If Not Integer.TryParse(Value, nNewValue) Then Return False + Dim nOldValue As Integer = If((Buffer(0) And nPower) = nPower, 1, 0) + If nOldValue = nNewValue Then + Return True + ElseIf nOldValue = 0 Then + Buffer(0) = Buffer(0) Or nPower + ElseIf nOldValue = 1 Then + Buffer(0) = Buffer(0) Xor nPower + Else + Return False + End If + ' Buffer(0) = Buffer(0) And nPower + If Map.refMachManaging.Debug > 1 Then + EgtOutLog("Scrittura variabile " & Address & " (Tipo 1) con valore " & Value) + 'For Index = 0 To Buffer.Count - 1 + ' EgtOutLog(Index & ": " & Buffer(Index)) + 'Next + End If + Dim nResult As Integer = Client.DBWrite(nDBAddress, nStartIndex, 1, Buffer) ' DbNumber, Start, Amount, Buffer + ' Return WriteBool(nDBAddress, nStartIndex, bValue) + If Map.refMachManaging.Debug > 1 Then + If nResult <> 0 Then + EgtOutLog("Scrittura variabile " & nDBAddress & ":" & nStartIndex & " con valore " & Value & " effettuata") + Else + EgtOutLog("Scrittura variabile " & nDBAddress & ":" & nStartIndex & " con valore " & Value & " fallita") + End If + End If + Return nResult = 0 + Case 2 + Dim nValue As Int16 = 0 + If Not Int16.TryParse(Value, nValue) Then Return False + If Map.refMachManaging.Debug > 1 Then + EgtOutLog("Scrittura variabile " & Address & " (Tipo 2) con valore " & Value) + End If + Dim bResult As Boolean = WriteInt(nDBAddress, nStartIndex, nValue) + If Map.refMachManaging.Debug > 1 Then + If bResult Then + EgtOutLog("Scrittura variabile " & nDBAddress & ":" & nStartIndex & " con valore " & Value & " effettuata") + Else + EgtOutLog("Scrittura variabile " & nDBAddress & ":" & nStartIndex & " con valore " & Value & " fallita") + End If + End If + Return bResult + Case 3 + Dim nValue As Integer = 0 + If Not Integer.TryParse(Value, nValue) Then Return False + If Map.refMachManaging.Debug > 1 Then + EgtOutLog("Scrittura variabile " & Address & " (Tipo 3) con valore " & Value) + End If + Dim bResult As Boolean = WriteDInt(nDBAddress, nStartIndex, nValue) + If Map.refMachManaging.Debug > 1 Then + If bResult Then + EgtOutLog("Scrittura variabile " & nDBAddress & ":" & nStartIndex & " con valore " & Value & " effettuata") + Else + EgtOutLog("Scrittura variabile " & nDBAddress & ":" & nStartIndex & " con valore " & Value & " fallita") + End If + End If + Return bResult + Case 4 + Dim dValue As Single = 0 + If Not StringToDoubleAdv(Value, dValue) Then Return False + If Map.refMachManaging.Debug > 1 Then + EgtOutLog("Scrittura variabile " & Address & " (Tipo 4) con valore " & Value) + End If + Dim bResult As Boolean = WriteReal(nDBAddress, nStartIndex, dValue) + If Map.refMachManaging.Debug > 1 Then + If bResult Then + EgtOutLog("Scrittura variabile " & nDBAddress & ":" & nStartIndex & " con valore " & Value & " effettuata") + Else + EgtOutLog("Scrittura variabile " & nDBAddress & ":" & nStartIndex & " con valore " & Value & " fallita") + End If + End If + Return bResult + End Select + End Function + +#End Region ' Read Variables + + Friend Function ReadInt(DBNumber As Integer, Start As Integer, ByRef Value As Integer) As Boolean + WaitingRefresh() + ' Read 2 bytes from the DBNumber starting from Start and puts them into ReadBuffer. + Dim Result As Integer = Client.DBRead(DBNumber, Start, 2, IntBuffer) ' DbNumber, Start, Amount, Buffer + If Result = 0 Then + Value = S7.GetIntAt(IntBuffer, 0) + Return True + End If + Return False + End Function + + Friend Function WriteInt(DBNumber As Integer, Start As Integer, Value As Int16) As Boolean + WaitingRefresh() + S7.SetIntAt(IntBuffer, 0, Value) + ' Read "Size" bytes from the DB "DBNumber" starting from 0 and puts them into Buffer. + Dim Result As Integer = Client.DBWrite(DBNumber, Start, 2, IntBuffer) ' DbNumber, Start, Amount, Buffer + Return Result = 0 + End Function + + Friend Function ReadBool(DBNumber As Integer, Start As Integer, ByRef Value As Boolean) As Boolean + WaitingRefresh() + ' Read 2 bytes from the DBNumber starting from Start and puts them into ReadBuffer. + Dim Result As Integer = Client.DBRead(DBNumber, Start, 1, BoolBuffer) ' DbNumber, Start, Amount, Buffer + If Result = 0 Then + Value = BitConverter.ToBoolean(BoolBuffer, 0) + Return True + End If + Return False + End Function + + Friend Function WriteBool(DBNumber As Integer, Start As Integer, Value As Boolean) As Boolean + WaitingRefresh() + + If Value Then + BoolBuffer(0) = &H1 + Else + BoolBuffer(0) = &H0 + End If + ' Read "Size" bytes from the DB "DBNumber" starting from 0 and puts them into Buffer. + Dim Result As Integer = Client.DBWrite(DBNumber, Start, 1, BoolBuffer) ' DbNumber, Start, Amount, Buffer + Return Result = 0 + End Function + + Friend Function ReadDInt(DBNumber As Integer, Start As Integer, ByRef Value As Integer) As Boolean + WaitingRefresh() + ' Read 2 bytes from the DBNumber starting from Start and puts them into ReadBuffer. + Dim Result As Integer = Client.DBRead(DBNumber, Start, 4, DIntBuffer) ' DbNumber, Start, Amount, Buffer + If Result = 0 Then + Value = S7.GetDIntAt(DIntBuffer, 0) + Return True + End If + Return False + End Function + + Friend Function WriteDInt(DBNumber As Integer, Start As Integer, Value As Integer) As Boolean + WaitingRefresh() + S7.SetDIntAt(DIntBuffer, 0, Value) + ' Read "Size" bytes from the DB "DBNumber" starting from 0 and puts them into Buffer. + Dim Result As Integer = Client.DBWrite(DBNumber, Start, 4, DIntBuffer) ' DbNumber, Start, Amount, Buffer + Return Result = 0 + End Function + + Friend Function ReadReal(DBNumber As Integer, Start As Integer, ByRef Value As Double) As Boolean + WaitingRefresh() + ' Read 4 bytes from the DBNumber starting from Start and puts them into ReadBuffer. + Dim Result As Integer = Client.DBRead(DBNumber, Start, 4, RealBuffer) ' DbNumber, Start, Amount, Buffer + If Result = 0 Then + Value = S7.GetRealAt(RealBuffer, 0) + Return True + End If + Return False + End Function + + Friend Function WriteReal(DBNumber As Integer, Start As Integer, Value As Single) As Boolean + WaitingRefresh() + S7.SetRealAt(RealBuffer, 0, Value) + ' Read "Size" bytes from the DB "DBNumber" starting from 0 and puts them into Buffer. + Dim Result As Integer = Client.DBWrite(DBNumber, Start, 4, RealBuffer) ' DbNumber, Start, Amount, Buffer + Return Result = 0 + End Function + + Friend Function ReadString(DBNumber As Integer, Start As Integer, Length As Integer, ByRef Value As String) As Boolean + WaitingRefresh() + ' Read 2 bytes from the DBNumber starting from Start and puts them into ReadBuffer. + Dim Result As Integer = Client.DBRead(DBNumber, Start, Length, StringBuffer) ' DbNumber, Start, Amount, Buffer + If Result = 0 Then + Value = S7.GetStringAt(StringBuffer, 0) + Return True + End If + Return False + End Function + + Friend Function WriteString(DBNumber As Integer, Start As Integer, Value As String) As Boolean + WaitingRefresh() + + If Value.Length > 65535 Then + Return False + End If + S7.SetStringAt(StringBuffer, 0, 65535, Value) + ' Read "Size" bytes from the DB "DBNumber" starting from 0 and puts them into Buffer. + Dim Result As Integer = Client.DBWrite(DBNumber, Start, Value.Length + 2, StringBuffer) ' DbNumber, Start, Amount, Buffer + Return Result = 0 + End Function + + Friend Sub ResetStep(bReset As Boolean) + WaitingRefresh() + Dim ResetStep As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList(19) ' Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = RESET_STEP) + If bReset Then + Map.refMachManaging.DebugMessage(1, "Imposto variabile ResetStep a 1") + ResetStep.sValue = 1 + Threading.Thread.Sleep(100) + Dim nResetStepOk As Integer = 0 + Dim ResetStepOk As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = RESET_STEP_OK) + While nResetStepOk <> 1 + Map.refMachManaging.DebugMessage(1, "Rileggo variabili") + RefreshAllVars() + Map.refMachManaging.DebugMessage(1, "Leggo valore ResetStepOk") + Integer.TryParse(ResetStepOk.sValue, nResetStepOk) + Threading.Thread.Sleep(1000) + End While + End If + ResetStep.sValue = 0 + Map.refMachManaging.DebugMessage(1, "Imposto variabile ResetStep a 0") + End Sub + + Friend Sub ReadPLCMessages() + WaitingRefresh() + + Dim nPlc_Msg As New List(Of Byte) + For Index As Integer = 1 To 6 + Dim nIndex As Integer = Index + Dim PLCMessagesVariable As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = PLC_MESSAGES & nIndex) + If IsNothing(PLCMessagesVariable) OrElse IsNothing(PLCMessagesVariable.sValue) Then Return + Dim nTemp As Int16 = 0 + Int16.TryParse(PLCMessagesVariable.sValue, nTemp) + nTemp = BinaryPrimitives.ReverseEndianness(nTemp) + Dim Bytes As Byte() = BitConverter.GetBytes(nTemp) + nPlc_Msg.AddRange(Bytes) + Next + Dim BitArray As New BitArray(nPlc_Msg.ToArray()) + Dim ErrorList As New List(Of Integer) + For BitIndex = 0 To BitArray.Count - 1 + If BitIndex <= 169 AndAlso BitArray(BitIndex) Then + ErrorList.Add(BitIndex) + End If + Next + ShowPLCError(ErrorList) + End Sub + + Friend Sub ShowPLCError(ErrorNumber As List(Of Integer)) + ' resetto stati bFound + For Each Message In m_ActiveMessages + Message.bFound = False + Next + + For index As Integer = 0 To ErrorNumber.Count - 1 + Dim nIndex As Integer = index + Dim NewMessageInList As SiemensReadMessages = m_ActiveMessages.FirstOrDefault(Function(x) x.nIndex = 0.ToString()) + ' se il messaggio e' gia' in lista + If Not IsNothing(NewMessageInList) Then + ' lo segno come trovato + NewMessageInList.bFound = True + Else + ' lo aggiungo + Dim NewMessage As SiemensReadMessages = New SiemensReadMessages(0.ToString()) + NewMessage.bFound = True + m_ActiveMessages.Add(NewMessage) + m_SiemensAlarmCallbackDlg(0, 0) + End If + Next + + ' cancello messaggi non trovati + For Index = m_ActiveMessages.Count - 1 To 0 Step -1 + Dim Message As SiemensReadMessages = m_ActiveMessages(Index) + If Not Message.bFound Then + m_SiemensAlarmCallbackDlg(Message.nIndex, 1) + m_ActiveMessages.RemoveAt(Index) + End If + Next + + End Sub + +End Class + +Friend Class DBBuffer + + Private m_DBAddress As Integer + Public ReadOnly Property DBAddress As Integer + Get + Return m_DBAddress + End Get + End Property + + Private m_DBValue(65536) As Byte + Public ReadOnly Property DBValue As Byte() + Get + Return m_DBValue + End Get + End Property + + Sub New(DBAddress As Integer, DBValue As Byte()) + m_DBAddress = DBAddress + m_DBValue = DBValue + End Sub + +End Class + +Public Class SiemensReadMessages + + Private m_nIndex As Integer + Public ReadOnly Property nIndex As Integer + Get + Return m_nIndex + End Get + End Property + Private m_sMessage As String + Public ReadOnly Property sMessage As String + Get + Return m_sMessage + End Get + End Property + Friend Sub SetMessage(sValue As String) + m_sMessage = sValue + End Sub + + Private m_bFound As Boolean = False + Friend Property bFound As Boolean + Get + Return m_bFound + End Get + Set(value As Boolean) + m_bFound = value + End Set + End Property + Public Sub New(nIndex As Integer) + m_nIndex = nIndex + m_sMessage = sMessage + End Sub + +End Class diff --git a/EgtBEAMWALL.Supervisor/Constants/ConstCommVar.vb b/EgtBEAMWALL.Supervisor/Constants/ConstCommVar.vb index 0b184020..da04958f 100644 --- a/EgtBEAMWALL.Supervisor/Constants/ConstCommVar.vb +++ b/EgtBEAMWALL.Supervisor/Constants/ConstCommVar.vb @@ -19,6 +19,7 @@ Module ConstCommVar NUM_FLEXIUM = 2 NUM_AXIUM_APSERVER = 3 NUM_AXIUM_PCTOOLKIT = 4 + SIEMENS_SHARP7 = 5 End Enum ' Assi @@ -54,6 +55,42 @@ Module ConstCommVar Public Const PLC_MESSAGES As String = "PLC_Messages" ' variabile per leggere e scrivere permesso invio cn a macchina Public Const SENDPERMISSION As String = "SendPermission" + ' variabile per confermare lettura dati di stato pezzo + Public Const DATAREADED As String = "Data_Readed" + ' variabile per confermare lettura stato reset + Public Const RESETREADED As String = "Reset_Readed" + ' variabile per confermare lettura stato reset + Public Const DATATOREAD As String = "Data_ToRead" + ' variabile per confermare lettura stato reset + Public Const RESET_STEP As String = "Reset_Step" + ' variabile per confermare lettura stato reset + Public Const RESET_STEP_OK As String = "Reset_Step_Ok" + ' variabile per stato CN + Public Const NC_STATUS As String = "NC_Status" + ' variabile per modo CN + Public Const NC_MODE As String = "NC_Mode" + ' variabile per apertura pinze manuale + Public Const OPEN_CLAMP As String = "Open_Clamp" + ' variabile per larghezza barra al carico + Public Const W_CARICO As String = "W_Carico" + ' variabile per lunghezza prossima barra + Public Const NEXTPART_L As String = "NextPartL" + ' variabile per larghezza prossima barra + Public Const NEXTPART_W As String = "NextPartW" + ' variabile per altezza prossima barra + Public Const NEXTPART_H As String = "NextPartH" + ' variabile per PressX1 prossima barra + Public Const NEXTPART_PRESSX1 As String = "NextPartPressX1" + ' variabile per Feed prossima barra + Public Const NEXTPART_FEED As String = "NextPartFeed" + ' variabile per Accelerazione prossima barra + Public Const NEXTPART_ACC As String = "NextPartAcc" + ' variabile per Ref1 prossima barra + Public Const NEXTPART_REF1 As String = "NextPartRef1" + ' variabile per Ref2 prossima barra + Public Const NEXTPART_REF2 As String = "NextPartRef2" + ' variabile per Ref2 prossima barra + Public Const STOP_WORKING As String = "Stop_Working" Public Enum OPStates Start = 1 @@ -72,4 +109,11 @@ Module ConstCommVar Home = 8 End Enum + ' Variabili Siemens + Public Const K_IP As String = "Ip" + Public Const K_RACK As String = "Rack" + Public Const K_SLOT As String = "Slot" + Public Const K_TIMERINTERVAL As String = "TimerInterval" + Public Const K_ISOFILEDIR As String = "IsoFileDir" + End Module diff --git a/EgtBEAMWALL.Supervisor/EgtBEAMWALL.Supervisor.vbproj b/EgtBEAMWALL.Supervisor/EgtBEAMWALL.Supervisor.vbproj index edf5bbdf..73955118 100644 --- a/EgtBEAMWALL.Supervisor/EgtBEAMWALL.Supervisor.vbproj +++ b/EgtBEAMWALL.Supervisor/EgtBEAMWALL.Supervisor.vbproj @@ -117,7 +117,8 @@ ..\ExtLibs\Interop.FXServer.dll True - + + False ..\ExtLibs\ISOCNC.Remoting.dll @@ -167,6 +168,9 @@ ..\packages\Zebra.Printer.SDK.2.15.2634\lib\net471\SdkApi.Desktop.Usb.dll + + ..\ExtLibs\Sharp7.net.dll + ..\packages\Lextm.SharpSnmpLib.10.0.9\lib\net452\SharpSnmpLib.dll @@ -280,6 +284,7 @@ + ConfigurationPageV.xaml diff --git a/EgtBEAMWALL.Supervisor/LeftPanel/LeftPanelVM.vb b/EgtBEAMWALL.Supervisor/LeftPanel/LeftPanelVM.vb index 6a87f28f..65fdd880 100644 --- a/EgtBEAMWALL.Supervisor/LeftPanel/LeftPanelVM.vb +++ b/EgtBEAMWALL.Supervisor/LeftPanel/LeftPanelVM.vb @@ -147,6 +147,17 @@ Public Class LeftPanelVM End Get End Property + Public Property m_Axis_Visibility As Visibility + Public ReadOnly Property Axis_Visibility As Visibility + Get + Return m_Axis_Visibility + End Get + End Property + Friend Sub SetAxisVisibility() + m_Axis_Visibility = If(CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7, Visibility.Collapsed, Visibility.Visible) + NotifyPropertyChanged(NameOf(Axis_Visibility)) + End Sub + Private m_bRestart As Boolean = False Public Property bRestart As Boolean Get @@ -268,7 +279,7 @@ Public Class LeftPanelVM Public ReadOnly Property OPMode_Visibility As Visibility Get - Return If(CurrentMachine.NCType = NCTypes.NUM_FLEXIUM Or CurrentMachine.NCType = NCTypes.NUM_AXIUM_APSERVER Or CurrentMachine.NCType = NCTypes.NUM_AXIUM_PCTOOLKIT, Visibility.Visible, Visibility.Collapsed) + Return If(CurrentMachine.NCType = NCTypes.NUM_FLEXIUM Or CurrentMachine.NCType = NCTypes.NUM_AXIUM_APSERVER Or CurrentMachine.NCType = NCTypes.NUM_AXIUM_PCTOOLKIT Or CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7, Visibility.Visible, Visibility.Collapsed) End Get End Property @@ -428,7 +439,7 @@ Public Class LeftPanelVM New OPState("Pending", OPStates.Pending), New OPState("Unspecified", OPStates.Unspecified) } - Case NCTypes.NUM_FLEXIUM, NCTypes.NUM_AXIUM_APSERVER, NCTypes.NUM_AXIUM_PCTOOLKIT + Case NCTypes.NUM_FLEXIUM, NCTypes.NUM_AXIUM_APSERVER, NCTypes.NUM_AXIUM_PCTOOLKIT, NCTypes.SIEMENS_SHARP7 m_OPStateList = New List(Of OPState) From {New OPState("Start", OPStates.Start), New OPState("Stop", OPStates.Stop), New OPState("Reset", OPStates.End), @@ -454,6 +465,13 @@ Public Class LeftPanelVM New OPState("Manual", OPModes.Manual), New OPState("Home", OPModes.Home) } + Case NCTypes.SIEMENS_SHARP7 + m_OPModeList = New List(Of OPState) From { + New OPState("Auto", OPModes.Auto), + New OPState("Mdi", OPModes.Mdi), + New OPState("Manual", OPModes.Manual), + New OPState("Reference Point", OPModes.Home) + } End Select End Sub diff --git a/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/MachCommandMessagePanelVM.vb b/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/MachCommandMessagePanelVM.vb index e74f1c58..1705a342 100644 --- a/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/MachCommandMessagePanelVM.vb +++ b/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/MachCommandMessagePanelVM.vb @@ -296,7 +296,7 @@ Public Class MachCommandMessagePanelVM m_MachManagingThread = New Thread(Sub() MachineCommThread.MachManagingThreadFunction(AddressOf ResultCallbackDlg, AddressOf CloseCallbackDlg, AddressOf UpdateCallbackDlg, AddressOf TPAAlarmCallbackDlg, AddressOf NUMAlarmCallbackDlg, - AddressOf AxisCoordinatesCallbackDlg, AddressOf OpStateCallbackDlg, + AddressOf SiemensAlarmCallbackDlg, AddressOf AxisCoordinatesCallbackDlg, AddressOf OpStateCallbackDlg, AddressOf OpModeCallbackDlg, AddressOf ChannelCallbackDlg, AddressOf ReadVarCallbackDlg) End Sub) ' avvio thread di gestione della macchina che avvia la connessione @@ -680,6 +680,42 @@ Public Class MachCommandMessagePanelVM DbControllers.m_LogMachineController.Create(LogEvent.CreateAlarmLog(DateTime.Now(), AlarmOperation & LogEvent.cSeparator & ErrorTyp & LogEvent.cSeparator & AlarmMessage & LogEvent.cSeparator & AlarmCode & LogEvent.cSeparator, DbControllers.m_SupervisorId)) End Sub + Friend Sub SiemensAlarmCallbackDlg(nIndex As Integer, AlarmOperation As Integer) + + ' se aggiungo allarme e non ce ne erano + If AlarmOperation = CInt(ISOCNC.Remoting.AlarmOperation.Addition) AndAlso m_ErrCycle.Count = 0 AndAlso m_Iso.Count = 0 AndAlso m_Message.Count = 0 AndAlso m_ErrSystem.Count = 0 Then + ' avvio il timer degli allarmi + m_AlarmTimer.Start() + End If + Dim AlarmMessage As String = nIndex + + ' costruisco messaggio errore in base al tipo + Dim sErrorMessage As String = AlarmMessage + If bMsgTranslationActive Then + Dim sTranslatedMsg = MachMsg(MsgParagraphs.PLC, nIndex) + If Not String.IsNullOrWhiteSpace(sTranslatedMsg) Then + sErrorMessage = sTranslatedMsg + End If + End If + AlarmMessage = If(Not String.IsNullOrWhiteSpace(sErrorMessage), sErrorMessage, "") + + If AlarmOperation = CInt(ISOCNC.Remoting.AlarmOperation.Addition) Then + m_ErrCycle.Add(Alarm.CreateAlarm(nIndex, AlarmMessage)) + Else + m_ErrCycle.RemoveAll(Function(x) x.sCode = nIndex) + End If + + ' forzo aggiornamento allarmi + AlarmTimer_Tick() + ' se non ci sono errori + If m_ErrCycle.Count = 0 AndAlso m_Iso.Count = 0 AndAlso m_Message.Count = 0 AndAlso m_ErrSystem.Count = 0 Then + ' fermo timer degli allarmi + m_AlarmTimer.Stop() + End If + 'DbControllers.m_LogMachineController.Create(MachLog.CreateAlarmLog(AlarmOperation, ErrorTyp, AlarmMessage, AlarmCode, DateTime.Now)) + DbControllers.m_LogMachineController.Create(LogEvent.CreateAlarmLog(DateTime.Now(), AlarmOperation & LogEvent.cSeparator & nIndex & LogEvent.cSeparator & sErrorMessage, DbControllers.m_SupervisorId)) + End Sub + Friend Sub AxisCoordinatesCallbackDlg(AxisValue As Double, AxisIndex As Integer) Map.refAxesPanelVM.AxisCoordinatesCallbackDlg(AxisValue, AxisIndex) End Sub @@ -697,7 +733,7 @@ Public Class MachCommandMessagePanelVM Next End If End If - Case NCTypes.NUM_FLEXIUM, NCTypes.NUM_AXIUM_APSERVER, NCTypes.NUM_AXIUM_PCTOOLKIT + Case NCTypes.NUM_FLEXIUM, NCTypes.NUM_AXIUM_APSERVER, NCTypes.NUM_AXIUM_PCTOOLKIT, NCTypes.SIEMENS_SHARP7 Map.refLeftPanelVM.SetOPState(NewState) End Select DbControllers.m_LogMachineController.Create(LogEvent.CreateMachineStateLog(newOpState, DbControllers.m_SupervisorId)) @@ -710,7 +746,7 @@ Public Class MachCommandMessagePanelVM Return End If Select Case CurrentMachine.NCType - Case NCTypes.NUM_FLEXIUM, NCTypes.NUM_AXIUM_APSERVER, NCTypes.NUM_AXIUM_PCTOOLKIT + Case NCTypes.NUM_FLEXIUM, NCTypes.NUM_AXIUM_APSERVER, NCTypes.NUM_AXIUM_PCTOOLKIT, NCTypes.SIEMENS_SHARP7 Map.refLeftPanelVM.SetOPMode(NewState) End Select DbControllers.m_LogMachineController.Create(LogEvent.CreateMachineModeLog(newOpState, DbControllers.m_SupervisorId)) diff --git a/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/MachCommandPanelVM.vb b/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/MachCommandPanelVM.vb new file mode 100644 index 00000000..574351f3 --- /dev/null +++ b/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/MachCommandPanelVM.vb @@ -0,0 +1,58 @@ +Imports System.Collections.ObjectModel +Imports ISOCNC.Remoting + +Public Class MachCommandPanelVM + + Private m_AxisList As ObservableCollection(Of Axis) + + Public ReadOnly Property AxisList As ObservableCollection(Of Axis) + Get + Return m_AxisList + End Get + End Property + + Private m_OPState As MachineOperatingState + + 'Public ReadOnly Property OPState As MachineOperatingState + ' Get + ' Return m_OPState + ' End Get + 'End Property + + 'Public ReadOnly Property sOPState As String + ' Get + ' Select Case m_OPState + ' Case MachineOperatingState.Start + ' Return "START" + ' Case MachineOperatingState.Stop + ' Return "STOP" + ' Case MachineOperatingState.End + ' Return "RESET" + ' Case MachineOperatingState.SetPoint + ' Return "SETPOINT" + ' Case MachineOperatingState.Pending + ' Return "PENDING" + ' Case Else + ' Return "UNSPECIFIED" + ' End Select + ' End Get + 'End Property + + Public Sub New() + Map.SetRefMachCommandMessagePanelVM(Me) + '' impostazioni timer degli allarmi + 'm_AlarmTimer.Interval = TimeSpan.FromMilliseconds(1500) + 'AddHandler m_AlarmTimer.Tick, AddressOf AlarmTimer_Tick + '' impostazione assi (leggerli da conf macchina) + 'm_AxisList = New ObservableCollection(Of Axis)({New Axis(ASSE_X), + ' New Axis(ASSE_Y), + ' New Axis(ASSE_Z), + ' New Axis(ASSE_C), + ' New Axis(ASSE_B)}) + '' connetto stampante etichette + 'LabelPrinter.ConnectPrinter() + + 'NotifyPropertyChanged(NameOf(Connect_Background)) + End Sub + +End Class diff --git a/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/Support classes.vb b/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/Support classes.vb new file mode 100644 index 00000000..6ef66dd0 --- /dev/null +++ b/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/Support classes.vb @@ -0,0 +1,55 @@ +Public Class Axis + Inherits VMBase + + Private m_Name As String + Public ReadOnly Property sName As String + Get + Return m_Name + End Get + End Property + + Private m_Value As Double + Public ReadOnly Property sValue As Double + Get + Return m_Value + End Get + End Property + + Friend Sub SetValue(value As Double) + m_Value = value + NotifyPropertyChanged(NameOf(sValue)) + End Sub + + Public Sub New(Name As String) + m_Name = Name + End Sub + +End Class + +Class Alarm + + Private m_sCode As String + Public ReadOnly Property sCode As String + Get + Return m_sCode + End Get + End Property + + Private m_sMessage As String + Public ReadOnly Property sMessage As String + Get + Return m_sMessage + End Get + End Property + + Protected Sub New() + End Sub + + Public Shared Function CreateAlarm(Code As String, Message As String) As Alarm + Dim NewAlarm As New Alarm + NewAlarm.m_sCode = Code + NewAlarm.m_sMessage = Message + Return NewAlarm + End Function + +End Class \ No newline at end of file diff --git a/EgtBEAMWALL.Supervisor/MachGroupPanel/MyMachGroupVM.vb b/EgtBEAMWALL.Supervisor/MachGroupPanel/MyMachGroupVM.vb index 1582e63f..683905bb 100644 --- a/EgtBEAMWALL.Supervisor/MachGroupPanel/MyMachGroupVM.vb +++ b/EgtBEAMWALL.Supervisor/MachGroupPanel/MyMachGroupVM.vb @@ -20,13 +20,14 @@ Public Class MyMachGroupVM ElseIf m_bToBeProduced OrElse m_bSentToMachine Then Return False ' se la macchina e' ferma - ElseIf IsNothing(Map.refLeftPanelVM.SelOPState) OrElse - (Map.refLeftPanelVM.SelOPState.Id = 0 OrElse - Map.refLeftPanelVM.SelOPState.Id = OPStates.End OrElse - Map.refLeftPanelVM.SelOPState.Id = OPStates.Stop OrElse - Map.refLeftPanelVM.SelOPState.Id = OPStates.Unspecified) Then + ElseIf CurrentMachine.NCType <> NCTypes.SIEMENS_SHARP7 AndAlso + (IsNothing(Map.refLeftPanelVM.SelOPState) OrElse + (Map.refLeftPanelVM.SelOPState.Id = 0 OrElse + Map.refLeftPanelVM.SelOPState.Id = OPStates.End OrElse + Map.refLeftPanelVM.SelOPState.Id = OPStates.Stop OrElse + Map.refLeftPanelVM.SelOPState.Id = OPStates.Unspecified)) Then ' verifico se c'e' un pezzo non finito - Dim ToBeRestartedPart As MyMachGroupVM = Map.refSupervisorMachGroupPanelVM.MachGroupVMList.FirstOrDefault(Function(x As MyMachGroupVM) x.nProduction_State = Global.EgtBEAMWALL.Core.ItemState.WIP And Not m_bToBeProduced) + Dim ToBeRestartedPart As MyMachGroupVM = Map.refSupervisorMachGroupPanelVM.MachGroupVMList.FirstOrDefault(Function(x As MyMachGroupVM) x.nProduction_State = Global.EgtBEAMWALL.Core.ItemState.WIP And Not x.m_bToBeProduced) ' se c'e', attivo solo il pezzo non finito Return Not (Not IsNothing(ToBeRestartedPart) AndAlso Not ToBeRestartedPart Is Me) Else @@ -46,11 +47,12 @@ Public Class MyMachGroupVM Case ItemState.WIP If Not m_bToBeProduced AndAlso Not m_bSentToMachine Then Return True - ElseIf IsNothing(Map.refLeftPanelVM.SelOPState) OrElse - (Map.refLeftPanelVM.SelOPState.Id = 0 OrElse - Map.refLeftPanelVM.SelOPState.Id = OPStates.End OrElse - Map.refLeftPanelVM.SelOPState.Id = OPStates.Stop OrElse - Map.refLeftPanelVM.SelOPState.Id = OPStates.Unspecified) Then + ElseIf CurrentMachine.NCType <> NCTypes.SIEMENS_SHARP7 AndAlso + (IsNothing(Map.refLeftPanelVM.SelOPState) OrElse + (Map.refLeftPanelVM.SelOPState.Id = 0 OrElse + Map.refLeftPanelVM.SelOPState.Id = OPStates.End OrElse + Map.refLeftPanelVM.SelOPState.Id = OPStates.Stop OrElse + Map.refLeftPanelVM.SelOPState.Id = OPStates.Unspecified)) Then Return True Else Return False @@ -221,24 +223,43 @@ Public Class MyMachGroupVM End If ' se progetto travi e lavorazione interrotta da reset If Map.refSupervisorManagerVM.CurrProd.nType = BWType.BEAM AndAlso (bResetWhileCutting OrElse dtStartTime <> DateTime.MinValue) And Not Map.refLeftPanelVM.bRestart Then - ' chiedo se riprendere o rifare la barra da zero - Select Case EgtBEAMWALL.Core.EgtMessageBoxV.Show(Application.Current.MainWindow, EgtMsg(62509), "", MessageBoxButton.YesNo, MessageBoxImage.Information) + Dim bRedo As MessageBoxResult = MessageBoxResult.No + If CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 AndAlso Not IsNothing(Map.refMachManaging) Then + ' leggo pinze aperte + Dim Open_ClampVariable As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = OPEN_CLAMP) + Map.refMachManaging.Siemens_Sharp7.RefreshAllVars() + Map.refMachManaging.DebugMessage(1, "Leggo variabile pinze aperte " & Open_ClampVariable.sValue) + If Open_ClampVariable.sValue = 1 Then + Map.refMachManaging.DebugMessage(1, "Pinze aperte, ripartenza impossibile") + bRedo = MessageBoxResult.No + MessageBox.Show("Pinze aperte, ripartenza impossibile!!", "Warning", MessageBoxButton.OK, MessageBoxImage.Warning) + Else + ' chiedo se riprendere o rifare la barra da zero + bRedo = EgtBEAMWALL.Core.EgtMessageBoxV.Show(Application.Current.MainWindow, EgtMsg(62509), "", MessageBoxButton.YesNo, MessageBoxImage.Information) + End If + Else + ' chiedo se riprendere o rifare la barra da zero + bRedo = EgtBEAMWALL.Core.EgtMessageBoxV.Show(Application.Current.MainWindow, EgtMsg(62509), "", MessageBoxButton.YesNo, MessageBoxImage.Information) + End If + Select Case bRedo Case MessageBoxResult.Yes - ' segno da rifare pezzi non completamente lavorati - For Each Part As PartVM In PartVMList - If Part.dtEndTime <> DateTime.MinValue Then - Part.bDO = False - Else - Part.SetDo(True) - End If - Next - ' se ripresa, mostro lista feature e colonne Redo - Map.refLeftPanelVM.bRestart = True - ' blocco produzione di tutti gli altri - MyMachGroupVM.UpdateProduceIsEnabledForAll() - ' riabilito bottoni di comunicazione a fine invio programma - Map.refMachCommandMessagePanelVM.SetCommBtnIsEnabled(True) - Return + If CurrentMachine.NCType <> NCTypes.SIEMENS_SHARP7 Then + ' segno da rifare pezzi non completamente lavorati + For Each Part As PartVM In PartVMList + If Part.dtEndTime <> DateTime.MinValue Then + Part.bDO = False + Else + Part.SetDo(True) + End If + Next + ' se ripresa, mostro lista feature e colonne Redo + Map.refLeftPanelVM.bRestart = True + ' blocco produzione di tutti gli altri + MyMachGroupVM.UpdateProduceIsEnabledForAll() + ' riabilito bottoni di comunicazione a fine invio programma + Map.refMachCommandMessagePanelVM.SetCommBtnIsEnabled(True) + Return + End If Case MessageBoxResult.No ' annullo stati dei pezzi gia' fatti For Each Part In PartVMList @@ -273,8 +294,9 @@ Public Class MyMachGroupVM ElseIf Map.refSupervisorManagerVM.CurrProd.nType = BWType.WALL AndAlso (bResetWhileCutting OrElse dtStartTime <> DateTime.MinValue) Then If False Then ' chiedo se riprendere o rifare il pannello da zero + Dim bRedo As MessageBoxResult = EgtBEAMWALL.Core.EgtMessageBoxV.Show(Application.Current.MainWindow, EgtMsg(62547), "", MessageBoxButton.YesNo, MessageBoxImage.Information) Dim MachIndexVariable As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = MACHINDEX) - Select Case EgtBEAMWALL.Core.EgtMessageBoxV.Show(Application.Current.MainWindow, EgtMsg(62547), "", MessageBoxButton.YesNo, MessageBoxImage.Information) + Select Case bRedo ' se ripresa Case MessageBoxResult.Yes ' ripristino indice di lavorazione precedente a reset diff --git a/EgtBEAMWALL.Supervisor/MachManagingThread/MachCommConst.vb b/EgtBEAMWALL.Supervisor/MachManagingThread/MachCommConst.vb index 8d3c145b..8394adca 100644 --- a/EgtBEAMWALL.Supervisor/MachManagingThread/MachCommConst.vb +++ b/EgtBEAMWALL.Supervisor/MachManagingThread/MachCommConst.vb @@ -21,6 +21,7 @@ Module MachCommConst Public Delegate Sub UpdateCallbackDlg(Param As String, Params As String) Public Delegate Sub TPAAlarmCallbackDlg(ByVal AlarmOperation As Integer, ByVal AlarmType As Integer, ByVal AlarmMessage As String, ByVal AlarmCode As String, ByVal AlarmDateTime As String) Public Delegate Sub NUMAlarmCallbackDlg(ByVal CncNumber As Integer, ByVal numberOfError As Integer, ByVal ErrorTyp As String, ByVal ErrorIndex As String, ByVal ErrorNumber As String, ByVal ErrorLine As String, ByVal ErrorMessage As String, ByVal ErrorAdditional As String) + Public Delegate Sub SiemensAlarmCallbackDlg(nIndex As Integer, AlarmOperation As Integer) Public Delegate Sub AxisCoordinatesCallbackDlg(ByVal AxisValue As Double, ByVal AxisIndex As Integer) Public Delegate Sub OpStateCallbackDlg(ByVal newOpState As Integer) Public Delegate Sub OpModeCallbackDlg(ByVal newOpState As Integer) @@ -32,6 +33,7 @@ Module MachCommConst Friend m_UpdateCallbackDlg As UpdateCallbackDlg Friend m_TPAAlarmCallbackDlg As TPAAlarmCallbackDlg Friend m_NUMAlarmCallbackDlg As NUMAlarmCallbackDlg + Friend m_SiemensAlarmCallbackDlg As SiemensAlarmCallbackDlg Friend m_AxisCoordinatesCallbackDlg As AxisCoordinatesCallbackDlg Friend m_OpStateCallbackDlg As OpStateCallbackDlg Friend m_OpModeCallbackDlg As OpModeCallbackDlg diff --git a/EgtBEAMWALL.Supervisor/MachManagingThread/MachManaging.vb b/EgtBEAMWALL.Supervisor/MachManagingThread/MachManaging.vb index db69e9a3..7c3d0bbe 100644 --- a/EgtBEAMWALL.Supervisor/MachManagingThread/MachManaging.vb +++ b/EgtBEAMWALL.Supervisor/MachManagingThread/MachManaging.vb @@ -49,6 +49,11 @@ Public Class MachManaging Return m_CN End Get End Property + Public ReadOnly Property Siemens_Sharp7 As SIEMENSSharp7Comm + Get + Return m_CN + End Get + End Property Private Shared WithEvents m_CommandList As New ObservableCollection(Of ThreadCommand) Public Shared ReadOnly Property CommandList As ObservableCollection(Of ThreadCommand) @@ -92,7 +97,20 @@ Public Class MachManaging End Get End Property + ' variabile che indica prima barra dopo start (Siemens) + Private m_bFirstRaw As Boolean = True + + ' variabile che indica se emettere ii messaggi di debug + Private m_Debug As Integer = 0 + Public ReadOnly Property Debug As Integer + Get + Return m_Debug + End Get + End Property + Sub New() + ' leggo variabile debug da ini + m_Debug = GetPrivateProfileInt(S_GENERAL, K_DEBUG, 0, CurrentMachine.sMachIniFile) ' imposto in Map Map.SetRefMachManaging(Me) AddHandler m_CommandList.CollectionChanged, AddressOf CommandList_CollectionChanged @@ -106,7 +124,7 @@ Public Class MachManaging Friend Sub Timer_Tick() Select Case CurrentMachine.NCType - Case NCTypes.NUM_FLEXIUM, NCTypes.TPA, NCTypes.NUM_AXIUM_APSERVER, NCTypes.NUM_AXIUM_PCTOOLKIT + Case NCTypes.NUM_FLEXIUM, NCTypes.TPA, NCTypes.NUM_AXIUM_APSERVER, NCTypes.NUM_AXIUM_PCTOOLKIT, NCTypes.SIEMENS_SHARP7 ' eseguo ciclo principale Dim nReset_State As Integer Dim nStart_State As Boolean @@ -119,6 +137,9 @@ Public Class MachManaging Dim nISO_Sent As Integer Dim nRunning As Integer Dim nCurrMachIndex As Integer + Dim nDataWrite As Integer + Dim nNCStatus As Integer + Dim nNCMode As Integer Dim ResetVariable As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = RESET_STATE) Dim StartVariable As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = START_STATE) Dim StopVariable As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = STOP_STATE) @@ -130,6 +151,11 @@ Public Class MachManaging Dim ISOSentVariable As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = ISO_SENT) Dim RunningVariable As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = RUNNING) Dim MachIndexVariable As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = MACHINDEX) + Dim DataReadedVariable As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = DATAREADED) + Dim ResetReadedVariable As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = RESETREADED) + Dim DataToReadVariable As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = DATATOREAD) + Dim NCStatusVariable As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NC_STATUS) + Dim NCModeVariable As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NC_MODE) Select Case CurrentMachine.NCType Case NCTypes.TPA ' leggo tutte le variabili @@ -302,7 +328,74 @@ Public Class MachManaging ReadPLCMessages() Num_Axium_PCToolkit.ReadCncMode() Num_Axium_PCToolkit.ReadPosition() + + Case NCTypes.SIEMENS_SHARP7 + ' leggo tutte le variabili + Map.refMachManaging.DebugMessage(1, "Leggo tutte le variabili") + Siemens_Sharp7.RefreshAllVars() + If Not IsNothing(ResetVariable.sValue) Then + Integer.TryParse(ResetVariable.sValue, nReset_State) + Else + nReset_State = 1 + End If + If Not IsNothing(ProdVariable.sValue) Then + Integer.TryParse(ProdVariable.sValue, nP_Prod) + Else + nP_Prod = -1 + End If + If Not IsNothing(MachGroupVariable.sValue) Then + Integer.TryParse(MachGroupVariable.sValue, nP_Machgroup) + Else + nP_Machgroup = -1 + End If + If Not IsNothing(PartVariable.sValue) Then + Integer.TryParse(PartVariable.sValue, nP_Part) + Else + nP_Part = -1 + End If + If Not IsNothing(StateVariable.sValue) Then + Integer.TryParse(StateVariable.sValue, nP_State) + Else + nP_State = -1 + End If + If Not IsNothing(ISONumVariable.sValue) Then + Integer.TryParse(ISONumVariable.sValue, nISO_Num) + Else + nISO_Num = -1 + End If + If Not IsNothing(RunningVariable.sValue) Then + Integer.TryParse(RunningVariable.sValue, nRunning) + Else + nRunning = -1 + End If + If Not IsNothing(DataReadedVariable.sValue) Then + Integer.TryParse(DataReadedVariable.sValue, nDataWrite) + Else + nDataWrite = -1 + End If + If Not IsNothing(NCStatusVariable.sValue) Then + Integer.TryParse(NCStatusVariable.sValue, nNCStatus) + Else + nNCStatus = -1 + End If + If Not IsNothing(NCModeVariable.sValue) Then + Integer.TryParse(NCModeVariable.sValue, nNCMode) + Else + nNCMode = -1 + End If + ' leggo messaggi plc + Siemens_Sharp7.ReadPLCMessages() End Select + ' se SiemensSharp7 e reset a 0, verifico che conferma lettura reset sia a zero + If CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 And ResetReadedVariable.sValue = "1" And ResetVariable.sValue = "0" Then + Map.refMachManaging.DebugMessage(1, "Azzero lettura reset") + ResetReadedVariable.sValue = "0" + End If + ' se SiemensSharp7 e dati letti a 1 e dati scritti a 0, verifico che dati letti sia a zero + If CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 And DataReadedVariable.sValue = "1" And DataToReadVariable.sValue = "0" Then + Map.refMachManaging.DebugMessage(1, "Azzero lettura dati") + DataReadedVariable.sValue = "0" + End If ' se NUM aggiorno stato della macchina If CurrentMachine.NCType = NCTypes.NUM_FLEXIUM Then Dim OpState As OPStates @@ -330,10 +423,45 @@ Public Class MachManaging If IsNothing(Map.refLeftPanelVM.SelOPState) OrElse OpState <> Map.refLeftPanelVM.SelOPState.Id Then m_OpStateCallbackDlg(OpState) End If + ElseIf CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 Then + Dim OpState As OPStates + If nNCStatus > 0 Then + Select Case nNCStatus + Case 1 + OpState = OPStates.End + Case 2 + OpState = OPStates.Stop + Case 3 + OpState = OPStates.Start + Case Else + OpState = OPStates.Unspecified + End Select + End If + If IsNothing(Map.refLeftPanelVM.SelOPState) OrElse OpState <> Map.refLeftPanelVM.SelOPState.Id Then + Map.refMachManaging.DebugMessage(1, "Imposto stato CN: " & OpState) + m_OpStateCallbackDlg(OpState) + End If + Dim OpMode As OPModes + If nNCMode > 0 Then + Select Case nNCMode + Case 1 + OpMode = OPModes.Manual + Case 2 + OpMode = OPModes.Auto + Case 3 + OpMode = OPModes.Mdi + Case 4 ' Reference Point + OpMode = OPModes.Home + End Select + End If + If IsNothing(Map.refLeftPanelVM.SelOPMode) OrElse OpMode <> Map.refLeftPanelVM.SelOPMode.Id Then + Map.refMachManaging.DebugMessage(1, "Imposto modo CN: " & OpMode) + m_OpModeCallbackDlg(OpMode) + End If End If ' se TPA e non ancora fatto, preparo variabili barra successiva If CurrentMachine.NCType = NCTypes.TPA AndAlso CurrentMachine.Flow = FlowTypes.CONTINUOUS AndAlso m_NextBarId = 0 Then - SetNextBarVars() + SetNextBarVars(nRunning) ' se macchina NUM, non sto gia' spedendo e variabile spedizione me lo permette ElseIf (CurrentMachine.NCType = NCTypes.NUM_FLEXIUM AndAlso Not Num_Flexium.bIsTransferActive AndAlso @@ -343,30 +471,54 @@ Public Class MachManaging nISO_Sent = 1) OrElse (CurrentMachine.NCType = NCTypes.NUM_AXIUM_PCTOOLKIT AndAlso Not Num_Axium_PCToolkit.bIsTransferActive AndAlso - nISO_Sent = 1) Then + nISO_Sent = 1) OrElse + (CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 AndAlso + (nISO_Num = 0 OrElse + nISO_Num = nRunning)) Then ' verifico se c'e' un programma da lanciare + Map.refMachManaging.DebugMessage(1, "Entro in SendNextProgram") SendNextProgram() + ElseIf CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 AndAlso m_NextBarId = 0 Then + SetNextBarVars(nRunning) End If ' verifico se scattato stato reset If nReset_State <> 0 Then + Map.refMachManaging.DebugMessage(1, "Scattato Reset") ' resetto tutti i programmi If Not IsNothing(Map.refProjectVM.SupervisorMachGroupPanelVM) Then Map.refProjectVM.SupervisorMachGroupPanelVM.ResetAllMachGroups() + If CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 Then + 'resetto programma corrente + Map.refMachManaging.DebugMessage(1, "Resetto programma corrente") + ISONumVariable.sValue = "0" + m_bFirstRaw = True + Else ' resetto variabili P ProdVariable.sValue = "0" MachGroupVariable.sValue = "0" PartVariable.sValue = "0" StateVariable.sValue = "0" + If CurrentMachine.NCType = NCTypes.TPA Then + RemoveAllProgram() ' rimuovo programma default per pending + End If + End If + ' cancello tutti i programmi da memoria CN If CurrentMachine.NCType = NCTypes.TPA Then RemoveAllProgram() ' rimuovo programma default per pending End If ' azzero variabile reset + If CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 Then + Map.refMachManaging.DebugMessage(1, "Confermo lettura reset") + ResetReadedVariable.sValue = "1" + Else ResetVariable.sValue = "0" + End If ' resetto prossima barra e variabili V If CurrentMachine.NCType = NCTypes.TPA AndAlso CurrentMachine.Flow = FlowTypes.CONTINUOUS Then m_NextBarId = 0 - For Index As Integer = 1 To 6 - Tpa.RWVariableManager.WriteVarByName(VPAR & Index.ToString(), 0) - Next + 'For Index As Integer = 1 To 6 + ' Tpa.RWVariableManager.WriteVarByName(VPAR & Index.ToString(), 0) + 'Next + ResetNextBarVars() End If Return ' se macchina TPA, e' in pending e non sta tagliando alcun pezzo @@ -382,10 +534,17 @@ Public Class MachManaging ' 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 + ElseIf (CurrentMachine.NCType <> NCTypes.SIEMENS_SHARP7 AndAlso + nP_Prod <> 0 AndAlso + nP_Machgroup <> 0 AndAlso + nP_Part <> 0) OrElse + (CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 AndAlso + DataToReadVariable.sValue = "1" AndAlso + nP_Prod <> 0 AndAlso + nP_Machgroup <> 0 AndAlso + nP_Part <> 0) Then If nP_State = PartState.START Then + Map.refMachManaging.DebugMessage(1, "Leggo dati start") Dim dtStart As DateTime = DateTime.Now() ' recupero gruppo di lavorazione del pezzo Dim MachGroup As MyMachGroupVM = Map.refProjectVM.SupervisorMachGroupPanelVM.MachGroupVMList.FirstOrDefault(Function(x) x.Id = nP_Machgroup) @@ -427,6 +586,9 @@ Public Class MachManaging Tpa.RWVariableManager.WriteVarByName(P_STATE, 0) Case NCTypes.NUM_FLEXIUM, NCTypes.NUM_AXIUM_APSERVER, NCTypes.NUM_AXIUM_PCTOOLKIT StateVariable.sValue = "0" + Case NCTypes.SIEMENS_SHARP7 + Map.refMachManaging.DebugMessage(1, "Confermo lettura dati start") + DataReadedVariable.sValue = "1" End Select ' 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.nProduction_State = 1) Then @@ -444,9 +606,11 @@ Public Class MachManaging End If ' flag di aggiornamento log macchina Map.refMachineLogPageVM.UpdateMachineLogList(False) + DebugMessage(1, "Fine lettura dati start") ' attesa per essere sicuro che abbia scritto e riletto variabili Threading.Thread.Sleep(300) ElseIf nP_State = PartState.END_ Then + DebugMessage(1, "Leggo dati end") Dim dtEnd As DateTime = DateTime.Now() ' recupero gruppo di lavorazione del pezzo Dim MachGroup As MyMachGroupVM = Map.refProjectVM.SupervisorMachGroupPanelVM.MachGroupVMList.FirstOrDefault(Function(x) x.Id = nP_Machgroup) @@ -506,10 +670,16 @@ Public Class MachManaging ' scrivo evento fine MachGroup su DB DbControllers.m_LogMachineController.Create(LogEvent.CreateMachGroupStateLog(dtEnd, nP_Prod, nP_Machgroup, nP_State, DbControllers.SupervisorId)) ' azzero tutte le variabilli per iniziare barra successiva - ProdVariable.sValue = "0" - MachGroupVariable.sValue = "0" - PartVariable.sValue = "0" - StateVariable.sValue = "0" + ' azzero variabile per far ripartire macchina + If CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 Then + DebugMessage(1, "Confermo lettura dati end") + DataReadedVariable.sValue = "1" + Else + ProdVariable.sValue = "0" + MachGroupVariable.sValue = "0" + PartVariable.sValue = "0" + StateVariable.sValue = "0" + End If ' se non impostata data start If MachGroup.dtStartTime = DateTime.MinValue Then @@ -536,7 +706,11 @@ Public Class MachManaging End If Else ' azzero variabile per far ripartire macchina - StateVariable.sValue = "0" + If CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 Then + DataReadedVariable.sValue = "1" + Else + StateVariable.sValue = "0" + End If End If ' se pezzo = -1 stampo etichette di tutti i pezzi del MachGroup If nP_Part = -1 Then @@ -554,22 +728,26 @@ Public Class MachManaging End If ' flag di aggiornamento log macchina Map.refMachineLogPageVM.UpdateMachineLogList(False) + DebugMessage(1, "Fine lettura dati end") ' attesa per essere sicuro che abbia scritto e riletto variabili Threading.Thread.Sleep(300) End If End If End Select - + ' funzione che riavvia comunicazione Siemens se necessario + If CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 Then + Siemens_Sharp7.RefreshConnection() + End If End Sub Private m_Lock_SendProgram As New Object - Private Function SetNextBarVars() As Boolean + Private Function SetNextBarVars(nRunning As Integer) 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 Then + If If(CurrentMachine.NCType = NCTypes.TPA, Not MyMachGroup.bSentToMachine, MyMachGroup.bSentToMachine AndAlso nRunning <> 0 AndAlso MyMachGroup.nName <> nRunning) AndAlso MyMachGroup.dtStartTime = DateTime.MinValue Then If MyMachGroup.bReadyForMachining Then ' leggo valori parametri V da file Dim dVPars(10) As Double @@ -581,41 +759,109 @@ Public Class MachManaging StringToDoubleAdv(VPar(1), dVPars(VParIndex - 1)) Next ' li scrivo nel CN - For Index As Integer = 1 To 10 - Dim sValue As String = "" - sValue = DoubleToString(dVPars(Index - 1), 2) - Tpa.RWVariableManager.WriteVarByName(VPAR & Index.ToString(), sValue) - Next + Select Case CurrentMachine.NCType + Case NCTypes.TPA + For Index As Integer = 1 To 10 + Dim sValue As String = "" + sValue = DoubleToString(dVPars(Index - 1), 2) + Tpa.RWVariableManager.WriteVarByName(VPAR & Index.ToString(), sValue) + Next + Case NCTypes.SIEMENS_SHARP7 + ' imposto larghezza barra + Dim NextPartL As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NEXTPART_L) + NextPartL.sValue = DoubleToString(Math.Ceiling(dVPars(0)), 2) + Dim NextPartW As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NEXTPART_W) + NextPartW.sValue = DoubleToString(dVPars(1), 2) + Dim NextPartH As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NEXTPART_H) + NextPartH.sValue = DoubleToString(dVPars(2), 2) + Dim NextPartPressX1 As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NEXTPART_PRESSX1) + NextPartPressX1.sValue = DoubleToString(dVPars(3), 2) + Dim NextPartFeed As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NEXTPART_FEED) + NextPartFeed.sValue = DoubleToString(dVPars(4), 2) + Dim NextPartAcc As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NEXTPART_ACC) + NextPartAcc.sValue = DoubleToString(dVPars(5), 2) + Dim NextPartRef1 As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NEXTPART_REF1) + NextPartRef1.sValue = DoubleToString(dVPars(6), 2) + Dim NextPartRef2 As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NEXTPART_REF2) + NextPartRef2.sValue = DoubleToString(dVPars(7), 2) + 'DebugMessage(1, "Imposto larghezza: " & MyMachGroup.dW) + End Select m_NextBarId = MyMachGroup.Id Return True Else + If CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 Then + ' metto tutti i valori a 0 + ResetNextBarVars() + End If Return False End If End If Next + ' se ho passato tutte le barre della lista, resetto valori carico barra successiva + If CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 Then + ' metto tutti i valori a 0 + ResetNextBarVars() + End If End If Return False End Function + Private Function ResetNextBarVars() As Boolean + ' li scrivo nel CN + Select Case CurrentMachine.NCType + Case NCTypes.TPA + For Index As Integer = 1 To 10 + Dim sValue As String = "" + sValue = DoubleToString(0, 2) + Tpa.RWVariableManager.WriteVarByName(VPAR & Index.ToString(), sValue) + Next + Case NCTypes.SIEMENS_SHARP7 + ' imposto larghezza barra + Dim NextPartL As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NEXTPART_L) + NextPartL.sValue = DoubleToString(0, 2) + Dim NextPartW As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NEXTPART_W) + NextPartW.sValue = DoubleToString(0, 2) + Dim NextPartH As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NEXTPART_H) + NextPartH.sValue = DoubleToString(0, 2) + Dim NextPartPressX1 As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NEXTPART_PRESSX1) + NextPartPressX1.sValue = DoubleToString(0, 2) + Dim NextPartFeed As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NEXTPART_FEED) + NextPartFeed.sValue = DoubleToString(0, 2) + Dim NextPartAcc As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NEXTPART_ACC) + NextPartAcc.sValue = DoubleToString(0, 2) + Dim NextPartRef1 As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NEXTPART_REF1) + NextPartRef1.sValue = DoubleToString(0, 2) + Dim NextPartRef2 As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = NEXTPART_REF2) + NextPartRef2.sValue = DoubleToString(0, 2) + 'DebugMessage(1, "Imposto larghezza: " & MyMachGroup.dW) + End Select + Return False + End Function + Private Function SendNextProgram() As Boolean 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 (CurrentMachine.NCType = NCTypes.NUM_AXIUM_APSERVER AndAlso Not Num_Axium_APServer.bIsTransferActive) OrElse - (CurrentMachine.NCType = NCTypes.NUM_AXIUM_PCTOOLKIT AndAlso Not Num_Axium_PCToolkit.bIsTransferActive) Then ' Or Tpa.opState = MachineOperatingState.Start) Then + (CurrentMachine.NCType = NCTypes.NUM_AXIUM_PCTOOLKIT AndAlso Not Num_Axium_PCToolkit.bIsTransferActive) OrElse + CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 Then ' Or Tpa.opState = MachineOperatingState.Start) Then ' verifico se c'e' un programma da lanciare If Not IsNothing(Map.refProjectVM.SupervisorMachGroupPanelVM) Then Dim bMachGroupNotReady As Boolean = False SyncLock m_Lock_SendProgram For Each MyMachGroup As MyMachGroupVM In Map.refProjectVM.SupervisorMachGroupPanelVM.MachGroupVMList - If Not MyMachGroup.bSentToMachine AndAlso (MyMachGroup.dtStartTime = DateTime.MinValue OrElse + DebugMessage(1, "Ciclo alla ricerca di un programma da mandare") + ' EgtOutLog("Ciclo su name: " & MyMachGroup.Name & " id: " & MyMachGroup.Id) + If Not MyMachGroup.bSentToMachine AndAlso (If(CurrentMachine.NCType <> NCTypes.SIEMENS_SHARP7, MyMachGroup.dtStartTime = DateTime.MinValue, MyMachGroup.dtEndTime = DateTime.MinValue) OrElse (Map.refSupervisorManagerVM.CurrProd.nType = BWType.WALL AndAlso MyMachGroup.bResetWhileCutting)) Then ' 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 ' lo lancio - bSent = SendProgram(MyMachGroup.CnFilePath(), MyMachGroup.Name) + DebugMessage(1, "Eseguo SendProgram") + bSent = SendProgram(MyMachGroup.CnFilePath(), MyMachGroup.Name, MyMachGroup) + ' EgtOutLog(MyMachGroup.Name & " id: " & MyMachGroup.Id & " mandato " & DateTime.Now() & " " & MyMachGroup.Name & " " & bSent.ToString()) Select Case CurrentMachine.NCType - Case NCTypes.TPA + Case NCTypes.TPA, NCTypes.SIEMENS_SHARP7 MyMachGroup.SetSentToMachine(bSent) Case NCTypes.NUM_FLEXIUM, NCTypes.NUM_AXIUM_APSERVER, NCTypes.NUM_AXIUM_PCTOOLKIT MyMachGroup.SetSendingToMachine(bSent) @@ -631,9 +877,25 @@ Public Class MachManaging End If Next End SyncLock + If CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 AndAlso Not Map.refProjectVM.SupervisorMachGroupPanelVM.MachGroupVMList.Any(Function(x As MyMachGroupVM) x.nProduction_State < ItemState.WIP And x.bReadyForMachining) Then + Dim ISONumVariable As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = ISO_NUM) + Dim nISONum As Integer = 0 + If Not Integer.TryParse(ISONumVariable.sValue, nISONum) Or nISONum <> 0 Then + DebugMessage(1, "Resetto programma da inviare") + ISONumVariable.sValue = 0 + ' resetto variabili per prossima barra + ResetNextBarVars() + ' do stop working + Dim StopWorking As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = STOP_WORKING) + StopWorking.sValue = "1" + End If + End If + 'If CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 Then + ' SetNextBarVars() + 'End If If bMachGroupNotReady Then Return False + End If End If - End If Return bSent End Function @@ -744,6 +1006,24 @@ Public Class MachManaging m_ResultCallbackDlg(CommandTypes.CONNECT, CommandStates.ERROR_, ResultTypes.EXECUTED, "Errore: impossibile connettersi!") Return End Try + Case NCTypes.SIEMENS_SHARP7 + Try + m_CN = New SIEMENSSharp7Comm(Me) + If Siemens_Sharp7.InitConnection() Then + m_bConnected = True + ' imposto stato manuale + Dim ManualMode As OPState = Map.refLeftPanelVM.OPModeList.FirstOrDefault(Function(x) x.Id = OPModes.Manual) + Map.refLeftPanelVM.SetOPMode(ManualMode) + m_ResultCallbackDlg(CommandTypes.CONNECT, CommandStates.OK, ResultTypes.EXECUTED, "") + Else + m_ResultCallbackDlg(CommandTypes.CONNECT, CommandStates.ERROR_, ResultTypes.EXECUTED, "Errore: impossibile connettersi!") + Return + End If + ' creo classe di gestione variabili + Catch ex As Exception + m_ResultCallbackDlg(CommandTypes.CONNECT, CommandStates.ERROR_, ResultTypes.EXECUTED, "Errore: impossibile connettersi!") + Return + End Try End Select End Sub @@ -773,6 +1053,14 @@ Public Class MachManaging m_ResultCallbackDlg(CommandTypes.DISCONNECT, CommandStates.OK, ResultTypes.EXECUTED, "") ' chiudo classe Num_Flexium Me.OnDispose() + Case NCTypes.SIEMENS_SHARP7 + m_bConnected = False + If Not IsNothing(Siemens_Sharp7) Then + Siemens_Sharp7.CloseConnection() + End If + m_ResultCallbackDlg(CommandTypes.DISCONNECT, CommandStates.OK, ResultTypes.EXECUTED, "") + ' chiudo classe Num_Flexium + Me.OnDispose() End Select ' termino thread di comunicazione MachineCommThread.StopThread() @@ -887,7 +1175,7 @@ Public Class MachManaging End Select End Sub - Public Function SendProgram(ProgramPath As String, ProgramId As String) As Boolean + Public Function SendProgram(ProgramPath As String, ProgramId As String, Optional MyMachGroup As MyMachGroupVM = Nothing) As Boolean Select Case CurrentMachine.NCType Case NCTypes.TPA If Tpa.opState = MachineOperatingState.Pending Then @@ -917,6 +1205,39 @@ Public Class MachManaging Num_Axium_PCToolkit.FileDownload(nFileType * 10, ProgramPath) End If Return True + Case NCTypes.SIEMENS_SHARP7 + ' EgtOutLog("Pre Download") + Dim nFileType As Integer = 0 + If Integer.TryParse(ProgramId, nFileType) AndAlso nFileType > 0 Then + Dim sDestDir As String = "" + GetPrivateProfileString(S_GENERAL, K_ISOFILEDIR, "c:/Saomad/ISO", sDestDir, CurrentMachine.sMachIniFile) + DebugMessage(1, "Copio programma") + File.Copy(ProgramPath, sDestDir & "\" & nFileType & ".mpf", True) + ' copio POSIZ file + Dim sPosizPath As String = Path.GetDirectoryName(ProgramPath) & "\" & Path.GetFileNameWithoutExtension(ProgramPath) & "_POSIZ.mpf" + File.Copy(sPosizPath, sDestDir & "\" & nFileType & "_POSIZ.mpf", True) + ' se primo dopo start + If m_bFirstRaw Then + m_bFirstRaw = False + DebugMessage(1, "Primo grezzo") + ' annullo step di ripartenza + Map.refMachManaging.Siemens_Sharp7.ResetStep(Not (MyMachGroup.dtStartTime <> DateTime.MinValue OrElse MyMachGroup.nProduction_State = ItemState.WIP)) + End If + ' imposto larghezza barra + Dim WCarico As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = W_CARICO) + WCarico.sValue = DoubleToString(MyMachGroup.dW, 1) + DebugMessage(1, "Imposto larghezza: " & MyMachGroup.dW) + ' resetto eventuale stop working + Dim StopWorking As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = STOP_WORKING) + If StopWorking.sValue = "1" Then + StopWorking.sValue = "0" + End If + ' imposto numero programma scritto + Dim ISONumVariable As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = ISO_NUM) + DebugMessage(1, "Imposto programma inviato: " & nFileType) + ISONumVariable.sValue = nFileType + End If + Return True End Select Return False End Function @@ -1009,6 +1330,13 @@ Public Class MachManaging Case CommVar.Types.CN Num_Axium_PCToolkit.WriteNCVariables(Address, Value) End Select + Case NCTypes.SIEMENS_SHARP7 + Select Case Type + Case CommVar.Types.PLC + Siemens_Sharp7.WriteVariable(Address, Value) + 'Case CommVar.Types.CN + ' Num_Axium_PCToolkit.WriteNCVariables(Address, Value) + End Select End Select End Sub @@ -1024,6 +1352,8 @@ Public Class MachManaging Return NUMAxiumComm.InitVar(NewVar) Case NCTypes.NUM_AXIUM_PCTOOLKIT Return NUMAxiumPcToolkitComm.InitVar(NewVar) + Case NCTypes.SIEMENS_SHARP7 + Return SIEMENSSharp7Comm.InitVar(NewVar) End Select Return Nothing End Function @@ -1116,4 +1446,14 @@ Public Class MachManaging End Select End Sub +#Region "Debug" + + Friend Sub DebugMessage(nLevel As Integer, sMessage As String) + If m_Debug >= nLevel Then + EgtOutLog(sMessage) + End If + End Sub + +#End Region ' Debug + End Class diff --git a/EgtBEAMWALL.Supervisor/MachManagingThread/MachManagingThread.vb b/EgtBEAMWALL.Supervisor/MachManagingThread/MachManagingThread.vb index 1a7b4321..6cefe4b7 100644 --- a/EgtBEAMWALL.Supervisor/MachManagingThread/MachManagingThread.vb +++ b/EgtBEAMWALL.Supervisor/MachManagingThread/MachManagingThread.vb @@ -21,7 +21,7 @@ Class MachineCommThread Private Shared sResetVarName As String = "0.FUNM.E80048" Public Shared Sub MachManagingThreadFunction(ResultCallbackDlg As ResultCallbackDlg, CloseCallbackDlg As CloseCallbackDlg, UpdateCallbackDlg As UpdateCallbackDlg, - TPAAlarmCallbackDlg As TPAAlarmCallbackDlg, NUMAlarmCallbackDlg As NUMAlarmCallbackDlg, AxisCoordinatesCallbackDlg As AxisCoordinatesCallbackDlg, + TPAAlarmCallbackDlg As TPAAlarmCallbackDlg, NUMAlarmCallbackDlg As NUMAlarmCallbackDlg, SiemensAlarmCallbackDlg As SiemensAlarmCallbackDlg, AxisCoordinatesCallbackDlg As AxisCoordinatesCallbackDlg, OpStateCallbackDlg As OpStateCallbackDlg, OpModeCallbackDlg As OpModeCallbackDlg, ChannelCallbackDlg As ChannelCallbackDlg, ReadVarCallbackDlg As ReadVarCallbackDlg) ' inizializzo callback @@ -30,6 +30,7 @@ Class MachineCommThread m_UpdateCallbackDlg = UpdateCallbackDlg m_TPAAlarmCallbackDlg = TPAAlarmCallbackDlg m_NUMAlarmCallbackDlg = NUMAlarmCallbackDlg + m_SiemensAlarmCallbackDlg = SiemensAlarmCallbackDlg m_AxisCoordinatesCallbackDlg = AxisCoordinatesCallbackDlg m_OpStateCallbackDlg = OpStateCallbackDlg m_OpModeCallbackDlg = OpModeCallbackDlg diff --git a/EgtBEAMWALL.Supervisor/MainMenu/MainMenuVM.vb b/EgtBEAMWALL.Supervisor/MainMenu/MainMenuVM.vb index e6045aee..6d3fee45 100644 --- a/EgtBEAMWALL.Supervisor/MainMenu/MainMenuVM.vb +++ b/EgtBEAMWALL.Supervisor/MainMenu/MainMenuVM.vb @@ -175,7 +175,7 @@ Public Class MainMenuVM #Region "METHODS" Friend Sub SetInputOutputVisibility() - If CurrentMachine.NCType = NCTypes.TPA Then + If CurrentMachine.NCType = NCTypes.TPA OrElse CurrentMachine.NCType = NCTypes.SIEMENS_SHARP7 Then m_Inputs_Visibility = Visibility.Collapsed m_Outputs_Visibility = Visibility.Collapsed End If diff --git a/EgtBEAMWALL.Supervisor/My Project/AssemblyInfo.vb b/EgtBEAMWALL.Supervisor/My Project/AssemblyInfo.vb index 265a2e2b..89845bf2 100644 --- a/EgtBEAMWALL.Supervisor/My Project/AssemblyInfo.vb +++ b/EgtBEAMWALL.Supervisor/My Project/AssemblyInfo.vb @@ -70,5 +70,5 @@ Imports System.Windows ' by using the '*' as shown below: ' - - + + diff --git a/EgtBEAMWALL.Supervisor/OpenProjectFileDialog/OpenProjectFileDialogVM.vb b/EgtBEAMWALL.Supervisor/OpenProjectFileDialog/OpenProjectFileDialogVM.vb index d8ca5ff0..254f9545 100644 --- a/EgtBEAMWALL.Supervisor/OpenProjectFileDialog/OpenProjectFileDialogVM.vb +++ b/EgtBEAMWALL.Supervisor/OpenProjectFileDialog/OpenProjectFileDialogVM.vb @@ -10,8 +10,6 @@ Public Class OpenProjectFileDialogVM Public Overrides Function Init(ProjectType As ProjectType, Optional CurrProjectList As List(Of ProjectFileVM) = Nothing, Optional GoToProd As Boolean = False) As Boolean? m_ProjectType = ProjectType m_GoToProd = GoToProd - '' carico colonne - 'LoadColumns() NotifyPropertyChanged(NameOf(FilterTypeList)) m_SelFilterType = m_FilterTypeList(0) ' carico lista progetti diff --git a/EgtBEAMWALL.Supervisor/RestartRawPart/RestartRawPartV.xaml b/EgtBEAMWALL.Supervisor/RestartRawPart/RestartRawPartV.xaml new file mode 100644 index 00000000..7cbc66f5 --- /dev/null +++ b/EgtBEAMWALL.Supervisor/RestartRawPart/RestartRawPartV.xaml @@ -0,0 +1,12 @@ + + + + + diff --git a/EgtBEAMWALL.Supervisor/RestartRawPart/RestartRawPartV.xaml.vb b/EgtBEAMWALL.Supervisor/RestartRawPart/RestartRawPartV.xaml.vb new file mode 100644 index 00000000..40386404 --- /dev/null +++ b/EgtBEAMWALL.Supervisor/RestartRawPart/RestartRawPartV.xaml.vb @@ -0,0 +1,3 @@ +Public Class RestartRawPartV + +End Class diff --git a/EgtBEAMWALL.Supervisor/RestartRawPart/RestartRawPartVM.vb b/EgtBEAMWALL.Supervisor/RestartRawPart/RestartRawPartVM.vb new file mode 100644 index 00000000..a20be7fc --- /dev/null +++ b/EgtBEAMWALL.Supervisor/RestartRawPart/RestartRawPartVM.vb @@ -0,0 +1,3 @@ +Public Class RestartRawPartVM + +End Class diff --git a/EgtBEAMWALL.Supervisor/RestartWnd/RestartWndV.xaml b/EgtBEAMWALL.Supervisor/RestartWnd/RestartWndV.xaml new file mode 100644 index 00000000..60574128 --- /dev/null +++ b/EgtBEAMWALL.Supervisor/RestartWnd/RestartWndV.xaml @@ -0,0 +1,12 @@ + + + + + diff --git a/EgtBEAMWALL.Supervisor/RestartWnd/RestartWndV.xaml.vb b/EgtBEAMWALL.Supervisor/RestartWnd/RestartWndV.xaml.vb new file mode 100644 index 00000000..7d4f3864 --- /dev/null +++ b/EgtBEAMWALL.Supervisor/RestartWnd/RestartWndV.xaml.vb @@ -0,0 +1,3 @@ +Public Class RestartWndV + +End Class diff --git a/EgtBEAMWALL.Supervisor/RestartWnd/RestartWndVM.vb b/EgtBEAMWALL.Supervisor/RestartWnd/RestartWndVM.vb new file mode 100644 index 00000000..587ca446 --- /dev/null +++ b/EgtBEAMWALL.Supervisor/RestartWnd/RestartWndVM.vb @@ -0,0 +1,3 @@ +Public Class RestartWndVM + +End Class diff --git a/EgtBEAMWALL.Supervisor/SceneHost/MySceneHostVM.vb b/EgtBEAMWALL.Supervisor/SceneHost/MySceneHostVM.vb index 0f64e83b..e0830aaa 100644 --- a/EgtBEAMWALL.Supervisor/SceneHost/MySceneHostVM.vb +++ b/EgtBEAMWALL.Supervisor/SceneHost/MySceneHostVM.vb @@ -60,7 +60,9 @@ Public Class MySceneHostVM ' Imposto direttorio ausiliario per import/gestione BTL Dim sBtlAuxDir As String = String.Empty GetMainPrivateProfileString(S_IMPORT, K_BTLAUXDIR, "", sBtlAuxDir) - EgtSetBtlAuxDir(sBtlAuxDir) + If Not EgtSetBtlAuxDir(sBtlAuxDir) Then + EgtOutLog("Missing BtlAuxDir path! Will be impossible to load Variant!") + End If ' inizializzo gestore travi e pareti EgtInitBeamMgr(EIB_FL.TS3_POS + EIB_FL.USEUATTR) ' inizializzo gestore lavorazioni diff --git a/EgtBEAMWALL.Supervisor/Utility/CurrentMachine.vb b/EgtBEAMWALL.Supervisor/Utility/CurrentMachine.vb index f22f2ac3..295c3674 100644 --- a/EgtBEAMWALL.Supervisor/Utility/CurrentMachine.vb +++ b/EgtBEAMWALL.Supervisor/Utility/CurrentMachine.vb @@ -182,6 +182,8 @@ Public Module CurrentMachine m_sTs3DataFile = If(File.Exists(sBeamTs3DataFile), sBeamTs3DataFile, sWallTs3DataFile) End If End If + ' leggo tipo di avanzamento pezzi + m_Flow = GetPrivateProfileInt(S_GENERAL, K_FLOW, 1, m_sMachIniFile) ' Impostazione path Script dir m_sMachScriptDir = sMachinesRootDir & "\" & sMachineName & "\" & K_SCRIPT ' Impostazione path Setup dir @@ -304,6 +306,8 @@ Public Module CurrentMachine Map.refLeftPanelVM.LoadOPModes() ' Imposto visibilità variabili E80000 Map.refLeftPanelVM.SetE80000Visibility() + ' Imposto visibilita' assi + Map.refLeftPanelVM.SetAxisVisibility() End Sub #End Region 'Init diff --git a/ExtLibs/Sharp7.net.dll b/ExtLibs/Sharp7.net.dll new file mode 100644 index 0000000000000000000000000000000000000000..74ccff27caa03fd17769c11483650e28e1c8d221 GIT binary patch literal 63488 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 literal 0 HcmV?d00001 From a158df111559de805b348b01a65004e7166bb717 Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Thu, 7 May 2026 15:19:27 +0200 Subject: [PATCH 02/10] - modifica a comunicazione Siemens per uscire da ciclo di attesa risposta macchina in caso di reset --- EgtBEAMWALL.Supervisor/Comms/SIEMENSSharp7Comm.vb | 15 ++++++++++----- .../MachManagingThread/MachManaging.vb | 4 ++-- EgtBEAMWALL.sln | 1 + 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/EgtBEAMWALL.Supervisor/Comms/SIEMENSSharp7Comm.vb b/EgtBEAMWALL.Supervisor/Comms/SIEMENSSharp7Comm.vb index e0768da7..5b488988 100644 --- a/EgtBEAMWALL.Supervisor/Comms/SIEMENSSharp7Comm.vb +++ b/EgtBEAMWALL.Supervisor/Comms/SIEMENSSharp7Comm.vb @@ -378,16 +378,20 @@ Public Class SIEMENSSharp7Comm Return Result = 0 End Function - Friend Sub ResetStep(bReset As Boolean) + Friend Function ResetStep(bReset As Boolean) As Boolean WaitingRefresh() - Dim ResetStep As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList(19) ' Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = RESET_STEP) + Dim varResetStep As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList(19) ' Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = RESET_STEP) If bReset Then Map.refMachManaging.DebugMessage(1, "Imposto variabile ResetStep a 1") - ResetStep.sValue = 1 + varResetStep.sValue = 1 Threading.Thread.Sleep(100) Dim nResetStepOk As Integer = 0 Dim ResetStepOk As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = RESET_STEP_OK) + Dim ResetMachine As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = RESET_STATE) While nResetStepOk <> 1 + If ResetMachine.sValue = "1" Then + Return False + End If Map.refMachManaging.DebugMessage(1, "Rileggo variabili") RefreshAllVars() Map.refMachManaging.DebugMessage(1, "Leggo valore ResetStepOk") @@ -395,9 +399,10 @@ Public Class SIEMENSSharp7Comm Threading.Thread.Sleep(1000) End While End If - ResetStep.sValue = 0 + varResetStep.sValue = 0 Map.refMachManaging.DebugMessage(1, "Imposto variabile ResetStep a 0") - End Sub + Return True + End Function Friend Sub ReadPLCMessages() WaitingRefresh() diff --git a/EgtBEAMWALL.Supervisor/MachManagingThread/MachManaging.vb b/EgtBEAMWALL.Supervisor/MachManagingThread/MachManaging.vb index 7c3d0bbe..38991452 100644 --- a/EgtBEAMWALL.Supervisor/MachManagingThread/MachManaging.vb +++ b/EgtBEAMWALL.Supervisor/MachManagingThread/MachManaging.vb @@ -510,7 +510,7 @@ Public Class MachManaging Map.refMachManaging.DebugMessage(1, "Confermo lettura reset") ResetReadedVariable.sValue = "1" Else - ResetVariable.sValue = "0" + ResetVariable.sValue = "0" End If ' resetto prossima barra e variabili V If CurrentMachine.NCType = NCTypes.TPA AndAlso CurrentMachine.Flow = FlowTypes.CONTINUOUS Then @@ -1221,7 +1221,7 @@ Public Class MachManaging m_bFirstRaw = False DebugMessage(1, "Primo grezzo") ' annullo step di ripartenza - Map.refMachManaging.Siemens_Sharp7.ResetStep(Not (MyMachGroup.dtStartTime <> DateTime.MinValue OrElse MyMachGroup.nProduction_State = ItemState.WIP)) + If Not Map.refMachManaging.Siemens_Sharp7.ResetStep(Not (MyMachGroup.dtStartTime <> DateTime.MinValue OrElse MyMachGroup.nProduction_State = ItemState.WIP)) Then Return False End If ' imposto larghezza barra Dim WCarico As Variable = Map.refMachCommandMessagePanelVM.MainVariablesList.FirstOrDefault(Function(x) x.sName = W_CARICO) diff --git a/EgtBEAMWALL.sln b/EgtBEAMWALL.sln index be4252ac..4907820b 100644 --- a/EgtBEAMWALL.sln +++ b/EgtBEAMWALL.sln @@ -45,6 +45,7 @@ Global {4BD87FB8-9D12-46E3-ABCB-6576415BCE9A}.Release|x86.ActiveCfg = Release|x86 {4BD87FB8-9D12-46E3-ABCB-6576415BCE9A}.Release|x86.Build.0 = Release|x86 {4BD87FB8-9D12-46E3-ABCB-6576415BCE9A}.RemoteDebug|x86.ActiveCfg = Debug|x86 + {4BD87FB8-9D12-46E3-ABCB-6576415BCE9A}.RemoteDebug|x86.Build.0 = Debug|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 31dcf81fc246d44e9a5026bd1286a0f450d90bd9 Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Thu, 7 May 2026 15:28:33 +0200 Subject: [PATCH 03/10] - gestita simulazione che non permette modifiche quando trave in produzione --- EgtBEAMWALL.Core/CALCPanel/CalcIntegration.vb | 4 ++-- EgtBEAMWALL.Optimizer/MachGroupPanel/MyMachGroupVM.vb | 1 + EgtBEAMWALL.Supervisor/CALCPanel/CALCPanelVM.vb | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/EgtBEAMWALL.Core/CALCPanel/CalcIntegration.vb b/EgtBEAMWALL.Core/CALCPanel/CalcIntegration.vb index c8ec7bb0..b9dd3031 100644 --- a/EgtBEAMWALL.Core/CALCPanel/CalcIntegration.vb +++ b/EgtBEAMWALL.Core/CALCPanel/CalcIntegration.vb @@ -155,7 +155,7 @@ Public Module CalcIntegration Else vProc(j).Proc.StartInfo.Arguments = """" & vBar(nCurrBar).sBarPath & """ " & """" & vBar(nCurrBar).nProjType & """ " & - """" & vBar(nCurrBar).nMachineName & """ " & vBar(nCurrBar).nCmdType + """" & vBar(nCurrBar).nMachineName & """ " & vBar(nCurrBar).nCmdType & " " & vBar(nCurrBar).nBarState End If vProc(j).Proc.StartInfo.UseShellExecute = False @@ -475,7 +475,7 @@ Public Module CalcIntegration End Module Public Class Bar - Public nBarState As Integer + Public nBarState As Integer = -1 Public nBarId As Integer Public sBarPath As String Public bBarOk As Boolean diff --git a/EgtBEAMWALL.Optimizer/MachGroupPanel/MyMachGroupVM.vb b/EgtBEAMWALL.Optimizer/MachGroupPanel/MyMachGroupVM.vb index be9dc284..651173f3 100644 --- a/EgtBEAMWALL.Optimizer/MachGroupPanel/MyMachGroupVM.vb +++ b/EgtBEAMWALL.Optimizer/MachGroupPanel/MyMachGroupVM.vb @@ -980,6 +980,7 @@ Public Class MyMachGroupVM .bBarOk = True, .nMachineName = MachineName, .nCmdType = CalcIntegration.CmdTypes.SIMULATE, + .nBarState = SelMachGroup.nProduction_State, .nGlobState = SelMachGroup.nGlobalState} If SelMachGroup.nGlobalState = CalcStates.NOTCALCULATED Then Dim sMachGroupFilePath As String = ProjectManagerVM.CurrProd.sProdDirPath & "\" & SelMachGroup.Name.ToString() & ".ori.bwe" diff --git a/EgtBEAMWALL.Supervisor/CALCPanel/CALCPanelVM.vb b/EgtBEAMWALL.Supervisor/CALCPanel/CALCPanelVM.vb index 3b760195..f9508fd1 100644 --- a/EgtBEAMWALL.Supervisor/CALCPanel/CALCPanelVM.vb +++ b/EgtBEAMWALL.Supervisor/CALCPanel/CALCPanelVM.vb @@ -496,7 +496,8 @@ Public Class CALCPanelVM .nProjType = ProjType, .bBarOk = True, .nMachineName = MachineName, - .nCmdType = CalcIntegration.CmdTypes.SIMULATE} + .nCmdType = CalcIntegration.CmdTypes.SIMULATE, + .nBarState = SelMachGroup.nProduction_State} If SelMachGroup.nGlobalState = CalcStates.NOTCALCULATED Then Dim sMachGroupFilePath As String = Map.refSupervisorManagerVM.CurrProd.sProdDirPath & "\" & SelMachGroup.Name.ToString() & ".ori.bwe" If File.Exists(sMachGroupFilePath) Then File.Delete(sMachGroupFilePath) From 789e543e3aa2dda72a73573ccde72b6fb3601b4a Mon Sep 17 00:00:00 2001 From: Demetrio Cassarino Date: Tue, 26 May 2026 14:01:57 +0200 Subject: [PATCH 04/10] -aggiunto controllo su removescenepart --- EgtBEAMWALL.Optimizer/BTLPartManager/BTLPartManagerVM.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/EgtBEAMWALL.Optimizer/BTLPartManager/BTLPartManagerVM.vb b/EgtBEAMWALL.Optimizer/BTLPartManager/BTLPartManagerVM.vb index 13f9cc3a..2d44f3f3 100644 --- a/EgtBEAMWALL.Optimizer/BTLPartManager/BTLPartManagerVM.vb +++ b/EgtBEAMWALL.Optimizer/BTLPartManager/BTLPartManagerVM.vb @@ -196,7 +196,7 @@ Public Class BTLPartManagerVM ' creo copia Dim NewPart As BTLPartM = SelPart.Copy() If Not IsNothing(NewPart) Then - Map.refProjectVM.UpdatePart(NewPart.nPartId) + If Map.refProdManagerVM.ListProjAsseBase.Count > 0 Then Map.refProjectVM.UpdatePart(NewPart.nPartId) ' selezione ultimo che e' quello appena creato Map.refProjectVM.BTLStructureVM.SetSelBTLPart(Map.refProjectVM.BTLStructureVM.BTLPartVMList(Map.refProjectVM.BTLStructureVM.BTLPartVMList.Count - 1), False, True) End If @@ -244,7 +244,7 @@ Public Class BTLPartManagerVM End If ' Eseguo cancellazione EgtBeamSetPart(BTLPartToDelete.nPartId) - RemoveScenePart(BTLPartToDelete) + If Map.refProdManagerVM.ListProjAsseBase.Count > 0 Then RemoveScenePart(BTLPartToDelete) ' seleziono elemento precedente Dim Index As Integer = Map.refProjectVM.BTLStructureVM.BTLPartVMList.IndexOf(BTLPartToDelete) Dim FilteredIndex As Integer = Map.refProjectVM.BTLStructureVM.BTLPartVMList_View.IndexOf(BTLPartToDelete) From 2917207424e48eeae7a65f291db1c2970574f914 Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Tue, 26 May 2026 16:26:52 +0200 Subject: [PATCH 05/10] - allargato spazio letto su db302 siemens - eliminati bottoni macchina su siemens - aggiunto ResetStep su bottono reset - aggiunta modalita' remotedebug per Optimizer --- .../EgtBEAMWALL.Optimizer.vbproj | 11 +++++ .../Comms/SIEMENSSharp7Comm.vb | 2 +- .../MachCommandMessagePanelV.xaml | 3 ++ .../MachCommandMessagePanelVM.vb | 18 ++++++++ .../MachManagingThread/MachManaging.vb | 3 ++ .../Utility/CurrentMachine.vb | 43 +++++++++++++++++-- EgtBEAMWALL.sln | 4 +- 7 files changed, 78 insertions(+), 6 deletions(-) diff --git a/EgtBEAMWALL.Optimizer/EgtBEAMWALL.Optimizer.vbproj b/EgtBEAMWALL.Optimizer/EgtBEAMWALL.Optimizer.vbproj index d22af3e3..856046ca 100644 --- a/EgtBEAMWALL.Optimizer/EgtBEAMWALL.Optimizer.vbproj +++ b/EgtBEAMWALL.Optimizer/EgtBEAMWALL.Optimizer.vbproj @@ -66,6 +66,17 @@ Resources\EgtBEAMWALL.ico + + true + true + true + bin\x86\RemoteDebug\ + EgtBEAMWALL.Optimizer.xml + 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42314 + full + x86 + true + ..\EgtBEAMWALL.Core\bin\Debug\EgtBEAMWALL.Core.dll diff --git a/EgtBEAMWALL.Supervisor/Comms/SIEMENSSharp7Comm.vb b/EgtBEAMWALL.Supervisor/Comms/SIEMENSSharp7Comm.vb index 5b488988..155bb877 100644 --- a/EgtBEAMWALL.Supervisor/Comms/SIEMENSSharp7Comm.vb +++ b/EgtBEAMWALL.Supervisor/Comms/SIEMENSSharp7Comm.vb @@ -121,7 +121,7 @@ Public Class SIEMENSSharp7Comm Case 301 nAddressByte = 8 Case 302 - nAddressByte = 34 + nAddressByte = 46 End Select Map.refMachManaging.DebugMessage(1, "Lettura di " & nAddressByte & " byte dalla variabile " & nDBAddress) Dim nResult As Integer = 1234567890 diff --git a/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/MachCommandMessagePanelV.xaml b/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/MachCommandMessagePanelV.xaml index c54ccd56..46e3c1e0 100644 --- a/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/MachCommandMessagePanelV.xaml +++ b/EgtBEAMWALL.Supervisor/MachCommandMessagePanel/MachCommandMessagePanelV.xaml @@ -20,10 +20,12 @@ Style="{StaticResource MachCommandMessagePanel_Button}"/>