Problèmes liés à l'horloge du contrôleur et archivage

Les résultats enregistrés dans ToolsNet comprennent un horodatage fourni par le contrôleur de serrage. Si l'horloge interne du contrôleur est incorrecte en raison d'une pile RTC (horloge temps réel) déchargée, d'un échec de la synchronisation NTP (protocole de synchronisation réseau), d'une mauvaise configuration manuelle ou d'un décalage de l'horloge, les résultats peuvent être enregistrés avec un horodatage erroné. Un horodatage erroné peut entraîner l'absence d'un résultat dans l'archive appropriée ou son archivage dans une base de données d'archives incorrecte.

Symptômes courants :

  • Les résultats affichent des dates très anciennes (par exemple, 1970 ou 2000).

  • Les résultats s'affichent avec des dates très éloignées dans le futur.

  • Le nombre total de résultats archivés ne correspond pas au nombre de résultats dans la base de données de production.

Détection du problème

Avant de lancer la tâche d'archivage, vérifier qu'aucun résultat ne comporte d'horodatage erroné. Exécuter cette requête sur la base de données ToolsNet pour identifier les résultats suspects :

Résultats dont l'horodatage se situe à plus d'un jour dans le futur

SELECT
    r.ID,
    r.ResultDateTime,
    r.ResultInsertDateTime,
    CASE
        WHEN u.MasterUnitID IS NOT NULL
            AND mu.Name IS NOT NULL
        THEN CONCAT(mu.Name, ' - ', u.Name)
        ELSE u.Name
    END AS ControllerName,
    u.IPAddress,
    p.Name AS ProgramName,
    r.UnifiedResultStatusTypeID AS ResultStatus
FROM AtlasCopco_ToolsNet_Database.ACDC.Result AS r
LEFT JOIN AtlasCopco_ToolsNet_Database.ACDC.Unit AS u
    ON r.UnitID = u.ID
LEFT JOIN AtlasCopco_ToolsNet_Database.ACDC.Unit AS mu
    ON u.MasterUnitID = mu.ID
LEFT JOIN AtlasCopco_ToolsNet_Database.ACDC.Program AS p
    ON r.ProgramID = p.ID
WHERE r.ResultDateTime > DATEADD(DAY, 1, GETUTCDATE())
ORDER BY
    r.ResultInsertDateTime DESC;

