Files
Mapo-IOB-WIN/CMSCncLib/CNC/CNC.OSAI/CNC.OSAI.vb
T
2018-11-19 19:38:38 +01:00

913 lines
47 KiB
VB.net

Imports Microsoft.Win32
Imports T_memType = System.Collections.Generic.Dictionary(Of System.Int32, System.Collections.Generic.Dictionary(Of System.Int32, System.Object))
Imports T_memDim = System.Collections.Generic.Dictionary(Of System.Int32, System.Object)
Imports CMSCncLib.Config.Settings
Namespace CNC
Partial Public Class OSAI
Inherits CNC
'Variabili per server Cndex (Osai)
Protected _szRemoteName As String
Protected _UserSession As Short
Protected _ErrClass As Integer
Protected _ErrNum As Integer
'Friend Cndex As CndexLinkDotNet.Cndex
Private nReturn As Short
Protected Const ERRORE = 0
Public Enum MemTypeWord
I_CODE = 0
O_CODE = 1
MW_CODE = 20
GW_CODE = 21
SW_CODE = 22
PW_CODE = 62
UW_CODE = 63
End Enum
Public Enum MemTypeDouble
MD_CODE = 40
GD_CODE = 41
SD_CODE = 42
PD_CODE = 43
UD_CODE = 44
L_CODE = 145
End Enum
Public Enum MemTypeText
LS_CODE = 18
AA_CODE = 28
A_CODE = 45
SC_CODE = 50
SYMO_A_CODE = 102
End Enum
Private nLicenzaTmp As Integer
Public Overrides Property Licenza() As Integer
Get
Return nLicenzaTmp
End Get
Set(ByVal value As Integer)
nLicenzaTmp = value
End Set
End Property
Private bLicenzaScadutaTmp As Boolean
Public Overrides Property LicenzaScaduta() As Boolean
Get
Return bLicenzaScadutaTmp
End Get
Set(ByVal value As Boolean)
bLicenzaScadutaTmp = value
End Set
End Property
Public Sub New(ByRef szRemoteName As String)
Me.New()
Try
'Cndex = New CndexLinkDotNet.Cndex
Catch ex As Exception
MsgBox(ex.Message)
End Try
_szRemoteName = szRemoteName
End Sub
Public Sub New()
MyBase.New()
_Type = NcType.OSAI
'Inizializzo le variabili
Me._Descrizione = "NC OSAI" & vbNewLine
Me._Descrizione = Me._Descrizione & "RemoteName: " & _szRemoteName
End Sub
Public Overrides Sub Connect(Optional ByRef szStatus As String = "")
Dim nReturn As Short
Dim pPhase As Short
Dim szReturn As String = ""
Dim sValue(0) As Short
Dim TimeStart As Date
'CMSCncLib.App.Runtime.Log.WI("TRY OpenSession CNC.OSAI", "RemoteName=" & _szRemoteName, CLog.Lev.Secondary)
'nReturn = Cndex.OpenSession_C(_szRemoteName, _UserSession, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("OpenSession_C({0},{1}) Connect CNC.OSAI", _szRemoteName, _UserSession), szReturn) Then
Throw New CmsNcException(szReturn)
Else
'CMSCncLib.App.Runtime.Log.WI("OK OpenSession CNC.OSAI", , CLog.Lev.Secondary)
'leggo in che fase di boot mi trovo
'nReturn = Cndex.BootPhaseEnquiry_C(_UserSession, pPhase, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("BootPhaseEnquiry_C({0},{1}) Connect CNC.OSAI", _UserSession, pPhase), szReturn) Then
_bConnected = False
Throw New CmsNcException(szReturn)
Else
'verifico che il sistema si trovi in una fase operativa "stabile"
'CMSCncLib.App.Runtime.Log.WI("OK BootPhaseEnquiry CNC.OSAI", "Phase=" & pPhase, CLog.Lev.Secondary)
If pPhase = 4 Then 'SYSTEM_UP_PHASE
'leggo matricola e verifico che sia diversa da zero
TimeStart = Now
Do
Select Case Settings.MemoryMapping
Case MemoryMapping.ElsManager,
MemoryMapping.Default
'Matricola
nReturn = O_RW_Short(False, MemTypeWord.MW_CODE, 3187, sValue)
Case MemoryMapping.ToolManager,
MemoryMapping.ToolTable
'Matricola
nReturn = O_RW_Short(False, MemTypeWord.MW_CODE, 3403, sValue)
End Select
If sValue(0) > 0 Then
Threading.Thread.Sleep(500)
Exit Do
End If
If (Now - TimeStart).Seconds > 30 Then
Select Case MsgBox("Matricola non inizializzata in 30 secondi: Verificare CMSKMG o PLC", MsgBoxStyle.Exclamation + MsgBoxStyle.RetryCancel)
Case MsgBoxResult.Retry : TimeStart = Now
Case MsgBoxResult.Cancel : Exit Do
End Select
End If
'CMSCncLib.App.Runtime.Log.WI("OK Connect CNC.OSAI but SERIAL NUMBER NOT YET INITIALIZED", , CLog.Lev.Secondary)
'Application.DoEvents()
Threading.Thread.Sleep(500) 'aspetto 500ms prima di ritentare
'Application.DoEvents()
Loop
_bConnected = True
'CMSCncLib.App.Runtime.Log.WI("OK Connect CNC.OSAI", "Connected=" & _bConnected, CLog.Lev.Secondary)
Else
_bConnected = False
'CMSCncLib.App.Runtime.Log.WI("OK Connect CNC.OSAI but PHASE NOT OK", "Phase=" & pPhase & " Connected=" & _bConnected, CLog.Lev.Secondary)
Throw New CmsNcException("ERR BootPhase NOT OK CNC.OSAI")
End If
End If
End If
End Sub
Public Overrides Sub Disconnect(Optional ByRef szStatus As String = "")
Dim nReturn As Short
Dim bRet As Boolean
Dim szReturn As String = ""
'chiudo la sessione
'nReturn = Cndex.CloseSession_C(_UserSession, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("CloseSession_C({0}) Disconnect CNC.OSAI", _UserSession), szReturn) Then
_bConnected = False '?
bRet = False
Throw New CmsNcException(szReturn)
Else
_bConnected = False
bRet = True
End If
End Sub
''' <summary>
''' Legge le memorie di configurazione dal cn
''' </summary>
Public Overrides Sub GetStaticData()
Dim sValue(0) As Short
If Not bStaticDataReaded Then
'Try
Select Case Settings.MemoryMapping
Case MemoryMapping.ElsManager,
MemoryMapping.Default
'Matricola
'nReturn = Cndex.ReadVarWord_C(_UserSession, Cndex.MW_CODE, 0, 3187, 1, sValue, _ErrClass, _ErrNum)
If nReturn = ERRORE Then
'CMSCncLib.App.Runtime.Log.WW("ERR GetStaticData CNC.OSAI", "Return=" & nReturn & " ErrClass=" & _ErrClass & " ErrNum=0x" & Hex(_ErrNum))
Else
Me._Matricola = sValue(0)
End If
'Teste
'nReturn = Cndex.ReadVarWord_C(_UserSession, Cndex.MW_CODE, 0, 3161, 1, sValue, _ErrClass, _ErrNum)
If nReturn = ERRORE Then
'CMSCncLib.App.Runtime.Log.WW("ERR GetStaticData CNC.OSAI", "Return=" & nReturn & " ErrClass=" & _ErrClass & " ErrNum=0x" & Hex(_ErrNum))
Else
Me._Teste = sValue(0)
End If
'Magazzini
'nReturn = Cndex.ReadVarWord_C(_UserSession, Cndex.MW_CODE, 0, 3163, 1, sValue, _ErrClass, _ErrNum)
If nReturn = ERRORE Then
'CMSCncLib.App.Runtime.Log.WW("ERR GetStaticData CNC.OSAI", "Return=" & nReturn & " ErrClass=" & _ErrClass & " ErrNum=0x" & Hex(_ErrNum))
Else
Me._Magazzini = sValue(0)
End If
'Manine per Magazzino
ReDim Me._ManineMagazzino(Me._Magazzini - 1)
For i = 1 To Me._Magazzini
If i <= 8 Then
'nReturn = Cndex.ReadVarWord_C(_UserSession, Cndex.MW_CODE, 0, 3164 + (i - 1), 1, sValue, _ErrClass, _ErrNum)
If nReturn = ERRORE Then
'CMSCncLib.App.Runtime.Log.WW("ERR GetStaticData CNC.OSAI", "Return=" & nReturn & " ErrClass=" & _ErrClass & " ErrNum=0x" & Hex(_ErrNum))
Else
Me._ManineMagazzino(i - 1) = sValue(0)
End If
Else '8-20
'nReturn = Cndex.ReadVarWord_C(_UserSession, Cndex.MW_CODE, 0, 3188 + (i - 1), 1, sValue, _ErrClass, _ErrNum)
If nReturn = ERRORE Then
'CMSCncLib.App.Runtime.Log.WW("ERR GetStaticData CNC.OSAI", "Return=" & nReturn & " ErrClass=" & _ErrClass & " ErrNum=0x" & Hex(_ErrNum))
Else
Me._ManineMagazzino(i - 1) = sValue(0)
End If
End If
Next i
Case MemoryMapping.ToolManager,
MemoryMapping.ToolTable
'Matricola
'nReturn = Cndex.ReadVarWord_C(_UserSession, Cndex.MW_CODE, 0, 3403, 1, sValue, _ErrClass, _ErrNum)
If nReturn = ERRORE Then
'CMSCncLib.App.Runtime.Log.WW("ERR GetStaticData CNC.OSAI", "Return=" & nReturn & " ErrClass=" & _ErrClass & " ErrNum=0x" & Hex(_ErrNum))
Else
Me._Matricola = sValue(0)
End If
'Teste
'nReturn = Cndex.ReadVarWord_C(_UserSession, Cndex.MW_CODE, 0, 3405, 1, sValue, _ErrClass, _ErrNum)
If nReturn = ERRORE Then
'CMSCncLib.App.Runtime.Log.WW("ERR GetStaticData CNC.OSAI", "Return=" & nReturn & " ErrClass=" & _ErrClass & " ErrNum=0x" & Hex(_ErrNum))
Else
Me._Teste = sValue(0)
End If
'Magazzini
'nReturn = Cndex.ReadVarWord_C(_UserSession, Cndex.MW_CODE, 0, 3407, 1, sValue, _ErrClass, _ErrNum)
If nReturn = ERRORE Then
'CMSCncLib.App.Runtime.Log.WW("ERR GetStaticData CNC.OSAI", "Return=" & nReturn & " ErrClass=" & _ErrClass & " ErrNum=0x" & Hex(_ErrNum))
Else
Me._Magazzini = sValue(0)
End If
'Manine per Magazzino
Dim bPari As Boolean
Dim nTmp As Integer
ReDim Me._ManineMagazzino(Me._Magazzini - 1)
If Me._Magazzini Mod 2 = 0 Then 'pari
bPari = True
nTmp = Me._Magazzini / 2
Else 'dispari
nTmp = Int(Me._Magazzini / 2) + 1
End If
For i = 1 To nTmp
'nReturn = Cndex.ReadVarWord_C(_UserSession, Cndex.MW_CODE, 0, 5520 + (i - 1), 1, sValue, _ErrClass, _ErrNum)
Me._ManineMagazzino(i * 2 - 2) = ShortToByte(sValue(0), LOW_ORDER)
If Not (Not bPari And i = nTmp) Then Me._ManineMagazzino(i * 2 - 1) = ShortToByte(sValue(0), HIGH_ORDER)
Next i
End Select
Me._MaxUtensiliGestibili = 300 'TODO IMPLEMENTARE
Me._MaxIdUtensile = 300 'TODO IMPLEMENTARE
'ZoomSpeed
Select Case Settings.MemoryMapping
Case MemoryMapping.ElsManager
O_RW_Short(R, MemTypeWord.MW_CODE, 3921, sValue)
Case MemoryMapping.ToolManager
O_RW_Short(R, MemTypeWord.MW_CODE, 5670, sValue)
Case MemoryMapping.ToolTable
O_RW_Short(R, MemTypeWord.MW_CODE, 3425, sValue)
End Select
If sValue(0) > 0 And sValue(0) <= 100 Then
Me._ZoomSpeed = sValue(0)
Else
Me._ZoomSpeed = 1
End If
bStaticDataReaded = True
'Catch ex As CmsNcException
' Me.CncException(ex.Message)
'End Try
End If
End Sub
''' <summary>
''' Legge o scrive Boolean da MEMORIE PLC
''' </summary>
''' <param name="bWrite">Se True SCRIVE, se False LEGGE</param>
''' <param name="MemType">Tipo di memoria Osai</param>
''' <param name="MemIndex">Indice di memoria</param>
''' <param name="MemBit">Bit della memoria</param>
''' <param name="Value">Valore da scrivere su scrittura e letto su lettura</param>
''' <returns>True se andata a buon fine</returns>
Public Overridable Overloads Function O_RW_Boolean(ByVal bWrite As Boolean, ByVal MemType As MemTypeWord, ByVal MemIndex As Integer, ByVal MemBit As Integer, ByRef Value As Boolean) As Boolean
Dim szReturn As String = ""
Dim nValue(0) As Short
'leggo la memoria
'nReturn = Cndex.ReadVarWord_C(_UserSession, MemType, 0, MemIndex, nValue.Length, nValue, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("ReadVarWord_C({0},{1},{2}) O_RW_Boolean CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException(szReturn)
Return False
Else
If bWrite Then ' *** Write
If Value Then 'True
nValue(0) = nValue(0) Or UnsignedToShort(2 ^ MemBit)
Else 'False
nValue(0) = nValue(0) And Not UnsignedToShort(2 ^ MemBit)
End If
'nReturn = Cndex.WriteVarWord_C(_UserSession, MemType, 0, MemIndex, nValue.Length, nValue, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("WriteVarWord_C({0},{1},{2}) O_RW_Boolean CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException(szReturn)
Return False
End If
Else ' ************* Read
If (nValue(0) And (2 ^ MemBit)) = (2 ^ MemBit) Then 'True
Value = True
Else 'False
Value = False
End If
End If
End If
Return True
End Function
''' <summary>
''' Legge o scrive Byte da MEMORIE PLC
''' </summary>
''' <param name="bWrite">Se True SCRIVE, se False LEGGE</param>
''' <param name="MemType">Tipo di memoria Osai</param>
''' <param name="MemIndex">Indice di memoria</param>
''' <param name="MemOrderStart">Ordine di partenza LOW_ORDER = 0 HIGH_ORDER = 1</param>
''' <param name="Value">Matrice di valori da scrivere su scrittura o letti su lettura</param>
''' <returns>True se andata a buon fine</returns>
Public Overridable Overloads Function O_RW_Byte(ByVal bWrite As Boolean, ByVal MemType As MemTypeWord, ByVal MemIndex As Integer, ByVal MemOrderStart As Integer, ByRef Value() As Byte) As Boolean
Dim szReturn As String = ""
Dim bStartHigh As Boolean = MemOrderStart
Dim bEndDispari As Boolean = (Value.Length + MemOrderStart) Mod 2
Dim cStart, cEnd As Byte
Dim ValueTmp(((Value.Length + MemOrderStart) \ 2) + ((Value.Length + MemOrderStart) Mod 2) - 1) As Short
If bWrite Then ' *** Write
'se comincio con hi leggo la prima memo
If bStartHigh Then
Dim ValStartTmp(0) As Short
'nReturn = Cndex.ReadVarWord_C(_UserSession, MemType, 0, MemIndex, ValStartTmp.Length, ValStartTmp, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("ReadVarWord_C({0},{1},{2}) O_RW_Byte CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException(szReturn)
Return False
Else
cStart = ShortToByte(ValStartTmp(0), LOW_ORDER)
End If
End If
'se finisco dispari, leggo l'ultima memo
If bEndDispari Then
Dim ValEndTmp(0) As Short
'nReturn = Cndex.ReadVarWord_C(_UserSession, MemType, 0, MemIndex + ValueTmp.Length - 1, ValEndTmp.Length, ValEndTmp, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("ReadVarWord_C({0},{1},{2}) O_RW_Byte CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException(szReturn)
Return False
Else
cEnd = ShortToByte(ValEndTmp(0), HIGH_ORDER)
End If
End If
For i = 0 To ValueTmp.Length - 1
Dim cLow, cHigh As Byte
'Low
If i = 0 AndAlso bStartHigh Then
cLow = cStart
Else
cLow = Value(i * 2 - MemOrderStart)
End If
'High
If i = (ValueTmp.Length - 1) AndAlso bEndDispari Then
cHigh = cEnd
Else
cHigh = Value(i * 2 + 1 - MemOrderStart)
End If
ValueTmp(i) = ByteToShort(cLow, cHigh)
Next
'nReturn = Cndex.WriteVarWord_C(_UserSession, MemType, 0, MemIndex, Value.Length, ValueTmp, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("WriteVarWord_C({0},{1},{2}) O_RW_DWord CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException(szReturn)
Return False
End If
Else ' ************* Read
'nReturn = Cndex.ReadVarWord_C(_UserSession, MemType, 0, MemIndex, ValueTmp.Length, ValueTmp, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("ReadVarWord_C({0},{1},{2}) O_RW_Byte CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException(szReturn)
Return False
Else
For i = 0 To Value.Length - 1
Value(i) = ShortToByte(ValueTmp((i + MemOrderStart) \ 2), (i + MemOrderStart) Mod 2)
Next
End If
End If
Return True
End Function
''' <summary>
''' Legge o scrive Word da MEMORIE PLC
''' </summary>
''' <param name="bWrite">Se True SCRIVE, se False LEGGE</param>
''' <param name="MemType">Tipo di memoria Osai</param>
''' <param name="MemIndex">Indice di memoria</param>
''' <param name="Value">Matrice di valori da scrivere su scrittura o letti su lettura</param>
''' <returns>True se andata a buon fine</returns>
Public Overridable Overloads Function O_RW_Word(ByVal bWrite As Boolean, ByVal MemType As MemTypeWord, ByVal MemIndex As Integer, ByRef Value() As UShort) As Boolean
Dim szReturn As String = ""
Dim nValue(Value.Length - 1) As Short
If bWrite Then ' *** Write
For i = 0 To Value.Length - 1
nValue(i) = UnsignedToShort(Value(i))
Next
'nReturn = Cndex.WriteVarWord_C(_UserSession, MemType, 0, MemIndex, Value.Length, nValue, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("WriteVarWord_C({0},{1},{2}) O_RW_Word CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException(szReturn)
Return False
End If
Else ' ************* Read
'nReturn = Cndex.ReadVarWord_C(_UserSession, MemType, 0, MemIndex, Value.Length, nValue, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("ReadVarWord_C({0},{1},{2}) O_RW_Word CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException(szReturn)
Return False
End If
For i = 0 To Value.Length - 1
Value(i) = ShortToUnsigned(nValue(i))
Next
End If
Return True
End Function
''' <summary>
''' Legge o scrive Short da MEMORIE PLC
''' </summary>
''' <param name="bWrite">Se True SCRIVE, se False LEGGE</param>
''' <param name="MemType">Tipo di memoria Osai</param>
''' <param name="MemIndex">Indice di memoria</param>
''' <param name="Value">Matrice di valori da scrivere su scrittura o letti su lettura</param>
''' <returns>True se andata a buon fine</returns>
Public Overridable Overloads Function O_RW_Short(ByVal bWrite As Boolean, ByVal MemType As MemTypeWord, ByVal MemIndex As Integer, ByRef Value() As Short) As Boolean
Dim szReturn As String = ""
If bWrite Then ' *** Write
'nReturn = Cndex.WriteVarWord_C(_UserSession, MemType, 0, MemIndex, Value.Length, Value, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("WriteVarWord_C({0},{1},{2}) O_RW_Word CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException(szReturn)
Return False
End If
Else ' ************* Read
'nReturn = Cndex.ReadVarWord_C(_UserSession, MemType, 0, MemIndex, Value.Length, Value, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("ReadVarWord_C({0},{1},{2}) O_RW_Word CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException(szReturn)
Return False
End If
End If
Return True
End Function
''' <summary>
''' Legge o scrive DWord da MEMORIE PLC
''' </summary>
''' <param name="bWrite">Se True SCRIVE, se False LEGGE</param>
''' <param name="MemType">Tipo di memoria Osai</param>
''' <param name="MemIndex">Indice di memoria</param>
''' <param name="Value">Matrice di valori da scrivere su scrittura o letti su lettura</param>
''' <returns>True se andata a buon fine</returns>
Public Overridable Overloads Function O_RW_DWord(ByVal bWrite As Boolean, ByVal MemType As MemTypeWord, ByVal MemIndex As Integer, ByRef Value() As UInteger) As Boolean
Dim szReturn As String = ""
Dim ValueTmp(Value.Length * 2 - 1) As Short
If bWrite Then ' *** Write
For i = 0 To Value.Length - 1
ValueTmp(i * 2) = DWordToShort(Value(i), LOW_ORDER)
ValueTmp(i * 2 + 1) = DWordToShort(Value(i), HIGH_ORDER)
Next
'nReturn = Cndex.WriteVarWord_C(_UserSession, MemType, 0, MemIndex, ValueTmp.Length, ValueTmp, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("WriteVarWord_C({0},{1},{2}) O_RW_DWord CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException(szReturn)
Return False
End If
Else ' ************* Read
'nReturn = Cndex.ReadVarWord_C(_UserSession, MemType, 0, MemIndex, ValueTmp.Length, ValueTmp, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("ReadVarWord_C({0},{1},{2}) O_RW_DWord CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException(szReturn)
Return False
Else
For i = 0 To Value.Length - 1
Value(i) = ShortsToDWord(ValueTmp(i * 2), ValueTmp(i * 2 + 1))
Next
End If
End If
Return True
End Function
''' <summary>
''' Legge o scrive DWord da MEMORIE PLC
''' </summary>
''' <param name="bWrite">Se True SCRIVE, se False LEGGE</param>
''' <param name="MemType">Tipo di memoria Osai</param>
''' <param name="MemIndex">Indice di memoria</param>
''' <param name="Value">Matrice di valori da scrivere su scrittura o letti su lettura</param>
''' <returns>True se andata a buon fine</returns>
Public Overridable Overloads Function O_RW_Integer(ByVal bWrite As Boolean, ByVal MemType As MemTypeWord, ByVal MemIndex As Integer, ByRef Value() As Integer) As Boolean
Dim szReturn As String = ""
Dim ValueTmp(Value.Length * 2 - 1) As Short
If bWrite Then ' *** Write
For i = 0 To Value.Length - 1
ValueTmp(i * 2) = IntegerToShort(Value(i), LOW_ORDER)
ValueTmp(i * 2 + 1) = IntegerToShort(Value(i), HIGH_ORDER)
Next
'nReturn = Cndex.WriteVarWord_C(_UserSession, MemType, 0, MemIndex, ValueTmp.Length, ValueTmp, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("WriteVarWord_C({0},{1},{2}) O_RW_DWord CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException(szReturn)
Return False
End If
Else ' ************* Read
'nReturn = Cndex.ReadVarWord_C(_UserSession, MemType, 0, MemIndex, ValueTmp.Length, ValueTmp, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("ReadVarWord_C({0},{1},{2}) O_RW_DWord CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException(szReturn)
Return False
Else
For i = 0 To Value.Length - 1
Value(i) = ShortsToInteger(ValueTmp(i * 2), ValueTmp(i * 2 + 1))
Next
End If
End If
Return True
End Function
''' <summary>
''' Legge o scrive Double da MEMORIE PLC
''' </summary>
''' <param name="bWrite">Se True SCRIVE, se False LEGGE</param>
''' <param name="MemType">Tipo di memoria Osai</param>
''' <param name="MemIndex">Indice di memoria</param>
''' <param name="Value">Matrice di valori da scrivere su scrittura o letti su lettura</param>
''' <returns>True se andata a buon fine</returns>
Public Overridable Overloads Function O_RW_Double(ByVal bWrite As Boolean, ByVal MemType As MemTypeDouble, ByVal MemIndex As Integer, ByRef Value() As Double) As Boolean
Dim szReturn As String = ""
If bWrite Then ' *** Write
'nReturn = Cndex.WriteVarDouble_C(_UserSession, MemType, 0, MemIndex, Value.Length, Value, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("WriteVarDouble_C({0},{1},{2}) O_RW_Double CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException("ERR WriteVarDouble_C O_RW_Double CNC.OSAI")
Return False
End If
Else ' ************* Read
'nReturn = Cndex.ReadVarDouble_C(_UserSession, MemType, 0, MemIndex, Value.Length, Value, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("ReadVarDouble_C({0},{1},{2}) O_RW_Double CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException("ERR ReadVarDouble_C O_RW_Double CNC.OSAI")
Return False
End If
End If
Return True
End Function
''' <summary>
''' Legge o scrive Stringhe da MEMORIE SC
''' </summary>
''' <param name="bWrite">Se True SCRIVE, se False LEGGE</param>
''' <param name="MemIndex">Indice di memoria</param>
''' <param name="MemLength">Lunghezza caratteri</param>
''' <param name="Value">Stringa da scrivere su scrittura o leggere su lettura</param>
''' <returns>True se andata a buon fine</returns>
Public Overridable Overloads Function O_RW_Text(ByVal bWrite As Boolean, ByVal MemType As MemTypeText, ByVal MemIndex As Integer, ByVal MemLength As Integer, ByRef Value As String) As Boolean
Dim szReturn As String = ""
If bWrite Then ' *** Write
'nReturn = Cndex.WriteVarText_C(_UserSession, MemType, 1, MemIndex, MemLength, Value, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("WriteVarText_C({0},{1},{2}) O_RW_Text CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException("ERR WriteVarText_C O_RW_Text CNC.OSAI")
Return False
End If
Else ' ************* Read
'nReturn = Cndex.ReadVarText_C(_UserSession, MemType, 1, MemIndex, MemLength, Value, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, String.Format("ReadVarText_C({0},{1},{2}) O_RW_Text CNC.OSAI", [Enum].GetName(MemType.GetType, MemType), MemIndex, Value), szReturn) Then
Throw New CmsNcException("ERR ReadVarText_C O_RW_Text CNC.OSAI")
Return False
End If
End If
Return True
End Function
''' <summary>
''' Legge o scrive Length and Radius Offset da tabella Utensili CN
''' </summary>
''' <param name="bWrite">Se True SCRIVE, se False LEGGE</param>
''' <param name="ToolOffsetNumber">Numero dell'offset utensile</param>
Public Overridable Function O_RW_ToolOffset(ByVal bWrite As Boolean, ByVal ToolOffsetNumber As Integer, ByRef CutterRadius_Wear As Double, ByRef CutterRadius_Geometry As Double, ByRef ToolLenght_Wear As Double, ByRef ToolLenght_Geometry As Double) As Boolean
Return False
End Function
''' <summary>
''' Blocca l'accesso alla tabella dei correttori
''' </summary>
''' <param name="Lock">=True: Blocca la tabella, =False: Sblocca la tabella</param>
''' <returns>True se andata a buon fine</returns>
Public Overridable Function O_LockOffsetTable(ByVal Lock As Boolean) As Boolean
Return False
End Function
''' <summary>
''' Legge il numero del processo attivo
''' </summary>
''' <param name="ProcessId">Valore di ritorno del processo selezionato</param>
''' <returns>True se andata a buon fine</returns>
Public Overridable Overloads Function O_GetSelectedProcess(ByRef ProcessId As Short) As Boolean
Dim szReturn As String = ""
'nReturn = Cndex.GetSelectedProcess_C(_UserSession, ProcessId, _ErrClass, _ErrNum)
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, "GetSelectedProcess_C O_GetSelectedProcess CNC.OSAI", szReturn) Then
Throw New CmsNcException("ERR GetSelectedProcess_C O_GetSelectedProcess CNC.OSAI")
Return False
End If
Return True
End Function
''' <summary>
''' Legge la riga del programma attivo
''' </summary>
''' <param name="Line">Riga in esecuzione del programma attivo</param>
''' <returns>True se andata a buon fine</returns>
Public Overridable Overloads Function O_GetActiveLineProgram(ByRef Line As String) As Boolean
Dim szReturn As String = ""
Dim ProcessId As Integer
Dim szLine1 As String = ""
Dim szLine2 As String = ""
Dim szLine3 As String = ""
Dim szLine4 As String = ""
Dim szLine5 As String = ""
Dim szLine6 As String = ""
Dim szLine7 As String = ""
Dim szLine8 As String = ""
O_GetSelectedProcess(ProcessId)
'nReturn = Cndex.GetPartProgramLines_C(_UserSession, ProcessId, szLine1, szLine2, szLine3, szLine4, szLine5, szLine6, szLine7, szLine8, _ErrClass, _ErrNum)
Line = szLine2
If O_CheckRetError(nReturn, _ErrClass, _ErrNum, "GetPartProgramLines_C O_GetActiveLineProgram CNC.OSAI", szReturn) Then
Throw New CmsNcException("ERR GetPartProgramLines_C O_GetActiveLineProgram CNC.OSAI")
Return False
End If
Return True
End Function
''' <summary>
''' Legge la tabella assi
''' </summary>
''' <param name="ProcessId">Processo selezionato</param>
''' <param name="AxisTable">Valore di ritorno Assi del processo selezionato</param>
''' <returns>True se andata a buon fine</returns>
Public Overridable Function O_GetAxisTab(ByVal ProcessId As Short, ByRef AxisTable() As Char, ByRef AxisIdTable() As Short) As Boolean
Return True
End Function
Public Overridable Function O_CheckRetError(ByVal nReturn As Short, ByVal ErrClass As Long, ByVal ErrNum As Long, ByVal Position As String, Optional ByRef szReturn As String = "") As Boolean
Dim szErrorClassDesc As String = String.Empty
Dim szErrorDesc As String = String.Empty
'Cndex 3.1.2 messages
'' aggiornare dal manuale di programmazione 4606R.pdf
'' alcune classi di errori sono del cn e non sono specificate nel documento
If nReturn = 0 Then
'Seleziono il messaggio
Select Case ErrClass
Case 1
szErrorClassDesc = "COM error class"
Select Case ErrNum
Case &H80080005 : szErrorDesc = "CO_E_SERVER_EXEC_FAILURE"
Case &H800706BA : szErrorDesc = "RPC_S_SERVER_UNAVAILABLE"
Case &H80070005 : szErrorDesc = "E_ACCESSDENIED"
Case &H80040154 : szErrorDesc = "REGDB_E_CLASSNOTREG"
Case &H80012 : szErrorDesc = "CO_S_NOTALLINTERFACES"
End Select
szErrorDesc = "0x" & Hex(ErrNum) & ": " & szErrorDesc
Case 2
szErrorClassDesc = "SERVER error class"
Select Case ErrNum
Case 1 : szErrorDesc = "Memory for dynamic allocations insufficient"
Case 2 : szErrorDesc = "Impossible to create synchronisation events"
Case 3 : szErrorDesc = "Session aborted and no longer usable"
Case 4 : szErrorDesc = "Session not open"
Case 5 : szErrorDesc = "Impossible to allocate a channel"
Case 6 : szErrorDesc = "Function of a non-existing process requested"
Case 7 : szErrorDesc = "Broadcasting command aborted"
Case 8 : szErrorDesc = "Buffer supplied by function in which the data supplied by the NC are copied is too small"
Case 9 : szErrorDesc = "Session already open"
Case 10 : szErrorDesc = "Broadcasting list invalid"
Case 11 : szErrorDesc = "Realtime command aborted"
Case 12 : szErrorDesc = "Function already active"
Case 13 : szErrorDesc = "Function not yet active"
Case 14 : szErrorDesc = "Reception thread ended"
Case 15 : szErrorDesc = "No reply to command received within allotted time"
Case 16 : szErrorDesc = "NC release to which you are connected is not compatible with communications with server"
Case 17 : szErrorDesc = "Cookie does not identify any communication session"
Case 18 : szErrorDesc = "Realtime thread cannot be created"
Case 19 : szErrorDesc = "No more sections available"
Case 20 : szErrorDesc = "Error in symbol acquisition"
Case 23 : szErrorDesc = "Internal object instance cannot be created"
Case 24 : szErrorDesc = "Broadcasting thread cannot be created"
Case 25 : szErrorDesc = "Function cannot be executed in the numerical control boot phase"
Case 26 : szErrorDesc = "Parameter wrong"
Case 27 : szErrorDesc = "Invalid buffer"
Case 29 : szErrorDesc = "Session identifier (UserSession) is invalid (session closed or never opened)"
Case 31 : szErrorDesc = "Session identifier is invalid (value out of range) or session has been closed automatically by Cndex server"
End Select
szErrorDesc = ErrNum.ToString & ": " & szErrorDesc
Case 3
szErrorClassDesc = "NETBIOS error class"
Select Case ErrNum
Case &H1 : szErrorDesc = "Illegal buffer length"
Case &H3 : szErrorDesc = "Illegal command"
Case &H5 : szErrorDesc = "Command timed out"
Case &H6 : szErrorDesc = "Message incomplete, issue another command"
Case &H7 : szErrorDesc = "Illegal buffer address"
Case &H8 : szErrorDesc = "Session number out of range"
Case &H9 : szErrorDesc = "No resource available"
Case &HA : szErrorDesc = "Session closed"
Case &HB : szErrorDesc = "Command cancelled"
Case &HD : szErrorDesc = "Duplicate name"
Case &HE : szErrorDesc = "Name table full"
Case &HF : szErrorDesc = "No deletions, name has active sessions"
Case &H11 : szErrorDesc = "Local session table full"
Case &H12 : szErrorDesc = "Remote session table full"
Case &H13 : szErrorDesc = "Illegal name number"
Case &H14 : szErrorDesc = "No callname"
Case &H15 : szErrorDesc = "Cannot put * in NCB_NAME"
Case &H16 : szErrorDesc = "Name in use on remote adapter"
Case &H17 : szErrorDesc = "Name deleted"
Case &H18 : szErrorDesc = "Session ended abnormally"
Case &H19 : szErrorDesc = "Name conflict detected"
Case &H21 : szErrorDesc = "Interface busy, IRET before retrying"
Case &H22 : szErrorDesc = "Too many commands outstanding, retry later"
Case &H23 : szErrorDesc = "Ncb_lana_num field invalid"
Case &H24 : szErrorDesc = "Command completed while cancel occurring"
Case &H26 : szErrorDesc = "Command not valid to cancel"
Case &H30 : szErrorDesc = "Name defined by another local process"
Case &H34 : szErrorDesc = "Environment undefined. RESET required"
Case &H35 : szErrorDesc = "Required OS resources exhausted"
Case &H36 : szErrorDesc = "Max number of applications exceeded"
Case &H37 : szErrorDesc = "No saps available for netbios"
Case &H38 : szErrorDesc = "Requested resources are not available"
Case &H39 : szErrorDesc = "Invalid ncb address or length > segment"
Case &H3B : szErrorDesc = "Invalid NCB DDID"
Case &H3C : szErrorDesc = "Lock of user area failed"
Case &H3F : szErrorDesc = "NETBIOS not loaded"
Case &H40 : szErrorDesc = "System error"
End Select
szErrorDesc = "0x" & Hex(ErrNum) & ": " & szErrorDesc
Case 4
szErrorClassDesc = "CNC error class"
Select Case ErrNum
'Error codes for Real Time functions
Case &H101 : szErrorDesc = "Command unknown"
Case &H102 : szErrorDesc = "No channel available"
Case &H103 : szErrorDesc = "Tick requested not multiple of system tick"
Case &H104 : szErrorDesc = "Id channel wrong"
Case &H105 : szErrorDesc = "Data acquisition still underway"
Case &H106 : szErrorDesc = "Channel not configured"
Case &H107 : szErrorDesc = "Error on stop trigger"
Case &H108 : szErrorDesc = "Channel already configured for other types of data"
'Error codes for Dry Run functions
Case &H200 : szErrorDesc = "Process not configured"
Case &H201 : szErrorDesc = "Axis not present in process"
Case &H202 : szErrorDesc = "Dry run not configured"
Case &H203 : szErrorDesc = "Dry run already being executed"
Case &H204 : szErrorDesc = "Dry run already in stop status"
End Select
szErrorDesc = "0x" & Hex(ErrNum) & ": " & szErrorDesc
Case 10
szErrorClassDesc = "DLL_INTERFACE error class"
Select Case ErrNum
Case 1 : szErrorDesc = "The server has been created more than once"
Case 2 : szErrorDesc = "An error has occurred during the creation of the Cndex server"
Case 3 : szErrorDesc = "A function has been called without having created the Cndex server"
Case 4 : szErrorDesc = "One or more function input parameters are not valid"
Case 5 : szErrorDesc = "Option A06 -CndexLink communication- for network communications with external applications is not enabled on the CNC you are trying to connect to"
End Select
szErrorDesc = ErrNum.ToString & ": " & szErrorDesc
Case Else
szErrorDesc = ErrNum.ToString
End Select
szErrorClassDesc = ErrClass.ToString & ": " & szErrorClassDesc
'Stampo il messaggio
szReturn = "ERR " & szErrorClassDesc & " " & szErrorDesc & " - Occurred in: " & Position
Return True 'presenza errore
End If
szReturn = ""
Return False 'assenza errori
End Function
#Region "area chiamate IOT (dummy/overridden)"
''' <summary>
''' Chiama GenNcInfo x ottenere dati base del NC
''' </summary>
''' <param name="NcInfo"></param>
''' <returns></returns>
Public Overridable Function O_GetNcInfo1(ByRef NcInfo As OPENcontrol.GETINFO1DATA) As Boolean
Return True
End Function
''' <summary>
''' Chiama ReadCurrentErrorMsg x ottenere elenco errori
''' </summary>
''' <param name="CurrMsgError"></param>
''' <returns></returns>
Public Overridable Function O_ReadCurrentErrorMsg(ByRef CurrMsgError As OPENcontrol.MSGERROR) As Boolean
Return True
End Function
''' <summary>
''' Chiama ReadCurrentEmergMsg x ottenere elenco errori
''' </summary>
''' <param name="CurrMsgEmerg"></param>
''' <returns></returns>
Public Overridable Function O_ReadCurrentEmergMsg(ByRef CurrMsgEmerg As OPENcontrol.MSGEMERGENCY) As Boolean
Return True
End Function
''' <summary>
''' Chiama ReadCurrentErrorMsg x ottenere elenco errori
''' </summary>
''' <param name="CurrMsgAnomaly"></param>
''' <returns></returns>
Public Overridable Function O_ReadCurrentAnomalyMsg(ByRef CurrMsgAnomaly As OPENcontrol.MSGANOMALY) As Boolean
Return True
End Function
''' <summary>
''' Restituisce posizione assi (tutti)
''' </summary>
''' <param name="tipoPos">Tipo posizione richiesta (1..6 / 1=tgt, 2 = act)</param>
''' <param name="ProcessId">Path/Processo (1..n)</param>
''' <param name="AxisPos">Vettore posizioni richieste</param>
''' <returns></returns>
Public Overridable Function getAllAxisPos(tipoPos As Int16, ProcessId As Short, ByRef AxisPos As OPENcontrol.GETINTDATA()) As Boolean
Return True
End Function
''' <summary>
''' Elenco codici G del processo richiesto...
''' </summary>
''' <param name="Processo"></param>
''' <param name="GCodeCurr"></param>
''' <returns></returns>
Public Overridable Function getPathGCodeMod(Processo As Int32, ByRef GCodeCurr As UShort()) As Boolean
Return True
End Function
#End Region
End Class
End Namespace