PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 26 → Connexion à un automate S7 1500 avec son serveur OPC UA intégré
Connexion à un automate S7 1500 avec son serveur OPC UA intégré
Débuté par Karine Pernin, 20 mar. 2020 16:42 - 31 réponses
Posté le 20 mars 2020 - 16:42
Bonjour

Dans le cadre d'un développement, j'ai besoin de m'interfacer avec un automate pour récupérer ses données. J'utilise l'exemple de WinDev et n'ayant pas accès actuellement à l'automate, j'ai installé le simulateur Prosys conseillé dans la LST.

Au fil de mes recherches, j'ai vu qu'il fallait travailler avec l'objet OPCDAauto.dll. Mais la dll se nomme OPC "DA" et je dois travailler avec du "UA".

Pourriez-vous me dire si j'ai bien la bonne dll, et si non, où puis-je la trouver?

Merci de vos réponses.

Karine
Membre enregistré
159 messages
Posté le 20 mars 2020 - 19:01
Je te conseille de faire le programme d’abord avec un langage .NET, (C# de préférence) histoire de bien comprendre comment ça marche le truc , ensuite ça va être simple la migration vers Windev

Lien vers OPC UA
https://github.com/OPCFoundation/UA-.NETStandard
Membre enregistré
5 messages
Posté le 23 mars 2020 - 07:35
Bonjour,

Il y a un exemple fourni par PC Soft (à partir de la version 24 il me semble). Les dll sont incluses avec (opc.ua.client.dll, opc.ua.configuration.dll, opc.ua.core.dll) ou disponibles sur le site de la fondation.
Je rejoins ce qui a été dis auparavant, c'est simple à mettre en oeuvre mais seulement si on a bien compris le fonctionnement global (j'ai pour ma part décortiqué l'exemple ligne à ligne, ce qui prend quand même du temps).
Posté le 23 mars 2020 - 11:40
Bonjour

Merci de vos réponses et du lien.

David, j'ai bien récupéré l'exemple de la LST mais je n'avais pas les trois dll dedans. je les ai trouvé sur le site d'opcfoundation.

Mais je parle de la dll que j'ai copié dans le répertoire "C:\Windows\System32", la dll OPCDAauto.dll
Membre enregistré
5 messages
Posté le 24 mars 2020 - 10:03
Bonjour,

OPCDAauto.ddl est utilisé pour l'OPC DA et n'est donc pas nécessaire pour le fonctionnement de l'exemple WD OPC UA.
Je viens de ré-importer l'exemple sur un poste différent et les dll sont bien chargées dans le dossier Mes Projets\Mes Exemples\WD OPC UA\Exe. Il faut ensuite indiquer à Windev le chemin des dll pour les importer dans le projet.
Posté le 24 mars 2020 - 10:36
Je viens de résoudre le mystère : je travaillais avec l'exemple OPC DA et non OPC UA en pensant qu'il n'y en avait qu'un seul :/

Merci de ta réponse. Du coup je retourne comprendre comment cela fonctionne.
Posté le 24 mars 2020 - 11:21
Je reviens vers vous car en essayant de me connecter, j'ai l'erreur suivante :

L'invocation de la méthode <Create(Opc.Ua.ApplicationConfiguration,Opc.Ua.ConfiguredEndpoint,System.Boolean,System.Boolean,System.String,System.UInt32,Opc.Ua.IUserIdentity,System.Collections.Generic.IList`1[System.String])> du type <Session> a échoué<\r><\n>Le framework .NET a renvoyé l'erreur suivante : <\r><\n>ApplicationCertificate cannot be found.

J'ai bien copié le fichier "wdtst_user.Config.xml" dans le répertoire "C:\Program Files (x86)\PC SOFT\WINDEV 24\Programmes\Framework\Win32x86" comme indiqué dans un premier message d'erreur. J'utilise le serveur Prosys comme indiqué dans la LST et passe bien l'adresse TCP dans le champ adéquat

Je me commence à désespérer de comprendre :(
Membre enregistré
159 messages
Posté le 24 mars 2020 - 13:07
t'as bien paramétré le fichier XML ? peut tu nous monter ta config
Membre enregistré
159 messages
Posté le 24 mars 2020 - 13:08
freak per a écrit :
> t'as bien paramétré le fichier XML ? peux tu nous monter ta config
Posté le 24 mars 2020 - 13:28
Je ne l'ai pas changé, car je ne sais pas par quoi je dois remplacer "<ApplicationName>UASampleClientStep01</ApplicationName>"

Est-ce que je dois mettre le nom de l'exemple WinDev, le nom de mon application qui recevra les données? Est-ce que je dois référencer une application chez OPC foundation? Je m'y perd un peu, et je trouve qu'encore une fois, les exemples de pcsoft manquent singulièrement d'explications pour les adapter.
Membre enregistré
5 messages
Posté le 26 mars 2020 - 07:33
Bonjour,

C'est un problème de sécurité. Dans ton serveur, ne laisse que l'accès en Security mode "None". Dans le futur il conviendra d'implémenter la connexion avec les autres modes de sécurité.
Posté le 30 mars 2020 - 13:45
Merci pour vos réponses

Pour l'instant, j'abandonne. Je ne comprend pas pourquoi cela ne fonctionne pas.
Membre enregistré
74 messages
Posté le 16 avril 2020 - 16:10
Bonjour je voudrais tester l'exemple opc UA mais j'ai le message suivant lorsque je test le projet :
Le fichier 'C:\Program Files\PC SOFT\WINDEV 25\Programmes\Framework\Win32x86\wdtst_user.Config.xml' est introuvable.

--
DB
Posté le 23 avril 2020 - 21:58
Bonjour,

Recherche le fichier dans le dossier du projet Windev.
Posté le 05 mai 2020 - 09:48
Bonjour

J'ai enfin du temps pour revenir à ma connexion avec l'automate. J'ai bien avancé, et avec le serveur prosys, mon application fonctionne.

Du coup, je tente de me connecter avec notre automate de test en saisissant l'adresse de cette manière : opc.tcp://adresse/OpenOpcUaCoreServer et j'ai l'erreur suivante :

Erreur à la ligne 22 du traitement Procédure locale createOpcUaSession.
L'invocation de la méthode <Create(Opc.Ua.ApplicationConfiguration,Opc.Ua.ConfiguredEndpoint,System.Boolean,System.Boolean,System.String,System.UInt32,Opc.Ua.IUserIdentity,System.Collections.Generic.IList`1[System.String])> du type <Session> a échoué
Le framework .NET a renvoyé l'erreur suivante :
BadConnectionClosed

----- Informations techniques -----

Projet : OPC_UA

Appel WL :
Traitement de 'Procédure locale createOpcUaSession' (FEN_OPCUA.PROCEDURE.createOpcUaSession), ligne 22, thread 0

Que s'est-il passé ?
L'invocation de la méthode <Create(Opc.Ua.ApplicationConfiguration,Opc.Ua.ConfiguredEndpoint,System.Boolean,System.Boolean,System.String,System.UInt32,Opc.Ua.IUserIdentity,System.Collections.Generic.IList`1[System.String])> du type <Session> a échoué
Le framework .NET a renvoyé l'erreur suivante :
BadConnectionClosed

Code erreur : 200002
Niveau : erreur fatale

Dump de l'erreur du module 'wd230net4.dll' (23.0.6.0).
Identifiant des informations détaillées (.err) : 200002
Informations de débogage :
System.Reflection.TargetInvocationException: Une exception a été levée par la cible d'un appel. ---> Opc.Ua.ServiceResultException: BadConnectionClosed
à Opc.Ua.Bindings.TcpClientChannel.BeginSendRequest(IServiceRequest request, Int32 timeout, AsyncCallback callback, Object state)
à Opc.Ua.Bindings.TcpTransportChannel.BeginSendRequest(IServiceRequest request, AsyncCallback callback, Object callbackData)
à Opc.Ua.Bindings.TcpTransportChannel.SendRequest(IServiceRequest request)
à Opc.Ua.SessionClient.CreateSession(RequestHeader requestHeader, ApplicationDescription clientDescription, String serverUri, String endpointUrl, String sessionName, Byte[] clientNonce, Byte[] clientCertificate, Double requestedSessionTimeout, UInt32 maxResponseMessageSize, NodeId& sessionId, NodeId& authenticationToken, Double& revisedSessionTimeout, Byte[]& serverNonce, Byte[]& serverCertificate, EndpointDescriptionCollection& serverEndpoints, SignedSoftwareCertificateCollection& serverSoftwareCertificates, SignatureData& serverSignature, UInt32& maxRequestMessageSize)
à Opc.Ua.Client.Session.Open(String sessionName, UInt32 sessionTimeout, IUserIdentity identity, IList`1 preferredLocales)
à Opc.Ua.Client.Session.Create(ApplicationConfiguration configuration, ConfiguredEndpoint endpoint, Boolean updateBeforeConnect, Boolean checkDomain, String sessionName, UInt32 sessionTimeout, IUserIdentity identity, IList`1 preferredLocales)
--- Fin de la trace de la pile d'exception interne ---
à System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
à System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
à System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
à CDotNetMethod.bInvoke(Char* pszTypeName, Char* pszMethodName, Char* pszParameters, MethodInfo gcMethod, Object gcObj, CSLevel* pclPile, Int32 nNbParamPile, Int32 bValeurRetour, STOperationDotNet* pstOperation)
Informations supplémentaires :
EIT_EXCEPTIONDOTNET
EIT_PILEWL :
Procédure locale createOpcUaSession (FEN_OPCUA.PROCEDURE.createOpcUaSession), ligne 22
Clic sur BTN_CreateSession (FEN_OPCUA.BTN_CreateSession), ligne 17
EIT_DATEHEURE : 05/05/2020 09:45:24
EIT_TYPE_WDFILE : <2>
EIT_IDCODE : <458752>

Assistance
Membre enregistré
74 messages
Posté le 05 mai 2020 - 10:52
Bonjour Karine,

j'ai laissé tombé OPC UA au profit de l'OPC DA et cela fonctionne bien. Il faut installer Simatic net v16 et créer une station PC dans TIA ou se trouve le projet.

--
DB
Posté le 05 mai 2020 - 15:41
Merci de votre réponse Freedavys, mais j'aimerais bien rester en OPC UA.

J'ai également toujours l'erreur suivante :
L'invocation de la méthode <Create(Opc.Ua.ApplicationConfiguration,Opc.Ua.ConfiguredEndpoint,System.Boolean,System.Boolean,System.String,System.UInt32,Opc.Ua.IUserIdentity,System.Collections.Generic.IList`1[System.String])> du type <Session> a échoué<\r><\n>Le framework .NET a renvoyé l'erreur suivante : <\r><\n>ApplicationCertificate cannot be found.

Ma configuration s'appelle "Robot_OPC". J'ai renommé le fichier xml "Robot_OPC.Config.xml" et je l'ai mis dans mon répertoire Exe. Je n'ai rien modifié dans le fichier xml.

Est-ce qu'il y a des lignes à adapter en fonction de mon projet?
Posté le 04 novembre 2020 - 08:54
Bonjour Karine,

Je suis actuellement en train de tester la communication en serveur OPC UA et rencontre également des difficultés.
J'utilise l'exemple fourni par Windev ainsi que Prosys pour émuler un serveur OPC UA.

As-tu réussi à résoudre ton problème de connexion du mois de Mai?
J'ai eu le même problème et il me semble que j'ai seulement configuré le "Security modes" à "None" dans l'onglet "Endpoints" (ne pas oublier de cliquer sur "Apply" tout en bas de la page et redémarrer le serveur) et j'ai aussi aussi été dans l'onglet "Certificates" et ai fait clic droit puis "Trust" sur les quelques lignes proposés dans le tableau à gauche et cela a fonctionné.
J'avoue y être aller un peu de façon empirique et je ne sais pas si c'est la bonne méthode mais j'ai réussi à me connecter, c'est le principal! :-)

Pour ma part, mon principal problème est que je n'arrive pas à écrire (avec l'exemple fourni par windev) dans des variables de type "Int" ou "Uint" alors que tout fonctionne avec des variables "string" ou "boolean".

