using System; using System.Collections.Generic; using System.Linq; using CncSimulator.Config; using CncSimulator.Device; using CncSimulator.Generator; namespace CncSimulator.Device { /// 单台设备的状态机与仿真逻辑 public class DeviceSimulator { public DeviceState State { get; private set; } private readonly Random _rnd; private readonly List _programs = new List { "O0001", "O0002", "1566.NC", "PART-A", "TEST-03" }; private int _currentScenarioIndex = 0; private int _tickCounter = 0; public DeviceSimulator(DeviceConfig cfg, int dataChangeInterval) { State = new DeviceState { DeviceCode = cfg.DeviceCode, Desc = cfg.Desc, ProgramName = cfg.InitialProgram ?? "O0001", PartCount = cfg.InitialPartCount, DataChangeInterval = dataChangeInterval }; // 使用不同种子避免同步 _rnd = new Random(cfg.DeviceCode.GetHashCode()); // 初始化一个随机偏移,确保场景起始不一致 _currentScenarioIndex = _rnd.Next(0, _programs.Count); } public void Tick() { if (!State.IsOnline) return; // 简易定时器:每次 Tick 增加一个单位时间,依据当前场景更新数据 _tickCounter++; // 每次数据变化的间隔由 DataChangeInterval 决定 if (_tickCounter < State.DataChangeInterval) return; _tickCounter = 0; // 根据当前场景执行更新逻辑 switch (State.CurrentScenario) { case "machining": State.PartCount += 1; State.RunStatus = 3; State.OperateMode = 1; State.MachiningStatus = "G01"; break; default: break; } } public void SetScenario(string scenarioName, int duration) { State.CurrentScenario = scenarioName; State.ScenarioDuration = duration; State.ScenarioTick = 0; } // 简化的场景更新接口,供 ScenarioPlayer 调用 public void ApplyScenarioUpdate(string scenarioName, int duration, string programOverride = null) { SetScenario(scenarioName, duration); if (!string.IsNullOrWhiteSpace(programOverride)) { State.ProgramName = programOverride; } } } }