Problème avec les appels de fonction

cop_seb Messages postés 5 Date d'inscription mercredi 10 janvier 2007 Statut Membre Dernière intervention 14 février 2007 - 13 févr. 2007 à 20:30
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 - 14 févr. 2007 à 23:30
Bonsoir à tous!
J'espère trouver ici une réponse à mon petit problème...

Voila je suis entrain de créer un système pour contrôler mon train électrique via le port parallèle, le système fonctionne en mode debug, la ou je coince c'est sur le vb6!

J'ai créé un module qui a pour fonctionner de contenir les sub pour commander chaque les états de chaque sortie, en voici un exemple:
<col style=\"width: 60pt;\" width=\"80\" />----
Public Sub s_6_3(), ----
Out ADD, 234, ----
Out ADD, 170, ----
Out ADD, 234, ----
End Sub

En mode débug j'ai facile, j'écris un call s_6_3 dans mon bouton et hop la lampe se met à un dans ce cas si...

La ou cela se complique c'est lorsque je veux appeler une sortie quelconque à partir d'une variable...

Je m'explique, sur le bouton 1 j'envois à une méthode l'aiguillage auquel il se rapporte, par exemple 6_3, alors la il met à un la sortie puis la coupe après un certain temps.

Cependant je n'arrive pas à appeler la méthode s_6_3 à partir de ma variable...  exemple:
public sub aigui(ByVal nom as strin)
dim sortie as string
sortie="Module3.s_" & nom
Call sortie  La sa coince...
end Sub

J'ai essayé d'utiliser la fonction CallByName, mais cela ne marche pas si le sub se trouve dans un module... alors je suis perdu...

Pouvez vous m'eclairer s'il vous plait?

Merci d'avance et bonne soirée

SEBASTIEN

9 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
13 févr. 2007 à 20:42
Bonsoir SEBASTIEN,

Peux-tu s'il te plait recommencer à exposer ton problème, mais cette fois-ci avec méthode et avec précision.3
J'ai vraiment du mal à comprendre ce dont il retourne et ce que sont les choses que tu tentes d'exposer...

Déjà (et par exemple) :
que pourrait signifier : "Cependant je n'arrive pas à appeler la méthode s_6_3"
alors que, très manifestement, s_6_3 n'est pas le nom d'une méthode mais celui que tu as donné à une routine...
mais ce n'est pas là tout ! ce n'est que l'un des éléments rendant ta question totalement incompréhensible.

Je suis certain de ce que, si tu sais ce dont il s'agit, tu sauras l'exposer à ceux qui ne le savent pas encore du tout ...
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
13 févr. 2007 à 20:49
A part peut-etre la méthode CallByName comme tu dis, à ma connaissance, ce que tu essye de faire est impossible

Il faut que tu fasse directement un Call s_6_3()

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
14 févr. 2007 à 00:14
Je n'ai pas mieux compris que les autres, mais peut-être que tu pourrais travailler avec une Sub (ou plusieurs) et lui passer des paramètres (?)

Si tu crées une procédure qui fait une action précise, disons changer la voie de direction et que tu as plusieurs jonctions qui peuvent faire cette action, tu peux mettre le numéro de jonction en paramètre selon les besoins. À ce moment, dans ta procédure, tu vérifies le paramètre en question et tu agis comme bon te semble...

ex:
Sub AllumeLampe(Numero as integer)
    If numero = 1 then
        'allume la 1
    elseif numero= 2 then
        'allume la 2
    '...............
    end if
End sub

Dans ton code
Call AllumeLampe 1     'si tu veux allumer la 1

MPi
0
cop_seb Messages postés 5 Date d'inscription mercredi 10 janvier 2007 Statut Membre Dernière intervention 14 février 2007
14 févr. 2007 à 08:37
Bonjour à tous,
je pensais avoir été plus ou moins claire. Bon c'est pas grave je vais tenter de mieux expliquer ca... Avant tout je tiens à préciser que je suis loin d'etre un craque en vb6, alors...

l'idée de base, créer des cartes sur bases de multiplexeur, et démultiplexeur, jusqu'a la rien de bien méchant.

Matériellement je dispose de ceci:
----------         ----------         ----------         ----------         
|  16       |         |  16        |         |  16        |         |  16       |  
|  OUT   |         |  OUT    |         |  OUT    |         |  IN       |     
----------         ----------         ----------         ----------    