Lorsque je clique sur "Ecrire la valeur", j'ai bien le toastaffiche "Valeur écrite avec succès" mais la valeur ne change ni dans le tableau Windev, ni dans Prosys.

Après avoir regardé dans l'onglet "Req/Res Log" de Prosys, et cliqué sur la ligne "Write" qui s'est affichée lors du clic via l'appli windev, j'observe le message suivant : "Results:[0]: Bad_TypeMismatch (0x80740000) "The value supplied for the attribute is not of the same type as the attribute's value.""

Je reste un peu (beaucoup) coincé avec ça!! Des idées??

Merci d'avance.

Damien.
Membre enregistré
4 messages
Posté le 04 novembre 2020 - 16:02
C'est encore moi (Damien, je viens de créer un compte...)

J'ajouterai que je n'arrive pas à écrire pour toutes les variables de type "entier" --> "byte", "sbyte", "int16", "Uint16", "int32", "Uint32", "float"
Membre enregistré
4 messages
Posté le 12 novembre 2020 - 17:09
Bonjour à tous,

Devant le fort engouement pour ce sujet, j'ai pris les devants et ai contacté le service support de PC SOFT. :p

Ci-dessous leur retour. Vivement la prochaine version! ;)

Si jamais quelqu'un réussit à mettre en oeuvre les alternatives proposées par PC SOFT, je suis preneur.
En attendant, mon projet étant prévu pour fin de semaine prochaine, je vais probablement passer que pas des variables de type "string" et le programme automate devra les retranscrire en type "integer"

