Projet Recuperation de nombre de cycle sur presses

Vous souhaitez développer un projet mais vous manquez de temps, de compétences ? Présentez votre projet ici pour trouver des participants...

Modérateur : Francois

Répondre
ThorGnole63
Messages : 4
Enregistré le : dim. 29 avr. 2018 18:58

Projet Recuperation de nombre de cycle sur presses

Message par ThorGnole63 » ven. 25 mai 2018 11:09

Bonjour je suis en train de mettre en place un systeme de recuperation de nombre de cycle sur presse en vu de suivre la production.

Le principe : Les presses renvoie un top fin de cycle au raspberry, le raspberry enregistre dans un fichier par presse le top (un "1) et horodate ledit top. Le fichier les sauvegardé toutes les 5 minutes. A cause de la longueur d'installation, je n'envoie pas directement le 3v3 sur les presses mais du 12V et je recupere le top en 3v3 par un relais a proximité du raspberry. Le top du relais est exploité par l'intermédiaire d'interruption programme (déclenchement sur GPIO.RISING). 1 interuption par presse (16 presses). Proframmation en python.

Un top me declenche l'interruption et cette interruption horodate et ouvre/ferme le fichier correspondant a la presse si l'archivage n'est pas en cours.
Pour l'archivage toutes les 5 minutes, j'ai mis en place un thread dédié comme ca on s'en occupe plus. (ca marche impeccable)

Par contre j'ai des problèmes de rebonds récurrents mais intermitents, c'est à dire pas à chaque fn de cycle , sur la presse p12, j'enregistre le top et 6secondes apres j'ai un deuxieme top alors qu'un cycle moyen est d'environ 50secondes. J'ai vérifié en mettant d'autres relais plus gros et donc moins sensibles a des micro coupures, les relais restent collés, MAIS les rebonds apparaissent quand meme. J'ai mis dans les interruptions une mémoire qui interdit de refaire le travail tant que l'entree correspondantes n'est pas repassée a 0. Ce qui vérifie que l'entrée correspondante repasse bien par 0 vu que l'interruption est relancée en intégralitée : du coup j'ai 2 questions:

- Serait ce un faux contact intermittent sur l'entree du raspberry ? Que prendre pour connecter de maniere fiable le connecteur GPIO ? (cable en nappe + bornier ou Dupond ?) (j'ai virée une nappe pour du Dupond et ca à amélioré un peu)
- Y a t il un nombre d'interruption maxi en Python ? Je vous envoie le code par la meme occasion.

grosso modo j'obtiens ca sur le moniteur du Thonny IDE: (pas fait de capture d'ecran mais ca ressemble a ca)

p122018-05-25 11:05:30
p172018-05-25 11:05:34
p192018-05-25 11:06:08
p122018-05-25 11:06:55 <---- ok tps de cycle environ 25s
p122018-05-25 11:07:00 <---- rebond apres 5s
p192018-05-25 11:07:03
...etc...


Merci de m'avoir lu malgré la longueur.

Code : Tout sélectionner

#!/usr/bin/python

from tkinter import *
from threading import Thread


import RPi.GPIO as GPIO
import time
import datetime
import smtplib
import threading
import os

from time import strftime

Encours_Archivage=0
test12 = 0
test04 = 0
test17 = 0
test19 = 0

def Tempo_Archivage(count=1):
    
#    for x in range(count):
     while 1:   
        time.sleep(300)
        Archivage()
       

def Archivage():
    Encours_Archivage=1
    print("Archivage")
    date = strftime('%y%m%d%H%M')
    os.rename('/home/pi/Partage/p02.txt','/home/pi/Partage/p02_' + date + '.txt')
    os.rename('/home/pi/Partage/p04.txt','/home/pi/Partage/p04_' + date + '.txt')
    os.rename('/home/pi/Partage/p08.txt','/home/pi/Partage/p08_' + date + '.txt')
    os.rename('/home/pi/Partage/p09.txt','/home/pi/Partage/p09_' + date + '.txt')
    os.rename('/home/pi/Partage/p10.txt','/home/pi/Partage/p10_' + date + '.txt')
    os.rename('/home/pi/Partage/p12.txt','/home/pi/Partage/p12_' + date + '.txt')
    os.rename('/home/pi/Partage/p14.txt','/home/pi/Partage/p14_' + date + '.txt')
    os.rename('/home/pi/Partage/p15.txt','/home/pi/Partage/p15_' + date + '.txt')
    os.rename('/home/pi/Partage/p17.txt','/home/pi/Partage/p17_' + date + '.txt')
    os.rename('/home/pi/Partage/p18.txt','/home/pi/Partage/p18_' + date + '.txt')
    os.rename('/home/pi/Partage/p19.txt','/home/pi/Partage/p19_' + date + '.txt')
    os.rename('/home/pi/Partage/p20.txt','/home/pi/Partage/p20_' + date + '.txt')

    fichier= open("/home/pi/Partage/p02.txt" , "a")
    fichier.close()
    fichier= open("/home/pi/Partage/p04.txt" , "a")
    fichier.close()
    fichier= open("/home/pi/Partage/p08.txt" , "a")
    fichier.close()
    fichier= open("/home/pi/Partage/p09.txt" , "a")
    fichier.close()
    fichier= open("/home/pi/Partage/p10.txt" , "a")
    fichier.close()
    fichier= open("/home/pi/Partage/p12.txt" , "a")
    fichier.close()
    fichier= open("/home/pi/Partage/p14.txt" , "a")
    fichier.close()
    fichier= open("/home/pi/Partage/p15.txt" , "a")
    fichier.close()
    fichier= open("/home/pi/Partage/p17.txt" , "a")
    fichier.close()
    fichier= open("/home/pi/Partage/p18.txt" , "a")
    fichier.close()
    fichier= open("/home/pi/Partage/p19.txt" , "a")
    fichier.close()
    fichier= open("/home/pi/Partage/p20.txt" , "a")
    fichier.close()
    print("Fin Archivage")
    Encours_Archivage=0
	


