提交 2b3d6b81 编写于 作者: cdy816's avatar cdy816

Bug 修改

上级 42dd0285
......@@ -1478,7 +1478,7 @@ namespace Cdy.Tag
/// <param name="memory"></param>
public static void MakeMemoryBusy(this FixedMemoryBlock memory)
{
LoggerService.Service.Info("FixedMemoryBlock", memory.Name + " is busy.....");
//LoggerService.Service.Info("FixedMemoryBlock", memory.Name + " is busy.....");
memory.IncRef();
//memory.StartMemory[0] = 1;
}
......@@ -1489,7 +1489,7 @@ namespace Cdy.Tag
/// <param name="memory"></param>
public static void MakeMemoryNoBusy(this FixedMemoryBlock memory)
{
LoggerService.Service.Info("FixedMemoryBlock", memory.Name+ " is ready !");
//LoggerService.Service.Info("FixedMemoryBlock", memory.Name+ " is ready !");
memory.DecRef();
//memory.StartMemory[0] = 0;
}
......
......@@ -1512,7 +1512,7 @@ namespace Cdy.Tag
public static void MakeMemoryBusy(this MarshalFixedMemoryBlock memory)
{
memory.IncRef();
LoggerService.Service.Info("MemoryBlock","make "+ memory.Name + " is busy.....");
//LoggerService.Service.Info("MemoryBlock","make "+ memory.Name + " is busy.....");
//memory.IsBusy = true;
//memory.StartMemory[0] = 1;
......@@ -1525,7 +1525,7 @@ namespace Cdy.Tag
public static void MakeMemoryNoBusy(this MarshalFixedMemoryBlock memory)
{
memory.DecRef();
LoggerService.Service.Info("MemoryBlock", "make " + memory.Name+ " is ready !");
//LoggerService.Service.Info("MemoryBlock", "make " + memory.Name+ " is ready !");
//memory.StartMemory[0] = 0;
}
......
......@@ -382,6 +382,12 @@ namespace Cdy.Tag
if (mIsDisposed) break;
Marshal.Copy(zoreData, 0, vv + i * zoreData.Length, zoreData.Length);
}
if(BufferItemSize % zoreData.Length >0)
{
Marshal.Copy(zoreData, 0, vv + (BufferItemSize > zoreData.Length ? BufferItemSize - zoreData.Length : 0), BufferItemSize > zoreData.Length ? zoreData.Length : BufferItemSize);
}
}
}
catch
......@@ -2490,7 +2496,7 @@ namespace Cdy.Tag
public static void MakeMemoryBusy(this MarshalMemoryBlock memory)
{
memory.IncRef();
LoggerService.Service.Info("MemoryBlock","make "+ memory.Name + " is busy.....");
//LoggerService.Service.Info("MemoryBlock","make "+ memory.Name + " is busy.....");
//memory.IsBusy = true;
//memory.StartMemory[0] = 1;
......@@ -2503,7 +2509,7 @@ namespace Cdy.Tag
public static void MakeMemoryNoBusy(this MarshalMemoryBlock memory)
{
memory.DecRef();
LoggerService.Service.Info("MemoryBlock", "make " + memory.Name+ " is ready !");
//LoggerService.Service.Info("MemoryBlock", "make " + memory.Name+ " is ready !");
//memory.StartMemory[0] = 0;
}
......
......@@ -1797,7 +1797,7 @@ namespace Cdy.Tag
/// <param name="memory"></param>
public static void MakeMemoryBusy(this MemoryBlock memory)
{
LoggerService.Service.Info("MemoryBlock", memory.Name + " is busy.....");
//LoggerService.Service.Info("MemoryBlock", memory.Name + " is busy.....");
memory.IsBusy = true;
//memory.StartMemory[0] = 1;
}
......@@ -1808,7 +1808,7 @@ namespace Cdy.Tag
/// <param name="memory"></param>
public static void MakeMemoryNoBusy(this MemoryBlock memory)
{
LoggerService.Service.Info("MemoryBlock", memory.Name+ " is ready !");
//LoggerService.Service.Info("MemoryBlock", memory.Name+ " is ready !");
memory.IsBusy = false;
//memory.StartMemory[0] = 0;
}
......
......@@ -99,7 +99,13 @@ namespace Cdy.Tag.Driver
/// <returns></returns>
bool SetTagValue(Tagbase tag, object value, DateTime time, byte quality);
/// <summary>
///
/// </summary>
/// <param name="tag"></param>
/// <param name="value"></param>
/// <param name="quality"></param>
/// <returns></returns>
bool SetTagValue(Tagbase tag, object value, byte quality);
/// <summary>
......
......@@ -36,6 +36,19 @@ namespace Cdy.Tag.Driver
#region ... Methods ...
/// <summary>
/// 获取手工记录的变量的Id
/// </summary>
/// <returns></returns>
List<int> GetManualRecordTagId();
/// <summary>
/// 获取变量的记录类型
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Dictionary<int, RecordType> GetTagRecordType(List<int> id);
/// <summary>
/// 设置变量的历史值
/// </summary>
......@@ -55,6 +68,26 @@ namespace Cdy.Tag.Driver
/// <returns></returns>
bool SetTagHisValue(int id, TagValue value, int timeUnit);
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <param name="time"></param>
/// <param name="value"></param>
/// <param name="quality"></param>
/// <param name="timeUnit"></param>
/// <returns></returns>
bool SetTagHisValue(int id, DateTime time, object value, byte quality, int timeUnit);
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <param name="value"></param>
/// <param name="timeUnit"></param>
/// <returns></returns>
bool SetTagHisValue(int id, object value, int timeUnit);
/// <summary>
/// 设置变量的历史值
/// </summary>
......@@ -64,6 +97,12 @@ namespace Cdy.Tag.Driver
bool SetTagHisValues(Dictionary<int, List<TagValue>> values, int timeUnit);
/// <summary>
///
/// </summary>
/// <param name="values"></param>
/// <param name="timeUnit"></param>
/// <returns></returns>
bool SetTagHisValues(Dictionary<int, TagValue> values, int timeUnit);
/// <summary>
......
......@@ -5,6 +5,7 @@ using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
namespace SimDriver
......@@ -14,7 +15,9 @@ namespace SimDriver
#region ... Variables ...
System.Collections.Generic.Dictionary<string, List<Tagbase>> mTagIdCach = new Dictionary<string, List<Tagbase>>();
Dictionary<string, List<Tagbase>> mTagIdCach = new Dictionary<string, List<Tagbase>>();
Dictionary<string, List<int>> mManualRecordTagCach = new Dictionary<string, List<int>>();
//private System.Timers.Timer mScanTimer;
......@@ -102,6 +105,14 @@ namespace SimDriver
private void InitTagCach(IRealTagProduct tagQuery)
{
mTagIdCach = tagQuery.GetTagsByLinkAddress(new List<string>() { "Sim:cos", "Sim:sin", "Sim:step", "Sim:steppoint", "Sim:square" });
mTagHisValueService = ServiceLocator.Locator.Resolve<ITagHisValueProduct>();
foreach (var vv in mTagIdCach)
{
mManualRecordTagCach.Add(vv.Key, mTagHisValueService.GetTagRecordType(vv.Value.Select(e => e.Id).ToList()).Where(e=>e.Value == RecordType.Manual).Select(e=>e.Key).ToList());
}
}
/// <summary>
......@@ -184,6 +195,41 @@ namespace SimDriver
});
mTagService.SubmiteNotifyChanged();
long llsw = sw.ElapsedMilliseconds;
System.Threading.Tasks.Parallel.ForEach(mManualRecordTagCach, (vv) => {
if (vv.Key == "Sim:cos")
{
TagValue tv = new TagValue() { Quality = 0, Time = DateTime.Now, Value = fval };
mTagHisValueService.SetTagHisValues(vv.Value.ToDictionary(e => e, e => tv), 1000);
}
else if (vv.Key == "Sim:sin")
{
TagValue tv = new TagValue() { Quality = 0, Time = DateTime.Now, Value = sval };
mTagHisValueService.SetTagHisValues(vv.Value.ToDictionary(e => e, e => tv), 1000);
//mTagService.SetTagValue(vv.Value, sval);
}
else if (vv.Key == "Sim:step")
{
TagValue tv = new TagValue() { Quality = 0, Time = DateTime.Now, Value = mNumber };
mTagHisValueService.SetTagHisValues(vv.Value.ToDictionary(e => e, e => tv), 1000);
//mTagService.SetTagValue(vv.Value, mNumber);
}
else if (vv.Key == "Sim:steppoint")
{
TagValue tv = new TagValue() { Quality = 0, Time = DateTime.Now, Value = fval };
mTagHisValueService.SetTagHisValues(vv.Value.ToDictionary(e => e, e => tv), 1000);
// mTagService.SetPointValue(vv.Value, mNumber, mNumber, mNumber);
}
else if (vv.Key == "Sim:square")
{
TagValue tv = new TagValue() { Quality = 0, Time = DateTime.Now, Value = mBoolNumber };
mTagHisValueService.SetTagHisValues(vv.Value.ToDictionary(e => e, e => tv), 1000);
//mTagService.SetTagValue(vv.Value, mBoolNumber);
}
});
int delay = (int)(500 - (DateTime.Now - mLastProcessTime).TotalMilliseconds);
if(delay < 0)
{
......@@ -192,7 +238,7 @@ namespace SimDriver
#if DEBUG
sw.Stop();
if (mNumber%10 == 0)
LoggerService.Service.Debug("Sim Driver", "set value elapsed:" + sw.ElapsedMilliseconds);
LoggerService.Service.Debug("Sim Driver", "set value elapsed:" + sw.ElapsedMilliseconds+", set his value elapsed:"+(sw.ElapsedMilliseconds-llsw));
#endif
Thread.Sleep(delay);
}
......
......@@ -2,7 +2,7 @@
"profiles": {
"DBInRun": {
"commandName": "Executable",
"executablePath": "C:\\Users\\cdy81\\source\\repos\\mars\\Output\\DBInRun.exe"
"executablePath": "C:\\Users\\chongdaoyang\\source\\repos\\mars\\Output\\DBInRun.exe"
}
}
}
\ No newline at end of file
......@@ -168,7 +168,7 @@ namespace Cdy.Tag
vpp = mMemoryCach.Dequeue();
}
Compress(vpp);
Thread.Sleep(1);
//Thread.Sleep(1);
}
mIsRunning = false;
}
......@@ -389,7 +389,7 @@ namespace Cdy.Tag
int datasize = 0;
var targetPosition = 28;
block.WriteInt(0,data.Id);
block.WriteDatetime(4, data.Time); //时间
block.WriteDatetime(12, data.EndTime); //结束时间
//block.WriteInt(20, 0); //写入数据大小
......
......@@ -68,7 +68,7 @@ namespace Cdy.Tag
{
target.WriteDatetime(targetAddr, this.StartTime);
LoggerService.Service.Debug("LosslessCompressUnit2", "Record time: "+this.StartTime.ToString("yyyy-MM-dd HH:mm:ss.fff"));
//LoggerService.Service.Debug("LosslessCompressUnit2", "Record time: "+this.StartTime.ToString("yyyy-MM-dd HH:mm:ss.fff"));
target.Write(TimeTick);
switch (TagType)
......
......@@ -1385,14 +1385,17 @@ namespace Cdy.Tag
if (mHisTags.ContainsKey(id) && mHisTags[id].Type == RecordType.Manual)
{
if (mManualHisDataCach.ContainsKey(id))
lock (mManualHisDataCach)
{
datacach = mManualHisDataCach[id];
}
else
{
datacach = new SortedDictionary<DateTime, ManualHisDataMemoryBlock>();
mManualHisDataCach.Add(id, datacach);
if (mManualHisDataCach.ContainsKey(id))
{
datacach = mManualHisDataCach[id];
}
else
{
datacach = new SortedDictionary<DateTime, ManualHisDataMemoryBlock>();
mManualHisDataCach.Add(id, datacach);
}
}
var tag = mHisTags[id];
......@@ -1558,6 +1561,187 @@ namespace Cdy.Tag
/// <param name="timeUnit"></param>
/// <returns></returns>
private bool ManualRecordHisValues(long id, Cdy.Tag.TagValue value, int timeUnit = 100)
{
return ManualRecordHisValues(id, value.Time, value.Value, value.Quality, timeUnit);
//if (mIsClosed) return false;
//int valueOffset, qulityOffset = 0;
//DateTime mLastTime = DateTime.MinValue;
//SortedDictionary<DateTime, ManualHisDataMemoryBlock> datacach;
//if (mHisTags.ContainsKey(id) && mHisTags[id].Type == RecordType.Manual)
//{
// if (mManualHisDataCach.ContainsKey(id))
// {
// datacach = mManualHisDataCach[id];
// }
// else
// {
// datacach = new SortedDictionary<DateTime, ManualHisDataMemoryBlock>();
// mManualHisDataCach.Add(id, datacach);
// }
// var tag = mHisTags[id];
// ManualHisDataMemoryBlock hb = null;
// var vdata = value.Time.Date;
// var mms = (int)(value.Time.Subtract(vdata).TotalSeconds / MergeMemoryTime);
// var time = vdata.AddSeconds(mms * MergeMemoryTime);
// if (datacach.ContainsKey(time))
// {
// hb = datacach[time];
// }
// else
// {
// var css = CalCachDatablockSize(tag.TagType, 0, MergeMemoryTime * 1000 / timeUnit, out valueOffset, out qulityOffset);
// hb = ManualHisDataMemoryBlockPool.Pool.Get(css);
// hb.Time = time;
// hb.MaxCount = MergeMemoryTime * 1000 / timeUnit;
// hb.TimeUnit = timeUnit;
// hb.TimeLen = 4;
// hb.TimerAddress = 0;
// hb.ValueAddress = valueOffset;
// hb.QualityAddress = qulityOffset;
// hb.Id = (int)id;
// hb.CurrentCount = 0;
// datacach.Add(time, hb);
// }
// mLastTime = time;
// if (hb.CurrentCount < hb.MaxCount && value.Time > hb.EndTime)
// {
// hb.Lock();
// var vtime = (int)((value.Time - hb.Time).TotalMilliseconds / timeUnit);
// //写入时间戳
// hb.WriteInt(hb.TimerAddress + hb.CurrentCount * 4, vtime);
// switch (tag.TagType)
// {
// case TagType.Bool:
// hb.WriteByteDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToByte(Convert.ToBoolean(value.Value)));
// break;
// case TagType.Byte:
// hb.WriteByteDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToByte(value.Value));
// break;
// case TagType.Short:
// hb.WriteShortDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToInt16(value.Value));
// break;
// case TagType.UShort:
// hb.WriteUShortDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToUInt16(value.Value));
// break;
// case TagType.Int:
// hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToInt32(value.Value));
// break;
// case TagType.UInt:
// hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToUInt32(value.Value));
// break;
// case TagType.Long:
// hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToInt64(value.Value));
// break;
// case TagType.ULong:
// hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToUInt64(value.Value));
// break;
// case TagType.Float:
// hb.WriteFloatDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToSingle(value.Value));
// break;
// case TagType.Double:
// hb.WriteDoubleDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToDouble(value.Value));
// break;
// case TagType.String:
// hb.WriteStringDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToString(value.Value), Encoding.Unicode);
// break;
// case TagType.DateTime:
// hb.WriteDatetime(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToDateTime(value.Value));
// break;
// case TagType.UIntPoint:
// UIntPointData data = (UIntPointData)value.Value;
// hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, data.X);
// hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 4, data.Y);
// break;
// case TagType.IntPoint:
// IntPointData idata = (IntPointData)value.Value;
// hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, idata.X);
// hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 4, idata.Y);
// break;
// case TagType.UIntPoint3:
// UIntPoint3Data udata3 = (UIntPoint3Data)value.Value;
// hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, udata3.X);
// hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 4, udata3.Y);
// hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 8, udata3.Z);
// break;
// case TagType.IntPoint3:
// IntPoint3Data idata3 = (IntPoint3Data)value.Value;
// hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, idata3.X);
// hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 4, idata3.Y);
// hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 8, idata3.Z);
// break;
// case TagType.ULongPoint:
// ULongPointData udata = (ULongPointData)value.Value;
// hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, udata.X);
// hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 8, udata.Y);
// break;
// case TagType.LongPoint:
// LongPointData lidata = (LongPointData)value.Value;
// hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, lidata.X);
// hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 8, lidata.Y);
// break;
// case TagType.ULongPoint3:
// ULongPoint3Data ludata3 = (ULongPoint3Data)value.Value;
// hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, ludata3.X);
// hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 16, ludata3.Y);
// hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 24, ludata3.Z);
// break;
// case TagType.LongPoint3:
// LongPoint3Data lidata3 = (LongPoint3Data)value.Value;
// hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, lidata3.X);
// hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 16, lidata3.Y);
// hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 24, lidata3.Z);
// break;
// }
// hb.WriteInt(hb.QualityAddress + hb.CurrentCount, value.Quality);
// hb.EndTime = value.Time;
// hb.CurrentCount++;
// hb.Relase();
// HisDataMemoryQueryService.Service.RegistorManual(id, hb.Time, hb.EndTime, hb);
// }
// bool isNeedSubmite = false;
// foreach (var vv in datacach.ToArray())
// {
// if (vv.Key < mLastTime || vv.Value.CurrentCount >= vv.Value.MaxCount)
// {
// ServiceLocator.Locator.Resolve<IDataCompress2>().RequestManualToCompress(vv.Value);
// datacach.Remove(vv.Key);
// isNeedSubmite = true;
// }
// }
// if (isNeedSubmite)
// ServiceLocator.Locator.Resolve<IDataCompress2>().SubmitManualToCompress();
// return true;
//}
//else
//{
// return false;
//}
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <param name="datetime"></param>
/// <param name="value"></param>
/// <param name="quality"></param>
/// <param name="timeUnit"></param>
/// <returns></returns>
private bool ManualRecordHisValues(long id,DateTime datetime ,object value,byte quality=0, int timeUnit = 100)
{
if (mIsClosed) return false;
......@@ -1569,21 +1753,24 @@ namespace Cdy.Tag
if (mHisTags.ContainsKey(id) && mHisTags[id].Type == RecordType.Manual)
{
if (mManualHisDataCach.ContainsKey(id))
{
datacach = mManualHisDataCach[id];
}
else
lock (mManualHisDataCach)
{
datacach = new SortedDictionary<DateTime, ManualHisDataMemoryBlock>();
mManualHisDataCach.Add(id, datacach);
if (mManualHisDataCach.ContainsKey(id))
{
datacach = mManualHisDataCach[id];
}
else
{
datacach = new SortedDictionary<DateTime, ManualHisDataMemoryBlock>();
mManualHisDataCach.Add(id, datacach);
}
}
var tag = mHisTags[id];
ManualHisDataMemoryBlock hb = null;
var vdata = value.Time.Date;
var mms = (int)(value.Time.Subtract(vdata).TotalSeconds / MergeMemoryTime);
var vdata = datetime.Date;
var mms = (int)(datetime.Subtract(vdata).TotalSeconds / MergeMemoryTime);
var time = vdata.AddSeconds(mms * MergeMemoryTime);
if (datacach.ContainsKey(time))
{
......@@ -1607,98 +1794,98 @@ namespace Cdy.Tag
}
mLastTime = time;
if (hb.CurrentCount < hb.MaxCount && value.Time > hb.EndTime)
if (hb.CurrentCount < hb.MaxCount && datetime > hb.EndTime)
{
hb.Lock();
var vtime = (int)((value.Time - hb.Time).TotalMilliseconds / timeUnit);
var vtime = (int)((datetime - hb.Time).TotalMilliseconds / timeUnit);
//写入时间戳
hb.WriteInt(hb.TimerAddress + hb.CurrentCount * 4, vtime);
switch (tag.TagType)
{
case TagType.Bool:
hb.WriteByteDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToByte(Convert.ToBoolean(value.Value)));
hb.WriteByteDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToByte(Convert.ToBoolean(value)));
break;
case TagType.Byte:
hb.WriteByteDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToByte(value.Value));
hb.WriteByteDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToByte(value));
break;
case TagType.Short:
hb.WriteShortDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToInt16(value.Value));
hb.WriteShortDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToInt16(value));
break;
case TagType.UShort:
hb.WriteUShortDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToUInt16(value.Value));
hb.WriteUShortDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToUInt16(value));
break;
case TagType.Int:
hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToInt32(value.Value));
hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToInt32(value));
break;
case TagType.UInt:
hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToUInt32(value.Value));
hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToUInt32(value));
break;
case TagType.Long:
hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToInt64(value.Value));
hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToInt64(value));
break;
case TagType.ULong:
hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToUInt64(value.Value));
hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToUInt64(value));
break;
case TagType.Float:
hb.WriteFloatDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToSingle(value.Value));
hb.WriteFloatDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToSingle(value));
break;
case TagType.Double:
hb.WriteDoubleDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToDouble(value.Value));
hb.WriteDoubleDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToDouble(value));
break;
case TagType.String:
hb.WriteStringDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToString(value.Value), Encoding.Unicode);
hb.WriteStringDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToString(value), Encoding.Unicode);
break;
case TagType.DateTime:
hb.WriteDatetime(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToDateTime(value.Value));
hb.WriteDatetime(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, Convert.ToDateTime(value));
break;
case TagType.UIntPoint:
UIntPointData data = (UIntPointData)value.Value;
UIntPointData data = (UIntPointData)value;
hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, data.X);
hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 4, data.Y);
break;
case TagType.IntPoint:
IntPointData idata = (IntPointData)value.Value;
IntPointData idata = (IntPointData)value;
hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, idata.X);
hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 4, idata.Y);
break;
case TagType.UIntPoint3:
UIntPoint3Data udata3 = (UIntPoint3Data)value.Value;
UIntPoint3Data udata3 = (UIntPoint3Data)value;
hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, udata3.X);
hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 4, udata3.Y);
hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 8, udata3.Z);
break;
case TagType.IntPoint3:
IntPoint3Data idata3 = (IntPoint3Data)value.Value;
IntPoint3Data idata3 = (IntPoint3Data)value;
hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, idata3.X);
hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 4, idata3.Y);
hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 8, idata3.Z);
break;
case TagType.ULongPoint:
ULongPointData udata = (ULongPointData)value.Value;
ULongPointData udata = (ULongPointData)value;
hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, udata.X);
hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 8, udata.Y);
break;
case TagType.LongPoint:
LongPointData lidata = (LongPointData)value.Value;
LongPointData lidata = (LongPointData)value;
hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, lidata.X);
hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 8, lidata.Y);
break;
case TagType.ULongPoint3:
ULongPoint3Data ludata3 = (ULongPoint3Data)value.Value;
ULongPoint3Data ludata3 = (ULongPoint3Data)value;
hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, ludata3.X);
hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 16, ludata3.Y);
hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 24, ludata3.Z);
break;
case TagType.LongPoint3:
LongPoint3Data lidata3 = (LongPoint3Data)value.Value;
LongPoint3Data lidata3 = (LongPoint3Data)value;
hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue, lidata3.X);
hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 16, lidata3.Y);
hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 24, lidata3.Z);
break;
}
hb.WriteInt(hb.QualityAddress + hb.CurrentCount, value.Quality);
hb.EndTime = value.Time;
hb.WriteInt(hb.QualityAddress + hb.CurrentCount, quality);
hb.EndTime = datetime;
hb.CurrentCount++;
hb.Relase();
......@@ -1756,6 +1943,31 @@ namespace Cdy.Tag
return ManualRecordHisValues(id, value, timeUnit);
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <param name="time"></param>
/// <param name="value"></param>
/// <param name="quality"></param>
/// <param name="timeUnit"></param>
/// <returns></returns>
public bool SetTagHisValue(int id, DateTime time, object value, byte quality, int timeUnit=100)
{
return ManualRecordHisValues(id, time, value, quality, timeUnit);
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <param name="value"></param>
/// <param name="timeUnit"></param>
/// <returns></returns>
public bool SetTagHisValue(int id, object value, int timeUnit)
{
return SetTagHisValue(id, DateTime.Now, value, 0, timeUnit);
}
/// <summary>
///
/// </summary>
......@@ -1796,6 +2008,33 @@ namespace Cdy.Tag
return true;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public List<int> GetManualRecordTagId()
{
return mManager.HisTags.Where(e => e.Value.Type == RecordType.Manual).Select(e=>e.Value.Id).ToList();
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Dictionary<int,RecordType> GetTagRecordType(List<int> id)
{
Dictionary<int, RecordType> re = new Dictionary<int, RecordType>();
foreach(var vv in id)
{
if(mManager.HisTags.ContainsKey(vv))
{
re.Add(vv,mManager.HisTags[vv].Type);
}
}
return re;
}
#endregion ...Methods...
#region ... Interfaces ...
......
......@@ -26,7 +26,7 @@ namespace DBRuntime.His
/// <summary>
///
/// </summary>
private Dictionary<int, Dictionary<ManualHisDataMemoryBlock, bool>> mPools = new Dictionary<int, Dictionary<ManualHisDataMemoryBlock, bool>>();
private Dictionary<int, Queue<ManualHisDataMemoryBlock>> mFreePools = new Dictionary<int, Queue<ManualHisDataMemoryBlock>>();
#endregion ...Variables...
......@@ -44,6 +44,30 @@ namespace DBRuntime.His
#region ... Methods ...
/// <summary>
///
/// </summary>
/// <param name="size"></param>
public void PreAlloc(int size)
{
lock (mFreePools)
{
if (mFreePools.ContainsKey(size))
{
var pp = mFreePools[size];
var bnb = NewBlock(size);
pp.Enqueue(bnb);
}
else
{
var bnb = NewBlock(size);
Queue<ManualHisDataMemoryBlock> dd = new Queue<ManualHisDataMemoryBlock>();
dd.Enqueue(bnb);
mFreePools.Add(size,dd);
}
}
}
/// <summary>
///
/// </summary>
......@@ -51,31 +75,27 @@ namespace DBRuntime.His
/// <returns></returns>
public ManualHisDataMemoryBlock Get(int size)
{
lock (mPools)
lock (mFreePools)
{
if (mPools.ContainsKey(size))
if (mFreePools.ContainsKey(size))
{
var pp = mPools[size].Where(e => !e.Value);
if (pp.Count() > 0)
var pp = mFreePools[size];
if (pp.Count > 0)
{
var bnb = pp.First().Key;
mPools[size][bnb] = true;
var bnb = pp.Dequeue();
return bnb;
}
else
{
var bnb = NewBlock(size);
mPools[size].Add(bnb, true);
return bnb;
}
}
else
{
var bnb = NewBlock(size);
Dictionary<ManualHisDataMemoryBlock, bool> dd = new Dictionary<ManualHisDataMemoryBlock, bool>();
dd.Add(bnb, true);
mPools.Add(size, dd);
Queue<ManualHisDataMemoryBlock> dd = new Queue<ManualHisDataMemoryBlock>();
mFreePools.Add(size, dd);
return bnb;
}
}
......@@ -98,13 +118,13 @@ namespace DBRuntime.His
public void Release(ManualHisDataMemoryBlock block)
{
var size = (int)block.AllocSize;
if(mPools.ContainsKey(size))
lock (mFreePools)
{
var vv = mPools[size];
if(vv.ContainsKey(block))
var size = (int)block.AllocSize;
if (mFreePools.ContainsKey(size))
{
vv[block] = false;
var vv = mFreePools[size];
vv.Enqueue(block);
block.Clear();
}
}
......
......@@ -27,7 +27,7 @@ namespace DBRuntime.His
/// <summary>
///
/// </summary>
private Dictionary<MarshalMemoryBlock, bool> mPools = new Dictionary<MarshalMemoryBlock, bool>();
private Dictionary<long, Queue<MarshalMemoryBlock>> mFreePools = new Dictionary<long, Queue<MarshalMemoryBlock>>();
#endregion ...Variables...
......@@ -52,19 +52,27 @@ namespace DBRuntime.His
/// <returns></returns>
public MarshalMemoryBlock Get(long size)
{
lock (mPools)
lock (mFreePools)
{
var mms = mPools.Where(e => !e.Value && e.Key.AllocSize == size);
if (mms.Count() > 0)
if (mFreePools.ContainsKey(size))
{
var vv = mms.First().Key;
mPools[vv] = true;
return vv;
var pp = mFreePools[size];
if (pp.Count > 0)
{
var bnb = pp.Dequeue();
return bnb;
}
else
{
var bnb = NewBlock(size);
return bnb;
}
}
else
{
var bnb = NewBlock(size);
mPools.Add(bnb, true);
Queue<MarshalMemoryBlock> dd = new Queue<MarshalMemoryBlock>();
mFreePools.Add(size, dd);
return bnb;
}
}
......@@ -77,7 +85,7 @@ namespace DBRuntime.His
/// <returns></returns>
private MarshalMemoryBlock NewBlock(long size)
{
return new MarshalMemoryBlock(size).Clear();
return new MarshalMemoryBlock(size,(int)size).Clear();
}
/// <summary>
......@@ -87,11 +95,16 @@ namespace DBRuntime.His
public void Release(MarshalMemoryBlock block)
{
if(mPools.ContainsKey(block))
lock (mFreePools)
{
mPools[block] = false;
var size = (int)block.AllocSize;
if (mFreePools.ContainsKey(size))
{
var vv = mFreePools[size];
vv.Enqueue(block);
block.Clear();
}
}
block.Clear();
}
#endregion ...Methods...
......
......@@ -17,6 +17,7 @@ using System.Buffers;
using DotNetty.Common;
using DBRuntime.His;
using System.Collections;
using System.Drawing;
/*
* ****文件结构****
......@@ -268,6 +269,12 @@ namespace Cdy.Tag
lock (resetEvent)
resetEvent.Reset();
//#if DEBUG
Stopwatch sw = new Stopwatch();
sw.Start();
LoggerService.Service.Info("SeriseEnginer", "********开始执行存储********", ConsoleColor.Cyan);
//#endif
if (mWaitForProcessMemory.Count > 0)
{
SaveToFile();
......@@ -284,6 +291,11 @@ namespace Cdy.Tag
}
}
//#if DEBUG
sw.Stop();
LoggerService.Service.Info("SeriseEnginer", ">>>>>>>>>完成执行存储>>>>>>> ElapsedMilliseconds:" + sw.ElapsedMilliseconds, ConsoleColor.Cyan);
//#endif
if (mIsClosed)
break;
}
......@@ -300,11 +312,7 @@ namespace Cdy.Tag
2. 拷贝数据块
3. 更新数据块指针
*/
//#if DEBUG
Stopwatch sw = new Stopwatch();
sw.Start();
LoggerService.Service.Info("SeriseEnginer", "********开始执行存储********", ConsoleColor.Cyan);
//#endif
HisDataPath = SelectHisDataPath();
List<CompressMemory2> mtmp;
lock (mWaitForProcessMemory)
......@@ -320,10 +328,7 @@ namespace Cdy.Tag
vv.MakeMemoryNoBusy();
}
//#if DEBUG
sw.Stop();
LoggerService.Service.Info("SeriseEnginer", ">>>>>>>>>完成执行存储>>>>>>> Count:" + mtmp.Count + " ElapsedMilliseconds:" + sw.ElapsedMilliseconds, ConsoleColor.Cyan);
//#endif
}
/// <summary>
......@@ -351,7 +356,7 @@ namespace Cdy.Tag
foreach (var vv in mSeriserFiles)
{
if (id >= vv.Value.Id * TagCountOneFile && id < (vv.Value.Id + 1) * TagCountOneFile)
if (id >= vv.Value.IdStart && id < vv.Value.IdEnd)
{
vv.Value.ManualRequestToSeriseFile(id, data);
}
......@@ -370,7 +375,7 @@ namespace Cdy.Tag
HisDataPath = SelectHisDataPath();
lock (mCachSeriseMemoryBlock)
mCachSeriseMemoryBlock.Enqueue(data);
if (mCachSeriseMemoryBlock.Count > 10) RequestToSave();
}
#endregion ...Methods...
......@@ -444,9 +449,10 @@ namespace Cdy.Tag
private List<int> mTagIdsCach;
private Dictionary<DateTime, Dictionary<int, long>> mPointerCach = new Dictionary<DateTime, Dictionary<int, long>>();
private int mId = 0;
#endregion ...Variables...
#region ... Events ...
......@@ -458,10 +464,21 @@ namespace Cdy.Tag
#endregion ...Constructor...
#region ... Properties ...
/// <summary>
///
/// </summary>
public int Id { get; set; }
public int IdStart { get; set; }
/// <summary>
///
/// </summary>
public int IdEnd { get; set; }
/// <summary>
///
/// </summary>
public int Id { get { return mId; } set { mId = value; IdStart = value * TagCountOneFile;IdEnd = (value + 1) * TagCountOneFile; } }
/// <summary>
///
......@@ -506,6 +523,8 @@ namespace Cdy.Tag
public bool IsNeedInit { get; set; }
private Dictionary<int, MarshalMemoryBlock> mManualHisDataCach = new Dictionary<int, MarshalMemoryBlock>();
#endregion ...Properties...
#region ... Methods ...
......@@ -815,6 +834,48 @@ namespace Cdy.Tag
return preoffset;
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <param name="datablock"></param>
public void AppendManualSeriseFile(int id,MarshalMemoryBlock datablock)
{
mManualHisDataCach.Add(id, datablock);
}
/// <summary>
///
/// </summary>
public void FreshManualDataToDisk()
{
string oldFile = string.Empty;
DataFileSeriserbase mwriter;
Dictionary<int, long> mHeadAddress = new Dictionary<int, long>();
Dictionary<int, long> mHeadValue = new Dictionary<int, long>();
foreach (var vv in mManualHisDataCach)
{
var id = vv.Key;
var datablock = vv.Value;
DateTime time = datablock.ReadDateTime(4);
DateTime endTime = datablock.ReadDateTime(12);
int size = datablock.ReadInt(20);
mTagCount = datablock.ReadInt(24);//变量个数
string sfile = GetFileName(time);
if(sfile!=oldFile)
{
mHeadAddress = new Dictionary<int, long>();
mHeadValue = new Dictionary<int, long>();
var heads = GetDataRegionHeadPoint(id, time, out mwriter);
mHeadAddress.Add(id, heads);
}
}
}
/// <summary>
/// 通过手动更新的方式,提交历史记录
/// </summary>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册