#region copyright //------------------------------------------------------------------------------ // 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充 // 此代码版权(除特别声明外的代码)归作者本人Diego所有 // 源代码使用协议遵循本仓库的开源协议及附加协议 // Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway // Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway // 使用文档:https://diego2098.gitee.io/thingsgateway-docs/ // QQ群:605534569 //------------------------------------------------------------------------------ #endregion using Mapster; using System.ComponentModel; using ThingsGateway.Application.Extensions; using ThingsGateway.Foundation; namespace ThingsGateway.Application; /// /// 变量运行状态表示 /// public class DeviceVariableRunTime : DeviceVariable { /// /// 设备名称 /// [Description("设备名称")] [DataTable(Order = 2, IsShow = true, Sortable = true)] public string DeviceName { get; set; } /// /// 运行态数据类型 /// [Description("数据类型")] public Type DataType { get { if (Value != null && DataTypeEnum == DataTypeEnum.Object) { return Value?.GetType(); } else { return DataTypeEnum.GetSystemType(); } } } /// /// 所在采集设备 /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] [Description("采集设备")] public CollectDeviceRunTime CollectDeviceRunTime { get; set; } /// /// 原始值 /// [Description("原始值")] [DataTable(Order = 3, IsShow = true, Sortable = false, CellClass = " table-text-truncate ")] public object RawValue { get; private set; } private object _value; /// /// 实时值 /// [Description("实时值")] [DataTable(Order = 3, IsShow = true, Sortable = false, CellClass = " table-text-truncate ")] public object Value { get => _value; private set => _value = value; } /// /// 最近一次值 /// [Description("最近一次值")] [DataTable(Order = 3, IsShow = true, Sortable = false, CellClass = " table-text-truncate ")] public object LastSetValue { get; private set; } /// /// 设置变量值与时间,设置为null时只更改质量戳状态 /// /// /// public OperResult SetValue(object value, DateTime dateTime = default) { try { if (value != null) { IsOnline = true; } else { IsOnline = false; RawValue = value; Set(value); return OperResult.CreateSuccessResult(); } RawValue = value; if (!string.IsNullOrEmpty(ReadExpressions)) { object data = null; try { data = ReadExpressions.GetExpressionsResult(RawValue); Set(data); } catch (Exception ex) { Set(null); return new(Name + " 转换表达式失败:" + ex.Message); } } else { Set(value); } return OperResult.CreateSuccessResult(); } catch (Exception ex) { return new(ex); } void Set(object data) { DateTime time; if (dateTime == default) { time = SysDateTimeExtensions.CurrentDateTime; } else { time = dateTime; } CollectTime = time; { if ((data?.ToString() != _value?.ToString() && LastSetValue?.ToString() != data?.ToString()) || isOnlineChanged) { ChangeTime = time; if (IsOnline) { _value = data; } LastSetValue = data; VariableValueChange?.Invoke(this); } } VariableCollectChange?.Invoke(this); } } /// /// 变化时间 /// [Description("变化时间")] [DataTable(Order = 2, IsShow = true, Sortable = true)] public DateTime ChangeTime { get; private set; } /// /// 采集时间 /// [Description("采集时间")] [DataTable(Order = 2, IsShow = true, Sortable = true)] public DateTime CollectTime { get; private set; } /// /// 谨慎使用,务必采用队列等方式 /// internal event VariableChangeEventHandler VariableCollectChange; /// /// 谨慎使用,务必采用队列等方式 /// public event VariableChangeEventHandler VariableValueChange; private bool isOnline; private bool isOnlineChanged; /// /// 是否在线 /// [Description("是否在线")] [DataTable(Order = 2, IsShow = true, Sortable = true)] public bool IsOnline { get { return isOnline; } private set { if (IsOnline != value) { isOnlineChanged = true; } else { isOnlineChanged = false; } isOnline = value; } } #region LoadSourceRead /// /// 返回字节组中的索引位置 /// 这个参数值由自动打包方法写入 /// [Description("打包索引")] [DataTable(Order = 6, IsShow = true, Sortable = true)] public int Index { get; set; } /// /// 这个参数值由自动打包方法写入 /// [Newtonsoft.Json.JsonIgnore] [System.Text.Json.Serialization.JsonIgnore] [AdaptIgnore] public IThingsGatewayBitConverter ThingsGatewayBitConverter { get; set; } #endregion #region 报警 /// /// 报警使能 /// public bool AlarmEnable { get { return LAlarmEnable || LLAlarmEnable || HAlarmEnable || HHAlarmEnable || BoolOpenAlarmEnable || BoolCloseAlarmEnable; } } /// /// 报警时间 /// public DateTime AlarmTime { get; set; } /// /// 事件时间 /// public DateTime EventTime { get; set; } /// /// 报警类型 /// public AlarmEnum AlarmTypeEnum { get; set; } = AlarmEnum.None; /// /// 事件类型 /// public EventEnum EventTypeEnum { get; set; } = EventEnum.None; /// /// 报警值 /// public string AlarmCode { get; set; } /// /// 报警限值 /// public string AlarmLimit { get; set; } /// /// 报警文本 /// public string AlarmText { get; set; } #endregion } /// /// 变量变化委托 /// public delegate void VariableChangeEventHandler(DeviceVariableRunTime collectVariableRunTime);