Télécharger le fichier « MyViz.py »
# -*- coding: utf-8 -*-
"""
Auteur : David Fournier
"""
from os.path import isfile
def lectureFichier(nomFichier):
"""
Cette fonction permet de convertir les données de n'importe quel fichier exporté de l'environnement MyViz en données utilisables dans l'environnement Python.
Entrée : nomFichier # adresse du fichier à lire
Sortie : var # liste des listes des données mesurées
"""
if isfile(nomFichier):
# Ouvrir le fichier en mode lecture
fichier = open(nomFichier, 'r')
# Lire les lignes
lignes = fichier.readlines()
# Traiter la première ligne
nbrVar = len(lignes[0].rstrip('\n').split(','))
# Déclaration des listes de variables
var = [[] for _ in range(nbrVar)]
# Traiter les lignes une à une sauf la première
for ligne in lignes[1:]:
# Séparer les données
ligne = ligne.rstrip('\n').split(',')
if len(ligne) == nbrVar:
try:
# Vérifier les données
for i in range(len(ligne)):
ligne[i] = float(ligne[i])
# Récuperer les données vérifiées
for i in range(len(ligne)):
var[i].append(ligne[i])
except:
print('ligne exclue (donnée incompatible) : '+str(ligne))
else:
print('ligne exclue (ligne incompatible) : '+str(ligne))
# Fermer le fichier
fichier.close()
else:
print('Avertissement : Fichier "',nomFichier,'" non trouvé !')
var = []
return var
def commandeEnTensionSerie(nomFichier):
"""
Cette fonction permet de convertir les données de l'environnement " Commande en tension (série) " de MyViz en données utilisables dans l'environnement Python.
Entrée : nomFichier # adresse du fichier à lire
Sortie : inst = var[0] # Temps (s)
conMot = var[1] # Consigne tension (V)
conGen = var[2] # Tension commande générateur (V)
vitMot = var[3] # Vitesse motoreducteur (rad/s)
couMot = var[4] # Courant moteur (A)
couGen = var[5] # Courant générateur (A)
# Couple moteur (N.m)
# Couple générateur (N.m)
"""
var = lectureFichier(nomFichier)
if len(var) == 8:
# suppression des données inutiles
del var[7]
del var[6]
return var
else:
return [[] for _ in range(6)]
def asservissementEnVitesseSerie(nomFichier):
"""
Cette fonction permet de convertir les données de l'environnement " Asservissement en vitesse (série) " de MyViz en données utilisables dans l'environnement Python.
Entrée : nomFichier # adresse du fichier à lire
Sortie : inst = var[0] # Temps (s)
conMot = var[1] # Consigne vitesse (rad/s),
vitMot = var[2] # Vitesse motoreducteur (rad/s)
comMot = var[3] # Tension commande moteur (V),
couMot = var[4] # Courant moteur (A)
comGen = var[5] # Tension commande générateur (V)
couGen = var[6] # Courant générateur (A)
"""
var = lectureFichier(nomFichier)
if len(var) == 7:
return var
else:
return [[] for _ in range(7)]
def asservissementEnVitesseReseau(nomFichier):
"""
Cette fonction permet de convertir les données de l'environnement " Asservissement en vitesse (série) " de MyViz en données utilisables dans l'environnement Python.
Entrée : nomFichier # adresse du fichier à lire
Sortie : inst = var[0] # Temps (s)
conMot = var[1] # Consigne vitesse (rad/s),
vitMot = var[2] # Vitesse motoreducteur (rad/s)
comMot = var[3] # Tension commande moteur (V),
couMot = var[4] # Courant moteur (A)
# Couple motoréducteur (N.m)
comGen = var[6] # Tension commande générateur (V)
couGen = var[7] # Courant générateur (A)
# Couple extérieur au motoréducteur (N.m)
# Couple externe (N.m)
"""
var = lectureFichier(nomFichier)
if len(var) == 10 :
# suppression des données inutiles
del var[9]
del var[8]
del var[5]
return var
else:
return [[] for _ in range(7)]
from matplotlib.pyplot import figure, plot, xlabel, ylabel, legend, title, show
def afficher(xy, abscisse='', titre='', fig=(5, 3)):
"""
Cette procédure permet d\'afficher les variables " ys " en fonction de " x "
Entrée : xy # liste de tuples contenant
* une liste d'abscisses
* une liste d'ordonnées
ou encore
Entrée : xy # liste de tuples contenant
* une liste d'abscisses
* une liste d'ordonnées
* une option mesure (mes) ou modèle (mod)
* une chaine de caractères pour un commentaire
abscisse # chaine de caractères
titre # chaine de caractères
fig # tuple de deux entiers
"""
for i in range(len(xy)):
if len(xy[i]) == 2:
xy[i] = (xy[i][0], xy[i][1], 'mes', 'Courbe '+str(i))
figure(figsize=fig)
for x, y, opt, texte in xy:
if opt == 'mes':
opt = '.'
else:
opt = '-'
plot(x, y, opt, label=texte)
if (len(xy) > 1):
xlabel(abscisse)
ylabel('Voir étiquette')
legend(loc='best')
else:
xlabel(abscisse)
ylabel(texte)
title(titre)
show()
from numpy import format_float_scientific
def arrondir(x, precision = 2, exp_digits=1):
"""
Cette fonction permet d'arrondir un nombre.
Entrée : x # Nombre à arrondir
precision # pour spécifier le nombre total de chiffres décimaux
exp_digits # pour dire combien de chiffres sont nécessaires dans la notation exponentielle.
Sortie : une chaine de caractère du nombre arrondi
"""
return format_float_scientific(x, precision, exp_digits)
#def arrondir(x):
# """
# Cette fonction permet d'arrondir un nombre.
# """
# return format(x,'.2E')
from numpy import unique, array
def signalCarre(var):
"""
Cette fonction permet de savoir si le signal étudié est un signal carré.
Entrée : var # Liste
Sortie : booléen
"""
return len(unique(array(var)))==2
from numpy import mean
def moyenneMobile(l, n):
# Taille de la liste
taille = len (l)
# Créer une liste aussi grande que les données
resultat = [ None ]* taille
for i in range ( taille ):
# chercher les bornes de la sous liste dont on doit faire la moyenne
a, b = i - n, i + n + 1
# les bornes doivent compatible avec la liste
a, b = max (0, a), min(b, taille )
# Faire la moyenne
resultat [i] = mean (l[a:b])
return resultat
def rechercheRegimePermament(liste, pourcent = 5):
pourcent /= 100
ind = len(liste) - 1
moy = liste[ind]
ind -= 1
while (ind>=0 and (1-pourcent)*moy <= liste[ind] <= (1+pourcent)*moy):
ind -= 1
moy = mean(liste[ind:])
if ind == len(liste) - 1:
return None
else:
#print(moy, ind, len(liste))
return ind
def regimePermanent(liste, ind):
return mean(liste[ind:])
##########################################
# Fonctions non testées et non utilisées #
##########################################
import numpy as np
def traiterSignalCarre(var, num, first = True, last = True, info=False):
"""
Cette fonction permet
de retirer le premier créneau : first = True
de retirer le dernier créneau : last = True
d'afficher éventuellement quelques informations sur les créneaux : info = True
Il faut spécifier le canal étudié au travers du paramètre **num**.
Entrée : var # Liste de liste
num # indice de la liste ayant le signal carré
"""
assert num < len(var)
if not signalCarre(var[num]):
if info:
print('Le signal n\'est pas carré')
else:
# Convertir la liste éventuelle en tableau
var = np.array(var)
# Chercher les deux valeurs du créneaux
mini = np.ndarray.min(var[num])
maxi = np.ndarray.max(var[num])
# Retirer le premier creneau
if first:
while(len(var[num])>0 and var[num][0] == mini):
var = np.delete(var, np.s_[0], axis=1)
while(len(var[num])>0 and var[num][0] == maxi):
var = np.delete(var, np.s_[0], axis=1)
# retirer le dernier créneau
if last:
while(len(var[num])>0 and var[num][-1] == maxi):
var = np.delete(var, np.s_[-1], axis=1)
while(len(var[num])>0 and var[num][-1] == mini):
var = np.delete(var, np.s_[-1], axis=1)
if (info and len(var[num])>0):
# compter le nombre de fronts montant et descendant
compteur = 0
for i in range(len(var[num])-1):
if var[num][i] != var[num][i+1]:
compteur += 1
# compter le nombre de créneaux entiers
compteur = (compteur+1)//2
print('Il y a ',compteur,' creneau','' if compteur <= 1 else 'x',sep='',end='')
print(' avec une valeur inférieure de "',mini,'" et une valeur supérieure de "',maxi,'"',sep='',end='')
i = 0
while i < len(var[num])-2 and var[num][i] == var[num][i+1]:
decalage = var[0][i+1]
i += 1
print(' avec un décalage du premier font de ',decalage,' seconde','' if decalage < 2 else 's',sep='',end='')
return var
Télécharger le fichier « MyViz.py »