|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using System.Timers;
|
|
|
|
|
namespace Mesnac.Basic
|
|
|
|
|
{
|
|
|
|
|
[Serializable]
|
|
|
|
|
public class Variable
|
|
|
|
|
{
|
|
|
|
|
#region 定义委托
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public delegate void RefreshControlValue(Variable sender);
|
|
|
|
|
public event RefreshControlValue Refresh;
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region value define
|
|
|
|
|
|
|
|
|
|
private string mName;
|
|
|
|
|
private string mAddr;
|
|
|
|
|
|
|
|
|
|
private string mDescription;
|
|
|
|
|
|
|
|
|
|
private object mValue;
|
|
|
|
|
private object mOldValue;
|
|
|
|
|
private string mDevice;
|
|
|
|
|
private TypeCode mValuetype;
|
|
|
|
|
|
|
|
|
|
private float mStep;
|
|
|
|
|
private string mVarway;
|
|
|
|
|
|
|
|
|
|
private string mDateStamp;
|
|
|
|
|
|
|
|
|
|
private float mMinvalue;
|
|
|
|
|
private float mMaxvalue;
|
|
|
|
|
private uint mTime;
|
|
|
|
|
private uint counter;
|
|
|
|
|
private bool bUse;
|
|
|
|
|
private string _sExpress1;
|
|
|
|
|
private string _sExpress2;
|
|
|
|
|
private string _sType;
|
|
|
|
|
private bool _isRun = false; //是否运行
|
|
|
|
|
|
|
|
|
|
[NonSerialized]
|
|
|
|
|
private System.Timers.Timer mTimer;
|
|
|
|
|
#endregion
|
|
|
|
|
public string sExpress1
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return _sExpress1;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
_sExpress1 = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string sExpress2
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return _sExpress2;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
_sExpress2 = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public string sType
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return _sType;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
_sType = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
private string _sVbs;
|
|
|
|
|
public string sVbs
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return _sVbs;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
_sVbs = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public Variable()
|
|
|
|
|
{
|
|
|
|
|
Name = "";
|
|
|
|
|
Addr = "";
|
|
|
|
|
Description = "";
|
|
|
|
|
Device = "";
|
|
|
|
|
Varway = "";
|
|
|
|
|
Value = 0;
|
|
|
|
|
OldValue = 0;
|
|
|
|
|
Valuetype = TypeCode.Empty;
|
|
|
|
|
nCounter = 0;
|
|
|
|
|
MTime = 0;
|
|
|
|
|
_sExpress1 = "";
|
|
|
|
|
_sExpress2 = "";
|
|
|
|
|
_sType = "";
|
|
|
|
|
mbUse = false;
|
|
|
|
|
_sVbs = "";
|
|
|
|
|
}
|
|
|
|
|
public bool mbUse
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return bUse;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
bUse = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public void Stop()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
this.mTimer.Stop();
|
|
|
|
|
this._isRun = false;
|
|
|
|
|
this.mTimer.Elapsed -= new ElapsedEventHandler(mTimer_Elapsed);
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public void Start(uint ntime)
|
|
|
|
|
{
|
|
|
|
|
if (this._isRun)
|
|
|
|
|
{
|
|
|
|
|
this.Stop();
|
|
|
|
|
}
|
|
|
|
|
this.mTimer = new System.Timers.Timer();
|
|
|
|
|
if (ntime < 10)
|
|
|
|
|
ntime = 10;
|
|
|
|
|
this.mTimer.Interval = ntime;
|
|
|
|
|
this.mTimer.Elapsed += new ElapsedEventHandler(mTimer_Elapsed);
|
|
|
|
|
this.mTimer.Start();
|
|
|
|
|
this._isRun = true;
|
|
|
|
|
}
|
|
|
|
|
//public event EventHandler<EventArgs> OnVirDataChanged;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void mTimer_Elapsed(object sender, ElapsedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
GenerateVarValue();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void GenerateVarValue()
|
|
|
|
|
{
|
|
|
|
|
//Monitor.Enter(this);
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
DateTime dt = new DateTime();
|
|
|
|
|
dt = DateTime.Now;
|
|
|
|
|
DateStamp = dt.ToString();
|
|
|
|
|
switch (Varway)
|
|
|
|
|
{
|
|
|
|
|
case "循环变化":
|
|
|
|
|
if (!mbUse)
|
|
|
|
|
{
|
|
|
|
|
Value = Minvalue;
|
|
|
|
|
mbUse = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Value = Convert.ToSingle(Value) + Step;
|
|
|
|
|
if (Convert.ToSingle(Value) >= Maxvalue)
|
|
|
|
|
{
|
|
|
|
|
Value = Maxvalue;
|
|
|
|
|
mbUse = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case "正向一周":
|
|
|
|
|
Valuetype = TypeCode.Single;
|
|
|
|
|
if (!mbUse)
|
|
|
|
|
{
|
|
|
|
|
Value = Minvalue;
|
|
|
|
|
mbUse = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Value = Convert.ToSingle(Value) + Step;
|
|
|
|
|
if (Convert.ToSingle(Value) >= Maxvalue)
|
|
|
|
|
{
|
|
|
|
|
Value = Maxvalue;
|
|
|
|
|
//mbUse = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case "BOOL变化":
|
|
|
|
|
if (!mbUse)
|
|
|
|
|
{
|
|
|
|
|
Value = 0;
|
|
|
|
|
mbUse = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Value = 1;
|
|
|
|
|
mbUse = false;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case "X^2变化":
|
|
|
|
|
Valuetype = TypeCode.Single;
|
|
|
|
|
if (!mbUse)
|
|
|
|
|
{
|
|
|
|
|
mOldValue = Minvalue;
|
|
|
|
|
mbUse = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
mOldValue = Convert.ToSingle(mOldValue) + Step;
|
|
|
|
|
Value = Convert.ToSingle(mOldValue) * Convert.ToSingle(mOldValue);
|
|
|
|
|
if (Convert.ToSingle(mOldValue) >= Maxvalue)
|
|
|
|
|
{
|
|
|
|
|
mOldValue = Maxvalue;
|
|
|
|
|
mbUse = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case "SIN变化":
|
|
|
|
|
Valuetype = TypeCode.Single;
|
|
|
|
|
if (!mbUse)
|
|
|
|
|
{
|
|
|
|
|
mOldValue = Minvalue;
|
|
|
|
|
mbUse = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
mOldValue = Convert.ToSingle(mOldValue) + Step;
|
|
|
|
|
Value = Math.Sin(Convert.ToSingle(mOldValue));
|
|
|
|
|
if (Convert.ToSingle(mOldValue) >= Maxvalue)
|
|
|
|
|
{
|
|
|
|
|
mOldValue = Maxvalue;
|
|
|
|
|
mbUse = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case "随机变化":
|
|
|
|
|
Random d = new Random();
|
|
|
|
|
Value = d.Next(Convert.ToInt32(Maxvalue));
|
|
|
|
|
Valuetype = TypeCode.UInt32;
|
|
|
|
|
break;
|
|
|
|
|
case "中间变量":
|
|
|
|
|
Valuetype = TypeCode.Single;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//激活时间
|
|
|
|
|
if (Refresh != null)
|
|
|
|
|
{
|
|
|
|
|
Refresh(this);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
//Monitor.Exit(this);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public uint nCounter
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return counter;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
counter = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public uint MTime
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return mTime;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
mTime = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public string Name
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this.mName;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
this.mName = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public string Addr
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this.mAddr;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
this.mAddr = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string Description
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this.mDescription;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
this.mDescription = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public object Value
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this.mValue;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
this.mValue = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public object OldValue
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this.mOldValue;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
this.mOldValue = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public string Device
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this.mDevice;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
this.mDevice = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public TypeCode Valuetype
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this.mValuetype;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
this.mValuetype = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public float Step
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this.mStep;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
this.mStep = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public string Varway
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this.mVarway;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
this.mVarway = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string DateStamp
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this.mDateStamp;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
this.mDateStamp = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public float Minvalue
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this.mMinvalue;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
this.mMinvalue = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public float Maxvalue
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this.mMaxvalue;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
this.mMaxvalue = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 虚拟设备是否处于运行状态
|
|
|
|
|
/// </summary>
|
|
|
|
|
public bool IsRun
|
|
|
|
|
{
|
|
|
|
|
get { return this._isRun; }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|