def cb_p02(channel):
    now = datetime.datetime.now()
    heure = now.strftime('%Y-%m-%d %H:%M:%S')
    s="p02" + heure
    print(s)
    fwrite= open('/home/pi/Partage/p02.txt','a')
    fwrite.write(heure)
    fwrite.write("\t1\n")
    fwrite.close()


def cb_p04(channel):
    global test04
    global Encours_Archivage
    if Encours_Archivage ==0:
        if test04 ==0:
            now = datetime.datetime.now()
            heure = now.strftime('%Y-%m-%d %H:%M:%S')
            s="p04" + heure
            print(s)
            fwrite= open('/home/pi/Partage/p04.txt','a')
            fwrite.write(heure)
            fwrite.write("\t1\n")
            fwrite.close()
            test04=1
 
def cb_p08(channel):
    now = datetime.datetime.now()
    heure = now.strftime('%Y-%m-%d %H:%M:%S')
    s="p08" + heure
    print(s)
    fwrite= open('/home/pi/Partage/p08.txt','a')
    fwrite.write(heure)
    fwrite.write("\t1\n")
    fwrite.close()
  
def cb_p09(channel): 
    now = datetime.datetime.now()
    heure = now.strftime('%Y-%m-%d %H:%M:%S')
    s="p09" + heure
    print(s)
    fwrite= open('/home/pi/Partage/p09.txt','a')
    fwrite.write(heure)
    fwrite.write("\t1\n")
    fwrite.close()
  
def cb_p10(channel):  
    now = datetime.datetime.now()
    heure = now.strftime('%Y-%m-%d %H:%M:%S')
    s="p10" + heure
    print(s)
    fwrite= open('/home/pi/Partage/p10.txt','a')
    fwrite.write(heure)
    fwrite.write("\t1\n")
    fwrite.close()

def cb_p12(channel):
    global test12
    global Encours_Archivage
    if Encours_Archivage ==0:
        if test12 == 0:
            now = datetime.datetime.now()
            heure = now.strftime('%Y-%m-%d %H:%M:%S')
            s="p12" + heure
            print(s)
            fwrite= open('/home/pi/Partage/p12.txt','a')
            fwrite.write(heure)
            fwrite.write("\t1\n")
            fwrite.close()
            test12 = 1

def cb_p14(channel):  
    now = datetime.datetime.now()
    heure = now.strftime('%Y-%m-%d %H:%M:%S')
    s="p14" + heure
    print(s)
    fwrite= open('/home/pi/Partage/p14.txt','a')
    fwrite.write(heure)
    fwrite.write("\t1\n")
    fwrite.close()  

def cb_p15(channel): 
    now = datetime.datetime.now()
    heure = now.strftime('%Y-%m-%d %H:%M:%S')
    s="p15" + heure
    print(s)
    fwrite= open('/home/pi/Partage/p15.txt','a')
    fwrite.write(heure)
    fwrite.write("\t1\n")
    fwrite.close()  
      
def cb_p17(channel):
    global test17
    global Encours_Archivage
    if Encours_Archivage ==0:
        now = datetime.datetime.now()
        heure = now.strftime('%Y-%m-%d %H:%M:%S')
        s="p17" + heure
        print(s)
        fwrite= open('/home/pi/Partage/p17.txt','a')
        fwrite.write(heure)
        fwrite.write("\t1\n")
        fwrite.close()
        test17 = 1
  
def cb_p18(channel):  
    now = datetime.datetime.now()
    heure = now.strftime('%Y-%m-%d %H:%M:%S')
    s="p18" + heure
    print(s)
    fwrite= open('/home/pi/Partage/p18.txt','a')
    fwrite.write(heure)
    fwrite.write("\t1\n")
    fwrite.close()  

def cb_p19(channel):
    global test19
    global Encours_Archivage
    if Encours_Archivage ==0:
        now = datetime.datetime.now()
        heure = now.strftime('%Y-%m-%d %H:%M:%S')
        s="p19" + heure
        print(s)
        fwrite= open('/home/pi/Partage/p19.txt','a')
        fwrite.write(heure)
        fwrite.write("\t1\n")
        fwrite.close()
        test19 = 1
  
