Files
Dario Sassi bd006a197f OmagCUT 3.1c1 :
- sistemata scrittura e lettura nomi utensili e lavorazioni in ini di macchina come UTF8
- sistemazione scelta lavorazioni in Split anche per lama fissa
- eliminati parametri WaterJet non usati
- sistemazioni varie.
2026-03-09 17:47:57 +01:00

1316 lines
45 KiB
VB.net

Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Linq
Imports System.Text
Imports System.Windows.Forms
Imports System.Runtime.InteropServices
Imports EgtUILib
Imports System.IO
Imports System.Threading
Imports System.Windows.Threading
Namespace Num
Public Class NumNCOld
Inherits CN_generico
'Public bIsDripFeed As Boolean = False
' costruisco il riferimento alla pagina principale
Private m_MainWindow As MainWindow = DirectCast(Application.Current.MainWindow, MainWindow)
' costruisco il riferimento alla barra ProjectMng
Private m_ProjectMng As ProjectMgrUC
' Messaggi ricevuti direttamente dal Thread che gestisce la comunicazione DripFeed
Private m_nMsg As Integer = 0
' Colore originale del bottone WorkBtn
Private m_BackgroundOrig As SolidColorBrush
' Timer per la lettura aggiornata dei messaggi in fase di comunicazione DriFeed
Private m_RefreshTimer As New DispatcherTimer
' funzione richiamata ad ogni clik
Private Sub RefreshTimer_tick()
' verifico se ci sono messaggi da stampare (Se n_Msg > 0 è una info, Se n_Msg < 0 è un errore)
If m_nMsg > 0 Then
m_MainWindow.m_CurrentProjectPageUC.ClearMessage()
m_MainWindow.m_CurrentProjectPageUC.SetInfoMessage(EgtMsg(m_nMsg))
ElseIf m_nMsg < 0 Then
m_MainWindow.m_CurrentProjectPageUC.ClearMessage()
m_MainWindow.m_CurrentProjectPageUC.SetWarningMessage(EgtMsg(Math.Abs(m_nMsg)))
End If
' dopo la stampa del messaggio resetto l'indice
m_nMsg = 0
' se ha terminato la trasmissione DripFeed fermo il timer
If Not bIsDripFeed Then
m_RefreshTimer.Stop()
' reimposto il colore originale del bottone WorkBtn della pagina ProjectMng
If Not IsNothing(m_ProjectMng) Then
m_ProjectMng.WorkBtn.Background = m_BackgroundOrig
End If
End If
End Sub
#Region " Classes"
#End Region
#Region " Enum"
Enum eStateType As Int16
NOT_INIT = -999
READY = 0
BUSY = -998
End Enum
#End Region
#Region " Constants"
Const SLEEP_TIME = 10
Const A_AXIS As Short = 6
Const RET_OK As Int16 = 0
' modi NUM Axium
Const AUTO_M = 0, SINGLE_M = 1, MDI_M = 2, DRYRUN_M = 3, SEARCH_M = 4, EDIT_M = 5, TEST_M = 6
Const MANUAL_M = 7, MOS_M = 8, SHIFTS_M = 9, TLCOMP_M = 10, LOAD_M = 13, UPLOAD_M = 15
Const V0 = &HA000, V1 = &HA001, V2 = &HA002, V3 = &HA003, V4 = &HA004, V5 = &HA005, V6 = &HA006, V7 = &HA007
Const VBY = &HA040, VW = &HA041, VL = &HA042 'VB4 doesn't accepte VB (-->VBY )
Const M0 = &HA100, M1 = &HA101, M2 = &HA102, M3 = &HA103, M4 = &HA104, M5 = &HA105, M6 = &HA106, M7 = &HA107
Const MB = &HA140, MW = &HA141, ML = &HA142
'Global Const C0=*0xA200
'C1,C2,C3,C4,C5,C6,C7,
Const CB = &HA240, CW = &HA241, CL = &HA242
Const R0 = &HA400, R1 = &HA401, R2 = &HA402, R3 = &HA403, R4 = &HA404, R5 = &HA405, R6 = &HA406, R7 = &HA407
Const RB = &HA440, RW = &HA441, RL = &HA442
Const W0 = &HA500, W1 = &HA501, W2 = &HA502, W3 = &HA503, W4 = &HA504, W5 = &HA505, W6 = &HA506, W7 = &HA507
Const WB = &HA540, WW = &HA541, WL = &HA542
Const I0 = &HA800, I1 = &HA801, I2 = &HA802, I3 = &HA803, I4 = &HA804, I5 = &HA805, I6 = &HA806, I7 = &HA807
Const IB = &HA840, IW = &HA841, IL = &HA842
Const Q0 = &HA900, Q1 = &HA901, Q2 = &HA902, Q3 = &HA903, Q4 = &HA904, Q5 = &HA905, Q6 = &HA906, Q7 = &HA907
Const QB = &HA940, QW = &HA941, QL = &HA942
Const SYN = 0 ' /* synchrone */
Const ASS = 1 ' /* assynchrone send request */
Const ASR = 2 ' /* assynchrone read response */
Const CTRL_AXES = 143
Const SPINDLE_SPEED = 144
Const SPINDLE_POS = 145, H_VAR = 147, MOS_OK = 149
Const E80000 = 150, E81000 = 151, E82000 = 152, E30000 = 166, E40000 = 167, M_DECOD = 168, DATA_PROG = 226
Const Mode = 180, ACTIVE_PROG = 181
Const REF = 128, MES = 129, DAT1 = 130, DAT2 = 131, DAT3 = 132, MIN_LIM = 133, MAX_LIM = 134, VARH = 147
Const TILT = 135, MACH_ORIGIN = 136, P17_MIN = 137, P17_MAX = 138, REF_COR = 139, REF_POS = 140, MES_POS = 141
Const TMACRO1 = &H31, TMACRO2 = &H32, TMACRO3 = &H33
Const TUT6 = 6, TLAD = 7, TIHM = 8, TNC = 12, TPAR = 5, TCALIBR = 2, TMACRO = 11, TUTIL = 13, TPASSANT = 12
Const TSi = 1, TFi = 2, SPi = 3, THi = 4, INI = 5, TABSYMB = 10, ALLMODULE = 16, CMODULE = 65, TXTFILE = 97
Const IHMFNT = 98, IHMBMP = 99, IHMRSC = 100, IHMINI = 101, IHMTXT = 102, IHMICO = 103, IHMCOD = 104
' Const DNC_MODE_FIRST = &H3A00, DNC_MODE_CONTINUE = &H3B00, DNC_MODE_ABORT = &H3C00
Const DNC_MODE_FIRST = 0, DNC_MODE_CONTINUE = 1, DNC_MODE_ABORT = 2
Const DNC_IN_PROGRES = &HC8, DNC_RING_BUFFER_FULL = &H7
#End Region
#Region " Structures"
Structure tDNC20_Position_OPOM
Dim Valid As Byte
Dim Position As Long
Dim ToGo As Long
Dim offset As Long
End Structure
Structure tDNC20_Axes
' Dim axe(0 To 8) As tDNC20_Position_OPOM
Dim axe() As tDNC20_Position_OPOM
End Structure
Structure tDNC20_Spindle_i
Dim Valid As Byte
Dim Spindle As Long
End Structure
Structure tDNC20_Spindle
' Dim Data(0 To 3) As tDNC20_Spindle_i
Dim Data() As tDNC20_Spindle_i
End Structure
Structure tCorOutil
Dim L_X As Long
Dim RTore_Z As Long
Dim R_Radus As Long
Dim DL_DX As Long
Dim DR_DZ As Long
Dim Direc As Long
Dim Type As Long
End Structure
<StructLayout(LayoutKind.Explicit)>
Public Structure tDNC20_ObjectList
<FieldOffset(0)> Public ElemNum As UInt16
<FieldOffset(2)> Public First As UInt16
<FieldOffset(4)> Public Quantity As UInt16
End Structure
Public Structure My_data_struct
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=256)>
Public data As Byte()
End Structure
#End Region
#Region " Variabili "
Public Var6003 As Byte
Public Var600A As Byte
Public Var600B As Byte
Public Var600C As Byte
Public Var600D As Byte
Public Var600E As Byte
Public var6010L As Long
Public var6014L As Long
Public var6018L As Long
Public var601CL As Long
Public var6020L As Long
Public var6024L As Long
Public var6028L As Long
Public var602CL As Long
Private iFirstVar As UInt16
Private n_portNC As Int16
Private n_PPport As Int16
Private Vmminch As Long = 1000
Private NumCifreDecP4 As Long = 1000
Private aTimer As System.Timers.Timer
Private nCount As Integer = 0
Private b_busy As Boolean = False
Private b_OM_pos As Boolean = True
Private global_state As eStateType = eStateType.NOT_INIT
Private MyData As My_data_struct
Private MyData2 As My_data_struct
Private l_active_program As Int32 ' /* active CNC program number */
Private l_GFunction As Int32 ' /* G functions running */
Private n_BlocExe As UInt16 ' ; /* current block number */
Private n_ProgError As Int16 ' ; /* CNC error number detected */
Private n_BlocError As UInt16 ' ; /* block number where the error was detected */
Private n_Tool As UInt16 ' ; /* current tool number (T) */
Private n_Direction As UInt16 ' ; /* current tool direction */
Private n_Corrector As UInt16 ' ; /* current tool offset number (D) */
Private n_LeftFunct As UInt16 ' ; /* functions to be executed after current movement (see LADDER documentation) */
Private n_ErrorNumber As UInt16 ' //Error number
Private n_ErrorBlockNum As UInt16 ' //Block number in error
Private n_ReadStatus As UInt16 ' //Read Status: 0x0F=end of message 0x06=follow-up
Private n_MsgSize As UInt16 ' //Number of characters in the message
Private MsgTab(123) As Byte ' //Message read
#End Region
#Region " DLL import"
Declare Function SetPLCTool Lib "LIB_UNIT2.DLL" (ByVal chinit As String) As Int16
Declare Function Get_Port Lib "LIB_UNIT2.DLL" (ByRef Port As Int16) As Int16
Declare Function Free_Port Lib "LIB_UNIT2.DLL" (ByVal Port As Int16) As Int16
Declare Function Close_Unite Lib "LIB_UNIT2.DLL" () As Int16
Declare Function WriteObjectVarious2 Lib "dnc2.DLL" (ByVal Port As Int16, ByVal qui As UInt16, ByRef pData As Int32) As Int16
Declare Function ReadObjectVarious2 Lib "dnc2.DLL" (ByVal Port As Int16, ByVal qui As UInt16, ByRef pData As Int32, ByVal Mode As UInt16) As Int16
' Declare Function WriteLadderVar Lib "dnc2.DLL" (ByVal Port As Int16, ByVal qui As UInt16, ByVal num As Int16, ByVal Nb As Int16, ByRef pData As Int32) As Int16
Declare Function StartNC Lib "dnc2.dll" (ByVal Port As Int16) As Int16
Declare Function StopNC Lib "dnc2.dll" (ByVal Port As Int16) As Int16
Declare Function InitNC Lib "dnc2.dll" (ByVal Port As Int16) As Int16
Declare Function WriteTool Lib "dnc2.dll" (ByVal Port As Int16, ByVal number As Integer, ByVal Quantity As Integer, AdrData As tCorOutil) As Int16
Declare Function ReadTool Lib "dnc2.dll" (ByVal Port As Int16, ByVal number As Integer, ByVal Quantity As Integer, ByRef d As My_data_struct, ByVal Mode As UInt16) As Int16
Declare Function DNC20_DialWithModes_2 Lib "dnc20_2.dll" (ByVal Port As Int16, ByVal pstring As String, ByVal Mode As UInt16) As Int16
Declare Function DNC20_Spindle Lib "dnc20_2.dll" (ByVal Port As Int16, ByVal Group As Int16, ByRef pData As tDNC20_Spindle, ByVal Mode As UInt16) As Int16
Declare Function ReadLadderVar Lib "dnc2.DLL" (ByVal Port As Int16, ByVal qui As UInt16, ByVal num As UInt16, ByVal Nb As UInt16, ByRef d As My_data_struct, ByVal Mode As UInt16) As Int16
Declare Function UpLoadFile Lib "dnc2.dll" (ByVal Port As Int16, ByVal prog As Int32, ByVal filename As String) As Int16
Declare Function DownLoadFile Lib "dnc2.dll" (ByVal Port As Int16, ByVal prog As Int32, ByVal filename As String) As Int16
Declare Function DownLoadFileAsyn Lib "dnc2.dll" (ByVal Port As Int16, ByVal prog As Int32, ByVal ringsize As Int32, ByVal filename As String, ByVal Mode As UInt16, ByRef Index As UInt16) As Int16
Declare Function DownLoadPPPFile Lib "dnc2.dll" (ByVal Port As Int16, ByVal prog As Int32, ByVal ringsize As Int32, ByVal filename As String) As Int16
Declare Function DownLoadPPPFile2 Lib "dnc2.dll" (ByVal Port As Int16, ByVal prog As Int32, ByVal ringsize As Int32, ByVal filename As String, ByVal Offset As Int16, ByVal Mode As UInt16, ByRef Index As UInt16) As Int16
Declare Function DncDeleteFile Lib "dnc2.dll" (ByVal Port As Int16, ByVal prog As Int32) As Int16
Declare Function DNC20_Position_OM Lib "dnc20_2.dll" (ByVal Port As Int16, ByVal Groupe As Int16, ByRef d As My_data_struct, ByVal Mode As UInt16) As Int16
Declare Function DNC20_Position_OP Lib "dnc20_2.dll" (ByVal Port As Int16, ByVal Groupe As Int16, ByRef d As My_data_struct, ByVal Mode As UInt16) As Int16
Declare Function ReadObjectVarious4 Lib "dnc2.dll" (ByVal Port As Int16, ByVal qui As UInt16, ByVal Prem As UInt16, ByVal Quantity As UInt16, ByRef d As My_data_struct, ByVal Mode As UInt16) As Int16
Declare Function WriteObjectVarious4 Lib "dnc2.dll" (ByVal Port As Int16, ByVal qui As UInt16, ByVal Prem As UInt16, ByVal Quantity As UInt16, ByRef d As My_data_struct) As Int16
Declare Function DNC20_ReadExxxxx Lib "dnc20_2.dll" (ByVal Port As Int16, ByVal Group As UInt16, ElemNb As Int16, ByRef DataList As tDNC20_ObjectList, ByRef Data As Int32, ByVal Mode As UInt16) As Int16
Declare Function DNC20_ReadLxxx Lib "dnc20_2.dll" (ByVal Port As Int16, ByVal Group As UInt16, ElemNb As Int16, ByRef DataList As tDNC20_ObjectList, ByRef Data As Single, ByVal Mode As UInt16) As Int16
Declare Function ReadMemoryFree Lib "dnc2.dll" (ByVal port As Int16, ByRef pData As Long, ByVal zone As Int16) As Int16
Declare Function ReadProgStatus Lib "dnc2.dll" (ByVal port As Int16, ByVal PremGr As Int16, ByVal NbGr As Int16, ByRef d As My_data_struct, ByVal Mode As Int16) As Int16
Declare Function DNC40_ReadCncError Lib "dnc40_2.dll" (ByVal Port As Int16, ByVal Group As UInt16, ByVal ErrorLineNum As Int16, ByRef d As My_data_struct, ByVal Mode As Int16) As Int16
Declare Function InterpoState Lib "dnc2.dll" (ByVal port As Int16, ByVal Group As Int16, ByVal GroupNB As Int16, ByRef d As My_data_struct, ByVal Mode As Int16) As Int16
#End Region
#Region " Constructor"
Sub New()
n_state = 0
sz_NC_error_messages = New List(Of String)
End Sub
Public Overrides Function Init() As Boolean
n_state = 0
' Stringhe valide : "COM" o "XIP01, 0, 10, 0, 0, 0"
Dim nret As Integer = NC_connect(m_szCnDataVar(CnData.Comm))
EgtOutLog(" -> Risultato apertura connessione: " & nret)
If nret <> 0 Then Return False
n_state = 2
' Create a timer and set an half second interval.
aTimer = New System.Timers.Timer()
Dim nRefresh As Integer = 200
Dim nTemp As Integer
If Integer.TryParse(m_szCnDataVar(CnData.Refresh), nTemp) Then
nRefresh = nTemp
End If
aTimer.Interval = nRefresh
' Hook up the Elapsed event for the timer.
AddHandler aTimer.Elapsed, AddressOf OnTimedEvent
aTimer.AutoReset = True ' Have the timer fire repeated events (true is the default)
aTimer.Enabled = True ' Start the timer
Return n_state >= 2
End Function
Private Sub OnTimedEvent(source As Object, e As System.Timers.ElapsedEventArgs)
If Not b_busy Then
aTimer.Enabled = False
b_busy = True
nCount += 1
Read_machine_pos() ' leggo posizioni assi
If nCount = 2 Or nCount = 4 Then
timer_read_var() ' leggo un mucchio di variabili in un colpo solo
End If
If nCount = 4 Then
nCount = 0
get_errors() ' leggo eventueli errori PLC e CN
End If
b_busy = False
aTimer.Enabled = True
End If
End Sub
Function NC_connect(sz_connect_string As String) As Int16
Dim nret As Int16
Dim msga As String
'nret = SetPLCTool("XIP01, 0, 10, 0, 0, 0")
'nret = SetPLCTool("COM")
nret = SetPLCTool(sz_connect_string)
If nret <> 0 Then
msga = "Communication not available (SetPLCTool) : " & nret.ToString & " - " & sz_connect_string
EgtOutLog(msga)
End If
'Richiedo porta comunicazione PC-CN 2
' iport2 = 1
nret = Get_Port(n_portNC)
If nret <> 0 Then
msga = " Port not available (Get_Port) : " & nret.ToString
EgtOutLog(msga)
End If
nret = Get_Port(n_PPport)
If nret <> 0 Then
msga = " PP Port not available (Get_Port) : " & nret.ToString
EgtOutLog(msga)
Else
EgtOutLog("PP Port available: " & n_PPport.ToString)
End If
' eventualmente aggiungere apertura porta per PPP
'iport3 = 3
'nret = Get_Port(iport3)
global_state = eStateType.READY
Return nret
End Function
Function NC_disconnect() As Int16
If VerifyBusy() <> eStateType.READY Then
Return global_state
End If
Dim nret As Int16 = Free_Port(n_portNC)
nret = Free_Port(n_PPport)
global_state = eStateType.NOT_INIT
Return nret
End Function
#End Region
Function timer_read_var() As Int16
Const FIRST_GROUP As Int16 = 0, N_GROUPS As Int16 = 1
Dim nret As Int16 = -1
If global_state <> eStateType.READY Then
Return global_state
End If
global_state = eStateType.BUSY
' Lettura variabile %V6003
iFirstVar = &H6003
nret = ReadLadderVar(n_portNC, VBY, iFirstVar, 1, MyData, SYN)
If nret = 0 Then
Var6003 = MyData.data(0)
End If
' Lettura variabili da %V600A.B a %V600D.B tramite un solo accesso in memoria per %V600A.B e lettura di 4 in serie
iFirstVar = &H600A
nret = ReadLadderVar(n_portNC, VBY, iFirstVar, 5, MyData, SYN)
If nret = 0 Then
Var600A = MyData.data(0) ' Feed_override
Var600B = MyData.data(1) ' spindle_override
Var600C = MyData.data(2)
Var600D = MyData.data(3) ' active_mode
Var600E = MyData.data(4)
b_feed_changed = True
d_DInterpo_Feed_override = Math.Round(Var600A * 120.0 / 255, 0)
b_spindle_data_changed = True
n_spindle_override(0) = CShort(Math.Round((Var600B * 50 / 255) + 50))
End If
' Lettura variabile assorbimento mandrino ( %V250F )
iFirstVar = &H250F
nret = ReadLadderVar(n_portNC, VW, iFirstVar, 1, MyData, SYN)
If nret = 0 Then
d_spindle_power = CDbl(BitConverter.ToInt16(MyData.data, 0)) / 10.0
End If
' Lettura potenziometro F override......
' Type tInterpo
' FeedMes1 As Integer '; /* not used */
' FeedMes2 As Integer '; /* internal unit per NC sampling time */
' Distance As Long '; /* to go on the path */
' FeedProg As Long ';
' Override As Long '; /* 16 LSB used */
' End Type
nret = InterpoState(n_portNC, FIRST_GROUP, N_GROUPS, MyData, SYN)
If nret <> 0 Then
Dim sMsg As String = "Error in InterpoState : " & nret.ToString
EgtOutLog(sMsg)
End If
' FeedMes1 = BitConverter.ToInt16(MyData.data, 0))
' FeedMes2 = BitConverter.ToInt16(MyData.data, 2)) '/* internal unit per NC sampling time */
' Distance = BitConverter.ToInt32(MyData.data, 4)) '/* to go on the path */
' FeedProg = BitConverter.ToInt32(MyData.data, 8))
' Override = BitConverter.ToInt32(MyData.data, 12)) /* 16 LSB used */
'e non gestiamo il caso del numero negativo.......
d_DInterpo_Prog_Feed = CDbl(BitConverter.ToUInt16(MyData.data, 10)) ' sembrerebbero i due bytes più alti del long ...??
' Lettura variabile S effettiva
iFirstVar = &H2600
nret = ReadLadderVar(n_portNC, VL, iFirstVar, 1, MyData, SYN)
If nret = 0 Then
d_spindle_eff(0) = CDbl(BitConverter.ToInt32(MyData.data, 0)) ' progr. Feed
End If
' Lettura variabili da %V6010.L a %V601C.L
iFirstVar = &H6010
nret = ReadLadderVar(n_portNC, VL, iFirstVar, 4, MyData, SYN)
If nret = 0 Then
var6010L = BitConverter.ToInt32(MyData.data, 0) ' progr. Feed
var6014L = BitConverter.ToInt32(MyData.data, 4) ' progr. speed
var6018L = BitConverter.ToInt32(MyData.data, 8)
var601CL = BitConverter.ToInt32(MyData.data, 12)
End If
' d_DInterpo_Prog_Feed = CDbl(var6010L) ' sembrerebbe non buona letta da qua ...
d_spindle_prog(0) = CDbl(var6014L)
' Lettura variabili da %V6020.L a %V602C.L
iFirstVar = &H6020
nret = ReadLadderVar(n_portNC, VL, iFirstVar, 4, MyData, SYN)
If nret = 0 Then
var6020L = BitConverter.ToInt32(MyData.data, 0)
var6024L = BitConverter.ToInt32(MyData.data, 4) ' potenziometro tablet
var6028L = BitConverter.ToInt32(MyData.data, 8) ' disponibile
var602CL = BitConverter.ToInt32(MyData.data, 12) ' disponibile
End If
global_state = eStateType.READY
Return nret
End Function
Private Function set_NC_mode(n_mode As Integer) As Int16
Dim nret As Int16 = -1
If VerifyBusy() <> eStateType.READY Then
Return global_state
End If
global_state = eStateType.BUSY
nret = WriteObjectVarious2(n_portNC, Mode, n_mode) ' 0 AUTO 1 SEQUENZIALE 2 IMD 7 MANUALE
If nret <> 0 Then
EgtOutLog("Error in set_NC_mode(" & n_mode.ToString() & ") : " & nret.ToString())
Else
EgtOutLog("set_NC_mode(" & n_mode.ToString() & ") : " & nret.ToString() & " -> ok")
End If
global_state = eStateType.READY
Return nret
End Function
Private Function set_MDI_command(sz_command As String) As Int16
Dim nret As Int16 = -1
Dim nret2 As Int16 = -1
Dim nret3 As Int16 = -1
If VerifyBusy() <> eStateType.READY Then
Return global_state
End If
global_state = eStateType.BUSY
nret = WriteObjectVarious2(n_portNC, Mode, MDI_M) ' SELEZIONE MODO IMD
If nret = 0 Then
nret2 = DNC20_DialWithModes_2(n_portNC, sz_command, SYN) ' PASSO IL COMANDO SU UN BUFFER
If nret2 = 0 Then
nret3 = StartNC(n_portNC) ' DO IL CICLO
If nret3 = 0 Then
nret = WriteObjectVarious2(n_portNC, Mode, MANUAL_M) ' ' SELEZIONO MODO MANUALE
Else
nret = nret3 + 3000S ' codice di errore della StartNC
End If ' If nret3 = 0
Else
nret = nret2 + 2000S ' codice di errore della DNC20_DialWithModes_2
End If ' If nret2 = 0
End If ' If nret = 0
global_state = eStateType.READY
Return nret
End Function
Function Read_machine_pos() As Int16
Dim nret As Int16
Dim i, n As Integer
If global_state <> eStateType.READY Then
Return global_state
End If
global_state = eStateType.BUSY
If b_OM_pos Then ' quote rispetto a 0 Macchina
nret = DNC20_Position_OM(n_portNC, 0, MyData, SYN)
Else ' quote rispetto a 0 Pezzo
nret = DNC20_Position_OP(n_portNC, 0, MyData, SYN)
End If
If nret <> 0 Then
Dim sMsg As String = "Error in DNC20_Position_O* : " & nret.ToString
EgtOutLog(sMsg)
End If
For i = 0 To Math.Min(8, MAX_AXES) ' si possono leggere come massimo 9 assi 0 -> 8
n = i * 16
b_axis_valid(i) = (MyData.data(n) <> 0)
If b_axis_valid(i) Then
If i < A_AXIS Then
d_axis_position(i) = (BitConverter.ToInt32(MyData.data, n + 4)) / Vmminch ' X
d_axis_delta(i) = (BitConverter.ToInt32(MyData.data, n + 8)) / Vmminch
Else
d_axis_position(i) = (BitConverter.ToInt32(MyData.data, n + 4)) / NumCifreDecP4 ' A
d_axis_delta(i) = (BitConverter.ToInt32(MyData.data, n + 8)) / NumCifreDecP4
End If
End If
Next
If b_axis_events_enable Then
MyBase.OnNewPositionData()
MyBase.OnNewPosDeltaData()
End If
global_state = eStateType.READY
Return nret
End Function
#Region " Metodi pubblici"
Public Overrides Function Stop_Connection() As Boolean
If VerifyBusy() <> eStateType.READY Then
Dim sMsg As String = "Error in NC_disconnect : always busy"
EgtOutLog(sMsg)
End If
aTimer.Stop()
Dim nRet As Short = NC_disconnect()
If nRet <> 0 Then
Dim sMsg As String = "Error in NC_disconnect : " & nRet.ToString
EgtOutLog(sMsg)
End If
Return True
End Function
Public Overrides Sub ReadEls_Add_Parameter(sz_var As String, n_par As Short)
' Verifico accessibilità CN
If VerifyBusy() <> eStateType.READY Then
n_DReadELS_handle = 0
Return
End If
' Dichiaro CN occupato
global_state = eStateType.BUSY
Dim Ask As tDNC20_ObjectList
Select Case sz_var(0)
Case "E"(0)
Ask.ElemNum = CUShort(sz_var.Substring(1, 1))
Ask.First = CUShort(sz_var.Remove(0, 2))
Ask.Quantity = 1
Dim nVal As Int32
Dim nRet As Int16 = DNC20_ReadExxxxx(n_portNC, 0, 1, Ask, nVal, SYN)
If nRet = 0 Then
d_DReadELS_value = CDbl(nVal)
n_DReadELS_handle = n_par
End If
Case "L"(0)
Ask.ElemNum = 0
Ask.First = CUShort(sz_var.Remove(0, 1))
Ask.Quantity = 1
Dim fVal As Single
Dim nRet As Int16 = DNC20_ReadLxxx(n_portNC, 0, 1, Ask, fVal, SYN)
If nRet = 0 Then
d_DReadELS_value = CDbl(fVal)
n_DReadELS_handle = n_par
End If
Case Else
n_DReadELS_handle = 0
End Select
' Dichiaro CN libero
global_state = eStateType.READY
End Sub
'
' call DVariables_WriteVariables("E80000;E80001" , "1;2" )
'
Public Overrides Sub DVariables_WriteVariables(sz_parameters As String, sz_values As String)
End Sub
Public Overrides Sub DVariables_WriteVariables2(sz_parameters As String, sz_values As String)
End Sub
Public Overrides Function MDI_command() As Short
Dim nret As Int16 = set_MDI_command(sz_ManualDataInput)
If nret <> 0 Then
EgtOutLog("Error Execute MDI Command :" & nret.ToString())
End If
Return nret
End Function
'
' Activate program
' returns 0 = OK ; > 0 error
'
Public Overrides Function ActivateProgram(n_part_program As Integer) As Int16
Dim nret As Int16 = -1
If VerifyBusy() <> eStateType.READY Then
Return global_state
End If
global_state = eStateType.BUSY
nret = WriteObjectVarious2(n_portNC, Mode, AUTO_M) ' potrebbe essere anche modo 11 !
If nret = 0 Then
nret = WriteObjectVarious2(n_portNC, ACTIVE_PROG, n_part_program) ' notare : numero non moltiplicato * 10
End If
If nret <> 0 Then
EgtOutLog("Error in Activate program : " & nret.ToString())
End If
global_state = eStateType.READY
Return nret
End Function
'
' Set DPOsition Mode OP/OM
'
Public Overrides Sub set_OP_OM(n As Short)
b_OM_pos = (n = 0)
End Sub
'
' Read Once position
' returns 0 = OK ; > 0 error
'
Public Overrides Function DPOsition_ReadOnce() As Int16
Return 1
End Function
'
' Set Cycle Start
'
Public Overrides Function DGeneralFunctions_CycleStart() As Int16
Dim nret As Int16 = -1
If VerifyBusy() <> eStateType.READY Then
Return global_state
End If
global_state = eStateType.BUSY
nret = StartNC(n_portNC)
global_state = eStateType.READY
Return nret
End Function
'
' Set Feed Hold
'
Public Overrides Function DGeneralFunctions_FeedHold() As Int16
Dim nret As Int16 = -1
If VerifyBusy() <> eStateType.READY Then
Return global_state
End If
global_state = eStateType.BUSY
nret = StopNC(n_portNC)
global_state = eStateType.READY
Return nret
End Function
'
' Set NC Reset
'
Public Overrides Function DGeneralFunctions_Reset() As Int16
Dim nret As Int16 = -1
If VerifyBusy() <> eStateType.READY Then
Return global_state
End If
global_state = eStateType.BUSY
nret = InitNC(n_portNC)
global_state = eStateType.READY
Return nret
End Function
Public Overrides Function DGeneralFunctions_WriteCncMode(nmode As Short) As Int16
' Non controllare global_state, lo fa già la set_NC_mode
Return set_NC_mode(nmode)
End Function
Public Overrides Function Write_var_1(sz_par As String, lvalue As Long) As Int16
Dim nret As Int16 = -1
Dim n_what As UInt16
If VerifyBusy() <> eStateType.READY Then
Return global_state
End If
global_state = eStateType.BUSY
If sz_par = "E80000" Then ' !!! da sistemare per beccare anche gli altri indirizzi
n_what = E80000
MyData.data = BitConverter.GetBytes(lvalue)
nret = WriteObjectVarious4(n_portNC, n_what, 0, 1, MyData)
Else
nret = -997
End If
global_state = eStateType.READY
Return nret
End Function
'
' da PC a CN (sincrono)
'
Public Overrides Function Download_NC_prog(sz_PC_filename As String, sz_NC_filename As String) As Int16
' Verifico accessibilità CN
If VerifyBusy() <> eStateType.READY Then
EgtOutLog("Stato CN " & global_state.ToString)
Return global_state
End If
' Determino numero programma ( %900.0 -> 9000)
Dim l As Int32 = get_Num_prog_number(sz_NC_filename)
' verifico la dimensione del file
Dim myFile As New FileInfo(sz_PC_filename)
' determino dimensione file
Dim sizeInBytes As Long = myFile.Length
EgtOutLog(" --- Dimensione file CadCut " & sizeInBytes.ToString)
' Verifico se dimensione file è maggiore del Buffer
If sizeInBytes > 32000 Then
' Trasmetto il programma (PPPFile2)
EgtOutLog(" --- START DOWNLOAD PPP FILE --- ")
' Imposto la modalità AUTO
set_NC_mode(0)
' Dichiaro CN occupato
global_state = eStateType.BUSY
' Attesa opportuna
System.Threading.Thread.Sleep(1000)
' 90969=Drip feed has been started
m_nMsg = 90969
bIsDripFeed = True
' cambio lo sfondo del pulsante WorkBtn
If Not IsNothing(m_MainWindow.m_FrameCutPageUC) AndAlso Not IsNothing(m_MainWindow.m_FrameCutPageUC.m_ProjectMgr) Then
m_ProjectMng = m_MainWindow.m_FrameCutPageUC.m_ProjectMgr
ElseIf Not IsNothing(m_MainWindow.m_CadCutPageUC) AndAlso Not IsNothing(m_MainWindow.m_CadCutPageUC.m_ProjectMgr) Then
m_ProjectMng = m_MainWindow.m_CadCutPageUC.m_ProjectMgr
End If
If Not IsNothing(m_ProjectMng) Then
m_BackgroundOrig = m_ProjectMng.WorkBtn.Background
Dim MyLinearGradientBrush As LinearGradientBrush = Application.Current.FindResource("OmagCut_GradientYellow")
m_ProjectMng.WorkBtn.Background = MyLinearGradientBrush
End If
' avvio il timer per la lettura dei messaggi, imposto il clock a 1s
AddHandler m_RefreshTimer.Tick, AddressOf RefreshTimer_tick
m_RefreshTimer.Interval = TimeSpan.FromMilliseconds(1000)
m_RefreshTimer.Start()
Dim thread As New Thread(Sub()
Download_Drip_CN_prog(sz_PC_filename, sz_NC_filename)
End Sub)
thread.Start()
Return 1
Else
' Dichiaro CN occupato
global_state = eStateType.BUSY
' Trasmetto il programma (interamente)
Dim nRet As Int16 = DownLoadFile(n_portNC, l, sz_PC_filename)
If nRet <> 0 Then
EgtOutLog("Error in Download_NC_prog : " & nRet.ToString())
End If
' Dichiaro CN libero
global_state = eStateType.READY
Return nRet
End If
End Function
'
' da PC a CN (asincrono)
'
Private Function Download_Drip_CN_prog(sz_PC_filename As String, sz_NC_filename As String) As Int16
' Determino numero programma ( %900.0 -> 9000)
Dim l As Int32 = get_Num_prog_number(sz_NC_filename)
' Ultimo numero di segmento invaito
Dim i As UInt16
' Invia il primo segmento (dati comunicazione)
EgtOutLog(" -> Invia il primo segmento " & " -> PPport: " & n_PPport & " -> NC file name: " & sz_PC_filename & " -> Dnc Mode: " & DNC_MODE_FIRST)
Dim nRet As Int16 = DownLoadPPPFile2(n_PPport, l, 32768, sz_PC_filename, Nothing, DNC_MODE_FIRST, i)
' Inserisco un tempo di attesa di sicurezza
Thread.Sleep(100)
' Verifico che il primo invio sia andato a buon fine (il CN deve esser in modalità IN_PROGRESS oppure RING_BUFFER_FULL)
If nRet <> DNC_IN_PROGRES And nRet <> DNC_RING_BUFFER_FULL And m_MainWindow.m_IsClosingApplication <> 1 Then
' 90970=Drip feed has been failed (Error)
m_nMsg = -90970
EgtOutLog("Error in Download_NC_prog/DownLoadPPPFile : " & nRet.ToString())
Else
' 90969=Drip feed has been started (Info)
m_nMsg = 90969
' Se il primo invio è andato a buon fine allora invio i segmenti seguenti
While (nRet = DNC_IN_PROGRES Or nRet = DNC_RING_BUFFER_FULL) And m_MainWindow.m_IsClosingApplication <> 1
nRet = DownLoadPPPFile2(n_portNC, l, 32768, sz_PC_filename, Nothing, DNC_MODE_CONTINUE, i)
Thread.Sleep(10)
End While
End If
' Verifico che il processo sia terminato correttamente
If nRet <> 0 Then
' 90971=Drip feed hes been aborted (Error)
If m_nMsg > 0 Then
' se in precedenza non è stato generato un messaggio di errore (m_nMsg = -90970) comunico che il processo è stato interrotto
m_nMsg = -90971
End If
EgtOutLog("Error in Download_NC_prog/DownLoadPPPFile : " & nRet.ToString() & ", DownLoadPPPFile is aborted")
Else
' 90972=Drip feed has been ended (Info)
m_nMsg = 90972
End If
' prima di terminare (a prescinere dall'esito della comunicazione) forzo la terminazione
nRet = DownLoadPPPFile2(n_PPport, l, 32768, sz_PC_filename, Nothing, DNC_MODE_ABORT, i)
' Dichiaro CN libero
global_state = eStateType.READY
bIsDripFeed = False
EgtOutLog("IsDripFeed : " & bIsDripFeed.ToString)
EgtOutLog(" --- END DOWNLOAD PPP FILE --- ")
' se richiesta chiusura del programma, notifico che è stata chiusa correttmanete la comunicazione DripFeed
If m_MainWindow.m_IsClosingApplication = 1 Then
m_MainWindow.m_IsClosingApplication = 2
End If
' chiudo il thread aperto
Return nRet
End Function
'
' da CN a pc
'
Public Overrides Function Upload_NC_prog(sz_PC_filename As String, sz_NC_filename As String) As Int16
Dim nret As Int16 = -1
If VerifyBusy() <> eStateType.READY Then
Return global_state
End If
global_state = eStateType.BUSY
Dim l As Int32 = get_Num_prog_number(sz_NC_filename)
nret = UpLoadFile(n_portNC, l, sz_PC_filename)
global_state = eStateType.READY
Return nret
End Function
Private Function get_Num_prog_number(sz_in As String) As Int32
Dim sz_n As String = sz_in
Dim n_prog_num As Int32
If sz_n.Contains("%") Then sz_n = sz_n.Replace("%", "")
If sz_n.Contains(".") Then
sz_n = sz_n.Replace(".", "")
n_prog_num = CInt(sz_n)
Else
n_prog_num = 10 * CInt(sz_n)
End If
Return n_prog_num
End Function
Public Overrides Function Delete_NC_prog(sz_NC_filename As String) As Int16
Dim nret As Int16 = -1
If VerifyBusy() <> eStateType.READY Then
Return global_state
End If
global_state = eStateType.BUSY
Dim l As Int32 = get_Num_prog_number(sz_NC_filename)
nret = DncDeleteFile(n_portNC, l)
If nret <> 0 Then
EgtOutLog("Error in Delete_NC_prog : " & nret.ToString())
End If
global_state = eStateType.READY
Return nret
End Function
Public Overrides Function DTool_set_read_range(n_start As Short, n_stop As Short) As Int16
Dim nret As Int16 = -1
If VerifyBusy() <> eStateType.READY Then
Return global_state
End If
global_state = eStateType.BUSY
nret = ReadTool(n_portNC, n_start, 1, MyData, SYN)
If nret = RET_OK Then
Tools(0).lenght = 0 ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Tools(0).radius = 0
Tools(0).comp_num = 0
b_Tool_data_changed = True
End If
global_state = eStateType.READY
Return nret
End Function
Public Overrides Function DTool_write_tool(n_tool_number As Short, Length_X As Double, Radius As Double, TipRadius_Z As Double,
DLength_X As Double, DTipRadius_Z As Double,
nDirection As Short, nType As Short, nH As Integer) As Int16
Dim Tool As tCorOutil
Dim nret As Int16 = -1
If VerifyBusy() <> eStateType.READY Then
Return global_state
End If
global_state = eStateType.BUSY
' da rifare !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Tool.L_X = CLng(Length_X * 1000)
Tool.R_Radus = CLng(Radius * 1000)
Tool.RTore_Z = CLng(TipRadius_Z * 1000)
Tool.DL_DX = 0
Tool.DR_DZ = 0
Tool.Direc = 0
Tool.Type = 0
nret = WriteTool(n_portNC, n_tool_number, 1, Tool)
global_state = eStateType.READY
Return nret
End Function
Public Overrides Function get_free_memory(n_zone As Int16) As Long
'
'
' usare zona 0
'
Dim nret As Int16 = -1
Dim l_free_mem As Long
If VerifyBusy() <> eStateType.READY Then
Return global_state
End If
global_state = eStateType.BUSY
nret = ReadMemoryFree(n_portNC, l_free_mem, n_zone)
global_state = eStateType.READY
If nret = 0 Then
Return l_free_mem
Else
Return -9999
End If
End Function
Public Overrides Function read_active_mode() As Int16
Return (Var600D) ' es 0 = auto, ecc.
End Function
Public Overrides Function Is_G24_active() As Boolean
Return ((Var6003 And &H2) <> 0)
End Function
Public Overrides Function get_program_status() As Int16
Dim nret As Int16 = -1
If VerifyBusy() <> eStateType.READY Then
Return global_state
End If
global_state = eStateType.BUSY
nret = ReadProgStatus(n_portNC, 0, 1, MyData, SYN)
If nret = 0 Then
l_GFunction = BitConverter.ToInt32(MyData.data, 0)
l_active_program = BitConverter.ToInt32(MyData.data, 4)
n_BlocExe = CUShort(BitConverter.ToInt16(MyData.data, 8))
n_ProgError = BitConverter.ToInt16(MyData.data, 10)
n_BlocError = CUShort(BitConverter.ToInt16(MyData.data, 12))
n_Tool = CUShort(BitConverter.ToInt16(MyData.data, 14))
n_Direction = CUShort(BitConverter.ToInt16(MyData.data, 16))
n_Corrector = CUShort(BitConverter.ToInt16(MyData.data, 18))
n_LeftFunct = CUShort(BitConverter.ToInt16(MyData.data, 20))
End If
global_state = eStateType.READY
Return nret
End Function
Public Overrides Function get_plc_messages() As Int16
If VerifyBusy() <> eStateType.READY Then
Return global_state
End If
Return get_errors()
End Function
Private Function get_errors() As Int16
Const GROUP_ACTIVE As UInt16 = &HFFFF ' 0xFFFF=Groupe Actif
Const MORE_MESSAGES As UInt16 = 6
Const NO_MORE_MESSAGES As UInt16 = 15
Dim nret As Int16 = -1, i As Short = 0
Dim nErrorLineNum As Int16 = 0
Dim b_int_NC_error As Boolean = False
Dim szt As String = ""
If global_state <> eStateType.READY Then
Return global_state
End If
global_state = eStateType.BUSY
' PLC errors
b_PLC_error = False
SyncLock Me
sz_PLC_error_messages = "PLC Errors : "
End SyncLock
iFirstVar = &H7000 ' messaggio 0 " MACCHINA OK "
nret = ReadLadderVar(n_portNC, VBY, iFirstVar, 100, MyData, SYN) ' max 120 bytes....
If nret = 0 Then ' 253 = troppi dati
For i = 0 To 100 - 1
If MyData.data(i) <> 0 Then
b_PLC_error = True
SyncLock Me
sz_PLC_error_messages = sz_PLC_error_messages & " " & i.ToString
End SyncLock
End If
Next
iFirstVar = &H7000 + 100 ' messaggio 100
nret = ReadLadderVar(n_portNC, VBY, iFirstVar, 50, MyData2, SYN)
If nret = 0 Then ' 253 = troppi dati
For i = 0 To 50 - 1
If MyData2.data(i) <> 0 Then
b_PLC_error = True
SyncLock Me
sz_PLC_error_messages = sz_PLC_error_messages & " " & (i + 100).ToString
End SyncLock
End If
Next
End If
End If
'--------------------------------------------------------------------------
' Visualizzazione errore CN
b_NC_error = False
SyncLock Me
sz_NC_error_messages.Clear()
End SyncLock
b_int_NC_error = False
iFirstVar = &H3
nret = ReadLadderVar(n_portNC, R6, iFirstVar, 1, MyData, SYN)
If MyData.data(0) <> 0 Then
b_int_NC_error = True
End If
If b_int_NC_error Then
nErrorLineNum = 0
n_ReadStatus = MORE_MESSAGES
While (n_ReadStatus = MORE_MESSAGES)
nret = DNC40_ReadCncError(n_portNC, GROUP_ACTIVE, nErrorLineNum, MyData, SYN)
If nret = 0 Then
' ErrorNumber As Integer 'Numéro d'erreur
' ErrorBlockNum As Integer 'Numéro de bloc en erreur
' ReadStatus As Byte 'Status de lecture: 0x0F=pas de suite 0x06=suite
' MsgSize As Byte 'Nombre de caractères dans le message
' MsgTab As String * 122 'Message lu
n_ErrorNumber = CUShort(BitConverter.ToInt16(MyData.data, 0))
n_ErrorBlockNum = CUShort(BitConverter.ToInt16(MyData.data, 2))
n_ReadStatus = MyData.data(4)
n_MsgSize = MyData.data(5)
If n_ErrorNumber <> 0 Then
For i = 0 To CShort(n_MsgSize) - 1S
szt = szt & System.Convert.ToChar(MyData.data(i + 6))
Next
SyncLock Me
sz_NC_error_messages.Add(szt) ' add this message to the error message list
End SyncLock
End If
nErrorLineNum = nErrorLineNum + 1S
Else
n_ReadStatus = NO_MORE_MESSAGES
End If
End While
b_NC_error = True
End If ' any error
global_state = eStateType.READY
Return nret
End Function
Function VerifyBusy() As eStateType
For I As Integer = 0 To 150
If global_state <> eStateType.READY Then
System.Threading.Thread.Sleep(SLEEP_TIME)
Else
Exit For
End If
Next
EgtOutLog("eStateType: " & global_state.ToString & " -- if eStateType=0 it means READY")
Return global_state
End Function
#End Region
End Class
End Namespace