Files
OmagCUT/CNCommunication.vb
T
Emmanuele Sassi 03086e237e OmagCUT :
- Aggiunti nuovi Dictionary per migliorare grafica programma.
- Miglioramenti vari.
2015-12-26 11:02:44 +00:00

331 lines
12 KiB
VB.net

Imports System.Windows.Threading
Imports System.Globalization
Imports EgtUILib
Public Class CNCommunication
' Riferimento alla MainWindow
Private m_MainWindow As MainWindow = Application.Current.MainWindow
Private m_MachineStatus As MachineStatusUC = m_MainWindow.m_MachineStatusUC
Private m_AlarmsPage As AlarmsPageUC = m_MainWindow.m_MachinePageUC.m_AlarmsPageUC
' Spazio per output messaggi
Private m_OutMessageTxBl As TextBlock = m_MainWindow.m_CurrentProjectPageUC.OutMessageTxBl
' Variabile per tipologia CN
Friend m_nNCType As Integer
' Variabile che indica il Mode corrente
Private m_nCurrMode As Integer
' Oggetto CN
Public WithEvents m_CN As CN_generico
' Flag di aggiornamento dati
Private m_bNewPosData As Boolean = True
Private m_bNewDeltaData As Boolean = True
Private m_bNewVarData As Boolean = False
Private m_bTimerBusy As Boolean = False
' Timer
Private m_RefreshTimer As New DispatcherTimer
' Nomi e indici degli assi macchina
Private m_bAxesOk As Boolean = False
Private m_sL1 As String = "X"
Private m_nL1 As Integer = 0
Private m_sL2 As String = "Y"
Private m_nL2 As Integer = 1
Private m_sL3 As String = "Z"
Private m_nL3 As Integer = 2
Private m_sR1 As String = "C"
Private m_nR1 As Integer = 8
Private m_sR2 As String = "B"
Private m_nR2 As Integer = 7
Friend Sub CNCommunication_Initialization()
' Verifico tipologia del CN
If m_MainWindow.m_bNCLink = 0 Then
m_nNCType = 0
Else
m_nNCType = GetPrivateProfileInt(S_NUMERICALCONTROL, K_TYPE, 0, m_MainWindow.GetMachIniFile())
End If
' Inizializzo la connessione
InitCn()
' Verifico se la connessione è avvenuta e in caso affermativo lancio il timer di aggiornamento dell'interfaccia
If Not (m_CN.n_state < 2) Then
AddHandler m_RefreshTimer.Tick, AddressOf RefreshTimer_tick
m_RefreshTimer.Interval = TimeSpan.FromMilliseconds(100)
m_RefreshTimer.Start()
End If
' Leggo dati sugli assi della macchina
ReadAxesData()
' Aggiorno nomi assi
m_MachineStatus.DisplayPositionName(m_sL1, m_sL2, m_sL3, m_sR1, m_sR2)
End Sub
Private Sub RefreshTimer_tick()
If Not m_bTimerBusy Then
m_bTimerBusy = True
m_RefreshTimer.Stop()
Refresh()
m_bTimerBusy = False
m_RefreshTimer.Start()
Else
Dim nDummy As Integer = 10
End If
End Sub
Private Sub ReadAxesData()
' Nomi e indici degli assi macchina
m_bAxesOk = True
GetPrivateProfileString(S_AXES, K_L1NAME, "X", m_sL1, m_MainWindow.GetMachIniFile())
m_nL1 = GetPrivateProfileInt(S_AXES, K_L1ID, 0, m_MainWindow.GetMachIniFile())
If Not m_CN.VerifyAxis(m_nL1) Then
m_bAxesOk = False
EgtOutLog("Error on L1ID")
End If
GetPrivateProfileString(S_AXES, K_L2NAME, "Y", m_sL2, m_MainWindow.GetMachIniFile())
m_nL2 = GetPrivateProfileInt(S_AXES, K_L2ID, 1, m_MainWindow.GetMachIniFile())
If Not m_CN.VerifyAxis(m_nL2) Then
m_bAxesOk = False
EgtOutLog("Error on L2ID")
End If
GetPrivateProfileString(S_AXES, K_L3NAME, "Z", m_sL3, m_MainWindow.GetMachIniFile())
m_nL3 = GetPrivateProfileInt(S_AXES, K_L3ID, 2, m_MainWindow.GetMachIniFile())
If Not m_CN.VerifyAxis(m_nL3) Then
m_bAxesOk = False
EgtOutLog("Error on L3ID")
End If
GetPrivateProfileString(S_AXES, K_R1NAME, "C", m_sR1, m_MainWindow.GetMachIniFile())
m_nR1 = GetPrivateProfileInt(S_AXES, K_R1ID, 8, m_MainWindow.GetMachIniFile())
If Not m_CN.VerifyAxis(m_nR1) Then
m_bAxesOk = False
EgtOutLog("Error on R1ID")
End If
GetPrivateProfileString(S_AXES, K_R2NAME, "B", m_sR2, m_MainWindow.GetMachIniFile())
m_nR2 = GetPrivateProfileInt(S_AXES, K_R2ID, 7, m_MainWindow.GetMachIniFile())
If Not m_CN.VerifyAxis(m_nR2) Then
m_bAxesOk = False
EgtOutLog("Error on R2ID")
End If
End Sub
Private Sub InitCn()
m_MachineStatus.MachineStatusGrid.Background = Application.Current.FindResource("OmagCut_Yellow")
' istanzio l'oggetto CN e lo inizializzo
Try
' Creo l'oggetto per la comunicazione
Select Case m_nNCType
Case 0
m_CN = New CN_Debug
Case 1
m_CN = New Num.NumNCOld
Case Else
m_CN = New Num.NumNC
End Select
' Recupero e imposto le variabili per i dati del CN (feed, speed,...)
Dim sVal As String = String.Empty
GetPrivateProfileString(S_NCDATA, K_MODE, "", sVal, m_MainWindow.GetMachIniFile())
m_CN.SetCnDataVar(CN_generico.CnData.Mode, sVal)
GetPrivateProfileString(S_NCDATA, K_JOGINCR, "", sVal, m_MainWindow.GetMachIniFile())
m_CN.SetCnDataVar(CN_generico.CnData.JogIncr, sVal)
GetPrivateProfileString(S_NCDATA, K_FEED, "", sVal, m_MainWindow.GetMachIniFile())
m_CN.SetCnDataVar(CN_generico.CnData.Feed, sVal)
GetPrivateProfileString(S_NCDATA, K_FEEDOVR, "", sVal, m_MainWindow.GetMachIniFile())
m_CN.SetCnDataVar(CN_generico.CnData.FeedOvr, sVal)
GetPrivateProfileString(S_NCDATA, K_SPEED, "", sVal, m_MainWindow.GetMachIniFile())
m_CN.SetCnDataVar(CN_generico.CnData.Speed, sVal)
GetPrivateProfileString(S_NCDATA, K_SPEEDOVR, "", sVal, m_MainWindow.GetMachIniFile())
m_CN.SetCnDataVar(CN_generico.CnData.SpeedOvr, sVal)
GetPrivateProfileString(S_NCDATA, K_POWER, "", sVal, m_MainWindow.GetMachIniFile())
m_CN.SetCnDataVar(CN_generico.CnData.Power, sVal)
' Inizializzo la comunicazione
m_CN.Init()
Catch ex As Exception
' set status to statusbar
EgtOutLog("Error starting NC communication : " & ex.Message)
End Try
Select Case m_nNCType
Case 0 'Debug
m_MachineStatus.MachineStatusGrid.Background = Brushes.Gold
Case 1, 2 'Axium, Flexium
If IsNothing(m_CN) OrElse m_CN.n_state < 2 Then
' Per evitare crash con azioni verso il controllo, avvio quello di debug
Me.m_CN = New CN_Debug
m_MachineStatus.MachineStatusGrid.Background = Application.Current.FindResource("OmagCut_Red")
Else
m_CN.b_axis_events_enable = True
m_MachineStatus.MachineStatusGrid.Background = Application.Current.FindResource("OmagCut_DarkGray")
End If
End Select
' Assegno riferimento al CN alle diverse pagine
m_MainWindow.m_MachineStatusUC.m_CN = Me.m_CN
m_MainWindow.m_MachinePageUC.m_AlarmsPageUC.m_CN = Me.m_CN
m_MainWindow.m_MachinePageUC.m_TestingPage.m_CN = Me.m_CN
m_MainWindow.m_DirectCutPageUC.m_MachineButtons.m_CN = Me.m_CN
m_MainWindow.m_DirectCutPageUC.m_ManualAxesMove.m_CN = Me.m_CN
m_MainWindow.m_DirectCutPageUC.m_CN = Me.m_CN
End Sub
Private Sub NewVarChanged_handler(ByVal nst As Object) Handles m_CN.NewVarChanged
m_bNewVarData = True
End Sub
Private Sub NewPositionData_handler(ByVal nst As Short) Handles m_CN.NewPositionData
m_bNewPosData = True
End Sub
Private Sub NewPosDeltaData_handler(ByVal nst As Short) Handles m_CN.NewPosDeltaData
m_bNewDeltaData = True
End Sub
Private Sub Refresh()
If m_bNewPosData Then
m_bNewPosData = False
m_MachineStatus.DisplayPosition(m_nL1, m_nL2, m_nL3, m_nR1, m_nR2)
End If
If m_bNewDeltaData Then
m_bNewDeltaData = False
m_MachineStatus.DisplayPositionDelta(m_nL1, m_nL2, m_nL3, m_nR1, m_nR2)
End If
If m_CN.b_feed_changed Then
m_CN.b_feed_changed = False
m_MachineStatus.DisplayFeed()
End If
If m_CN.b_spindle_data_changed Then
m_CN.b_spindle_data_changed = False
m_MachineStatus.DisplaySpeed()
End If
If m_CN.b_spindle_power_changed Then
m_CN.b_spindle_power_changed = False
m_MachineStatus.DisplayPower()
End If
If m_bNewVarData Then
m_bNewVarData = False
m_MachineStatus.DisplayVar()
End If
If m_CN.b_Tool_data_changed Then
m_CN.b_Tool_data_changed = False
'FrmMain.LblToolLen.Text = cn.Tools(0).lenght.ToString
'FrmMain.LblToolRad.Text = cn.Tools(0).radius.ToString
'FrmMain.LblToolComp.Text = cn.Tools(0).comp_num.ToString
End If
If m_CN.read_active_mode() <> m_nCurrMode Then
m_nCurrMode = m_CN.read_active_mode()
m_MachineStatus.DisplayActiveMode(m_nCurrMode)
End If
If m_CN.b_NC_error Then
m_CN.b_NC_error = False
m_AlarmsPage.NcError()
End If
If m_CN.b_PLC_error Then
m_AlarmsPage.PlcError(m_CN.sz_PLC_error_messages)
Else
'Dim BackColor As SolidColorBrush = m_MainWindow.m_MachineStatusUC.MachineStatusGrid.Background
'If Colors.Red.Equals(BackColor.Color) Then
' m_MainWindow.m_MachineStatusUC.MachineStatusGrid.Background = Brushes.DarkGray
'End If
End If
Dim b As Boolean = m_CN.Is_G26_active() '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
End Sub
Friend Function SendProgram(ByVal sCncPath As String, ByVal nNumProg As Integer) As Boolean
Dim bOk As Boolean = True
' Download programma
If m_MainWindow.m_bNCLink Then
Dim sNumProg As String = "%" & nNumProg.ToString() & ".0"
m_MainWindow.m_CNCommunication.m_CN.DGeneralFunctions_Reset()
If m_MainWindow.m_CNCommunication.m_nNCType = 1 Then
bOk = bOk AndAlso (m_MainWindow.m_CNCommunication.m_CN.Delete_NC_prog(sNumProg) = 0)
End If
bOk = bOk AndAlso (m_MainWindow.m_CNCommunication.m_CN.Download_NC_prog(sCncPath, sNumProg) = 0)
' Attesa opportuna
System.Threading.Thread.Sleep(100)
' Attivazione programma
bOk = bOk AndAlso (m_MainWindow.m_CNCommunication.m_CN.ActivateProgram(nNumProg) = 0)
' Modalità automatica
bOk = bOk AndAlso (m_MainWindow.m_CNCommunication.m_CN.DGeneralFunctions_WriteCncMode(0) = 0)
' Se errore, lo segnalo
If Not bOk Then
m_OutMessageTxBl.Text = EgtMsg(90315) 'Errore nella trasmissione del programma CN
m_OutMessageTxBl.Background = Brushes.Tomato
m_OutMessageTxBl.Visibility = Windows.Visibility.Visible
EgtOutLog(m_OutMessageTxBl.Text)
End If
Else
m_OutMessageTxBl.Text = EgtMsg(90316) 'Non connesso alla macchina
m_OutMessageTxBl.Background = Brushes.Gold
m_OutMessageTxBl.Visibility = Windows.Visibility.Visible
EgtOutLog(m_OutMessageTxBl.Text)
End If
Return bOk
End Function
Friend Function GetAxesPositions(ByRef dL1 As Double, ByRef dL2 As Double, ByRef dL3 As Double,
ByRef dR1 As Double, ByRef dR2 As Double) As Boolean
dL1 = m_CN.d_axis_position(m_nL1)
dL2 = m_CN.d_axis_position(m_nL2)
dL3 = m_CN.d_axis_position(m_nL3)
dR1 = m_CN.d_axis_position(m_nR1)
dR2 = m_CN.d_axis_position(m_nR2)
Return m_bAxesOk
End Function
Friend Function GetLinearAxesPositions(ByRef dL1 As Double, ByRef dL2 As Double, ByRef dL3 As Double)
dL1 = m_CN.d_axis_position(m_nL1)
dL2 = m_CN.d_axis_position(m_nL2)
dL3 = m_CN.d_axis_position(m_nL3)
Return m_bAxesOk
End Function
Friend Function GetRotaryAxesPositions(ByRef dR1 As Double, ByRef dR2 As Double) As Boolean
dR1 = m_CN.d_axis_position(m_nR1)
dR2 = m_CN.d_axis_position(m_nR2)
Return m_bAxesOk
End Function
Friend Function GetAxesNames(ByRef sL1 As String, ByRef sL2 As String, ByRef sL3 As String,
ByRef sR1 As String, ByRef sR2 As String) As Boolean
sL1 = m_sL1
sL2 = m_sL2
sL3 = m_sL3
sR1 = m_sR1
sR2 = m_sR2
Return m_bAxesOk
End Function
End Class