控制器时钟问题与归档

ToolsNet 中存储的结果包含由拧紧控制器提供的时间戳。如果控制器的内部时钟因实时时钟 (RTC) 电池耗尽、网络时间协议 (NTP) 同步失败、手动配置错误或时钟漂移而不准确,那么结果可能被记录为错误的时间戳。错误的时间戳可能导致结果在正确的归档中缺失,或被归档到错误的数据库中。

常见表现:

  • 结果显示的日期远在过去(例如 1970 年或 2000 年)。

  • 结果显示的日期远在未来。

  • 已归档结果的总数与生产数据库中的结果数量不一致。

检测问题

在执行归档任务之前,请先验证是否有结果包含错误的时间戳。在 ToolsNet 数据库中运行以下查询,以识别可疑结果:

时间戳超过未来 1 天的结果

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;

时间戳异常陈旧的结果(早于 ToolsNet 部署日期,请相应调整年份)

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、名称及总结果数量中年份不匹配的记录

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;

如果查询返回结果,请先记录控制器名称和 IP 地址,并在运行归档任务之前调查控制器时钟问题。

对归档的影响

归档过程使用时间戳列来选择结果。如果控制器发送的结果带有错误时间戳,归档行为将发生变化,具体情况如下。

场景

归档影响

时间戳在过去(例如 2000 年)

即使是近期产生的操作结果,也可能在首次运行时就被立即归档到错误的数据库中。这些结果将遵循该归档的保留策略。

时间戳在未来(例如 2099 年)

结果将一直等到那个未来日期到达后才能归档。这会导致生产数据库不断增长。

同一控制器混合了正确和错误的时间戳

装配任务的“最新结果”可能不正确。这会影响 SPC、统计和报表功能。

时间戳年份错误

结果可能被归档到错误的数据库。

归档前的建议操作

  • 检查控制器的 RTC 电池,如已耗尽请及时更换。

  • 确保控制器已配置为与可靠的 NTP 服务器同步时间,并且同步功能处于激活状态。

  • 纠正控制器上的任何手动时间配置错误。

  • 对于已提交错误时间戳结果的控制器,请勿运行归档任务。

  • 如需手动更新 ToolsNet 中的时间戳,请提交 QCM 支持工单。

  • 如果大量结果带有错误时间戳且归档无法安全进行,请通知 ACDC/ToolsNet 支持团队。

ToolsNet 8 不会自动检测或纠正控制器的时间戳错误。这是设计如此。结果时间戳的完整性由控制器负责。

归档后的建议操作

针对指定日期范围(2024-01-01 至 2025-01-01)运行查询,查找未被归档的生产结果。查询应执行以下操作:

  • 逐一比对每条生产结果 ID (Result.ID) 与归档引用 (Archive.dbo.Result.ResultID)。

  • 仅返回没有匹配归档记录的条目。

  • 包含单元和控制器详细信息(适用时显示 MasterUnitName - UnitName)、单元 IP 地址以及完整的结果记录,以支持对缺失归档记录的调查。

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;

Archive.dbo.Result 中,请务必将 Archive 替换为您实际环境中的归档数据库名称。例如,如果您的归档数据库名为 ToolsNetArchive,则应将其更新为 ToolsNetArchive.dbo.Result