Bug de temps en temps, mais haute priorité

16

Je travaille sur un projet CNC (commande numérique par ordinateur) qui découpe des formes en métal à l'aide d'un laser.

Maintenant, mon problème est de temps en temps (1-2 fois en 20 jours impairs), la coupe se passe mal ou non selon ce qui est défini.

Mais cela entraîne une perte et le client n'est donc pas très content.

J'ai essayé d'en découvrir la cause en

  1. Y compris les fichiers journaux
  2. Débogage
  3. Répétition du même environnement.

Mais ça ne se répétera pas.

Une opération de pause et de poursuite le fera fonctionner à nouveau sans que le bogue réapparaisse.

Comment puis-je résoudre ce problème? Dois-je le signaler comme un problème matériel?

Shirish11
la source
15
Bienvenue dans le monde merveilleux du heisenbug * 8 ')
Mark Booth
Lorsque vous dites que cela se produit 1 à 2 fois en 20 jours, cela signifie-t-il qu'il faut environ 20 jours pour qu'il apparaisse ou qu'il apparaisse parfois après le jour 1, parfois le jour 3 etc ...
Dunk
@Dunk, il n'y a pas de calendrier spécifique, mais il n'est jamais apparu deux fois dans une semaine.
Shirish11
@Shirish - Je me penchais vers un problème de débordement d'horloge qui n'était pas géré correctement, que j'ai vu plusieurs fois sur des systèmes dont le problème semble se produire tous les jours et après inspection, exactement tous les jours (ou plusieurs de ces jours) .
Dunk
Que se passe-t-il lorsque le système est en pause? Quelle mémoire / compteurs / matériel change encore? Et quand tu continues? Il semble que tout changement pendant que vous effectuez ces opérations est un indice de la cause du problème.
Dunk

Réponses:

25

Contournements

Comme le suggère ChrisF , la solution pragmatique à court terme peut être d'utiliser l' astuce pause et reprise , mais vous devez parler à vos clients pour savoir quelles devraient être vos priorités. Par exemple:

  • Si le défaut détruit une pièce de 1000 £ ou provoque 4 heures d'arrêt une fois par semaine, alors que le correctif de pause-reprise réduit la production de 1%, ils préféreront probablement le correctif dès maintenant.

  • Si le défaut détruit une pièce de 1 £ ou provoque 4 minutes d'arrêt une fois par semaine, mais que le correctif de pause-reprise réduit la production de 1%, ils préféreront probablement attendre un correctif qui n'affecte pas le taux de production.

Ayant travaillé dans l'industrie du micro-usinage laser pendant de nombreuses années, je sais à quel point vous pouvez être sous pression pour optimiser le processus et faire en sorte que votre machine produise autant de pièces par heure que possible, donc de toute façon vous allez être sous pression pour résoudre correctement le problème.

Enregistrement

D'après mon expérience, le seul moyen de retrouver efficacement un Heisenbug est une journalisation abondante. Connectez tout dans et autour de la partie du code qui pourrait être responsable de l'erreur. Apprenez à lire efficacement vos fichiers journaux, assurez-vous de surveiller l' erreur suivante sur vos moteurs (vos étapes se déplacent-elles là où elles devraient quand elles le devraient?). Regardez l'utilisation de la mémoire sur la machine, une fuite de mémoire provoque-t-elle la famine d'un processus critique?

Assurez-vous que vous enregistrez également les actions des utilisateurs, êtes-vous sûr que l'opérateur ne frappe pas l'arrêt d'urgence afin qu'il puisse sortir pour une pause-cigarette sournoise pendant qu'il est en cours de réparation? J'ai vu ça arriver!

Analyse statique

Recherchez également des corrélations entre le traçage de certains modèles et le déclenchement plus ou moins fréquent du bogue. Si vous pouvez trouver des modèles qui déclenchent le problème plus fréquemment (ou ne le déclenchent jamais), cela peut indiquer votre problème.

Essayez de créer des motifs qui déclenchent le problème encore plus fréquemment. Si vous pouvez trouver un moyen de déclencher le problème de manière fiable, vous êtes à mi-chemin d'une solution.

Autres options

Enfin, ne tardez pas à blâmer le matériel, mais ne supposez jamais qu'il est parfait. Plusieurs fois, on m'a blâmé pour des problèmes qui se sont avérés être de nature électrique ou mécanique, donc vous devez toujours avoir cela à l'esprit.