Bon développement!
- - - - - - -

Extrait du retour de PC SOFT :
"Les premières vérifications faites montrent qu'un développement à part entière sera nécessaire pour gérer ce cas, il ne s'agit malheureusement pas d'une correction pouvant être fournie sous la forme d'une DLL isolée.

Il est donc très probable que le cas ne puisse être géré que dans une prochaine version de WINDEV.

Suivant le cas, il est possible que l'utilisation d'un code C# directement saisi dans l'éditeur puisse constituer une alternative. Il est également possible d'utiliser une DLL compilée dans un autre langage, qui sera appelée via la fonction API depuis votre application WINDEV."
Membre enregistré
4 messages
Posté le 13 novembre 2020 - 10:15
Bonjour à tous (enfin surtout à moi-même si je prends le fil de cette discussion)

Finalement, en testant à nouveau le programme, je constate que l'écriture fonctionne tout de même pour des entiers sur 4 octets (Int32 et Uint32)!

Si l'on regarde la procédure WriteValueToNode, on constate que certains types de variables ont été validés par Windev (cf commentaire "OK" dans le code). Donc, à ceux qui souhaitent développer avec un serveur OPCUA en attendant la V27, privilégiez les types de variables "bool", "int32", "Uint32", "double" et "string" ;)

Bon dév' à tous!

