#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);