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
}
}