1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473
| Imports System.Net
Imports System.Configuration
''' -----------------------------------------------------------------------------
''' Project : Client
''' Class : Opc
'''
''' -----------------------------------------------------------------------------
''' <summary>
''' Classe permettant l'accès au serveur opc distant.
''' Nécessite que le serveur opc client soit installé et que l'adresse du serveur opc soit passée soit en paramètre dans le fichier de configuration, soit en paramètre de création de la classe.
''' Permet l'ajout des groupes aux serveur et permet d'obtenir l'instance du serveur opc créé.
''' </summary>
''' <remarks>
''' La classe génère un évènement lorsque le serveur opc distant est coupé
''' </remarks>
''' <history>
''' [davidc] 22/07/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Public Class OpcRockwell
'Déclaration des variables
Private adresseIpPcServeurOPC As String
Private WithEvents svr As RsiOPCAuto.OPCServer
Private groupes As RsiOPCAuto.OPCGroups
Private logFichierLog As RapportApplication
Private typeServeur As serveurOpc
Public Event ServeurClosed(ByVal sender As Object, ByVal e As EventArgs)
''' -----------------------------------------------------------------------------
''' <summary>
''' Enumération qui permet de choisir son serveur opc
''' </summary>
''' <remarks>
''' </remarks>
''' <history>
''' [davidc] 29/05/2006 Created
''' </history>
''' -----------------------------------------------------------------------------
Enum serveurOpc
serveurAllenBradley = 1
serveurAllenBradleyDistant = 2
End Enum
''' -----------------------------------------------------------------------------
''' <summary>
''' Fonction qui renvoie la chaîne de connexion du serveur choisi
''' </summary>
''' <param name="idServeur">Enumération indiquant le serveur retenu</param>
''' <returns></returns>
''' <remarks>
''' </remarks>
''' <history>
''' [davidc] 29/05/2006 Created
''' </history>
''' -----------------------------------------------------------------------------
Private Function getIdentifiantServeur(ByVal idServeur As serveurOpc) As String
Select Case idServeur
Case serveurOpc.serveurAllenBradley
Return "RSLinx OPC Server"
Case serveurOpc.serveurAllenBradleyDistant
Return "RSLinx Remote OPC Server"
Case Else
Return "RSLinx OPC Server"
End Select
End Function
''' -----------------------------------------------------------------------------
''' <summary>
''' Obtient le fichier de log.
''' Si la référence à la classe n'existe pas instanciation
''' </summary>
''' <value>Retourne un objet de type RapportApplication</value>
''' <remarks>
''' </remarks>
''' <history>
''' [davidc] 06/08/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Friend ReadOnly Property fichierLog() As RapportApplication
Get
If logFichierLog Is Nothing Then
logFichierLog = New RapportApplication
End If
Return logFichierLog
End Get
End Property
''' -----------------------------------------------------------------------------
''' <summary>
''' Permet de connecter la classe au serveur opc situé à l'adresse indiquée dans le fichier de configuration.
''' </summary>
''' <remarks>
''' </remarks>
''' <history>
''' [davidc] 22/07/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Public Sub Connect()
Connect(adresseIpPcServeurOPC, typeServeur)
End Sub
''' -----------------------------------------------------------------------------
''' <summary>
''' Permet de se connecter au serveur opc dont l'adresse ip est passée en paramètre.
''' </summary>
''' <param name="parAdresseIpServeurOPC"></param>
''' <remarks>
''' </remarks>
''' <history>
''' [davidc] 22/07/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Public Sub Connect(ByVal parAdresseIPServeurOpc As String, ByVal serveurOpc As serveurOpc)
Try
svr.Connect(Me.getIdentifiantServeur(serveurOpc), parAdresseIPServeurOpc)
'Récupération de la collection des groupes
Try
groupes = svr.OPCGroups
Catch ecast As System.InvalidCastException
'Debug.WriteLine("J'ai planté à la récupération des groupes")
'Nouvel essai car problème dûs à l'instanciation d'interface
groupes = svr.OPCGroups
End Try
'Catch eSecusrity As UnauthorizedAccessException
' Debug.WriteLine("Le serveur n'est pas connecté, l'application ne pourra pas se connecter aux automates")
Catch eCast As System.InvalidCastException
Debug.WriteLine(eCast.ToString)
fichierLog.AddException(Me, eCast.ToString)
Catch eCom As System.Runtime.InteropServices.COMException
Debug.WriteLine(Me.GetType.ToString & " une erreur s'est produite: " & eCom.ToString)
fichierLog.AddException(Me, eCom.ToString)
Catch ex As NullReferenceException
'le serveur n'est pas instancié
svr = New RsiOPCAuto.OPCServer
Connect(serveurOpc, parAdresseIPServeurOpc)
fichierLog.AddException(Me, ex.ToString)
End Try
End Sub
''' -----------------------------------------------------------------------------
''' <summary>
''' Supprime tous les groupes liés au serveur opc puis déconnecte le serveur opc.
''' </summary>
''' <remarks>
''' </remarks>
''' <history>
''' [davidc] 22/07/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Public Sub Disconnect()
Try
CType(svr.OPCGroups, RsiOPCAuto.OPCGroups).RemoveAll()
Catch ex As NullReferenceException
End Try
Try
svr.Disconnect()
Catch e As NullReferenceException
Debug.WriteLine("Une erreure s'est produite " & e.ToString)
End Try
End Sub
''' -----------------------------------------------------------------------------
''' <summary>
''' Ajoute un groupe dont le nom est passé en paramètre au serveur opc de la chaîne.
''' </summary>
''' <param name="parNomGroupe">Chaîne de caractère représentant le nom du groupe à ajouter</param>
''' <returns>
''' un objet de type groupe opc
''' </returns>
''' <remarks>
''' </remarks>
''' <history>
''' [davidc] 22/07/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Public Function AddGroup(ByVal parNomGroupe As String) As Object
Try
Return CType(groupes, RsiOPCAuto.OPCGroups).Add(parNomGroupe)
'Return svr.OPCGroups.add(parNomGroupe)
Catch e As NullReferenceException
Me.fichierLog.AddException(Me, e.ToString)
Return Nothing
End Try
End Function
''' -----------------------------------------------------------------------------
''' <summary>
''' Ajoute un groupe.
''' </summary>
''' <returns>
''' un objet de type groupe opc
''' </returns>
''' <remarks>
''' Permet d'ajouter un groupe sans risque de doublons.
''' Le serveur opc attribue un nom unique au groupe lors de l'ajout
''' </remarks>
''' <history>
''' [davidc] 25/11/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
<CLSCompliant(False)> _
Public Function AddGroup() As RsiOPCAuto.IOPCGroups
Try
Return groupes.Add()
Catch e As NullReferenceException
Me.fichierLog.AddException(Me, e.ToString)
Return Nothing
End Try
End Function
''' -----------------------------------------------------------------------------
''' <summary>
''' Supprime le groupe opc dont le nom est passé en paramètre du serveur.
''' </summary>
''' <param name="parNomGroupe">Chaîne de caractère représentant le nom du groupe à supprimer</param>
''' <remarks>
''' </remarks>
''' <history>
''' [davidc] 22/07/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Public Sub RemoveGroup(ByVal parNomGroupe As String)
Try
groupes.Remove(parNomGroupe)
Catch ex As NullReferenceException
Catch eCom As System.Runtime.InteropServices.COMException
'pas de problème si le groupe n'existe pas il y a des chances qu'il ne soit plus dans le serveur opc
End Try
End Sub
''' -----------------------------------------------------------------------------
''' <summary>
''' Fonction permettant d'ajouter un tableau d'items au groupe opc représentant l'objet
''' </summary>
''' <param name="parCheminConnexion">Tableau de chaîne de caractères représentant les adresses automates des items à surveiller</param>
''' <param name="parIdentifiant">Tableau d'identifiant représentant les identifiants des items à surveiller</param>
''' <remarks>
''' </remarks>
''' <history>
''' [davidc] 22/07/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
<CLSCompliant(False)> _
Public Function AddItem(ByVal GrpOpc As RsiOPCAuto.OPCGroup, ByVal parCheminConnexion() As String, ByVal parIdentifiant() As String) As String(,)
Dim nbItems As Integer
'Recherche du nombre d'items
nbItems = parCheminConnexion.Length
Dim locIdConnexion As Array = Array.CreateInstance(GetType(String), nbItems)
Dim locClientHandle As Array = Array.CreateInstance(GetType(Int32), nbItems)
Dim locServerHandle As Array = Array.CreateInstance(GetType(Int32), nbItems)
Dim locErrors As Array = Array.CreateInstance(GetType(Int32), nbItems)
Dim i As Int16
Dim locRequestDataType As Object = Nothing
Dim locAccessPaths As Object = Nothing
Dim items As RsiOPCAuto.OPCItems
Dim tableauRetour(,) As String
ReDim tableauRetour(nbItems, 1)
'Définition des handles clients à passer au serveur
For i = 0 To nbItems - 1
locClientHandle(i) = parIdentifiant(i) 'Identifiant * 1000 + hashColIdItems.Count + i
locIdConnexion(i) = parCheminConnexion(i)
Next
'Ajouter les items au groupe puis stocker l'identifiant dans la collection en tant que clé
Try
Try
items = GrpOpc.OPCItems
Catch castEx As InvalidCastException
'Nouvel essai car problème de définition et d'instanciation d'interface
items = GrpOpc.OPCItems
End Try
'Ajout du tableau d'items
Call items.AddItems(nbItems - 1, locIdConnexion, locClientHandle, locServerHandle, locErrors, locRequestDataType, locAccessPaths)
'mise en activité du groupe
GrpOpc.IsActive = True
GrpOpc.IsSubscribed = True
Debug.WriteLine(GrpOpc.UpdateRate)
Debug.WriteLine(GrpOpc.TimeBias)
'mise en activité du groupe d'items
logFichierLog = New RapportApplication
Me.logFichierLog.AddText("nombre d'items: " & nbItems - 1)
Me.logFichierLog.AddText("tailleTableau erreur: " & locErrors.GetLength(0))
For i = 1 To locServerHandle.GetLength(0)
Me.logFichierLog.AddText(i & ": server handle: " & locServerHandle(i))
Next
items.SetActive(nbItems - 1, locServerHandle, True, locErrors)
For i = 1 To nbItems - 1
tableauRetour(i - 1, 0) = parIdentifiant(i)
tableauRetour(i - 1, 1) = locServerHandle(i)
Next
Dim cancelID As Integer
GrpOpc.AsyncRead(nbItems - 1, locServerHandle, locErrors, 1012, cancelID)
Return tableauRetour
GrpOpc.AsyncRefresh(RsiOPCAuto.OPCDataSource.OPCCache, 1015, cancelID)
Catch castEx As InvalidCastException
Debug.WriteLine(castEx.ToString)
Me.fichierLog.AddException(Me, castEx.ToString)
Return Nothing
Catch nRefExc As NullReferenceException
Me.fichierLog.AddException(Me, nRefExc.ToString)
Return Nothing
End Try
End Function
''' -----------------------------------------------------------------------------
''' <summary>
''' Permet de récupérer un objet item suivant le serverHandle passé en paramètre
''' </summary>
''' <param name="parServerHandle"></param>
''' <returns>Objet opcitem</returns>
''' <remarks>
''' </remarks>
''' <history>
''' [davidc] 02/06/2006 Created
''' </history>
''' -----------------------------------------------------------------------------
<CLSCompliant(False)> _
Public Function getItem(ByVal parServerHandle As Integer) As RsiOPCAuto.OPCItem
Dim i As Integer
Dim j As Integer
For i = 1 To groupes.Count
For j = 1 To groupes.Item(i).OPCItems.Count
If groupes.Item(i).OPCItems.Item(j).ServerHandle = parServerHandle Then
Return groupes.Item(i).OPCItems.Item(j)
End If
Next
Next
Return Nothing
End Function
'Fonction qui retourne l'état du serveur opc
''' -----------------------------------------------------------------------------
''' <summary>
''' Propriété qui permet de récupérer l'état du serveur opc (connecté, déconnecté).
''' </summary>
''' <value></value>
''' <remarks>
''' Pour le moment les seuls états disponibles sont connectés et déconnectés
''' </remarks>
''' <history>
''' [davidc] 22/07/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Public ReadOnly Property Etat() As String
Get
Dim strRetour As String = ""
'Dim etatPossible As SAOPCAutomation.OPCServerState
Try
Select Case svr.ServerState
Case RsiOPCAuto.OPCServerState.OPCRunning
strRetour = "Connecté"
Case RsiOPCAuto.OPCServerState.OPCDisconnected
strRetour = "Déconnecté"
Case RsiOPCAuto.OPCServerState.OPCFailed
strRetour = "Erreur Fatale"
Case RsiOPCAuto.OPCServerState.OPCSuspended
strRetour = "Suspendu"
Case RsiOPCAuto.OPCServerState.OPCTest
strRetour = "En test"
Case RsiOPCAuto.OPCServerState.OPCNoconfig
strRetour = "Pas de configuration"
End Select
Catch e As NullReferenceException
strRetour = e.ToString
End Try
Return strRetour
End Get
End Property
''' -----------------------------------------------------------------------------
''' <summary>
''' Procédure appelée lorsque le serveur opc distant est fermé.
''' Permet de prévenir les classes appelantes.
''' </summary>
''' <param name="Reason"></param>
''' <remarks>
''' </remarks>
''' <history>
''' [davidc] 22/07/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Private Sub svr_ServerShutDown(ByVal Reason As String)
Dim evt As Events.OpcEventArgs
evt = New Events.OpcEventArgs(Reason)
RaiseEvent ServeurClosed(Me, evt)
End Sub
Protected Overrides Sub Finalize()
'Dim grp As SAOPCAutomation.OPCGroup
Try
'If Not logFichierLog Is Nothing Then
' fichierLog.LibereFichier()
' logFichierLog = Nothing
'End If
'Supprime tous les groupes et les items correspondants
groupes.RemoveAll()
svr.Disconnect()
'groupes = Nothing
'svr = Nothing
Catch e As NullReferenceException
'ce n'est pas grave, au pire, on ne peux libérer une ressource qui n'existe pas
End Try
MyBase.Finalize()
End Sub
''' -----------------------------------------------------------------------------
''' <summary>
''' Créateur de classe.
''' Récupère l'adresse ip du serveur opc contenue dans le fichier de configuration
''' Crée une nouvelle instance de l'objet com opc
''' Lance la fonction de connexion au serveur
''' </summary>
''' <remarks>
''' En cas d'exception, écrit l'erreur dans le journal de log
''' </remarks>
''' <history>
''' [davidc] 06/08/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Public Sub New(ByVal parTypeServeur As serveurOpc)
Try
typeServeur = parTypeServeur
'Récupération de l'adresse IP
adresseIpPcServeurOPC = System.Configuration.ConfigurationManager.AppSettings("adresseIpAutomateAB")
svr = New RsiOPCAuto.OPCServer
Connect()
Catch e As System.IO.IOException
Debug.WriteLine(e.ToString)
Me.fichierLog.AddException(Me, e.ToString)
Catch eX As System.Xml.XmlException
Debug.WriteLine(eX.ToString)
Me.fichierLog.AddException(Me, eX.ToString)
Catch eRef As NullReferenceException
Debug.WriteLine(eRef.ToString)
Me.fichierLog.AddException(Me, eRef.ToString)
Catch eC As System.Runtime.InteropServices.COMException
Debug.WriteLine(eC.ToString)
Me.fichierLog.AddException(Me, eC.ToString)
Me.fichierLog.AddText("Une erreur COM s'est produite, essayer de réinstaller le client OPC avec la totalité de ses options")
End Try
End Sub
Private Sub svrRockwell_ServerShutDown(ByVal Reason As String) Handles svr.ServerShutDown
svr_ServerShutDown(Reason)
End Sub
End Class |
Partager