def cb_p20(channel):
    now = datetime.datetime.now()
    heure = now.strftime('%Y-%m-%d %H:%M:%S')
    s="p20" + heure
    print(s)
    fwrite= open('/home/pi/Partage/p20.txt','a')
    fwrite.write(heure)
    fwrite.write("\t1\n")
    fwrite.close()
    
 
#mode numerotation brochage : BCM = num electronique carte ou BOARD = num serigraphie connecteur 
GPIO.setmode(GPIO.BOARD)

#initialiser broches
GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(13, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(15, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

#lire etat entree 
#callback selon n° presses
# presse remise dans le bon ordre le 21/05/2018

#GPIO.add_event_detect(11, GPIO.RISING, callback=cb_p02, bouncetime=200)
#time.sleep (0.1)
GPIO.add_event_detect(12, GPIO.RISING, callback=cb_p04, bouncetime=200)
time.sleep (0.1)
#GPIO.add_event_detect(13, GPIO.RISING, callback=cb_p08, bouncetime=200)
#time.sleep (0.1)
GPIO.add_event_detect(15, GPIO.RISING, callback=cb_p09, bouncetime=200)
time.sleep (0.1)
GPIO.add_event_detect(16, GPIO.RISING, callback=cb_p10, bouncetime=200)                      
time.sleep (0.1)
GPIO.add_event_detect(18, GPIO.RISING, callback=cb_p20, bouncetime=200)
time.sleep (0.1)
GPIO.add_event_detect(19, GPIO.RISING, callback=cb_p15, bouncetime=200)
time.sleep (0.1)
#GPIO.add_event_detect(21, GPIO.RISING, callback=cb_p14, bouncetime=200)
#time.sleep (0.1)
GPIO.add_event_detect(22, GPIO.RISING, callback=cb_p17, bouncetime=3000)
time.sleep (0.1)
GPIO.add_event_detect(23, GPIO.RISING, callback=cb_p18, bouncetime=200)
time.sleep (0.1)
GPIO.add_event_detect(24, GPIO.RISING, callback=cb_p19, bouncetime=3000)
time.sleep (0.1)
GPIO.add_event_detect(26, GPIO.RISING, callback=cb_p12, bouncetime=3000)
time.sleep (0.1)

thread =Thread(target=Tempo_Archivage)
thread.start()

while 1:
     
    if GPIO.input(22) ==0:
        test17 = 0
    
    if GPIO.input(24) ==0:
        test19 = 0
    
    if GPIO.input(26) ==0:
        test12 = 0

    if GPIO.input(12) ==0:
        test04 = 0

ThorGnole63
Messages : 4
Enregistré le : dim. 29 avr. 2018 18:58

Re: Projet Recuperation de nombre de cycle sur presses

Message par ThorGnole63 » mer. 12 sept. 2018 10:02

Bonjour a tous, je me suis débrouillé pour mes problèmes de rebond, et apres 2 mois de test, je poste ma solution pour que cela puisse servir a d'autres.

J'ai donc lancé un thread dédié pour chaque machine, ce thread est une boucle infinie tant qu'une variable n'est pas mise a 1. Lorsque cette variable est mise a 1, je lance une tempo avec un temps juste inferieur au temps de cycle minimum de la presse et je remets la variable a 0

la variable est mise a 1 à la fin du traitement du top de la presse en question.
Tant que la variable est a 1, on ne peut pas recompter un top, ce qui inhibe les rebonds.

La methode du thread permet de ne rater aucun top presse par rapport a une tempo antirebond d'attente apres chaque top.

Pour ma part, c'est la premiere fois que je code un multithreading. Il me plait de plus en plus le Rasp.....

destroyedlolo
Raspinaute
Messages : 1585
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

Re: Projet Recuperation de nombre de cycle sur presses

Message par destroyedlolo » jeu. 13 sept. 2018 10:42

Salut,

Je n'avais pas vu ton poste initiale mais je trouve ta solution très maline :)
Et ca tombe bien, je suis en train de refaire le cerveau de ma domotique justement en utilisant plein de threads pour en facilité la gestion et avec des problématique de timeout et d'interaction entre threads.

Justement, je ne sais pas comment tu crée tes tempos mais des discussions que j'ai eu avec des gens qui s'y connaissent plus que moi, il faut éviter les sleep() dans des threads et encore plus les signaux qui ne sont pas forcément propagés et géré comme tu pourrais le souhaiter.
Le sleep() découle de ca : sur certaines archi, les sleep() sont implémentés par l'utilisation du signal Alarme.

Maintenant, ce n'est pas le cas sous Linux donc tu ne devrais pas etre impacté sur le PI.

La solution que j'ai employé a été d'utiliser des timed conditions ou des timerfd.

A+
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

ThorGnole63
Messages : 4
Enregistré le : dim. 29 avr. 2018 18:58

Re: Projet Recuperation de nombre de cycle sur presses

Message par ThorGnole63 » mer. 19 sept. 2018 11:50

Bonjour desole pour la reponse tardive. Pour les tempos, j'ai effectivement utilisé des time.sleep, je suis allé au plus simple vu que les threads servent juste a remettre la variable a 0.
A++

Répondre

Retourner vers « Projets »