09-04-2013 08:14 AM
Je suis en train de créer des étages de DLL/Lib sous LabWindowsCVI V10.0
- Driver (Pilotage du matériel avec gestion des erreur)
Ex : Gestion_IP, Gestion_RS, Gestion_GPIB, ... (Ouverture/Fermeture/Lecture/Écriture/...)
- Protocole (Formattage des données et utilisation des fonctions "Driver")
Ex : Gestion_Appareil1_IP, Gestion_Appareil2_IP,Gestion_Appareil3_RS, Gestion_Appareil4_GPIB, ... (EnvoiCommande1/EnvoiCommande2/...)
- Banc (Intégration des caractéristiques des bancs de test aux fonctions "Protocole")
Ex : Configuration1 = Commutation du relai X pour EnvoiCommande1...
- Produit (Developpement des tests par produits en y intégrant les fonctions"Banc" et, si nécessaire, "Protocole")
Ex : Test1 = Mesure X en Configuration1 avec contrôle
L'intérêt principal est de :
- disposer de fonctions standards usine au niveau "Driver" et "Protocole"
- réduire le développement et la validation lors de l'arrivée d'un nouveau "Banc" et/ou "Produit"
- pouvoir déplacer un produit A sur un banc différent
Afin de limiter le nombre de .lib et de .h à inclure dans les niveaux supérieurs, j'aimerais savoir comment incluse a la compilation :
- les librairies et .h "Driver" dans les librairies "Protocole"
- les librairies et .h "Protocole" dans les librairies "Banc"
- les librairies et .h "Banc" dans les librairies "Produit"
Merci pour votre aide
09-04-2013 10:05 AM
Bonjour,
Je ne suis pas sûr de bien comprendre ta question, mais en la lisant on est tenté de te suggérer de procéder comme suit (exemple pour un "test3" de communication RS sur un produit X donné) :
- insérer une ligne #include gestion_rs.h(prototypes des fonctions contenues dans gestion_rs.c) dans le fichier gestion_appareil3_rs.c
- insérer une ligne #include gestion_appareil3_rs.h (prototypes des fonctions contenues dans gestion_appareil3_rs.c) dans le fichier configuration3.c
- insérer une ligne #include configuration3.h (prototypes des fonctions contenues dans configuration3.c) dans le fichier test3.c
Ai-je répondu à ta question ? J'ai l'impression d'enfoncer une porte ouverte mais si c'est le cas cela permettra au moins de te faire clarifier ta question. 🙂
J.
09-04-2013 10:22 AM
bonsoir,
La réponse de Julien_2831 correspond à ce à quoi je voudrais arriver...
Ce que j'ai actuellement c'est :
- une ligne #include gestion_rs.h dans le fichier gestion_appareil3_rs.c
- deux lignes #include gestion_appareil3_rs.h et #include gestion_rs.h dans le fichier configuration3.c
- trois lignes #include configuration3.h et #include gestion_appareil3_rs.h et #include gestion_rs.h dans le fichier test3.c
Il me faut donc inclure dans les projets toutes les librairies et .h associés...
Je voudrais n'inclure que celles du niveau inférieur.
Si celà est possible, j'aimerais même pouvoir appeler des fonctions des niveaux n-2 et inférieur...
J'ai essayé de jouer avec les encarts "LoadExternalModule Options" et "Exports" sur menu "Build \ Target Settings" sans succès...
Merci Julien pour cette première réponse
Guillaume
09-04-2013 10:42 AM
Je reprends ta réponse et je barre ce qui me semble inutile à la compilation.
Ce que j'ai actuellement c'est :
- une ligne #include gestion_rs.h dans le fichier gestion_appareil3_rs.c
- deux lignes #include gestion_appareil3_rs.h et #include gestion_rs.h dans le fichier configuration3.c
- trois lignes #include configuration3.h et #include gestion_appareil3_rs.h et #include gestion_rs.h dans le fichier test3.c
On retombe sur ma première réponse, à savoir que seules les lib du niveau inférieur sont incluses.
Dans ce cas, et sauf erreur de ma part, les fonctions du niveau n-2 pourront bel et bien être appelées depuis le niveau n...car pour compiler les fonctions du niveau n-1, le compilateur aura forcément dû connaître les prototypes de celles du niveau n-2 ! 🙂
Je t'invite à faire un petit test simple pour t'en assurer, mais je pense que ça va rouler.
09-06-2013 08:46 AM
J'ai réalisé une petite imbrication de projet pour mieux comprendre le fonctionnement.
J'ai inclus les Header (*.h) lors de la compilation de tous les niveaux.
Si le niveau haut (Produit) appel une fonction du niveau inférieur (Banc), seul l'importation de "Banc.lib"' et "Banc.h" sont nécessaires.
Si le niveau haut (Produit) appel une fonction de très bas niveau (Drivers), il faut également importé la Lib et H de ce niveau.
L'encapsulage semble donc fonctionner uniquement pour les fonctions du projet mais pas pour les fonctions externes...
Pour info, sur mon projet complexe, j'ai :
- "Driver" - Un projet de la gestion des erreurs et de gestion élémentaire des fichiers textes (Ouverture/Fermeture/Lecture/Ecriture).
- "Protocol" - Un projet de la traitement des fichiers textes (LectureEtMemorisationDuneLigne/EcritureDuneLigne).
=> Appel la gestion des erreurs et la gestion élémentaire des fichiers textes
- "Bench" - Un projet de la gestion personnalisée des fichiers textes (LectureFichierCfg1/LectureFichierCfg2/EcritureFichierRapport1,... avec les variables du banc).
=> Appel la gestion des erreurs et la gestion élémentaire des fichiers textes
=> Appel la gestion traitement des fichiers textes
- "Produit" - Un projet de séquencement des fonctions de niveau banc...
=> Appel la gestion des erreurs et la gestion élémentaire des fichiers textes
=> Appel la gestion personnalisée de fichiers textes
J'aurais bien voulu m'affranchir des fonctions :
- Orange : Utilisée dans le niveau ou elle est appelée mais déjà présente dans l'autre librairie appelée.
- Rouge : Pas utilisée dans le niveau ou elle est appelée...
Merci pour vos réponses. Grace à elles, j'avance doucement, mais j'avance
Guillaume
09-06-2013 09:16 AM
Voici un exemple de ce que j'imagine (voir pièce jointe).
Le niveau N2 est le plus élevé. Il y a un niveau intermédiaire N1 et un bas niveau N0. Tu peux voir comment j'envisage l'encapsulation.
09-06-2013 10:03 AM
Salut Julien,
J'ai regardé ton exemple : Tu imbriques des .c dans un même projet....
Ce que j'essai de faire est d'imbriquer plusieurs projets ensemble (cf pièce jointe).
Info : Ouvre le fichier "...\ESSAI IMBRICATION\3-BenchFunctions\3-BenchLevel.cws" pour tout visualiser en même temps...
Objectif : Dans les "Include Files" du projet "3-BenchLevel" n'avoir que "2-ProtocolFunctions.lib" mais pouvoir utilisé :
- la fonction "iFileTXTandBIN_OpenAndClose" du niveau -1
- la fonction "iFileTXTandBIN_Open" du niveau -2
Remarque : Dans mon exemple, celà n'a aucun intérêt mais j'en ai besoin dans mon système complexe...
Question complémentaire : Si tu réussis à m'activer la fonction panel du niveau 1 dans le niveau 2, ce serait formidable.
J'ai un problème de compatibilité du type FILE à la compilation et je ne réussi pas à déclarer mes variables d'entrées dans ce type...
Merci, bonne soirée et bon WE
Guillaume
10-21-2013 03:41 AM
Bonjour Julien,
Dans la mesure ou tes fonctions correspondant à chaque niveau sont réparties dans des DLL différentes, tu n'as pas d'autres choix que :
1- Inclure le .h et le .lib correspondant pour chaque projet
2- Ajouter des fonctions chargées de relayer l'accés au niveau n-2 dans les librairies de niveau n-1 (wrapper)
En somme, tu souhaites faire de l'encapsulation en C mais par l'intermédiaire de DLL. Seule l'utilisation de composant ActiveX/DCOM pour chaque niveau ( qui risque de compliquer plus encore ton projet) permettrait de répondre à tes besoins.
Cordialement,
Stéphane