Bonjour � tous,
J'aimerais pour une application OPC convertir un FLOAT en VARIANT, est ce possible?
Merci beaucoup.
Version imprimable
Bonjour � tous,
J'aimerais pour une application OPC convertir un FLOAT en VARIANT, est ce possible?
Merci beaucoup.
Oui, c'est possible.
�a depend de comment sont implement�s tes VARIANTS.
Les VARIANTS, c'est juste une technique, diff�rentes biblioth�ques l'impl�mentent de diff�rentes fa�ons.
Il y a boost::variant dans Boost
Il y a QVariant dans Qt
Il y a ...
Salut,
OPC utilise les variables de type tagVARIANT
pour utiliser un float, il faut d�finir le type :ensuite, tu affectes la valeur dans le champ correspondant aux flottants :Code:
1
2
3 tagVARIANT maVariableFlottante; maVariableFlottante.vt = VT_R4;
Tu trouveras la d�finition de la structure tagVARIANT dans le fichier oaidl.h (dans les r�pertoires de visual studio normalement...)Code:maVariableFlottante.fltVal = 123.456;
Ok donc pour mon cas ca devrait donner ca ?
Ja' besoin de votre avis car je ne peux pas faire de run pour le moment, mais au build tout semble correct.
En fait non ca plante....
Merci
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 // Python return a value which is a Python Object // To Send in OPC, we need a VARIANT tagVARIANT maVariableFlottante; maVariableFlottante.vt = VT_R4; // je fait la conversion pointervar de typen PyObject en "f" PyArg_Parse(pointervar, "f",&maVariableFlottante.vt); // Create the group // By default, the name of the group is Group_Opc COPCGroup* MyGroupOPC = GetGroup(opc, "Group_Opc"); // write to OPC the value of Python MyGroupOPC->addItem(NodePath, true)->writeSync(maVariableFlottante);
tagVariant c'est du microsoft pure et dur. (je connaissais pas). Donc niveau portabilit� y'a mieux. (boost::variant comme cit� plus haut).
D'ailleurs apr�s recherche :
http://msdn.microsoft.com/fr-fr/library/tagvariant.aspxCitation:
This class supports the .NET Framework infrastructure and is not intended to be used directly from your code.
�a serait pas plut�t �a :
� moins que tu ais fait une erreur de recopie...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 // Python return a value which is a Python Object // To Send in OPC, we need a VARIANT tagVARIANT maVariableFlottante; maVariableFlottante.vt = VT_R4; // je fait la conversion pointervar de typen PyObject en "f" PyArg_Parse(pointervar, "f",&maVariableFlottante.fltVal); // Create the group // By default, the name of the group is Group_Opc COPCGroup* MyGroupOPC = GetGroup(opc, "Group_Opc"); // write to OPC the value of Python MyGroupOPC->addItem(NodePath, true)->writeSync(maVariableFlottante);
Oui effectivement ca serait plut�t ce que tu dis, et le plantage venait de toute fa�on d'ailleurs.
Je vous retiens au courant sous peu,
En attendant merci;)
Julien
Je recommande d'utiliser directement le typedef VARIANT plut�t que la structure tagVARIANT sous-jacente...
Bon �a � l'air de fonctionner pour un float,
J'ai aussi besoin d'effectuer le m�me traitement pour un Int et un String.
Je ne connais pas du tout les conversions avec ce type d'�l�ments.
Merci
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 tagVARIANT monstring; monstring...=..; // je fait la conversion pointervar de typen PyObject en "f" PyArg_Parse(pointervar, "s",&maVariableFlottante.IVal); // Create the group // By default, the name of the group is Group_Opc COPCGroup* MyGroupOPC = GetGroup(opc, "Group_Opc"); // write to OPC the value of Python MyGroupOPC->addItem(NodePath, true)->writeSync(maVariableFlottante);
Comme dis par m�dinoc et moi m�me implicitement utilise VARIANT (c'est un typedef) plut�t que tagVariant qui n'est pas fait pour �tre utilis� dans un code final.
Ok pour le typedef VARIANT plut�t que tagVARIANT
Mais je suis tout de m�me oblig� de faire la conversion
Si je reprend mon code initial on a :
Pour un string et un int connaissez vous les conversions?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 // Python return a value which is a Python Object // To Send in OPC, we need a VARIANT VARIANT maVariableFlottante; maVariableFlottante.vt = VT_R4; // je fait la conversion pointervar de typen PyObject en "f" PyArg_Parse(pointervar, "f",&maVariableFlottante.fltVal); // Create the group // By default, the name of the group is Group_Opc COPCGroup* MyGroupOPC = GetGroup(opc, "Group_Opc"); // write to OPC the value of Python MyGroupOPC->addItem(NodePath, true)->writeSync(maVariableFlottante);
J'ai post� ailleurs pour les strings (utiliser une BSTR).
Pour les int, c'est VT_I4 :
Code:
1
2
3
4
5 int monEntier = ... ; VARIANT var; VariantInit(&var); V_VT(&var) = VT_I4; V_IA(&var) = monEntier;
eheh,
moi aussi �a m'int�resse ;)
pour les chaines de caract�res, c'est l�
quelles sont les fonctions du type V_IA, V_BSTR mais pour les int, les float, les bool, les short?...
o� trouve-t-on leur d�finition?
j'ai cherch� mais trouve pas:(
http://msdn.microsoft.com/en-us/library/ms221627.aspx
En bas y'a le tableau des correspondances.
Ce ne sont pas des fonctions mais des macros, en fait.
C'est simple, c'est le m�me nom que pour les constantes VT_*, sans le "T".
- VT_I4 et V_I4 pour int (32 bits)
- VT_R4 et V_R4 pour float (32 bits)
- VT_R8 et V_R8 pour double (64 bits)
- VT_BOOL et V_BOOL pour les bool�ens (attention, utiliser VARIANT_TRUE et VARIANT_FALSE, pas 1 et 0)
- VT_I2 et V_I2 pour les short (16 bits)
- type + VT_BYREF pour les pointeurs, avec par exemple V_I4REF pour un pointeur sur int.
Apparemment, il n'y a pas d'aide sur les macros, mais leurs d�finitions sont dans <OleAuto.h>. Pour les constantes de types, tu peux les trouver dans l'aide, et leur d�finition est dansWTypes.h.
Juste un truc � propos des char: Pour des raisons de compatibilit�, la constante de type VT_I1 d�signe en v�rit� le type OLECHAR, qui est un wchar_t. Il n'existe plus de type char ou signed char dans les variants. Par contre, la constante VT_UI1 d�signe toujours un unsigned char (ou "byte").
yeah,:ccool:
merci M�dinoc :zoubi:
Merci � tous, c'est impeccable. ;)