PROCÉDURE WriteValueToNode(szNodeId est une chaîne, szValue est chaîne)


request est RequestHeader dynamic
request = allouer RequestHeader
myNodesToWrite est Opc.Ua.WriteValueCollection
myWriteValue est Opc.Ua.WriteValue
myResults est StatusCodeCollection dynamic
myResults = allouer StatusCodeCollection
myDiagsInfo est Opc.Ua.DiagnosticInfoCollection dynamic
myDiagsInfo = allouer DiagnosticInfoCollection
myNodeId est NodeId(szNodeId)
szBuiltInType est chaîne

myWriteValue.NodeId=myNodeId
myWriteValue.AttributeId=Attributes.Value

// Type
GetBuiltInType(myNodeId,szBuiltInType)

SELON szBuiltInType
CAS "i=1"
// bool OK
uValue est un booléen=(szValue)
myWriteValue.Value.set_Value(uValue)
CAS "i=2"
// sbyte
uValue est un entier sur 1 octet sans signe=(szValue)
myWriteValue.Value.set_Value(uValue)
CAS "i=3"
// byte
uValue est un entier sur 1 octet=(szValue)
nSType est entier =TypeVar(uValue)
typeInf est Opc.Ua.TypeInfo(BuiltInType.Byte,-1)

myVariant est Opc.Ua.Variant(uValue,typeInf)