Résultats dont les horodatages semblent anormalement anciens (antérieurs au déploiement de ToolsNet ; veuillez ajuster l'année)

SELECT
    r.ID,
    r.ResultDateTime,
    r.ResultInsertDateTime,
    CASE
        WHEN u.MasterUnitID IS NOT NULL
            AND mu.Name IS NOT NULL
        THEN CONCAT(mu.Name, ' - ', u.Name)
        ELSE u.Name
    END AS ControllerName,
    u.IPAddress,
    p.Name AS ProgramName,
    r.UnifiedResultStatusTypeID AS ResultStatus
FROM AtlasCopco_ToolsNet_Database.ACDC.Result AS r
LEFT JOIN AtlasCopco_ToolsNet_Database.ACDC.Unit AS u
    ON r.UnitID = u.ID
LEFT JOIN AtlasCopco_ToolsNet_Database.ACDC.Unit AS mu
    ON u.MasterUnitID = mu.ID
LEFT JOIN AtlasCopco_ToolsNet_Database.ACDC.Program AS p
    ON r.ProgramID = p.ID
WHERE
    r.ResultDateTime < (
        SELECT TOP (1)
            TimeStamp
        FROM AtlasCopco_ToolsNet_Database.ToolsNet.SystemInfoLog
    )
    AND r.ResultDateTime < (
        SELECT TOP (1)
            ResultInsertDateTime
        FROM AtlasCopco_ToolsNet_Database.ACDC.Result
        ORDER BY
            ID
    )
ORDER BY
    r.ResultInsertDateTime ASC;

UnitID, nom et nombre total de résultats pour lesquels l'année ne correspond pas

SELECT
    r.UnitID,
    CASE
        WHEN u.MasterUnitID IS NOT NULL AND mu.Name IS NOT NULL
            THEN CONCAT(mu.Name, ' - ', u.Name)
        ELSE u.Name
    END AS ControllerName,
    u.IPAddress,
    COUNT(*) AS MismatchedYearCount
FROM AtlasCopco_ToolsNet_Database.ACDC.Result r
LEFT JOIN AtlasCopco_ToolsNet_Database.ACDC.Unit u
    ON r.UnitID = u.ID
LEFT JOIN AtlasCopco_ToolsNet_Database.ACDC.Unit mu
    ON u.MasterUnitID = mu.ID
LEFT JOIN AtlasCopco_ToolsNet_Database.ACDC.Program p
    ON r.ProgramID = p.ID
WHERE DATEPART(YEAR, r.ResultDateTime) <> DATEPART(YEAR, r.ResultInsertDateTime)
GROUP BY
    r.UnitID,
    CASE
        WHEN u.MasterUnitID IS NOT NULL AND mu.Name IS NOT NULL
            THEN CONCAT(mu.Name, ' - ', u.Name)
        ELSE u.Name
    END,
    u.IPAddress
ORDER BY MismatchedYearCount DESC;

Si la requête renvoie des résultats, noter le nom du contrôleur et l'adresse IP, puis vérifier l'horloge du contrôleur avant de lancer la tâche d'archivage.

Conséquences sur l'archivage

Le processus d'archivage sélectionne les résultats à l'aide de la colonne Horodatage. Si un contrôleur envoie des résultats avec un horodatage incorrect, le comportement d'archivage change comme décrit ci-dessous.

Scénario

Conséquences sur l'archivage

Horodatage dans le passé (par exemple, l'année 2000)

Les résultats peuvent être archivés dès la première exécution dans le dossier d'archivage incorrect, même s'il s'agit de résultats opérationnels récents. Ils respecteront la politique de conservation des archives applicable à ces archives.

Horodatage dans le futur (par exemple, l'année 2099)

Les résultats ne seront pas archivés avant cette date. Cela entraîne une augmentation de la taille de la base de données de production.

Présence simultanée d'horodatages corrects et incorrects sur le même contrôleur

Le « dernier résultat » d'une tâche d'assemblage peut être erroné. Cela a des conséquences sur le SPC, les statistiques et le reporting.

L'horodatage indique une année erronée

Les résultats risquent d'être archivés dans la mauvaise base de données d'archivage.

Actions recommandées avant l'archivage

  • Vérifier la pile RTC du contrôleur et la remplacer si elle est déchargée.

  • Veiller à ce que le contrôleur soit configuré pour synchroniser l'heure avec un serveur NTP fiable et que la synchronisation soit active.

  • Corriger toute erreur de configuration manuelle de l'heure sur le contrôleur.

  • Ne pas exécuter la tâche d'archivage pour les contrôleurs ayant transmis des résultats avec des horodatages incorrects.

  • Pour mettre à jour manuellement les horodatages dans ToolsNet, ouvrir un ticket d'assistance QCM.

  • Si un grand nombre de résultats comporte des horodatages erronés et que l'archivage ne peut pas être effectué en toute sécurité, veuiller en informer l'équipe d'assistance ACDC/ToolsNet.

ToolsNet 8 ne détecte ni ne corrige automatiquement les horodatages erronés du contrôleur. C'est voulu. La responsabilité de l'intégrité de l'horodatage des résultats incombe au contrôleur.

Actions recommandées après l'archivage

Exécuter une requête pour la période indiquée (du 1er janvier 2024 au 1er janvier 2025) afin de trouver les résultats de production qui n'ont pas été archivés. La requête doit :

  • Comparer chaque identifiant de résultat de production (Result.ID) avec la référence d'archive (Archive.dbo.Result.ResultID).

  • Ne renvoyer que les enregistrements pour lesquels aucune entrée d'archive ne correspond.

  • Veuillez inclure les informations relatives à l'unité et au contrôleur (afficher MasterUnitName - UnitName le cas échéant), l'adresse IP de l'unité, ainsi que l'enregistrement complet des résultats afin de faciliter l'enquête sur les enregistrements d'archives manquants.

SELECT
    u.ID AS UnitID,
    CASE
        WHEN u.MasterUnitID IS NOT NULL AND mu.Name IS NOT NULL
            THEN CONCAT(mu.Name, ' - ', u.Name)
        ELSE u.Name
    END AS ControllerName,
    u.IPAddress AS IPaddress,
    r.*
FROM AtlasCopco_ToolsNet_Database.ACDC.Result r
INNER JOIN AtlasCopco_ToolsNet_Database.ACDC.Unit u
    ON r.UnitID = u.ID
LEFT JOIN AtlasCopco_ToolsNet_Database.ACDC.Unit mu
    ON u.MasterUnitID = mu.ID
LEFT JOIN Archive.dbo.Result arch
    ON r.ID = arch.ResultID
WHERE
    r.ResultDateTime >= '2024-01-01'
    AND r.ResultDateTime < '2025-01-01'
    AND arch.ResultID IS NULL
ORDER BY
    ControllerName,
    r.ResultDateTime DESC;

Dans Archive.dbo.Result, veiller à remplacer Archive par le nom de la base de données d'archivage de votre environnement. Par exemple, si votre base de données d'archives s'appelle ToolsNetArchive, renommez-la en ToolsNetArchive.dbo.Result.