Bonjour tout le monde
J'ai créer une application sur vb qui sert à se connecter à un serveur OPC , et j'ai un probléme lors de l'ajout des items au group
Pièce jointe 282877
et donc j'ai besion de vos aides et merciii d'avance
Version imprimable
Bonjour tout le monde
J'ai créer une application sur vb qui sert à se connecter à un serveur OPC , et j'ai un probléme lors de l'ajout des items au group
Pièce jointe 282877
et donc j'ai besion de vos aides et merciii d'avance
Bonjour,
Ce genre d'erreur résulte généralement de l'utilisation de code managé avec un code unsafe et/ou natif. Comme a priori tu utilises une bibliothèque tiers, 3 cas se présentent :
- cette bibliothèque est buggée. Et dans ce cas, il n'y a pas grand chose à faire ;
- l'utilisation de la bibliothèque est faite de manière inappropriée, ce qui déclenche des bugs ;
- le wrapper qui permet d'appeler du code natif (qui contient généralement des DllImport à foison) est erroné et réalise de mauvaises liaisons entre les données, ce qui provoque l'erreur.
Bref, en l'état actuel des choses, difficile de t'aider. Il nous faudrait déjà la confirmation que tu utilises bien une bibliothèque tiers, que c'est une bibliothèque native ou unsafe. Ensuite, il nous faudrait la bibliothèque utilisée et voir si quelqu'un l'a déjà utilisé. Un exemple de code simple reproduisant le problème serait également le bien venu.
Bonjour et merci bien pour votre réponse , bon je sais pas qu'est ce qu'une bibliothéque tiers( bibliothèque native ou unsafe) mais j'ai ajouté une réference par l'instruc suivante Imports SAOPCAutomation et j'ai déclaré mes variables suivant cette réf
il y'a d'autre personnes qui ont utilisé cette réf (d'aprés ce que j'ai trouvé sur les forums) mais ils n'ont pas ce type de problémeCode:
1
2
3
4
5 Public ServeurOPC As New SAOPCAutomation.OPCServer 'objet serveur Public WithEvents OPCGroupes As SAOPCAutomation.OPCGroups 'Collection de Groupes Public WithEvents OFSGroupeAutomate1 As SAOPCAutomation.OPCGroup 'group d 'item Public ItemLectureAutomate1_Compt As SAOPCAutomation.OPCItem ' opc item1 Public ItemLectureAutomate1_analog As SAOPCAutomation.OPCItem 'opc item1
Alors, dans l'ordre :
- Bibliothèque tiers : bibliothèque développée par un tiers, c'est-à-dire une personne ou une équipe extérieure
- Bibiothèque native : bibliothèque non managée (écrite en C, en C++ ou tout autre langage compilé)
- Bibliothèque unsafe : bibliothèque managée qui utilise des opérations non sûres (d'où le unsafe) comme la manipulation de pointeurs
Dans ce cas, ce serait une mauvaise utilisation de la bibliothèque. Auquel cas il nous faudrait le code complet, et non juste la déclaration des variables...Citation:
il y'a d'autre personnes qui ont utilisé cette réf (d'aprés ce que j'ai trouvé sur les forums) mais ils n'ont pas ce type de probléme
Merci
voici le code
lors de l'affichage de l'erreur le curseur s'arrete à ce niveauCode:
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 Imports SAOPCAutomation ' add ref ; SA OPC Automation Imports System.Runtime.InteropServices 'ajout des ref sys optionnel Imports System Imports System.IO Imports System.ComponentModel Public Class Form1 'déclaration des objet serveur Public ServeurOPC As New SAOPCAutomation.OPCServer 'objet serveur Public WithEvents OPCGroupes As SAOPCAutomation.OPCGroups 'Collection de Groupes Public WithEvents OFSGroupeAutomate1 As SAOPCAutomation.OPCGroup 'group d 'item Public ItemLectureAutomate1_Compt As SAOPCAutomation.OPCItem ' opc item1 Public ItemLectureAutomate1_analog As SAOPCAutomation.OPCItem 'opc item1 'Public ItemLectureAutomate1() As SAOPCAutomation.OPCItem Dim FinCreation As Boolean 'Flag de signalement de la fin de création Const OPC_DS_DEVICE = 2 ' la source de laquelle on va lire les items (la valeur 2 est décrit dans le tuto OFS) ' tableau Dim tab_item() As SAOPCAutomation.OPCItem Dim t() As String Dim items() As String Dim index, Pcourant As Integer 'variable Dim val1_preced As String 'test de la nouvelle valeur Dim test1 As Boolean 'fermeture de serveur Dim test_doublitem As Boolean 'verifier les doublons Public Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Button3.Enabled = False Button5.Enabled = False End Sub Public Sub Form1_Unload(sender As Object, e As EventArgs) Handles MyBase.Load 'déconnection à la fermeture pour libérer de l'espace DeConnectionOPC() End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Try ConnectionOPC() Button3.Enabled = True Button5.Enabled = True index = 1 Catch ex As System.Runtime.InteropServices.COMException MessageBox.Show(ex.Message) End Try End Sub 'fonction ConnectionOPC '------------------------------------------------------------------------------------------------------------------------------------------------------- Public Sub ConnectionOPC() 'connection de serveur ServeurOPC = New OPCServer ServeurOPC.Connect("Schneider-Aut.OFS") If ServeurOPC.ServerState = 1 Then MsgBox("Connection OK") Else MsgBox("Défaut connection") Exit Sub End If ' Connection OK création du groupe OPCGroupes = ServeurOPC.OPCGroups OPCGroupes.DefaultGroupIsActive = vbTrue OPCGroupes.DefaultGroupDeadband = 0 OFSGroupeAutomate1 = OPCGroupes.Add("GroupeAutomate1") OFSGroupeAutomate1.IsSubscribed = vbTrue OFSGroupeAutomate1.IsActive = vbTrue OFSGroupeAutomate1.UpdateRate = 1000 End Sub 'fonction deConnectionOPC '------------------------------------------------------------------------------------------------------------------------------------------------------- Public Sub DeConnectionOPC() 'ServeurOPC.OPCGroups.RemoveAll() ' deconnection des groupes OPCGroupes.RemoveAll() OPCGroupes = Nothing OFSGroupeAutomate1 = Nothing ServeurOPC.Disconnect() 'déconnection du serveur ServeurOPC = Nothing End Sub ' pour l'ajout des items dans un tableau t Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click Try test_doublitem = True If (TextBox1.Text = "" Or TextBox2.Text = "") Then ' le texbox1 contient l@ memoire de l'item et le textbox2 contient un nom de l'item (choisi par l'utilisatuer) MsgBox("veuillez saisir le nom et l'adresse de l'item") Else If t Is Nothing Then ReDim t(0) t(t.Count - 1) = TextBox2.Text ListView1.Items.Add(TextBox1.Text) Else For i = 0 To t.Count - 1 If (t(i) = TextBox2.Text Or items(i) = TextBox1.Text) Then test_doublitem = False MsgBox("l'Item existe déja") Exit For End If Next If (test_doublitem = True) Then ReDim Preserve t(t.Count) t(t.Count - 1) = TextBox2.Text ListView1.Items.Add(TextBox1.Text) End If End If End If Catch ex As System.Runtime.InteropServices.COMException MsgBox(e.ToString) End Try OPCGroupes = Nothing End Sub ' le bouton valider qui va faire l'ajout de l'item Public Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click Try For i = 0 To t.Count - 1 ItemLectureAutomate1_Compt = OFSGroupeAutomate1.OPCItems.AddItem(t(i), i + 1) If tab_item Is Nothing Then ReDim tab_item(0) tab_item(tab_item.Count - 1) = ItemLectureAutomate1_Compt Else ReDim Preserve tab_item(tab_item.Count) tab_item(tab_item.Count - 1) = ItemLectureAutomate1_Compt End If Next Catch ex As System.Runtime.InteropServices.COMException MsgBox(e.ToString) End Try End Sub
IndicationCode:ItemLectureAutomate1_Compt = OFSGroupeAutomate1.OPCItems.AddItem(t(i), i + 1)
J'ai essayé de faire directement
mais lorsque j'ai utilisé ce tableau tab_item pour faire la lecture a prés ça n'a pas marché (probleme de ref null)Code:tab_item(tab_item.Count - 1) =OFSGroupeAutomate1.OPCItems.AddItem(t(i), i + 1)
donc j'ai procéder à cette instanceCode:
1
2
3
4
5
6
7 For i = 0 To tab_item.Count - 1 tab_item(i).Read(OPC_DS_DEVICE) Me.DataGridView1.Rows.Add("m", "compteur", tab_item(i).Value, ItemLectureAutomate1_Compt.Quality, Now().Date.ToString(), Now.TimeOfDay.ToString()) Next
Il 'ya une autre fonction d'ajout d'item AddItems() mais avec plusieurs parametre que j'ai testé mais ça n'a jamais marché et j'ai pas pu le résoudre Pièce jointe 283241Code:ItemLectureAutomate1_Compt = OFSGroupeAutomate1.OPCItems.AddItem(t(i), i + 1)
J'attends vos commentaires et merciii énormément
J'ai fait une faute dans le commentaire du 1er code en effet le textbox2 s'agit de l'@ et le textbox1 et le nom
pour la fonction additems c'est ce que j'ai besion de mettre comme primitives
Code:
1
2 sub AddItems(NumItems As Integer, ByRef ItemIDs As System.Array, ByRef ClientHandles As System.Array, ByRef ServerHandles As System.Array, ByRef Errors As System.Array, Optional RequestedDataTypes As Object = Nothing, Optional AccessPaths As Object = Nothing) Member of SAOPCAutomation.OPCItems