Le tout est raccorder au port parallèle de mon pc. je travail sur les 8 bits de d0 ->d7 pour commander mes sorties. (je ne parle pas encore des entrées car je n'ai pas encore réaliser la carte...)

Sur chaque cartes j'ai deux multiplexeur de 3  par 8, donc 3 bits de contrôle et 8 sorties. J'ai nomé ces sorties comme suit:
mise à 1 : s_n°du multiplexeur_n°de la sortie
mise à 0 : r_n°du multiplexeur_n°de la sortie

Exemple: pour la sortie une du multiplexeur 1 de la carte 3 cela donne:
mise à 1: s_5_1
mise à 0: r_5_1

Maintenant du point de vue programme, voici sa structure:
  form 1: FDEBUG ; contient l'interface pour le DEBUG de la carte, a savoir les set et reset de chaques sorties, lecture de chaques entrées. (cette partie fct).
form2: FMANU; contient l'interface de mise en place du système train, à savoir aiguillages, alimentation et autre. Cette partie pose problème...

module1; contient l'adresse du port parallèle, les fonctiones d'écriture et lecture. Rien de bien méchant.
module2; contient les routines propre au mode de fonctionnement DEBUG, par exemple RAZ des cartes...
module3; contient les routines pour mettre à 1 ou à 0 les sorties, je donne ci dessous un exemple...
module4; devrait contenir les routines propre au mode de fonctionnement MANU.

Alors un exemple de ce que contient le module3:

Public Sub s_1_1()
Out ADD,100
Out ADD,200
Out ADD, 100
End Sub
Public Sub r_1_1()
Out ADD, XXX
Out ADD, YYY
Out ADD, XXX
End Sub
public Sub s_1_2()
Out ADD, XXX
Out ADD, YYY
Out ADD, XXX
End Sub
public Sub r_1_2()
Out ADD, XXX
Out ADD, YYY
Out ADD, XXX
End Sub

Et ainsi de suite les set et les reset pour chaque sorties. (1_1->1_8  |  2_1->2_8   |   3_1->3.8   |   4.1->4.8   |   5.1->5.8   |   6.1->6.8) (c-à-d 48 sorties...)

XXX et YYY représent l'adresse en décimal que je dois écrire sur le port parallèle pour activer ou désactiver ma sortie, et est donc variable.

En mode DEBUG cela fonctionne très bien, pour appeler ma routine de sortie correcpondant à 1_1 je fais ceci:
Call Module3.s_1.1
et hop ma sortie passe à 1.

En mode MANU cela se complique, mais avant d'expliquer pourquoi au point de vue programme je vais expliquer le pourquoi au point de vue matériel.

Pour commander un aiguillage j'ai besoin de 2 sorties, une pour mettre l'aiguillage à gauche l'autre pour le mettre à droite. De plus je ne puex jamais laisser la tension sur les sorties, je dois donc lancer un pulse de durée définie sur la sortie.

Pour se faire j'ai eu l'idée de créer une routine qui aurait pour but de faire ceci:

Créer le nom de la routine à appeler suivant l'adresse de la sortie (j'envois à la routine 1_1, il va créé s_1_1 et r_1_1)
Il met à un la sortie correspondante (dans la lignée de ce que je fais manuellement avec le mode DEBUG:   Call Module4.s_1_1)
Attendre une tempo que quelques secondes
Il met à zéro la sortie (dans la lignée de ce que je fais manuellement avec le mode DEBUG:   Call Module4.r_1_1)

Encode cela pourrait donner un truc du genre:

Public Sub (ByVal adresse as String)         
dim sortie as String
sortie= "Module3.s_" & adresse         'si adresse="1_1", alors sortie= "Module3.s_1_1"
Call sortie
TEMPORISATION
sortie= "Module3.r_" & adresse         'si adresse="1_1", alors sortie= "Module3.r_1_1"
Call sortie
End Sub

Le problème vous l'aurez peut-être déjà compris, c'est que dans cette routine j'aurais besoin d'appeler des autres routines dont le nom est défini cette dernière à base d'une variable.
Visual Basic il aime pas ca, et donc cela ne marche pas...

J'ai essayé de résoudre ce problème en utilisant l'appel CallByName, mais la il ne fonctionne pas car je travail dans des modules.

J'essaye donc de trouver une solution pour ne pas devoir recommencer tout mon travail, d'ou ma présence ici.