Même si vous n'avez normalement pas accès à la machine, n'oubliez pas que certains problèmes ne peuvent être résolus efficacement que sur la machine. Parfois, quelques jours sur site peuvent valoir des semaines via un bureau à distance et des mois hors ligne. Si vous manquez d'options hors ligne, n'hésitez pas à proposer une visite du site, ils ne peuvent que dire non.

Vous pouvez également consulter les questions et réponses de Que faites-vous avec un heisenbug? et que faire des bugs qui ne font pas de reproches? mais cela pourrait ne pas être si utile pour votre situation.

Mark Booth
la source
plus à ajouter à mon problème, je n'ai pas le matériel à ma disposition. Et le client n'est pas si éduqué pour comprendre ces termes de programmation, il n'est donc pas possible de s'accrocher à distance à son système. BTW merci pour les conseils va essayer de contourner ce problème.
Shirish11
6

Je vais faire une suggestion décalée.

Allez au directeur d'usine et demandez à voir les enregistrements du moniteur de ligne électrique pour cet outil, ou cette zone, pour les moments où les dysfonctionnements se sont produits. Demandez-lui également s'il y a eu des soudures ou toute autre activité inhabituelle à cette époque.

Il y a plusieurs décennies, mon père passait beaucoup de temps avec un mini-ordinateur qui plantait sans raison. Ils ont appelé le représentant client du fabricant.

Le représentant est entré dans leur bureau, dans la zone de l'usine, et a branché un voltmètre dans le mur, à côté du mini, puis a dit "Regardez ça".

Quelques minutes plus tard, le voltmètre s'est soudainement affaissé, de manière significative, puis est revenu. Le représentant a dit: "C'est lui qui a frappé son arc d'essai. Attendez une minute." Peu de temps après, le voltmètre s'est à nouveau affaissé, et cette fois il est resté affaissé.

Le représentant a dit: "C'est votre problème. Vous avez un gars qui soude sur le sol de l'usine, et il est sur la même jambe électrique que vous. Je l'ai vu s'installer alors que j'entrais."

Ils ont dû exécuter une alimentation électrique complètement séparée pour le bureau.

John R. Strohm
la source
4

Le problème est réel et a de réelles conséquences pour l'utilisateur - c'est-à-dire un travail ruiné, etc. Cependant, il ne doit pas être corrigé "correctement". Vous déclarez:

Une opération de pause et de poursuite le fera à nouveau fonctionner sans problème avec la réapparition du bogue.

Dans ce cas, faites-le. Le client sera heureux de ne pas gaspiller de matériel lors de cycles défectueux, même si les cycles normaux prennent quelques secondes de plus.

Évidemment, à long terme, vous devrez peut-être résoudre ce problème "correctement", mais pour le moment, réduisez vos pertes, optez pour la solution de contournement et passez à autre chose.

ChrisF
la source
4

J'ai eu un bug dans un jeu qui ne s'est produit qu'une seule fois sur un milliard. Heureusement, cela signifiait que je le voyais toutes les 15 à 30 minutes, mais parcourir le code dans le débogueur n'allait pas fonctionner. J'ai fini par mettre des messages de débogage. Ils avaient besoin d'utiliser des instructions if fantaisistes parce que je ne voulais quelque chose qu'en cas de problème. Dans la plupart des cas, le code de débogage répétait les calculs dans le code normal mais en utilisant différentes techniques. Les répétitions n'avaient pas besoin d'être précises. Si je savais qu'un nombre devrait toujours être inférieur à 10 000 et qu'il semblait atteindre 150 000 à l'occasion, je vérifierais simplement une valeur supérieure à 100 000. Chaque fois que le bogue se produisait, j'étudiais mes résultats, concevais des messages de débogage plus élaborés (ou plus précisément, des vérifications plus élaborées pour voir si je devais afficher un message), et j'attendais que le problème se reproduise.

Vos cycles vont être beaucoup plus longs que les miens, mais vous finirez par résoudre le problème. J'espère que vous pouvez trouver la solution par une autre méthode plus rapide, mais cela finira par l'attraper si rien d'autre ne le fait, et vous donnera le sentiment que vous faites quelque chose jusqu'à ce que vous trouviez une meilleure idée.

