FT8alain
Messages postés8Date d'inscriptiondimanche 17 juin 2001StatutMembreDernière intervention 6 avril 2014
-
21 janv. 2014 à 20:30
vb95
Messages postés3472Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention13 avril 2024
-
6 avril 2014 à 08:45
Bonjour,
Je suis en train de développer un programme en VB 2010 qui assure le dialogue, l'affichage de valeurs, modification de valeurs avec un appareil à base de microcontroleur 16 bits programmé en C et datant des années 2000 (vous imaginez les problèmes de correspondance dans le type des variables). Mon programme dialogue via une liaison série RS232 avec un protocole ressemblant à MODBUS. J'ai réussi à faire tourner mon programme.
Le problème est que le dialogue PC <-> Appareil se fait via la lecture de structures de données et que, suivant l'utilisation de l'appareil, les structures n'ont pas les mêmes "grandeurs". A l'époque, il y avait un programme par appareil et on me demande de standardiser.
Je m'explique :
Pour un type d'appareil, j'ai une structure de 2 tableaux de 16 "char" (programmation en C) soit 2 x 16 x 1Byte = 32 Bytes.
Pour un autre type d'appareil, la même structure de 2 tableaux est de 16 "int" (programmation en C) soit 2 x 16 x 2 Short = 64 bytes. (Merci le développeur de l'époque qui a modifié le type pour stocker des valeurs < 255)
Donc, ce que j'aimerai c'est que suivant le type d'appareil, je puisse déclarer ma structure. Exemple :
Si appareil 1 :
Public structure AA
public aa() as byte
public bb() as byte
sub new(byval a as byte)
redim aa(a)
redim bb(a)
end sub
end structure
public AAA as new AA(10)
Si appareil 2 :
Public structure AA
public aa() as ushort
public bb() as ushort
sub new(byval a as byte)
redim aa(a)
redim bb(a)
end sub
end structure
public AAA as new AA(10)
Puis après, j'utilise AAA sans m'en préoccuper.
Donc, voici ma question, est-il possible de faire un truc du genre :
Si appareil1 : déclaration AAA appareil 1
Si appareil2 : déclaration AAA appareil 2
J'espère ne pas avoir était trop long dans l'explication et que vous m'aiderai à résoudre ce problème (j'ai quasiment 20 appareils différents avec des structures ayant le même nom mais pas la même déclaration).
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 21 janv. 2014 à 21:45
Il est clair que l'usage d'une seule structure serait totalement impossible.
Pour cela, je te propose de mémoriser le type de l'appareil dans un objet "Equipement", cet objet sera chargé aussi de la retranscription des données brutes (tableau d'octet) en type utilisable par le code (Int32 par exemple).
Cela te permettra d'éviter un code complexe et trop chargé.
FT8alain
Messages postés8Date d'inscriptiondimanche 17 juin 2001StatutMembreDernière intervention 6 avril 2014 24 mars 2014 à 19:53
Salut,
Avec beaucoup de retard car je croyais que mon projet aller être annulé, je suis de retour car on me demande à nouveau de m'y remettre.
Pourrais tu m'expliquer un peu plus ta solution? Tu parles d'objets qui seraient chargés suivant le type d'appareil. J'ai beau avoir cherché sur MSDN, je n'ai rien trouvé de vraiment positif.
Peut-être que la solution passerait par des classes au lieu de structures
Je suis perdu :(
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 1 avril 2014 à 22:54
Bonsoir,
En gros, réception d'un entier définissant le type :
Si Type=1 Alors utiliser telle structure pour la traduction
Si Type=2 Alors, en utiliser une autre
Si Type=3, ...
vb95
Messages postés3472Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention13 avril 2024169 5 avril 2014 à 10:57
Salut
tu dois déclarer des structures différentes au niveau du nom
Public struct1 as .....
Public Struct2 as .....
etc .....
Ensuite lors de l'utilisation tu utilises Select Case pour choisir le traitement à faire pour telle structure !
Tu dis : " A l'époque il y avait un programme par appareil !"
Maintenant il faut faire un seul programme avec un sous-programme par appareil et chaque sous-programme utilise une seule des structures définies en Public
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 5 avril 2014 à 11:10
Bonjour,
Pourquoi ne pas (ce serait plus simple) ne pas définir une structure plus grande (4 tableaux au lieu de deux) et en utiliser les membres selon le type de a ?
vb95
Messages postés3472Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention13 avril 2024169 5 avril 2014 à 16:02
Pour Ft8alain
Tu dis :" pour un appareil j'ai 2 tableaux de 16 bytes et pour un autre appareil j'ai 2 tableaux de 16 int16 "
donc tu définis 2 structures ainsi
Public Structure struct8
Dim tabl2() as byte
End Structure
Public Structure struct16
Dim tabl1() as int16
Dim tabl2() as int16
End Structure
public appareil8 as struct8
public appareil16 as struct16
ensuite dans l'initialisation du programme au chargement du premier formulaire tu initialises tes tableaux
With appareil8
redim .tabl1(0 to 15)
redim .tabl2(0 to 15)
End with
With appareil16
redim .tabl1(0 to 15)
redim .tabl2(0 to 15)
End with
ensuite selon le type d'appareil tu utilises l'une ou l'autre des structures
FT8alain
Messages postés8Date d'inscriptiondimanche 17 juin 2001StatutMembreDernière intervention 6 avril 2014 6 avril 2014 à 06:53
Salut,
Merci pour vos réponses et d'essayer de m'aider.
La solution de déclarer les structures par appareils, je l'ai déjà fait mais cela m'amène a utiliser un paquet de "Select case..End select" car l'exemple que j'ai décrit dans mon 1er message n'est qu'une goutte d'eau dans un verre. En effet, j'ai une variable structure globale qui est composée de plusieurs structures dont les noms sont identiques mais sont composées de variables de types différents voire de différentes variables (variables qui existent pour tel appareil mais n'existent pas pour d'autres, etc.). Après ces variables globales sont affichées dans des écrans mais aussi lues et écrites via liaison série dans les appareils (les structures sont aussi définies dans l'appareil mais là je ne peux pas les modifier, je n'ai pas le droit de toucher au logiciel interne de l'appareil).
Donc j'ai le choix:
1 - Créer des écrans et des dialogues via liaison série pour chaque appareil, ce qui correspond à créer un soft par appareil.
2 - Jongler avec des conditions (case, If, etc.) en gardant les mêmes écrans et les mêmes dialogues.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 Modifié par ucfoutu le 6/04/2014 à 07:50
Je ne suis pas vb.nettiste et peux donc m'avancer à tort, mais je serais assez surpris que l'on ne puisse, sous VB.Net, jongler au moins autant que sous VB6.
Les structures se définissent sous VB6 en Types (types personnalisés).
Et je jonglerais avec quelque chose du genre :
Private Type mes_types machine1 As Integer machine2 As Long machine3 As String End Type Private Type toto titi As mes_types tata As mes_types End Type
Private Sub Command1_Click() Dim teste As toto teste.titi.machine2 = 5 ' et j'aurais ici une erreur de type en y mettant par ex un string teste.tata.machine3 = "blabla" Var1 = teste.titi.machine2 var2 = teste.tata.machine3 MsgBox Var1 & vbCrLf & var2 End Sub
Enfin ... "je jonglerais" n'est pas tout-à-fait exact. Car j'éviterais tout simplement de faire une telle usine à gaz, au prétexte de ne pas alourdir mon code par une longue série de select case...
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
vb95
Messages postés3472Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention13 avril 2024169 6 avril 2014 à 08:45
Salut FT8alain
Pourquoi ne pas faire une forme de sélection pour choisir l'appareil utilisé et que chaque appareil utilise une forme "fille" pour les différents traitements ! Si certains traitements ou variables sont identiques pour plusieurs appareils mettre ces variables en Public et ces traitements en Public aussi dans un module !