Problemi del clock del controller e archiviazione

I risultati memorizzati in ToolsNet includono un timestamp fornito dal controller di serraggio. Se il clock interno del controller non è corretto a causa dell'esaurimento della batteria dell'orologio in tempo reale (RTC), di un errore nella sincronizzazione tramite il protocollo NTP (Network Time Protocol), di un'errata configurazione manuale o di una deriva dell'orologio, i risultati potrebbero essere salvati con un timestamp errato. Un timestamp errato può causare la mancata presenza di un risultato nell'archivio corretto o la sua archiviazione nel database di archivio sbagliato.

Sintomi comuni:

  • I risultati riportano date molto lontane nel tempo (ad esempio, il 1970 o il 2000).

  • I risultati riportano date molto lontane nel futuro.

  • Il numero totale dei risultati archiviati non corrisponde al numero di risultati presenti nel database di produzione.

Individuazione del problema

Prima di eseguire il processo di archiviazione, assicurati che nessun risultato presenti timestamp errati. Esegui questa query sul database di ToolsNet per individuare i risultati sospetti:

Risultati con data e ora che indicano 1 giorno o più nel futuro

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;

Risultati con date sospettosamente vecchie (precedenti all'implementazione di ToolsNet; modificare l'anno)

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;

ID unità, nome e totale dei risultati in cui l'anno non corrisponde

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;

Se la query restituisce dei risultati, prendere nota del nome del controller e dell'indirizzo IP, quindi verificare il clock del controller prima di eseguire il processo di archiviazione.

Impatto sull’archiviazione

Il processo di archiviazione seleziona i risultati utilizzando la colonna Data e ora. Se un controller invia risultati con un timestamp errato, il comportamento di archiviazione cambia come descritto di seguito.

Situazione

Impatto dell'archiviazione

Timestamp passato (ad esempio, anno 2000)

I risultati potrebbero essere archiviati immediatamente nell'archivio sbagliato già al primo tentativo, anche se si tratta di risultati operativi recenti. Rispetteranno la politica di conservazione prevista per quell'archivio.

Timestamp futuro (ad esempio, anno 2099)

I risultati non verranno archiviati fino al raggiungimento di tale data futura. Questo fa sì che il database di produzione aumenti di dimensioni.

Presenza di timestamp corretti e non corretti sullo stesso controller

Il "risultato più recente" di un'operazione di assemblaggio potrebbe essere errato. Ciò ha ripercussioni su SPC, statistiche e report.

Timestamp nell’anno sbagliato

I risultati potrebbero essere archiviati nel database di archiviazione sbagliato.

Azioni consigliate prima dell'archiviazione

  • Controllare la batteria dell'RTC del controller e sostituirla se scarica.

  • Assicurarsi che il controller sia configurato per sincronizzare l'ora con un server NTP affidabile e che la sincronizzazione sia attiva.

  • Correggere eventuali impostazioni errate dell'ora sul controller.

  • Non eseguire il processo di archiviazione per i controller che hanno inviato risultati con timestamp errati.

  • Per aggiornare manualmente i timestamp in ToolsNet, apri un ticket di assistenza QCM.

  • Se un numero elevato di risultati presenta timestamp errati e l'archiviazione non può procedere in modo sicuro, si prega di informare il team di assistenza ACDC/ToolsNet.

ToolsNet 8 non rileva né corregge automaticamente i timestamp errati del controller. È voluto. La responsabilità dell'integrità del timestamp dei risultati spetta al responsabile del trattamento.

Azioni consigliate dopo dell'archiviazione

Eseguire una query per l'intervallo di date specificato (dal 1° gennaio 2024 al 1° gennaio 2025) per individuare i risultati di produzione che non sono stati archiviati. La query dovrebbe:

  • Confrontare ogni ID del risultato di produzione (Result.ID) con il riferimento dell'archivio (Archive.dbo.Result.ResultID).

  • Restituire solo i record senza una corrispondente voce nell’archivio.

  • Includere i dettagli relativi all'unità e al controller (indicando MasterUnitName - UnitName, se del caso), l'indirizzo IP dell'unità e il record completo dei risultati per facilitare l'analisi dei record mancanti nell'archivio.

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;

In Archive.dbo.Result, assicurati di sostituire Archivio con il nome del database di archiviazione del tuo ambiente. Ad esempio, se il database di archivio si chiama ToolsNetArchive, rinominalo ToolsNetArchive.dbo.Result.