(Au cas où cela serait utile, j'ai finalement résolu mon problème en nettoyant les quelques lignes de code que j'ai finalement identifiées comme étant le problème. Je jure qu'il n'y avait rien de mal à cela, mais je pense que l'optimiseur et le CPU réorganisaient les instructions pour performances, et je pense que de temps en temps, ils prenaient des chances d'obtenir un peu de vitesse supplémentaire. Même un seul cœur multi-processus ces jours-ci, et je pense que de temps en temps, un grand registre a été lu avant d'être écrit. J'ai changé tous les calculs pour travailler avec des variables locales. Les valeurs du "champ d'instance" ont été déplacées vers les variables locales dès le début, et les valeurs locales n'ont été reculées qu'à la toute fin, à l'intérieur des blocs de synchronisation. Et j'ai utilisé une valeur locale pour le méthode retourne la valeur plutôt que le "champ d'instance"J'avais utilisé.)

RalphChapin
la source
+1 pour la vérification de l'intégrité et l'amélioration itérative des messages de journalisation pour converger vers la racine du problème.
Mark Booth
1

Règle 1 numéro un du débogage: vous avez besoin d'un scénario reproductible .

Si vous n'en avez pas, vous devez d'abord y travailler. Pouvez-vous reproduire ce bug dans une sorte de "mode de simulation" de la machine, où aucun métal n'est réellement coupé? Cela semble logique ici. Pouvez-vous exécuter plusieurs programmes de coupe différents rapidement et automatiquement, simulant le processus de 20 jours en quelques minutes? Cela peut augmenter la probabilité d'apparition du problème.

Ensuite, lorsque vous avez un tel scénario, l'étape suivante consiste à rassembler autant d'informations que possible et à commencer réellement le débogage.

Doc Brown
la source
simuler le processus de 20 jours en quelques minutes ce n'est pas possible. Je dois considérer le matériel.
Shirish11
2
Je n'ai jamais rencontré de heisenbug pouvant être reproduit à l'aide d'un mode de simulation . Les problèmes concernent presque toujours les composants qui sont simulés ou le couplage entre eux. Comme je l'ai dit, si vous pouvez reproduire le problème de manière fiable, vous êtes à mi-chemin d'une solution.
Mark Booth
@Shirish: "simuler le processus en quelques minutes" peut être un extrême, mais attendre 20 jours pour que le bug se produise et couper beaucoup de métal pour laisser le bug apparaître est évidemment l'autre extrême. Peut-être qu'il y a quelque chose de possible entre les deux.
Doc Brown du
2
@ shirish-si vous n'avez pas retiré le matériel pour qu'il soit possible de le simuler, cela signifie que la conception fait défaut. Cela signifie également que votre système n'a pas pu être correctement testé. Il n'est donc pas surprenant que le système rencontre des problèmes.
Dunk
1
@Dunk - Avez-vous déjà travaillé dans l'industrie du traçage laser? Vous n'avez pas toujours le luxe d'un simulateur et même si vous en aviez un bon, il ne serait pas rentable de simuler entièrement toutes les subtilités d'un système mécatronique complexe. Après l'erreur, le profil de vitesse, le suivi des impulsions à une précision inférieure au micron, les interactions entre les systèmes en temps réel doux et dur, la pression temporelle Takt - simuler ce lot en temps réel prendrait un cluster, sans parler de le faire dans 1/10 000 de temps réel. Plus rapide / meilleur / moins cher - vous pouvez rarement avoir les trois, alors essayez de ne pas être aussi critique.
Mark Booth
1

Je ne sais pas dans quelle langue cela est exécuté, mais si je rencontre des bugs erratiques dans mon code (C ++), j'utiliserai un outil comme valgrind ou cppcheck pour m'assurer que rien ne se passe en mémoire.

Chance
la source
0

Une extension de la réponse de RalphChapin:

Au fil des ans, j'ai dû chasser un bon nombre de bogues qui ne se manifestaient que sur des systèmes que je ne pouvais pas dupliquer à cause du matériel connecté.

En plus de me connecter comme un fou, j'ai trouvé utile une autre chose: mettre des informations à l'écran montrant où se trouvait le code et les valeurs de certaines variables pertinentes. Lorsque le problème est apparu, même les ouvriers de l'usine pouvaient me lire les informations.

Il fallait généralement quelques rondes de raffinement pour le définir avec précision, mais c'était très efficace.

Loren Pechtel
la source