控制器时钟问题与归档
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。