Problem med styrenhetens klocka och arkivering

Resultat som lagras i ToolsNet innehåller en tidsstämpel som tillhandahålls av åtdragningsstyrenheten. Om styrenhetens interna klocka är felaktig på grund av ett urladdat RTC-batteri (Real Time Clock), misslyckad NTP-synkronisering (Network Time Protocol), felaktig manuell konfiguration eller klockavvikelse kan resultaten lagras med felaktig tidsstämpel. Felaktiga tidsstämplar kan leda till att ett resultat saknas i rätt arkiv eller arkiveras i fel arkivdatabas.

Vanliga symptom:

  • Resultaten visas med datum långt tillbaka i tiden (till exempel 1970 eller 2000).

  • Resultaten visas med datum långt fram i tiden.

  • Det totala antalet arkiverade resultat stämmer inte överens med antalet resultat i produktionsdatabasen.

Felsökning

Innan du kör arkiveringsjobbet ska du kontrollera att inga resultat har felaktiga tidsstämplar. Kör följande sökfråga mot ToolsNet-databasen för att identifiera misstänkta resultat:

Resultat med tidsstämplar som ligger mer än 1 dag framåt i tiden

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;

Resultat med tidsstämplar som är misstänkt gamla (från tiden före ToolsNet-implementeringen; justera årtalet)

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, namn och totalt antal resultat där årtalet inte stämmer

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;

Om sökningen ger resultat ska du notera ControllerName och IP-adress samt kontrollera styrenhetens klocka innan du kör arkiveringsjobbet.

Inverkan på arkiveringen

Arkiveringsprocessen väljer ut resultat med hjälp av kolumnen Tidsstämpel. Om en styrenhet skickar resultat med felaktig tidsstämpel ändras arkiveringsbeteendet enligt beskrivningen nedan.

Scenario

Konsekvenser av arkivering

Tidsstämpel i det förflutna (till exempel år 2000)

Resultat kan arkiveras direkt vid den första körningen till fel arkiv, även om det rör sig om aktuella driftsresultat. De kommer att följa arkivets lagringspolicy.

Tidsstämpel i framtiden (till exempel år 2099)

Resultaten kommer inte att arkiveras förrän det framtida datumet har inträffat. Detta leder till att produktionsdatabasen växer.

Blandade korrekta och felaktiga tidsstämplar på samma styrenhet

Det ”senaste resultatet” för en monteringsuppgift kan vara felaktigt. Detta påverkar SPC, statistik och rapportering.

Tidsstämpel i fel år

Resultaten kan komma att arkiveras i fel arkivdatabas.

Rekommenderade åtgärder före arkivering

  • Kontrollera RTC-batteriet i styrenheten och byt ut det om det är urladdat.

  • Se till att styrenheten är konfigurerad för att synkronisera tiden med en pålitlig NTP-server och att synkroniseringen är aktiv.

  • Korrigera eventuella manuella felkonfigurationer av tiden på styrenheten.

  • Kör inte arkiveringsjobbet för styrenheter som har skickat in resultat med felaktiga tidsstämplar.

  • För manuella uppdateringar av tidsstämplar i ToolsNet, öppna ett QCM-supportärende.

  • Om ett stort antal resultat har felaktiga tidsstämplar och arkiveringen inte kan genomföras på ett säkert sätt, kontakta supporten för ACDC/ToolsNet.

ToolsNet 8 upptäcker eller korrigerar inte felaktiga tidsstämplar från styrenheten automatiskt. Detta är avsiktligt. Ansvaret för att resultatens tidsstämplar är korrekta ligger hos styrenheten.

Rekommenderade åtgärder efter arkivering

Kör en sökning för det angivna datumintervallet (2024-01-01 till 2025-01-01) för att hitta produktionsresultat som inte har arkiverats. Sökningen bör:

  • Jämföra varje produktionsresultat-ID (Result.ID) med arkivreferensen (Archive.dbo.Result.ResultID).

  • Endast returnera poster utan matchande arkivpost.

  • Inkludera enhets- och styrenhetsdetaljer (visa MasterUnitName – UnitName när det är tillämpligt), enhetens IP-adress och den fullständiga resultatposten för att underlätta utredningen av saknade arkivposter.

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;

I Archive.dbo.Result ska du se till att Archive ersätts med namnet på arkivdatabasen i din miljö. Om din arkivdatabas till exempel heter ToolsNetArchive ska du uppdatera den till ToolsNetArchive.dbo.Result.