myWriteValue.Value.Value=myVariant
CAS "i=4"
// int 16
uValue est entier sur 2 octets=(szValue)
myWriteValue.Value.set_Value(uValue)
CAS "i=5"
// uint 16
uValue est un entier sans signe sur 2 octets=(szValue)
myWriteValue.Value.set_Value(uValue)

CAS "i=6"
// int 32 OK
uValue est entier sur 4 octets=(szValue)
myWriteValue.Value.set_Value(uValue)
CAS "i=7"
// uint 32 OK
uValue est entier sans signe sur 4 octets=(szValue)
myWriteValue.Value.set_Value(uValue)
CAS "i=10"
// float
uValue est réel=(szValue)
myWriteValue.Value.set_Value(uValue)
CAS "i=11"
// double OK
uValue est un réel =(szValue)
myVariant est Opc.Ua.Variant(uValue)
myWriteValue.Value.set_Value(myVariant)
CAS "i=12"
// String OK
myVariant est Opc.Ua.Variant(szValue)
myWriteValue.Value.set_Value(myVariant)
AUTRE CAS
RENVOYER Faux
FIN


myNodesToWrite.add(myWriteValue)
// Écriture
mySession.Write(request,myNodesToWrite,myResults,myDiagsInfo)
myStatusCode est Opc.Ua.StatusCode(0)
szStatusCode est chaîne
myStatusCode<-myResults.get_Item(0)
szStatusCode=myStatusCode.ToString()

RENVOYER Vrai


CAS ERREUR:
RENVOYER Faux
CAS EXCEPTION:
RENVOYER Faux
Posté le 13 janvier 2021 - 11:34
Bonjour,

pour palier au problème de type non géré par PCSoft, il suffit de faire une fonction C# (dans une collection de procédure dédiée par exemple) qui retournera le type C# attendu. Parfois il est possible aussi de faire fonctionner en modifiant légèrement le type de la variable Wlangage (pour les floats, je déclare un réel sur 4 octets).
Posté le 27 mai 2021 - 15:44
Bonjour,
Travaillez vous toujours sur l'OPC UA avec Windev.

Si tel est le cas, sachez que depuis la version Windev26 maj 01F260100... la gestion des écritures OPC.UA des entiers de 1 et 2 octets signés ou non fonctionne désormais.

moi personnellement je n'arrive à écrire des tableaux quelque soit le type, si vous avez une idée je suis preneur.
Membre enregistré
4 messages
Posté le 31 mai 2021 - 11:29
Bonjour Fab_Nasty,

J'ai bien reçu la notification de PC_SOFT sur l'évolution de la version 26...
J'ai réussi à m'en passer pour mon projet en utilisant les variables qui fonctionnaient.

