修复累计总数(totalPartCount)显示异常+模拟器time_freeze功能

- Machine entity新增LastTotalPartCount字段映射DB last_total_part_count列
- MachineStatusResponse DTO新增TotalPartCount属性
- MachineRepository SelectColumns新增last_total_part_count列映射
- MachineService.GetStatus填充TotalPartCount值
- 模拟器新增time_freeze/time_unfreeze事件支持(DeviceState/DeviceSimulator/FanucDataGenerator)
main
haoliang 1 month ago
parent 54910626b1
commit 2153a1fed9

@ -28,5 +28,8 @@ namespace CncModels.Dto.Machine
/// <summary>主轴负载(%</summary> /// <summary>主轴负载(%</summary>
public decimal? SpindleLoad { get; set; } public decimal? SpindleLoad { get; set; }
/// <summary>历史累计加工零件总数Tag1终身值</summary>
public decimal? TotalPartCount { get; set; }
} }
} }

@ -52,6 +52,9 @@ namespace CncModels.Entity
/// <summary>最近零件数</summary> /// <summary>最近零件数</summary>
public decimal? LastPartCount { get; set; } public decimal? LastPartCount { get; set; }
/// <summary>最近累计零件总数Tag1历史终身值</summary>
public decimal? LastTotalPartCount { get; set; }
/// <summary>最近操作模式</summary> /// <summary>最近操作模式</summary>
public string LastOperateMode { get; set; } public string LastOperateMode { get; set; }

@ -20,7 +20,7 @@ namespace CncRepository.Impl
/// <summary>在线判断SQL片段last_ping_time在20秒内视为在线</summary> /// <summary>在线判断SQL片段last_ping_time在20秒内视为在线</summary>
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 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) public Machine GetById(int id)
{ {

@ -130,6 +130,7 @@ namespace CncService.Impl
PartCount = machine.LastPartCount, PartCount = machine.LastPartCount,
RunStatus = machine.LastRunStatus ?? latest?.RunStatus, RunStatus = machine.LastRunStatus ?? latest?.RunStatus,
OperationMode = machine.LastOperateMode, OperationMode = machine.LastOperateMode,
TotalPartCount = machine.LastTotalPartCount,
SpindleSpeedSet = null, SpindleSpeedSet = null,
FeedSpeedSet = null, FeedSpeedSet = null,
SpindleSpeedActual = null, SpindleSpeedActual = null,

@ -99,6 +99,17 @@ namespace CncSimulator.Device
case "same_part": case "same_part":
SetScenario("same_part", 999); SetScenario("same_part", 999);
break; 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;
} }
} }

@ -58,6 +58,13 @@ namespace CncSimulator.Device
/// <summary>数据变化间隔(秒)</summary> /// <summary>数据变化间隔(秒)</summary>
public int DataChangeInterval { get; set; } = 10; public int DataChangeInterval { get; set; } = 10;
// ===== 时间冻结测试time不变value变的边界条件 =====
/// <summary>时间冻结开关true时Tag的time字段保持不变value照常更新</summary>
public bool FreezeTime { get; set; } = false;
/// <summary>冻结时使用的固定时间null时首次冻结取当前时间</summary>
public DateTime? FrozenTimeValue { get; set; } = null;
// ===== 统计信息 ===== // ===== 统计信息 =====
/// <summary>本次启动后累计总加工零件数</summary> /// <summary>本次启动后累计总加工零件数</summary>
public int TotalPartsSinceStart { get; set; } = 0; public int TotalPartsSinceStart { get; set; } = 0;

@ -31,7 +31,10 @@ namespace CncSimulator.Generator
private JArray GenerateTags(DeviceState state) private JArray GenerateTags(DeviceState state)
{ {
var tags = new JArray(); var tags = new JArray();
DateTime baseTime = DateTime.Now; // 如果设备设置了时间冻结,使用冻结的固定时间;否则取当前时间
DateTime baseTime = state.FreezeTime && state.FrozenTimeValue.HasValue
? state.FrozenTimeValue.Value
: DateTime.Now;
// 每个tag的时间基准上随机偏移 -5~0 秒 // 每个tag的时间基准上随机偏移 -5~0 秒
DateTime TagTime() DateTime TagTime()

Loading…
Cancel
Save