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.