Concernant ton problème, as-tu utilisé l'exemple fourni par Windev? Car il a un tableau et cela fonctionne parfaitement...
Quel est ton problème précisément?
Posté le 02 juin 2021 - 16:24
Bonjour,

il semble que j'avais fait une petite boulette, un de mes collègues l'a corrigé.
donc en effet l'écriture d'un tableau fonctionne.

Merci pour l'info.

mais quelqu'un connait-il le moyen de lire et écrire une structure ?
Membre enregistré
14 messages
Posté le 03 juin 2021 - 14:50
Fab_Nasty a écrit :
Bonjour,

il semble que j'avais fait une petite boulette, un de mes collègues l'a corrigé.
donc en effet l'écriture d'un tableau fonctionne.

Merci pour l'info.

mais quelqu'un connait-il le moyen de lire et écrire une structure ?


Bonjour, si vous avez quelques ligne de code a me partager, j'en serai ravi, j'ai du mal à comprendre comment s'articule ces objet :

RequestHeader,DataValue et variant

merci d'avance !

J'ai longtemps chercher pour les structure mais impossible de les lire ou écrire de mon coté, nous avons décidé de changer le format de no données.
Cependant il me semble que cela se gère avec ls extensionObject ...
Posté le 08 juin 2021 - 10:07
Bonjour Paul M,

Je suis le collégue de Fab_Nasty. Pour l'écriture de tableau le code différe peu d'une écriture classique, à la différence qu'il faut affecter la valeur dans un Variant.

variable_tampon est un tableau de tailletable entier sans signe sur 2 octets
variable_tampon=SzValue
//Affectation du tableau dans un DataValue
Temp est Opc.Ua.variant(variable_tampon)
clMyVariant est DataValue <- new DataValue(Temp);

myWriteValue.IndexRange = debut_trame+":"+((debut_trame+tailletable)-1) //Dimensionnement du tableau de valeur
myWriteValue.Value = clMyVariant


Dans cet Exemple:
-Tailletable correspond à la taille du tableau à écrire
-SzValue contient le tableau de donnée à écrire
-Debut_trame est un entier determinant la premiére valeur à écrire.

De mon coté j'ai un peu avancé sur la lecture de structure, je pense ne pas être loin de la solution mais je me retrouve bloqué sur la fonction Opc.Ua.Session.ReadValues , lorsque j'éxécute mon code j'obtient une exception:
"Le framework .NET a renvoyé l'erreur suivante :
Une exception a été levée par la cible d'un appel."

Malgrés tout mes essais je n'ai pas réussi à faire fonctionné cette fonction. Si jamais vous avez une idée je suis preneur
Membre enregistré
14 messages
Posté le 08 juin 2021 - 15:01
Merci beaucoup pour le code, Dès que j'ai le temps je vais voir si j'arrive à le faire fonctionner de mon coté.

Concernant ReadValue, je ne sais pas si c'est la fonction que vous utilisez pour lire l'ensemble de vos données, de mon coté oui, nous ne sommes pas passé par le système de subscription.

mais pour l'ensemble de donnée nous utilisons des tableaux, car il parait que OPC-UA est bien mieux optimisé pour les Tableaux et ça c'est avéré vrai :
gTab_R_Real = gmySession.ReadValue(monNodeID).Value


