Tableau de bord pour un système mécanique : Interface de suivi des performances d'un système oscillant (masse-ressort-amortisseur).
- Identifier les grandeurs physiques à surveiller (position, vitesse, accélération)
- Définir les indicateurs clés de performance (temps de réponse, dépassement)
- Choisir les visualisations appropriées (graphiques temporels, diagrammes de phase)
- Configurer les alertes pour les seuils critiques
- Tester et valider le tableau de bord
• Position : \(x(t)\) en mètres
• Vitesse : \(v(t) = \dot{x}(t)\) en m/s
• Accélération : \(a(t) = \ddot{x}(t)\) en m/s²
• Temps de réponse à 5% : \(t_{r5\%}\)
• Dépassement maximal : \(D_{max}\)
• Erreur statique : \(e_{ss}\)
• Coefficient d'amortissement : \(\delta\)
// Structure du tableau de bord
dashboard_structure = {
'title': 'Suivi Système Masse-Ressort-Amortisseur',
'sections': [
{
'name': 'Paramètres du système',
'widgets': ['masse', 'raideur', 'amortissement']
},
{
'name': 'Données en temps réel',
'widgets': ['position', 'vitesse', 'accélération']
},
{
'name': 'Performances',
'widgets': ['temps_reponse', 'depassement', 'erreur_statique']
}
]
}
import matplotlib.pyplot as plt
import numpy as np
# Données simulées
t = np.linspace(0, 5, 1000)
x = 0.1 * np.exp(-0.2*t) * np.cos(2*t - 0.1)
v = np.gradient(x, t)
a = np.gradient(v, t)
# Graphique principal
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
# Position vs temps
axes[0,0].plot(t, x)
axes[0,0].set_title('Position en fonction du temps')
axes[0,0].set_xlabel('Temps (s)')
axes[0,0].set_ylabel('Position (m)')
# Vitesse vs temps
axes[0,1].plot(t, v)
axes[0,1].set_title('Vitesse en fonction du temps')
axes[0,1].set_xlabel('Temps (s)')
axes[0,1].set_ylabel('Vitesse (m/s)')
# Portrait de phase
axes[1,0].plot(x, v)
axes[1,0].set_title('Portrait de phase')
axes[1,0].set_xlabel('Position (m)')
axes[1,0].set_ylabel('Vitesse (m/s)')
# Accélération vs temps
axes[1,1].plot(t, a)
axes[1,1].set_title('Accélération en fonction du temps')
axes[1,1].set_xlabel('Temps (s)')
axes[1,1].set_ylabel('Accélération (m/s²)')
plt.tight_layout()
plt.show()
# Configuration des alertes
thresholds = {
'depassement_max': 0.2, # 20%
'temps_reponse_max': 3.0, # 3 secondes
'position_max': 0.2 # 20 cm
}
def check_alerts(performance_data):
alerts = []
if performance_data['depassement'] > thresholds['depassement_max']:
alerts.append('Dépassement trop élevé')
if performance_data['temps_reponse'] > thresholds['temps_reponse_max']:
alerts.append('Temps de réponse trop long')
return alerts
Le tableau de bord du système mécanique permet de suivre en temps réel la position, vitesse et accélération, avec des indicateurs clés de performance et des alertes configurées pour détecter les anomalies.
• Équation du mouvement : \(m\ddot{x} + c\dot{x} + kx = F(t)\)
• Indicateurs de performance : Temps de réponse, dépassement, erreur statique
• Visualisation : Graphiques temporels et diagrammes de phase
Tableau de bord pour un système thermique : Interface de suivi des températures et des transferts thermiques dans un système de chauffage/refroidissement.
• Température instantanée : \(T(t)\) en °C
• Température ambiante : \(T_{amb}\) en °C
• Puissance dissipée : \(P(t)\) en W
• Flux thermique : \(\Phi(t)\) en W
\(\frac{dT}{dt} = \frac{1}{mc}(P_{entrant} - P_{sortant} - h(T - T_{amb}))\)
Où \(m\) est la masse, \(c\) la capacité thermique, \(h\) le coefficient de transfert
• Constante de temps : \(\tau = \frac{mc}{h}\)
• Temps de réponse : \(t_{r90\%}\)
• Écart de température : \(\Delta T\)
• Efficacité thermique : \(\eta\)
dashboard_thermal = {
'title': 'Suivi Système Thermique',
'tabs': [
{
'name': 'Températures',
'charts': [
{'type': 'line', 'data': 'temperature_history'},
{'type': 'gauge', 'data': 'current_temp'}
]
},
{
'name': 'Puissances',
'charts': [
{'type': 'line', 'data': 'power_history'},
{'type': 'bar', 'data': 'energy_consumption'}
]
},
{
'name': 'Performances',
'charts': [
{'type': 'metric', 'data': 'time_constant'},
{'type': 'metric', 'data': 'efficiency'}
]
}
]
}
import matplotlib.pyplot as plt
import numpy as np
# Simulation thermique
t = np.linspace(0, 60, 600) # 60 secondes
T_init = 20 # °C
T_target = 80 # °C
tau = 20 # Constante de temps
T = T_target + (T_init - T_target) * np.exp(-t/tau)
# Graphiques
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
# Température vs temps
axes[0,0].plot(t, T, linewidth=2, color='#ffce00')
axes[0,0].set_title('Température en fonction du temps')
axes[0,0].set_xlabel('Temps (s)')
axes[0,0].set_ylabel('Température (°C)')
axes[0,0].grid(True, alpha=0.3)
# Dérivée de température
dTdt = np.gradient(T, t)
axes[0,1].plot(t, dTdt, linewidth=2, color='#34d399')
axes[0,1].set_title('Taux de variation de température')
axes[0,1].set_xlabel('Temps (s)')
axes[0,1].set_ylabel('dT/dt (°C/s)')
axes[0,1].grid(True, alpha=0.3)
# Diagramme de phase
axes[1,0].plot(T, dTdt)
axes[1,0].set_title('Portrait de phase thermique')
axes[1,0].set_xlabel('Température (°C)')
axes[1,0].set_ylabel('dT/dt (°C/s)')
axes[1,0].grid(True, alpha=0.3)
# Efficacité en fonction du temps
efficiency = 1 - np.abs(T - T_target) / (T_target - T_init)
axes[1,1].plot(t, efficiency, linewidth=2, color='#3b82f6')
axes[1,1].set_title('Efficacité thermique')
axes[1,1].set_xlabel('Temps (s)')
axes[1,1].set_ylabel('Efficacité (%)')
axes[1,1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
Le tableau de bord thermique permet de suivre la température, les puissances, et les performances thermiques en temps réel, avec des indicateurs de constante de temps et d'efficacité.
• Loi de Newton : \(\frac{dT}{dt} = -h(T - T_{amb})\)
• Constante de temps : \(\tau = \frac{mc}{h}\)
• Équation de transfert : Bilan énergétique
Tableau de bord pour un circuit électrique : Interface de suivi des tensions, courants et puissances dans un circuit RC ou RLC.
• Tension : \(u(t)\) en volts
• Courant : \(i(t)\) en ampères
• Puissance active : \(P(t)\) en watts
• Impédance : \(Z(t)\) en ohms
\(\tau\frac{du_C}{dt} + u_C = E\) où \(\tau = RC\)
Solution : \(u_C(t) = E(1 - e^{-t/\tau})\)
• Constante de temps : \(\tau = RC\)
• Fréquence de coupure : \(f_c = \frac{1}{2\pi RC}\)
• Énergie stockée : \(W = \frac{1}{2}Cu^2\)
• Puissance dissipée : \(P = Ri^2\)
dashboard_electrical = {
'title': 'Suivi Circuit Électrique',
'sections': [
{
'name': 'Paramètres',
'components': ['R', 'C', 'L', 'E']
},
{
'name': 'Signaux électriques',
'components': ['tension', 'courant', 'puissance']
},
{
'name': 'Impédance et fréquence',
'components': ['impedance', 'frequence_coupure']
},
{
'name': 'Énergie',
'components': ['energie_stockee', 'puissance_dissipee']
}
],
'alerts': [
{'condition': 'voltage > 25', 'message': 'Tension excessive'},
{'condition': 'current > 5', 'message': 'Courant trop élevé'}
]
}
import matplotlib.pyplot as plt
import numpy as np
# Paramètres du circuit RC
R = 1000 # Ohms
C = 1e-6 # Farads
tau = R * C # Constante de temps
E = 12 # Volts
# Simulation
t = np.linspace(0, 0.005, 1000) # 5ms
uC = E * (1 - np.exp(-t/tau)) # Tension aux bornes du condensateur
iC = (E/R) * np.exp(-t/tau) # Courant dans le circuit
P = uC * iC # Puissance instantanée
# Graphiques
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
# Tension vs temps
axes[0,0].plot(t, uC, linewidth=2, color='#ffce00')
axes[0,0].set_title('Tension du condensateur')
axes[0,0].set_xlabel('Temps (s)')
axes[0,0].set_ylabel('Tension (V)')
axes[0,0].grid(True, alpha=0.3)
# Courant vs temps
axes[0,1].plot(t, iC, linewidth=2, color='#34d399')
axes[0,1].set_title('Courant dans le circuit')
axes[0,1].set_xlabel('Temps (s)')
axes[0,1].set_ylabel('Courant (A)')
axes[0,1].grid(True, alpha=0.3)
# Puissance vs temps
axes[1,0].plot(t, P, linewidth=2, color='#3b82f6')
axes[1,0].set_title('Puissance instantanée')
axes[1,0].set_xlabel('Temps (s)')
axes[1,0].set_ylabel('Puissance (W)')
axes[1,0].grid(True, alpha=0.3)
# Diagramme de phase tension/courant
axes[1,1].plot(uC, iC)
axes[1,1].set_title('Diagramme de phase')
axes[1,1].set_xlabel('Tension (V)')
axes[1,1].set_ylabel('Courant (A)')
axes[1,1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
Le tableau de bord électrique permet de suivre en temps réel la tension, le courant, la puissance et d'autres paramètres clés, avec des alertes configurées pour les seuils critiques.
• Loi d'Ohm : \(U = RI\)
• Équation RC : \(\tau\frac{du_C}{dt} + u_C = E\)
• Puissance : \(P = UI\)
Tableau de bord de suivi industriel : Interface de surveillance des performances d'une chaîne de production ou d'un processus industriel.
• Productivité : pièces/heure
• Taux de rendement global (TRG/OEE)
• Taux de disponibilité
• Taux de qualité
dashboard_industrial = {
'title': 'Suivi Performance Industrielle',
'layout': 'dashboard_grid',
'widgets': [
{
'id': 'production_rate',
'type': 'gauge',
'title': 'Productivité actuelle',
'value': 0,
'unit': 'pièces/h',
'range': [0, 1000],
'thresholds': {'low': 300, 'medium': 600, 'high': 800}
},
{
'id': 'oee',
'type': 'donut',
'title': 'TRG (OEE)',
'labels': ['Disponibilité', 'Performance', 'Qualité'],
'values': [0, 0, 0]
},
{
'id': 'production_timeline',
'type': 'line',
'title': 'Production sur la journée',
'x_axis': 'heure',
'y_axis': 'pièces'
},
{
'id': 'quality_chart',
'type': 'bar',
'title': 'Taux de qualité par poste',
'categories': ['Poste A', 'Poste B', 'Poste C'],
'values': [0, 0, 0]
}
]
}
def calculate_oee(availability, performance, quality):
"""
Calcul du TRG (OEE) : Taux de Rendement Global
OEE = Disponibilité × Performance × Qualité
"""
oee = availability * performance * quality
return oee
def calculate_indicators(data):
"""
Calcul des indicateurs de performance industrielle
"""
# Temps de fonctionnement / Temps total
availability = data['running_time'] / data['total_time']
# Pièces produites / Temps de fonctionnement
theoretical_rate = data['theoretical_rate'] # pièces/h
actual_performance = data['actual_output'] / data['running_time']
performance = actual_performance / theoretical_rate
# Pièces conformes / Pièces produites
quality = data['good_parts'] / data['total_parts']
oee = calculate_oee(availability, performance, quality)
return {
'availability': availability * 100,
'performance': performance * 100,
'quality': quality * 100,
'oee': oee * 100
}
alert_config = {
'production_drop': {
'condition': 'production_rate < 0.7 * target_rate',
'severity': 'warning',
'action': 'check_machine'
},
'quality_issue': {
'condition': 'quality_rate < 95',
'severity': 'critical',
'action': 'stop_production'
},
'machine_failure': {
'condition': 'machine_status == "error"',
'severity': 'critical',
'action': 'maintenance_required'
}
}
def trigger_alerts(indicators):
triggered_alerts = []
for alert_name, config in alert_config.items():
if eval(config['condition']):
triggered_alerts.append({
'name': alert_name,
'severity': config['severity'],
'message': f'Alerte {config["severity"]}: {alert_name}',
'action': config['action']
})
return triggered_alerts
import matplotlib.pyplot as plt
import numpy as np
# Données simulées de performance industrielle
hours = np.arange(0, 24, 1)
production_rate = 500 + 100 * np.sin(hours * np.pi / 12) + np.random.normal(0, 20, 24)
oee_values = 80 + 10 * np.sin(hours * np.pi / 12) + np.random.normal(0, 5, 24)
quality_rate = 95 + 3 * np.sin(hours * np.pi / 12) + np.random.normal(0, 2, 24)
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
# Production par heure
axes[0,0].plot(hours, production_rate, marker='o', linewidth=2, color='#ffce00')
axes[0,0].set_title('Production par heure')
axes[0,0].set_xlabel('Heure de la journée')
axes[0,0].set_ylabel('Pièces/heure')
axes[0,0].grid(True, alpha=0.3)
# TRG (OEE) sur la journée
axes[0,1].plot(hours, oee_values, marker='s', linewidth=2, color='#34d399')
axes[0,1].set_title('TRG (OEE) sur la journée')
axes[0,1].set_xlabel('Heure de la journée')
axes[0,1].set_ylabel('TRG (%)')
axes[0,1].grid(True, alpha=0.3)
# Qualité par heure
axes[1,0].bar(hours, quality_rate, color='#3b82f6', alpha=0.7)
axes[1,0].set_title('Taux de qualité par heure')
axes[1,0].set_xlabel('Heure de la journée')
axes[1,0].set_ylabel('Qualité (%)')
axes[1,0].grid(True, alpha=0.3)
# Corrélation production/TRG
axes[1,1].scatter(production_rate, oee_values, alpha=0.7, color='#8b5cf6')
axes[1,1].set_title('Corrélation Production/TRG')
axes[1,1].set_xlabel('Production (pièces/h)')
axes[1,1].set_ylabel('TRG (%)')
axes[1,1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
Le tableau de bord industriel permet de suivre en temps réel la productivité, le TRG, la qualité et d'autres indicateurs clés, avec des alertes configurées pour les seuils critiques.
• TRG (OEE) : Taux de Rendement Global = Disponibilité × Performance × Qualité
• Indicateurs KPI : Productivité, qualité, disponibilité
• Alertes intelligentes : Détection automatique des anomalies
Tableau de bord pour un système asservi : Interface de surveillance des performances d'un système de commande automatique avec boucle de retour.
• Consigne : \(r(t)\) en unité physique
• Sortie : \(y(t)\) en unité physique
• Erreur : \(e(t) = r(t) - y(t)\) en unité physique
• Commande : \(u(t)\) en unité physique
• Erreur statique : \(e_{ss} = \lim_{t \to \infty} e(t)\)
• Dépassement : \(D\% = \frac{y_{max} - y_{final}}{y_{final}} \times 100\)
• Temps de réponse : \(t_r\)
• Marges de stabilité : \(GM\), \(PM\)
dashboard_control = {
'title': 'Suivi Système Asservi',
'sections': [
{
'name': 'Signaux de commande',
'components': ['consigne', 'sortie', 'erreur', 'commande']
},
{
'name': 'Performances temporelles',
'components': ['temps_reponse', 'depassement', 'erreur_statique']
},
{
'name': 'Stabilité',
'components': ['marge_gain', 'marge_phase', 'pulsation_coupe']
},
{
'name': 'Correcteur',
'components': ['parametres_pid', 'action_correcteur']
}
],
'real_time_updates': true,
'refresh_rate': '100ms'
}
import numpy as np
from scipy import signal
def analyze_step_response(t, y):
"""Analyse de la réponse indicielle"""
# Valeur finale
final_value = y[-1]
# Erreur statique
error_ss = abs(final_value - 1.0) # pour une consigne unité
# Dépassement
max_value = np.max(y)
overshoot = ((max_value - final_value) / final_value) * 100
# Temps de réponse à 5%
threshold = final_value * 0.95
idx = np.where(y >= threshold)[0]
if len(idx) > 0:
settling_time = t[idx[0]]
else:
settling_time = float('inf')
# Temps de montée
rise_start = final_value * 0.1
rise_end = final_value * 0.9
start_idx = np.where(y >= rise_start)[0]
end_idx = np.where(y >= rise_end)[0]
if len(start_idx) > 0 and len(end_idx) > 0:
rise_time = t[end_idx[0]] - t[start_idx[0]]
else:
rise_time = float('inf')
return {
'error_ss': error_ss,
'overshoot': overshoot,
'settling_time': settling_time,
'rise_time': rise_time
}
def calculate_stability_margins(sys_open_loop):
"""Calcul des marges de stabilité"""
gm, pm, wg, wp = signal.margin(sys_open_loop)
return {
'gain_margin': gm,
'phase_margin': pm,
'gain_freq': wg,
'phase_freq': wp
}
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal
# Simulation d'un système asservi
num = [10]
den = [1, 5, 6]
sys = signal.TransferFunction(num, den)
# Système en boucle fermée
sys_closed = signal.feedback(sys, 1)
# Réponse indicielle
t, y = signal.step(sys_closed, T=np.linspace(0, 5, 1000))
# Calcul des performances
perf = analyze_step_response(t, y)
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
# Réponse indicielle
axes[0,0].plot(t, y, linewidth=2, color='#ffce00', label='Sortie')
axes[0,0].axhline(y=1, color='red', linestyle='--', alpha=0.7, label='Consigne')
axes[0,0].set_title(f'Réponse indicielle (D%={perf["overshoot"]:.1f}%)')
axes[0,0].set_xlabel('Temps (s)')
axes[0,0].set_ylabel('Sortie')
axes[0,0].legend()
axes[0,0].grid(True, alpha=0.3)
# Erreur en fonction du temps
error = 1 - y
axes[0,1].plot(t, error, linewidth=2, color='#34d399')
axes[0,1].set_title(f'Erreur en fonction du temps (ess={perf["error_ss"]:.3f})')
axes[0,1].set_xlabel('Temps (s)')
axes[0,1].set_ylabel('Erreur')
axes[0,1].grid(True, alpha=0.3)
# Diagramme de Bode
w, mag, phase = signal.bode(signal.TransferFunction([10], [1, 5, 6]), n=1000)
axes[1,0].semilogx(w, mag, color='#3b82f6')
axes[1,0].set_title('Diagramme de Bode (Module)')
axes[1,0].set_xlabel('Pulsation (rad/s)')
axes[1,0].set_ylabel('Module (dB)')
axes[1,0].grid(True, alpha=0.3)
# Phase
axes[1,1].semilogx(w, phase, color='#8b5cf6')
axes[1,1].set_title('Diagramme de Bode (Phase)')
axes[1,1].set_xlabel('Pulsation (rad/s)')
axes[1,1].set_ylabel('Phase (deg)')
axes[1,1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
Le tableau de bord d'asservissement permet de suivre en temps réel la consigne, la sortie, l'erreur et la commande, avec des indicateurs de performance et de stabilité.
• Asservissement : Comparaison entre consigne et sortie
• Stabilité : Marges de gain et de phase
• Performance : Dépassement, temps de réponse, erreur statique
- Identification des besoins : Quelles données doivent être surveillées ?
- Sélection des indicateurs : Quels sont les KPI pertinents ?
- Choix des visualisations : Quels graphiques sont les plus parlants ?
- Configuration des alertes : Quels seuils déclenchent des notifications ?
- Implémentation : Construction de l'interface utilisateur
- Validation : Test avec des données réelles et ajustements
- Un bon tableau de bord doit être intuitif et facile à lire
- Les indicateurs doivent être mis à jour en temps réel ou quasi-réel
- Les alertes doivent être pertinentes et éviter les fausses alarmes
- La hiérarchie des informations doit être clairement établie
- Le tableau de bord doit s'adapter aux différents profils d'utilisateurs
- Indicateurs de performance (KPI) : Mesures clés de la performance
- Indicateurs de tendance : Évolution des paramètres dans le temps
- Indicateurs de comparaison : Comparaison avec des références ou des objectifs
- Indicateurs d'alerte : Signalement des écarts ou anomalies
- Indicateurs de diagnostic : Aide à l'identification des causes
- Les tableaux de bord sont essentiels pour le suivi des performances
- Ils permettent une surveillance en temps réel des systèmes
- La conception doit être centrée sur l'utilisateur final
- Les indicateurs doivent être pertinents et significatifs
- Les alertes permettent une réaction rapide aux anomalies