J'espère que mon explication a été plus claire que la première fois, et je m'excuse de suite si je n'ai pas utlisé les bon mots pour nommer les éléments. C'est d'ailleurs pour cela que j'ai essayé de faire appel à des exemples.

je vous remercies pour vos réponses passées et vos futur réponse.

PS:MPi
Merci de ta réponse, mais j'ai déjà essayé cela , et je coince sur le "Out ADD, variable" de la même manière que je coince actuellement. En effet Out est une fonction qui fait appel à une DLL, donc je n'arrive pas à intégrer de variable la non plus...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
14 févr. 2007 à 10:57
CallByName, comme on te l'a suggéré, devrait être l'idéal.
Et je ne vois pas pourquoi ça ne fonctionnerait pas avec des procédures dans un module (?)
Du moins, je n'ai jamais entendu parler de cette problématique...

Autrement, comme je te le suggérais, il s'agirait de passer les arguments nécessaires en paramètre à une Sub "générale" qui appelerait la bonne Sub selon ces paramètres. Avec un Select Case, tu pourrais rediriger le code vers la bonne fonction ... C'est du moins ce que j'en comprends ...

ex:
en me fiant à la routine que tu écris
Public Sub Generale (ByVal adresse as String)        
Select case adresse
    Case "1_1"
       Call s_1_1
       Temporisation
       Call r_1_1
    Case "2_2"
       Call s_2_2
       Temporisation

       Call r_2_2

    '.................
End select
End sub

Ça ne pourrait pas fonctionner ainsi ?
MPi
0
cop_seb Messages postés 5 Date d'inscription mercredi 10 janvier 2007 Statut Membre Dernière intervention 14 février 2007
14 févr. 2007 à 11:48
Si tu as raison je pense que cela pourrait fonctionner. Seulement l'écriture sera assez lourde, à savoir 96 cas possible (48 sortie, un set et un reset), d'ou mon désire de simplifier l'ensemble.


Merci d'avoir répondu à mon message, si il n'y a pas d'autre solution je m'en remettrais à cela.


A bientot


SEB
0
cop_seb Messages postés 5 Date d'inscription mercredi 10 janvier 2007 Statut Membre Dernière intervention 14 février 2007
14 févr. 2007 à 11:50
Oups me suis planté, il n'y aurait "que" 48 cas, car set et reset sont dans le mm...

enfin!
0
cop_seb Messages postés 5 Date d'inscription mercredi 10 janvier 2007 Statut Membre Dernière intervention 14 février 2007
14 févr. 2007 à 11:50
Oups me suis planté, il n'y aurait "que" 48 cas, car set et reset sont dans le mm...

enfin!
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
14 févr. 2007 à 23:30
Je te conseillerais de réessayer avec CallByName.
Il paraît que c'est plus lent à l'exécution, par contre...
Mais plus simple à mettre en place, je pense...

Sinon, tu peux simplifier des fonctions imbriquées comme je l'expliquais mais les rendre plus simples encore.

En fait, tu as 48 possibilités donc 48 IF (ou mieux Case)
Tu as 2 procédures principales Set (S) et Reset (R)

Ces 2 procédures peuvent contenir les 3 valeurs que tu utilises (si je me fie à tes exemples)
Tes procédures
Public Sub s_1_1()
Out ADD,100
Out ADD,200
Out ADD, 100
End Sub
Public Sub r_1_1()
Out ADD, XXX
Out ADD, YYY
Out ADD, XXX
End Sub

pourraient être changées par
Public Sub S(Val1,Val2,Val3)
    Out Add, Val1
    Out Add, Val2
    Out Add, Val3

End sub
même chose pour R  (reset)
Tu n'aurais en fait que 2 procédures

Tu les appelles donc à partir d'une seule procédure, disons "MaSub"
Public Sub MaSub(ByVal Adresse as string)
    Select Case Adresse
       Case "1_1"  'je ne sais pas si le S et le R doivent être ensemble, comme ça (?)
          S 100, 200, 100
          R 100, 200, 100
       Case "1_2"
          S 200, 300, 200

          R 200, 300, 200

.........................

le reste n'est que du copier/coller et quelques modifications de valeurs
Si les procédures Set et Reset ne doivent pas être roulées une après l'autre, ce pourrait être un autre paramètre à ajouter
Et on peut probablement encore simplifier
Le problème, c'est que c'est du chinois pour moi ton bidule de train  ¦¬)
Mais c'est sûrement intéressant à faire...

MPi
0
Rejoignez-nous