diff --git a/src/CncModels/Dto/Machine/MachineStatusResponse.cs b/src/CncModels/Dto/Machine/MachineStatusResponse.cs index 8e45eb2..2572f6e 100644 --- a/src/CncModels/Dto/Machine/MachineStatusResponse.cs +++ b/src/CncModels/Dto/Machine/MachineStatusResponse.cs @@ -28,5 +28,8 @@ namespace CncModels.Dto.Machine /// 主轴负载(%) public decimal? SpindleLoad { get; set; } + + /// 历史累计加工零件总数(Tag1终身值) + public decimal? TotalPartCount { get; set; } } } diff --git a/src/CncModels/Entity/Machine.cs b/src/CncModels/Entity/Machine.cs index 384425f..983b738 100644 --- a/src/CncModels/Entity/Machine.cs +++ b/src/CncModels/Entity/Machine.cs @@ -52,6 +52,9 @@ namespace CncModels.Entity /// 最近零件数 public decimal? LastPartCount { get; set; } + /// 最近累计零件总数(Tag1历史终身值) + public decimal? LastTotalPartCount { get; set; } + /// 最近操作模式 public string LastOperateMode { get; set; } diff --git a/src/CncRepository/Impl/MachineRepository.cs b/src/CncRepository/Impl/MachineRepository.cs index 0ff4846..864ef28 100644 --- a/src/CncRepository/Impl/MachineRepository.cs +++ b/src/CncRepository/Impl/MachineRepository.cs @@ -20,7 +20,7 @@ namespace CncRepository.Impl /// 在线判断SQL片段:last_ping_time在20秒内视为在线 private const string OnlineExpr = "(CASE WHEN last_ping_time IS NOT NULL AND last_ping_time >= NOW() - INTERVAL 20 SECOND THEN 1 ELSE 0 END)"; - private const string SelectColumns = @"id as Id, device_code as DeviceCode, name as Name, workshop_id as WorkshopId, collect_address_id as CollectAddressId, ip_address as IpAddress, brand_id as BrandId, is_enabled as IsEnabled, {0} as IsOnline, last_ping_time as LastPingTime, last_ping_latency as LastPingLatency, last_collect_time as LastCollectTime, last_device_status as LastDeviceStatus, last_run_status as LastRunStatus, last_program_name as LastProgramName, last_part_count as LastPartCount, last_operate_mode as LastOperateMode, last_machining_status as LastMachiningStatus, created_at as CreatedAt, updated_at as UpdatedAt"; + private const string SelectColumns = @"id as Id, device_code as DeviceCode, name as Name, workshop_id as WorkshopId, collect_address_id as CollectAddressId, ip_address as IpAddress, brand_id as BrandId, is_enabled as IsEnabled, {0} as IsOnline, last_ping_time as LastPingTime, last_ping_latency as LastPingLatency, last_collect_time as LastCollectTime, last_device_status as LastDeviceStatus, last_run_status as LastRunStatus, last_program_name as LastProgramName, last_part_count as LastPartCount, last_total_part_count as LastTotalPartCount, last_operate_mode as LastOperateMode, last_machining_status as LastMachiningStatus, created_at as CreatedAt, updated_at as UpdatedAt"; public Machine GetById(int id) { diff --git a/src/CncService/Impl/MachineService.cs b/src/CncService/Impl/MachineService.cs index f6a1235..2700db0 100644 --- a/src/CncService/Impl/MachineService.cs +++ b/src/CncService/Impl/MachineService.cs @@ -130,6 +130,7 @@ namespace CncService.Impl PartCount = machine.LastPartCount, RunStatus = machine.LastRunStatus ?? latest?.RunStatus, OperationMode = machine.LastOperateMode, + TotalPartCount = machine.LastTotalPartCount, SpindleSpeedSet = null, FeedSpeedSet = null, SpindleSpeedActual = null, diff --git a/src/CncSimulator/Device/DeviceSimulator.cs b/src/CncSimulator/Device/DeviceSimulator.cs index 6d8a9e8..a325e8e 100644 --- a/src/CncSimulator/Device/DeviceSimulator.cs +++ b/src/CncSimulator/Device/DeviceSimulator.cs @@ -99,6 +99,17 @@ namespace CncSimulator.Device case "same_part": SetScenario("same_part", 999); break; + case "time_freeze": + // 冻结时间:Tag的time保持不变,value继续正常更新 + _state.FreezeTime = true; + if (!_state.FrozenTimeValue.HasValue) + _state.FrozenTimeValue = DateTime.Now; + break; + case "time_unfreeze": + // 解冻时间:恢复正常time更新 + _state.FreezeTime = false; + _state.FrozenTimeValue = null; + break; } } diff --git a/src/CncSimulator/Device/DeviceState.cs b/src/CncSimulator/Device/DeviceState.cs index 57d9a2c..b50c5c7 100644 --- a/src/CncSimulator/Device/DeviceState.cs +++ b/src/CncSimulator/Device/DeviceState.cs @@ -58,6 +58,13 @@ namespace CncSimulator.Device /// 数据变化间隔(秒) public int DataChangeInterval { get; set; } = 10; + // ===== 时间冻结(测试time不变value变的边界条件) ===== + /// 时间冻结开关:true时Tag的time字段保持不变,value照常更新 + public bool FreezeTime { get; set; } = false; + + /// 冻结时使用的固定时间(null时首次冻结取当前时间) + public DateTime? FrozenTimeValue { get; set; } = null; + // ===== 统计信息 ===== /// 本次启动后累计总加工零件数 public int TotalPartsSinceStart { get; set; } = 0; diff --git a/src/CncSimulator/Generator/FanucDataGenerator.cs b/src/CncSimulator/Generator/FanucDataGenerator.cs index 57f2b33..2918984 100644 --- a/src/CncSimulator/Generator/FanucDataGenerator.cs +++ b/src/CncSimulator/Generator/FanucDataGenerator.cs @@ -31,7 +31,10 @@ namespace CncSimulator.Generator private JArray GenerateTags(DeviceState state) { var tags = new JArray(); - DateTime baseTime = DateTime.Now; + // 如果设备设置了时间冻结,使用冻结的固定时间;否则取当前时间 + DateTime baseTime = state.FreezeTime && state.FrozenTimeValue.HasValue + ? state.FrozenTimeValue.Value + : DateTime.Now; // 每个tag的时间基准上随机偏移 -5~0 秒 DateTime TagTime()