using HslCommunication.ModBus; using OrpaonEMS.App.Services; using OrpaonEMS.Core.Enums; using Prism.Mvvm; using Stateless; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OrpaonEMS.App.Models { /// /// PCS状态模型 /// public class PCSStateModel : BindableBase { /// /// 实例化函数 /// /// public PCSStateModel(InPowerPCSDataService inPowerPCSDataService) { PCSStateMachineInitalConfig(); InPowerPCSDataService = inPowerPCSDataService; } /// /// PCS的状态信息 /// /// public PCSState PcsStateInfo { get; set; } private string _PcsStateMsg; /// /// PCS的状态信息 /// 状态文本 /// public string PcsStateMsg { get { return _PcsStateMsg; } set { _PcsStateMsg = value; RaisePropertyChanged(); } } /// /// PCS运行状态机 /// public StateMachine PcsStateMachine { set; get; } /// /// 上位机连接PCS状态机 /// public StateMachine CurIPCLinkStateMachine { set; get; } /// /// PCS链接状态 /// public LinkState PcsLinkState { get; set; } private string _LinkStateMsg; /// /// PCS连接PC的状态信息文本 /// public string LinkStateMsg { get { return _LinkStateMsg; } set { _LinkStateMsg = value; RaisePropertyChanged(); } } /// /// PCS的初始配置 /// public void PCSStateMachineInitalConfig() { //PCS运行状态 PcsStateMachine = new StateMachine(PCSState.Inital); //初始化-> PcsStateMachine.Configure(PCSState.Inital) .Permit(PCSStateTrigger.RunTrig, PCSState.Run) .Permit(PCSStateTrigger.StandbyTrig, PCSState.Standby) .Permit(PCSStateTrigger.StopTrig, PCSState.Stop) .OnEntry(() => PCSInital()); PcsStateMachine.Configure(PCSState.Run) .Permit(PCSStateTrigger.StandbyTrig, PCSState.Standby) .Permit(PCSStateTrigger.StopTrig, PCSState.Stop) .Ignore(PCSStateTrigger.RunTrig) .OnEntry(() => PCSStartAsync()); PcsStateMachine.Configure(PCSState.Stop) .Permit(PCSStateTrigger.RunTrig, PCSState.Run) .Permit(PCSStateTrigger.StandbyTrig, PCSState.Standby) .Ignore(PCSStateTrigger.StopTrig) .OnEntry(() => PCSStopAsync()); PcsStateMachine.Configure(PCSState.Standby) .Permit(PCSStateTrigger.RunTrig, PCSState.Run) .Permit(PCSStateTrigger.StopTrig, PCSState.Stop) .Ignore(PCSStateTrigger.StandbyTrig) .OnEntry(() => PCSStandbyAsync()); //PCS 上位机连接状态 CurIPCLinkStateMachine = new StateMachine(LinkState.Initial); CurIPCLinkStateMachine.Configure(LinkState.Initial) .Permit(LinkStateTrig.LinkOKTrig, LinkState.LinkOK) .Permit(LinkStateTrig.LinkNGTrig, LinkState.LinkNG); CurIPCLinkStateMachine.Configure(LinkState.LinkNG) .Permit(LinkStateTrig.LinkOKTrig, LinkState.LinkOK) .Ignore(LinkStateTrig.LinkNGTrig) .OnEntry(() => IPCLinkNG()); CurIPCLinkStateMachine.Configure(LinkState.LinkOK) .Permit(LinkStateTrig.LinkNGTrig, LinkState.LinkNG) .Ignore(LinkStateTrig.LinkOKTrig) .OnEntry(() => IPCLinkOK()); } #region PCS运行状态 /// /// PCS 初始化 /// private void PCSInital() { PcsStateInfo = PCSState.Inital; PcsStateMsg = "初始化"; Console.WriteLine($"时间:{DateTime.Now.ToString()}:PCS进入【初始】模式 "); } /// /// PCS 进入停机 /// /// private void PCSStandbyAsync() { PcsStateInfo = PCSState.Standby; PcsStateMsg = "待机"; Console.WriteLine($"时间:{DateTime.Now.ToString()}:PCS进入【待机】模式 "); //return Task.CompletedTask; } /// /// PCS 进入停止 /// /// private void PCSStopAsync() { PcsStateInfo = PCSState.Stop; PcsStateMsg = "停止"; Console.WriteLine($"时间:{DateTime.Now.ToString()}:PCS进入【停止】模式 "); //return Task.CompletedTask; } /// /// PCS 进入运行 /// /// /// private void PCSStartAsync() { PcsStateInfo = PCSState.Run; PcsStateMsg = "运行"; Console.WriteLine($"时间:{DateTime.Now.ToString()}:PCS进入【运行】模式 "); //return Task.CompletedTask; } private bool[] _PCSStateValue = new bool[3]; /// /// PCS运行状态字数据 ///需要转换数据 /// public bool[] PCSStateValue { get { return _PCSStateValue; } set { if (!value.SequenceEqual(_PCSStateValue)) { if (value[0]) { PcsStateMachine.FireAsync(PCSStateTrigger.StopTrig); } else if (value[1]) { PcsStateMachine.FireAsync(PCSStateTrigger.StandbyTrig); } else if (value[2]) { PcsStateMachine.FireAsync(PCSStateTrigger.RunTrig); } else { PcsStateMachine.FireAsync(PCSStateTrigger.StopTrig); } _PCSStateValue = value; } } } /// /// PCS总故障状态 /// public PcsFaultState PcsSysFaultState { get; set; } private string _PcsSysFaultStateMsg; /// /// PC总S故障状态文本 /// public string PcsSysFaultStateMsg { get { return _PcsSysFaultStateMsg; } set { _PcsSysFaultStateMsg = value; RaisePropertyChanged(); } } private bool _PcsSysFaultStateVaue; /// /// 总故障状态字 /// public bool PcsSysFaultStateVaue { get { return _PcsSysFaultStateVaue; } set { if (value != _PcsSysFaultStateVaue) { if (value) { PcsSysFaultState = PcsFaultState.Fault; PcsSysFaultStateMsg = "故障中"; //产生报警 Console.WriteLine($"datetime:{DateTime.Now.ToString()} PCS 故障产生"); } else { PcsSysFaultState = PcsFaultState.Normal; PcsSysFaultStateMsg = "正常"; //故障消失后,故障复位一下 InPowerPCSDataService.PCSFaultReset(); //报警消失 Console.WriteLine($"datetime:{DateTime.Now.ToString()} PCS 故障消失"); } _PcsSysFaultStateVaue = value; } } } /// /// PCS报警状态 /// public PcsAlarmState PcsSysAlarmState { get; set; } private string _PcsSysAlarmStateMsg = ""; /// /// PCS报警状态文本 /// public string PcsSysAlarmStateMsg { get { return _PcsSysAlarmStateMsg; } set { _PcsSysAlarmStateMsg = value; } } private bool _PcsSysAlarmVaue; /// /// PCS报警状态字 /// public bool PcsSysAlarmVaue { get { return _PcsSysAlarmVaue; } set { if (value != _PcsSysAlarmVaue) { if (value) { PcsSysAlarmState = PcsAlarmState.Alarm; PcsSysAlarmStateMsg = "报警中"; //产生报警 Console.WriteLine($"datetime:{DateTime.Now.ToString()} PCS 报警产生"); } else { PcsSysAlarmState = PcsAlarmState.Normal; PcsSysAlarmStateMsg = "正常"; //报警消失后,报警复位一下 InPowerPCSDataService.PCSFaultReset(); //报警消失 Console.WriteLine($"datetime:{DateTime.Now.ToString()} PCS 报警消失"); } _PcsSysAlarmVaue = value; } } } /// /// PCS并离网状态 /// public PCSOffLineInfo PcsOffLineState; private string _PcsOffLineStateMsg; /// /// PCS并离网状态消息 /// public string PcsOffLineStateMsg { get { return _PcsOffLineStateMsg; } set { _PcsOffLineStateMsg = value; RaisePropertyChanged(); } } private bool _PcsOffLineStateValue; /// /// PCS并离网故障状态值 /// public bool PcsOffLineStateValue { get { return _PcsOffLineStateValue; } set { if (value != _PcsOffLineStateValue) { if (value) { PcsOffLineState = PCSOffLineInfo.OffLine; PcsOffLineStateMsg = "并网"; //产生报警 Console.WriteLine($"时间:{DateTime.Now.ToString()} PCS 并网状态"); } else { PcsOffLineState = PCSOffLineInfo.OnLine; PcsOffLineStateMsg = "离网"; //报警消失 Console.WriteLine($"时间:{DateTime.Now.ToString()} PCS 离网状态"); } _PcsOffLineStateValue = value; } } } /// /// PCS远程本地状态cs /// public PcsRemoteLocation PcsRemoteLocationState; private string _PcsRemoteLocationStateMsg; /// /// PCS远程本地状态消息 /// public string PcsRemoteLocationStateMsg { get { return _PcsRemoteLocationStateMsg; } set { _PcsRemoteLocationStateMsg = value; RaisePropertyChanged(); } } private bool _PcsRemoteLocationStateValue; /// /// PCS远程本地状态值 /// public bool PcsRemoteLocationStateValue { get { return _PcsRemoteLocationStateValue; } set { //if (value != _PCSRemoteLocationValue) //{ if (value) { PcsRemoteLocationState = PcsRemoteLocation.Remote; PcsRemoteLocationStateMsg = "远程"; //产生报警 //Console.WriteLine($"datetime:{DateTime.Now.ToString()} PCS 远程"); } else { PcsRemoteLocationState = PcsRemoteLocation.Location; PcsRemoteLocationStateMsg = "本地"; //报警消失 //Console.WriteLine($"datetime:{DateTime.Now.ToString()} PCS 本地"); } _PcsRemoteLocationStateValue = value; //} } } #endregion #region 上位机连接状态 private ushort _LinkBitValue=3; /// /// PCS上位机连接的结果值 /// public ushort LinkBitValue { get { return _LinkBitValue; } set { if (value != _LinkBitValue)//连接状态值改变 { switch (value) { case 1: if (CurIPCLinkStateMachine.State!=LinkState.LinkOK) { CurIPCLinkStateMachine.Fire(LinkStateTrig.LinkOKTrig); } break; case 2: if (CurIPCLinkStateMachine.State != LinkState.LinkNG) { CurIPCLinkStateMachine.Fire(LinkStateTrig.LinkNGTrig); } break; default: break; } _LinkBitValue = value; } } } public InPowerPCSDataService InPowerPCSDataService { get; } /// /// IPC连接NG的执行方法 /// /// private void IPCLinkNG() { LinkStateMsg = "失败"; PcsLinkState = LinkState.LinkNG; Console.WriteLine($"DateTime:{DateTime.Now.ToString()}-【PCS状态模块】-【PCS上位机连接失败】"); } /// /// IPC连接成功的执行方法 /// private void IPCLinkOK() { LinkStateMsg = "正常"; PcsLinkState = LinkState.LinkOK; Console.WriteLine($"DateTime:{DateTime.Now.ToString()}-【PCS状态模块】-【PCS上位机连接成功】"); } #endregion } }