Mais cela n'a pas fonctionné, même en utilisant une structure de même forme, je devais surement obtenir la même erreur que vous.
En cherchant pas mal (et a grand coup de TRACE de tous ce qui est traçable) j'ai finit par identifier un type ExtensionObject, renvoyé par la lecture du type des éléments contenues au sein d'un tableau de structure (pour essayer de bypasser le problème du read, j'ai mis mes structure dans un tableau)

ce code devrait vous permettre de lire vos structure,
//déclaration
gTabSTRUCT est un tableau dynamique
gTabSTRUCT = allouer un tableau de 500 ExtensionObject //la il y en a 500 mais 1 ou 4000 fonctionnerais

//boucle de lecture
gTabSTRUCT = gmySession.ReadValue("node id du tableau").Value
clTemp est ExtensionObject
clTemp<-gTabSTRUCT[1]
Trace(clTemp.Body.ToString()) //cette trace est très intéressante, elle fournie un byteString, qui m'a permis, en le décodant de récupérer les
//valeurs de mes structure, mais c'est une usine a gaz, est cela me parait difficilement envisageable en acquisition à
//100 milliseconde


NB la trace ne vas peut être pas fonctionner du premier coup (utiliser getbody() plutôt ?) , entre temps beaucoup de chose on changé dans mes DB je n'ai plus de structure a lire (et ne peux donc pas tester ce que je viens de vous écrire)

Il y a sur internet un exemple, (je n'ai pas le temps pour le retrouver désolé) de OPC-UA en C# qui fonctionne pour la lecture des structure mais je n'ai pas réussit à l'exploiter, je ne connais pas bien le C# et n'ais pas d'ide adapté
Posté le 16 juin 2021 - 14:19
Bonjour,
Si l'utilisation des dll OPC Foundation vous semble trop complexe, Siemens propose une classe .NET

Je cite la doc Siemens "s71500_communication_function_manual_fr-FR_fr-FR.pdf" P165 :

Exemple d'application dans Industry Online Support

Le support en ligne de Siemens Industry propose gratuitement un exemple d'application avec un API client pour différents cas d'application. Les fonctions de cette interface vous permettent de créer vos propres clients OPC UA, adaptés à votre cas d'application. Afin de simplifier le maniement de l'API, nous vous proposons une classe .NET Helper supérieure.
L'API client repose sur la pile .NET OPC UA de l'OPC Foundation.
Cet exemple d'application est disponible gratuitement et montre l'établissement de liaisons entre serveur et client, ainsi que la lecture et l'écriture de variables API.

Lien pour le téléchargement : OPC UA .NET Client for the SIMATIC S7-1500 OPC UA Server

http://support.automation.siemens.com/WW/view/fr/109737901

@+

FredG
Membre enregistré
5 messages
Posté le 27 juillet 2021 - 08:35
Bonjour,

Dans mon cas, j'ai tout simplement testé l'exemple Windev OPC UA mais au bout de quelques temps (plusieurs heures) l'exemple crash ou arrête d'actualiser les valeurs en laissant l'application allumé. J'ai contacté le support PC-SOFT à ce sujet et il doivent me tenir au courant si ils trouvent quelque chose.
Si quelqu'un a eu un problème similaire, son aide est la bienvenue.

Bonne journée à vous.
Posté le 27 juillet 2021 - 11:40
Bonjour,

C'est la raison pour laquelle j'ai abandonné ce mode de fonctionnement (je suis retourné vers un SDK que j'avais auparavant). Tu peux améliorer ce temps d'arrêt en jouant avec des paramètres de type KeepAlive mais ça ne règle pas le problème complètement. P
Apparemment ce serait un problème du côté de la gestion du .NET mais ça me dépasse ...(https://opcfoundation.org/forum/opc-ua-standard/opc-ua-client-shutdown-system-accessviolation-exception/). Je mettrais quand même un (petit) billet sur le delegate keepAlive qui permet de maintenir la connexion avec le serveur.

Je suis preneur si tu as un retour de PC Soft !
Membre enregistré
5 messages
Posté le 27 juillet 2021 - 16:28
C'est bien ce que je pensais, mais PC Soft avait l'air de dire qu'il n'avait jamais entendu parler de ce problème...

Je reviendrai donner des nouvelles si j'en ai de la part de PC Soft.

Personnellement, je pense faire tourner 2 applis avec une appli principal qui redémarre lorsqu'il y a un crash ou que les valeurs arrêtent de s'actualiser, et une appli secondaire qui la remplace le temps du redémarrage pour ne pas perdre de données durant ce laps de temps.