IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Programmation dans une boucle avec un temps fixe


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    particulier
    Inscrit en
    juin 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : particulier

    Informations forums :
    Inscription : juin 2023
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Programmation dans une boucle avec un temps fixe
    Bonjour

    je voudrais progarmmer une boucle qui s'exécute avec un temps fixe, éventuellement paramétrable, avec à l'intérieur des instructions de calcul et de commande de servos moteurs qui peuvent avoir un temps variable. Si le temps des instructions est supérieur au temps permis par la boucle, je sors un message d'erreur, si le temps des instructions est inférieur au temps permis par la boucle, c'est le temps de la boucle qui est pris en compte.

    Je ne sais pas si ma question est claire ? je pourrais préciser si besoin.

    Merci !

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    12 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 12 113
    Points : 29 558
    Points
    29 558
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Cela ressemble à du temps réel. Or Python n'est pas prévu pour ça.
    Une idée comme ça: lancer la boucle dans un thead pendant que le père lance une tempo. Ensuite si la tempo est écoulée et que le thread n'a pas rendu son résultat alors il est arrêté...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    particulier
    Inscrit en
    juin 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : particulier

    Informations forums :
    Inscription : juin 2023
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour
    Cela ressemble à du temps réel. Or Python n'est pas prévu pour ça.
    Une idée comme ça: lancer la boucle dans un thead pendant que le père lance une tempo. Ensuite si la tempo est écoulée et que le thread n'a pas rendu son résultat alors il est arrêté...
    En fait je programme en micro python, peut-être est-ce une spécifité ajoutée par rapport à Python ?

  4. #4
    Membre expert Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2013
    Messages
    1 880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2013
    Messages : 1 880
    Points : 3 963
    Points
    3 963
    Par défaut
    bonjour

    Tu ne nous parles pas de ton temps (micro seconde, ... secondes, ?) et strictement rien sur la précision donc impossible de donner une solution.
    Comme dit plus haut, pour du temps réel, python n'est certainement pas la solution !

    une petite simulation (la boucle dure 4 secondes, si dépasse : erreur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    import time
    import random
     
    def timer(fonction_travail, maxi, datas):
        # fonction à durée fixe*
        t0 = time.perf_counter()
        print("start ...")
        try:
            ret = fonction_travail(datas)
        finally:
            t1 = time.perf_counter()
            duree = t1 - t0
            print(f'    # {duree:0.4f}')
            if duree > maxi:
                raise TimeoutError(f"Oups, trop long, plus de {maxi} secondes")
            else:
                print(f"    # Attendre  {maxi - duree} secondes ...")
                time.sleep(maxi - duree)
                return ret
     
    def travail(datas):
        # calcul et de commande de servos moteurs 
        time.sleep(random.randint(1, 5))
     
    for i in range(8):
        timer(travail, 4, i)
    $moi= ( !== ) ? : ;

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    20 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 20 761
    Points : 35 839
    Points
    35 839
    Par défaut
    Salut,

    Citation Envoyé par pmdd01 Voir le message
    Je ne sais pas si ma question est claire ? je pourrais préciser si besoin.
    Un peu de recherche sur Internet vous indiquerait des articles comme celui-ci... avec des solutions plus facile à implémenter sur Linux que sur Windows.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    particulier
    Inscrit en
    juin 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : particulier

    Informations forums :
    Inscription : juin 2023
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par papajoker Voir le message
    bonjour

    Tu ne nous parles pas de ton temps (micro seconde, ... secondes, ?) et strictement rien sur la précision donc impossible de donner une solution.
    Comme dit plus haut, pour du temps réel, python n'est certainement pas la solution !

    une petite simulation (la boucle dure 4 secondes, si dépasse : erreur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    import time
    import random
     
    def timer(fonction_travail, maxi, datas):
        # fonction à durée fixe*
        t0 = time.perf_counter()
        print("start ...")
        try:
            ret = fonction_travail(datas)
        finally:
            t1 = time.perf_counter()
            duree = t1 - t0
            print(f'    # {duree:0.4f}')
            if duree > maxi:
                raise TimeoutError(f"Oups, trop long, plus de {maxi} secondes")
            else:
                print(f"    # Attendre  {maxi - duree} secondes ...")
                time.sleep(maxi - duree)
                return ret
     
    def travail(datas):
        # calcul et de commande de servos moteurs 
        time.sleep(random.randint(1, 5))
     
    for i in range(8):
        timer(travail, 4, i)




    De l'ordre de 10 ms...

  7. #7
    Membre expert Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2013
    Messages
    1 880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2013
    Messages : 1 880
    Points : 3 963
    Points
    3 963
    Par défaut
    Citation Envoyé par pmdd01 Voir le message
    De l'ordre de 10 ms...
    réponse concise je suppose donc que tu n'as même pas essayé de modifier ma variable maxi ...

    Pour voir la précision maxi que tu peux avoir, tu peux faire un simple test (dépend de ton OS), genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import time
     
    boucle = 100
    timeur = 10/1000
    start = time.perf_counter()
    for i in range(boucle):
        time.sleep(timeur)
        # value_retour, durée = travailler(datas)    # dans un autre thread
        # if duree > timeur : raise TimeoutError(f" plus que {timeur} seconde")
    end = time.perf_counter() - start
    print()
    print("Fin", end, "==", boucle * timeur, "secondes ???")
    ps: wiztricks t'a donné un lien si tu n'as que cela à en dire, on ne peut pas grand-chose pour toi
    $moi= ( !== ) ? : ;

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    20 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 20 761
    Points : 35 839
    Points
    35 839
    Par défaut
    Citation Envoyé par pmdd01 Voir le message
    De l'ordre de 10 ms...
    Probablement trop petit pour un OS qui n'est pas "temps réel" (et probablement le matériel qui va avec).
    Et avec ça on oublie Python pour coder en C ou en assembleur.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    particulier
    Inscrit en
    juin 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : particulier

    Informations forums :
    Inscription : juin 2023
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Probablement trop petit pour un OS qui n'est pas "temps réel" (et probablement le matériel qui va avec).
    Et avec ça on oublie Python pour coder en C ou en assembleur.

    - W
    Le micropython ne le permet pas ?

  10. #10
    Membre expert Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2013
    Messages
    1 880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2013
    Messages : 1 880
    Points : 3 963
    Points
    3 963
    Par défaut
    On ne connait PAS tes besoins, c'est donc à TOI uniquement de faire des tests !!! On te l'a dit, plus tu vas dans le "petit" et moins python va répondre au besoin.
    Une chose est sûre, si tu désires véritablement du "temps réel", alors il faut oublier tout langage interprété Attention, le temps réel est un travail très compliqué et vu tes questions, certainement pas accessible à ton niveau.

    Puisque python est simple, c'est simple et rapide de faire un petit code de test... décalage accepté de tes 10ms ? temps de traitement de ta fonction de travail en pleine charge ? cpu à 99% des heures est acceptable ? dépendance d'un os/machine minimale ? ...

    oublie Python pour coder en
    Existe bien d'autres alternatives comme Rust ou Go
    $moi= ( !== ) ? : ;

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    20 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 20 761
    Points : 35 839
    Points
    35 839
    Par défaut
    Citation Envoyé par pmdd01 Voir le message
    Le micropython ne le permet pas ?
    Peut être mais on part sur de la programmation de microcontrôleurs.
    Ce n'est pas de la programmation pour débutant *et* ça demande une étude du besoin et un choix de la solution à mettre en face (lancer une opération avec un timeout dessus aura sans doute un support matériel qu'on n'a pas en standard).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Membre expert Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2013
    Messages
    1 880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2013
    Messages : 1 880
    Points : 3 963
    Points
    3 963
    Par défaut
    pas de la programmation pour débutant *et* ça demande une étude du besoin et un choix de la solution à mettre en face
    Tout à fait !
    Par exemple, que se passe-t-il si une tâche dépasse les 10ms ?
    - la tâche suivante est quand même lancée ? risque de plantage si 2 tâches en // ?
    - comment "retarder" le timeur si une tâche dépasse les 10 ms ? Mais alors notre boucle de 10ms ! va être déréglée, c'est possible ou non ?
    Devons-nous supprimer des taches en attente pour coller au cahier des charges ? les mettre en attente, mais avec toujours le même décalage de 10ms entre elles ? autre solution ?
    Une question qui va certainement avoir un impact énorme sur l'architecture du code (python ou autre).

    Et ce n'est qu'un exemple de TON étude.

    Et en premier (avant d'ouvrir ce sujet) c'est de savoir combien de temps prend une tache écrite en python ? Il est même possible qu'elle ne puisse tenir dans 8ms ?
    $moi= ( !== ) ? : ;

  13. #13
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    janvier 2009
    Messages
    12 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 12 441
    Points : 55 899
    Points
    55 899
    Billets dans le blog
    37
    Par défaut
    Bonsoir,

    Les microcontrôleurs ont des timers hardware que l'on peut évoquer en micropython avec des modules spécifiques (from machine import Timer).
    Quel est le microcontrôleur utilisé ?

Discussions similaires

  1. Update dans une boucle avec valeur incrémentale
    Par framus.class dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 24/09/2008, 11h19
  2. Problème de requête dans une boucle avec ADOQuery
    Par Ekik dans le forum Bases de données
    Réponses: 8
    Dernier message: 14/05/2007, 16h07
  3. Réponses: 1
    Dernier message: 01/01/2007, 13h17
  4. Tri dans une boucle avec numéros
    Par delavega dans le forum ASP
    Réponses: 1
    Dernier message: 24/11/2006, 13h17
  5. Réponses: 4
    Dernier message: 15/06/2006, 10h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo