La plupart des produits matériels contiennent des sous-assemblages, chacun avec son propre numéro de série. Le champ sub_units vous permet d'enregistrer quels composants ont été intégrés dans quelle unité parente, offrant une traçabilité complète de la nomenclature depuis un seul script de test.
Pourquoi le suivi des sous-assemblages est important
Un produit fini peut contenir une carte d'alimentation, un module de calcul et un réseau de capteurs. Chacun possède son propre numéro de série et son propre historique de tests. Lorsqu'une défaillance terrain pointe vers un composant spécifique, vous devez savoir quelles unités parentes contiennent ce composant.
C'est une pratique standard pour la traçabilité IPC-1782 et une exigence dans les industries réglementées. Les numéros de série parent et enfant sont liés automatiquement lorsque vous les incluez dans vos exécutions de tests.
C'est aussi ce qui est le plus difficile à ajouter après coup. Reconstruire quelle carte est allée dans quel assemblage implique de lire des dossiers de fabrication à la main, s'ils existent. Modélisez-le dès la première série même si vous ne l'interrogez pas encore.
Enregistrer les numéros de série des sous-unités
sub_units est un champ de htf.Test(...), aux côtés de procedure_id et part_number. Il prend une liste d'entrées {"serial_number": "..."}.
test_assembly.py31 lines
# Enregistrement des numéros de série des sous-assemblages lors du test d'assemblage finalimport openhtf as htffrom tofupilot.openhtf import upload@htf.measures( htf.Measurement("system_power_on").in_range(minimum=1, maximum=1), htf.Measurement("communication_check").in_range(minimum=1, maximum=1),)def system_integration_test(test): test.measurements.system_power_on = 1 test.measurements.communication_check = 1def main(): test = htf.Test( system_integration_test, procedure_id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", # UUID de procédure du dashboard part_number="ASSY-100", sub_units=[ {"serial_number": "PSU-2026-0441"}, {"serial_number": "CPU-2026-1187"}, {"serial_number": "SNS-2026-0893"}, ], ) test.add_output_callbacks(upload()) test.execute(lambda: "ASSY-2026-0072")if __name__ == "__main__": main()Après l'envoi de ce test, la page d'unité pour ASSY-2026-0072 affiche trois sous-assemblages liés. Cliquez sur n'importe quel numéro de série de sous-unité pour voir son propre historique de tests.
Scanner les numéros de série des sous-unités pendant l'assemblage
En pratique, les opérateurs scannent les numéros de série des composants à mesure qu'ils les installent. Comme sub_units est un argument du constructeur, collectez les scans avant de construire le test :
test_scan_subunits.py34 lines
# L'opérateur scanne les numéros de série des sous-assemblages pendant l'assemblageimport openhtf as htffrom openhtf.util import unitsfrom tofupilot.openhtf import upload@htf.measures( htf.Measurement("power_rail_5v").in_range(minimum=4.8, maximum=5.2).with_units(units.VOLT), htf.Measurement("power_rail_3v3").in_range(minimum=3.1, maximum=3.5).with_units(units.VOLT),)def power_validation(test): test.measurements.power_rail_5v = 5.02 test.measurements.power_rail_3v3 = 3.31def main(): psu = input("Scanner le numéro de série PSU : ") cpu = input("Scanner le numéro de série CPU : ") test = htf.Test( power_validation, procedure_id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", part_number="ASSY-100", sub_units=[ {"serial_number": psu}, {"serial_number": cpu}, ], ) test.add_output_callbacks(upload()) test.execute(lambda: input("Scanner le numéro de série de l'assemblage : "))if __name__ == "__main__": main()Scanner avant le démarrage du test permet aussi de détecter une erreur de scan avant de consommer du temps de cycle en mesures. Validez le format du numéro de série à la saisie plutôt que de découvrir une faute de frappe dans l'enregistrement de traçabilité des mois plus tard.
Pour une station avec une vraie interface opérateur, remplacez input() par openhtf.plugs.user_input afin que les invites apparaissent sur l'écran opérateur plutôt que dans une console.
Assemblages multi-niveaux
Pour les produits avec des assemblages imbriqués (un module dans une carte, dans un châssis), testez chaque niveau séparément avec ses propres sous-unités. La hiérarchie se construit automatiquement.
test_nested_assembly.py47 lines
# Tester un module, puis tester la carte qui le contientimport openhtf as htffrom tofupilot.openhtf import uploadMODULE_PROCEDURE_ID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"BOARD_PROCEDURE_ID = "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"@htf.measures( htf.Measurement("module_self_test").in_range(minimum=1, maximum=1),)def module_test(test): test.measurements.module_self_test = 1@htf.measures( htf.Measurement("board_communication").in_range(minimum=1, maximum=1),)def board_test(test): test.measurements.board_communication = 1def main(): # Premièrement : tester le module seul module_serial = "MOD-2026-0551" t1 = htf.Test( module_test, procedure_id=MODULE_PROCEDURE_ID, part_number="MOD-100", ) t1.add_output_callbacks(upload()) t1.execute(lambda: module_serial) # Deuxièmement : tester la carte, en déclarant le module comme sous-unité board_serial = "BRD-2026-0112" t2 = htf.Test( board_test, procedure_id=BOARD_PROCEDURE_ID, part_number="BRD-100", sub_units=[{"serial_number": module_serial}], ) t2.add_output_callbacks(upload()) t2.execute(lambda: board_serial)if __name__ == "__main__": main()La recherche par numéro de série de la carte affiche le module comme sous-unité. La recherche par numéro de série du module affiche ses propres résultats de test ainsi que la carte parente dans laquelle il a été installé.
En production, ces deux tests sont généralement des scripts séparés sur des stations séparées, exécutés à des heures différentes. Ils sont réunis ici uniquement pour montrer les deux moitiés du lien.
Cas d'utilisation de la traçabilité de nomenclature
Une fois les liens de sous-assemblage en place, vous pouvez répondre aux questions qui comptent en production :
- Investigation de défaillance terrain. Un module capteur tombe en panne sur le terrain. Recherchez son numéro de série pour trouver chaque unité parente contenant le même type de module du même lot de production.
- Rappel de composant. Un fournisseur signale un lot de condensateurs. Si vos phases de test enregistrent les numéros de lot comme mesures, vous pouvez tracer quels assemblages les ont utilisés.
- Rendement par composant. Le rendement au premier passage ventilé par lot de sous-assemblage montre si un lot de composants précis cause les défaillances.
Le cas du rappel justifie à lui seul tout l'exercice. Sans les liens, vous mettez au rebut ou rappelez tout ce qui a été construit sur une plage de dates ; avec eux, vous ne traitez que les unités qui contiennent réellement le lot suspect.
Visualiser les liens de sous-assemblage
Ouvrez la page de n'importe quelle unité pour voir son arborescence de sous-assemblage :
- Les composants enfants directs avec leurs numéros de série
- L'historique de test propre à chaque enfant (cliquez pour le consulter)
- L'assemblage parent, si cette unité est elle-même un sous-composant
- Toutes les exécutions de test pour l'unité, à travers chaque étape de production
Cela offre aux ingénieurs qualité et aux auditeurs un point unique pour tracer n'importe quel composant à travers la hiérarchie complète du produit.
