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

Bug 修改

上级 42dd0285
...@@ -1478,7 +1478,7 @@ namespace Cdy.Tag ...@@ -1478,7 +1478,7 @@ namespace Cdy.Tag
/// <param name="memory"></param> /// <param name="memory"></param>
public static void MakeMemoryBusy(this FixedMemoryBlock memory) 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.IncRef();
//memory.StartMemory[0] = 1; //memory.StartMemory[0] = 1;
} }
...@@ -1489,7 +1489,7 @@ namespace Cdy.Tag ...@@ -1489,7 +1489,7 @@ namespace Cdy.Tag
/// <param name="memory"></param> /// <param name="memory"></param>
public static void MakeMemoryNoBusy(this FixedMemoryBlock memory) 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.DecRef();
//memory.StartMemory[0] = 0; //memory.StartMemory[0] = 0;
} }
......
...@@ -1512,7 +1512,7 @@ namespace Cdy.Tag ...@@ -1512,7 +1512,7 @@ namespace Cdy.Tag
public static void MakeMemoryBusy(this MarshalFixedMemoryBlock memory) public static void MakeMemoryBusy(this MarshalFixedMemoryBlock memory)
{ {
memory.IncRef(); memory.IncRef();
LoggerService.Service.Info("MemoryBlock","make "+ memory.Name + " is busy....."); //LoggerService.Service.Info("MemoryBlock","make "+ memory.Name + " is busy.....");
//memory.IsBusy = true; //memory.IsBusy = true;
//memory.StartMemory[0] = 1; //memory.StartMemory[0] = 1;
...@@ -1525,7 +1525,7 @@ namespace Cdy.Tag ...@@ -1525,7 +1525,7 @@ namespace Cdy.Tag
public static void MakeMemoryNoBusy(this MarshalFixedMemoryBlock memory) public static void MakeMemoryNoBusy(this MarshalFixedMemoryBlock memory)
{ {
memory.DecRef(); memory.DecRef();
LoggerService.Service.Info("MemoryBlock", "make " + memory.Name+ " is ready !"); //LoggerService.Service.Info("MemoryBlock", "make " + memory.Name+ " is ready !");
//memory.StartMemory[0] = 0; //memory.StartMemory[0] = 0;
} }
......
...@@ -382,6 +382,12 @@ namespace Cdy.Tag ...@@ -382,6 +382,12 @@ namespace Cdy.Tag
if (mIsDisposed) break; if (mIsDisposed) break;
Marshal.Copy(zoreData, 0, vv + i * zoreData.Length, zoreData.Length); 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 catch
...@@ -2490,7 +2496,7 @@ namespace Cdy.Tag ...@@ -2490,7 +2496,7 @@ namespace Cdy.Tag
public static void MakeMemoryBusy(this MarshalMemoryBlock memory) public static void MakeMemoryBusy(this MarshalMemoryBlock memory)
{ {
memory.IncRef(); memory.IncRef();
LoggerService.Service.Info("MemoryBlock","make "+ memory.Name + " is busy....."); //LoggerService.Service.Info("MemoryBlock","make "+ memory.Name + " is busy.....");
//memory.IsBusy = true; //memory.IsBusy = true;
//memory.StartMemory[0] = 1; //memory.StartMemory[0] = 1;
...@@ -2503,7 +2509,7 @@ namespace Cdy.Tag ...@@ -2503,7 +2509,7 @@ namespace Cdy.Tag
public static void MakeMemoryNoBusy(this MarshalMemoryBlock memory) public static void MakeMemoryNoBusy(this MarshalMemoryBlock memory)
{ {
memory.DecRef(); memory.DecRef();
LoggerService.Service.Info("MemoryBlock", "make " + memory.Name+ " is ready !"); //LoggerService.Service.Info("MemoryBlock", "make " + memory.Name+ " is ready !");
//memory.StartMemory[0] = 0; //memory.StartMemory[0] = 0;
} }
......
...@@ -1797,7 +1797,7 @@ namespace Cdy.Tag ...@@ -1797,7 +1797,7 @@ namespace Cdy.Tag
/// <param name="memory"></param> /// <param name="memory"></param>
public static void MakeMemoryBusy(this MemoryBlock memory) 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.IsBusy = true;
//memory.StartMemory[0] = 1; //memory.StartMemory[0] = 1;
} }
...@@ -1808,7 +1808,7 @@ namespace Cdy.Tag ...@@ -1808,7 +1808,7 @@ namespace Cdy.Tag
/// <param name="memory"></param> /// <param name="memory"></param>
public static void MakeMemoryNoBusy(this MemoryBlock memory) 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.IsBusy = false;
//memory.StartMemory[0] = 0; //memory.StartMemory[0] = 0;
} }
......
...@@ -99,7 +99,13 @@ namespace Cdy.Tag.Driver ...@@ -99,7 +99,13 @@ namespace Cdy.Tag.Driver
/// <returns></returns> /// <returns></returns>
bool SetTagValue(Tagbase tag, object value, DateTime time, byte quality); 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); bool SetTagValue(Tagbase tag, object value, byte quality);
/// <summary> /// <summary>
......
...@@ -36,6 +36,19 @@ namespace Cdy.Tag.Driver ...@@ -36,6 +36,19 @@ namespace Cdy.Tag.Driver
#region ... Methods ... #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>
/// 设置变量的历史值 /// 设置变量的历史值
/// </summary> /// </summary>
...@@ -55,6 +68,26 @@ namespace Cdy.Tag.Driver ...@@ -55,6 +68,26 @@ namespace Cdy.Tag.Driver
/// <returns></returns> /// <returns></returns>
bool SetTagHisValue(int id, TagValue value, int timeUnit); 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>
/// 设置变量的历史值 /// 设置变量的历史值
/// </summary> /// </summary>
...@@ -64,6 +97,12 @@ namespace Cdy.Tag.Driver ...@@ -64,6 +97,12 @@ namespace Cdy.Tag.Driver
bool SetTagHisValues(Dictionary<int, List<TagValue>> values, int timeUnit); 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); bool SetTagHisValues(Dictionary<int, TagValue> values, int timeUnit);
/// <summary> /// <summary>
......
...@@ -5,6 +5,7 @@ using System.Collections; ...@@ -5,6 +5,7 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq;
using System.Threading; using System.Threading;
namespace SimDriver namespace SimDriver
...@@ -14,7 +15,9 @@ namespace SimDriver ...@@ -14,7 +15,9 @@ namespace SimDriver
#region ... Variables ... #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; //private System.Timers.Timer mScanTimer;
...@@ -102,6 +105,14 @@ namespace SimDriver ...@@ -102,6 +105,14 @@ namespace SimDriver
private void InitTagCach(IRealTagProduct tagQuery) private void InitTagCach(IRealTagProduct tagQuery)
{ {
mTagIdCach = tagQuery.GetTagsByLinkAddress(new List<string>() { "Sim:cos", "Sim:sin", "Sim:step", "Sim:steppoint", "Sim:square" }); 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> /// <summary>
...@@ -184,6 +195,41 @@ namespace SimDriver ...@@ -184,6 +195,41 @@ namespace SimDriver
}); });
mTagService.SubmiteNotifyChanged(); 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); int delay = (int)(500 - (DateTime.Now - mLastProcessTime).TotalMilliseconds);
if(delay < 0) if(delay < 0)
{ {
...@@ -192,7 +238,7 @@ namespace SimDriver ...@@ -192,7 +238,7 @@ namespace SimDriver
#if DEBUG #if DEBUG
sw.Stop(); sw.Stop();
if (mNumber%10 == 0) 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 #endif
Thread.Sleep(delay); Thread.Sleep(delay);
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
"profiles": { "profiles": {
"DBInRun": { "DBInRun": {
"commandName": "Executable", "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 ...@@ -168,7 +168,7 @@ namespace Cdy.Tag
vpp = mMemoryCach.Dequeue(); vpp = mMemoryCach.Dequeue();
} }
Compress(vpp); Compress(vpp);
Thread.Sleep(1); //Thread.Sleep(1);
} }
mIsRunning = false; mIsRunning = false;
} }
...@@ -389,7 +389,7 @@ namespace Cdy.Tag ...@@ -389,7 +389,7 @@ namespace Cdy.Tag
int datasize = 0; int datasize = 0;
var targetPosition = 28; var targetPosition = 28;
block.WriteInt(0,data.Id);
block.WriteDatetime(4, data.Time); //时间 block.WriteDatetime(4, data.Time); //时间
block.WriteDatetime(12, data.EndTime); //结束时间 block.WriteDatetime(12, data.EndTime); //结束时间
//block.WriteInt(20, 0); //写入数据大小 //block.WriteInt(20, 0); //写入数据大小
......
...@@ -68,7 +68,7 @@ namespace Cdy.Tag ...@@ -68,7 +68,7 @@ namespace Cdy.Tag
{ {
target.WriteDatetime(targetAddr, this.StartTime); 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); target.Write(TimeTick);
switch (TagType) switch (TagType)
......
...@@ -1385,14 +1385,17 @@ namespace Cdy.Tag ...@@ -1385,14 +1385,17 @@ namespace Cdy.Tag
if (mHisTags.ContainsKey(id) && mHisTags[id].Type == RecordType.Manual) if (mHisTags.ContainsKey(id) && mHisTags[id].Type == RecordType.Manual)
{ {
if (mManualHisDataCach.ContainsKey(id)) lock (mManualHisDataCach)
{ {
datacach = mManualHisDataCach[id]; if (mManualHisDataCach.ContainsKey(id))
} {
else datacach = mManualHisDataCach[id];
{ }
datacach = new SortedDictionary<DateTime, ManualHisDataMemoryBlock>(); else
mManualHisDataCach.Add(id, datacach); {
datacach = new SortedDictionary<DateTime, ManualHisDataMemoryBlock>();
mManualHisDataCach.Add(id, datacach);
}
} }
var tag = mHisTags[id]; var tag = mHisTags[id];
...@@ -1558,6 +1561,187 @@ namespace Cdy.Tag ...@@ -1558,6 +1561,187 @@ namespace Cdy.Tag
/// <param name="timeUnit"></param> /// <param name="timeUnit"></param>
/// <returns></returns> /// <returns></returns>
private bool ManualRecordHisValues(long id, Cdy.Tag.TagValue value, int timeUnit = 100) 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; if (mIsClosed) return false;
...@@ -1569,21 +1753,24 @@ namespace Cdy.Tag ...@@ -1569,21 +1753,24 @@ namespace Cdy.Tag
if (mHisTags.ContainsKey(id) && mHisTags[id].Type == RecordType.Manual) if (mHisTags.ContainsKey(id) && mHisTags[id].Type == RecordType.Manual)
{ {
if (mManualHisDataCach.ContainsKey(id)) lock (mManualHisDataCach)
{
datacach = mManualHisDataCach[id];
}
else
{ {
datacach = new SortedDictionary<DateTime, ManualHisDataMemoryBlock>(); if (mManualHisDataCach.ContainsKey(id))
mManualHisDataCach.Add(id, datacach); {
datacach = mManualHisDataCach[id];
}
else
{
datacach = new SortedDictionary<DateTime, ManualHisDataMemoryBlock>();
mManualHisDataCach.Add(id, datacach);
}
} }
var tag = mHisTags[id]; var tag = mHisTags[id];
ManualHisDataMemoryBlock hb = null; ManualHisDataMemoryBlock hb = null;
var vdata = value.Time.Date; var vdata = datetime.Date;
var mms = (int)(value.Time.Subtract(vdata).TotalSeconds / MergeMemoryTime); var mms = (int)(datetime.Subtract(vdata).TotalSeconds / MergeMemoryTime);
var time = vdata.AddSeconds(mms * MergeMemoryTime); var time = vdata.AddSeconds(mms * MergeMemoryTime);
if (datacach.ContainsKey(time)) if (datacach.ContainsKey(time))
{ {
...@@ -1607,98 +1794,98 @@ namespace Cdy.Tag ...@@ -1607,98 +1794,98 @@ namespace Cdy.Tag
} }
mLastTime = time; mLastTime = time;
if (hb.CurrentCount < hb.MaxCount && value.Time > hb.EndTime) if (hb.CurrentCount < hb.MaxCount && datetime > hb.EndTime)
{ {
hb.Lock(); 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); hb.WriteInt(hb.TimerAddress + hb.CurrentCount * 4, vtime);
switch (tag.TagType) switch (tag.TagType)
{ {
case TagType.Bool: 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; break;
case TagType.Byte: 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; break;
case TagType.Short: 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; break;
case TagType.UShort: 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; break;
case TagType.Int: 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; break;
case TagType.UInt: 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; break;
case TagType.Long: 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; break;
case TagType.ULong: 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; break;
case TagType.Float: 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; break;
case TagType.Double: 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; break;
case TagType.String: 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; break;
case TagType.DateTime: 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; break;
case TagType.UIntPoint: 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, data.X);
hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 4, data.Y); hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 4, data.Y);
break; break;
case TagType.IntPoint: 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, idata.X);
hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 4, idata.Y); hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 4, idata.Y);
break; break;
case TagType.UIntPoint3: 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, udata3.X);
hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 4, udata3.Y); hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 4, udata3.Y);
hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 8, udata3.Z); hb.WriteUIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 8, udata3.Z);
break; break;
case TagType.IntPoint3: 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, idata3.X);
hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 4, idata3.Y); hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 4, idata3.Y);
hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 8, idata3.Z); hb.WriteIntDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 8, idata3.Z);
break; break;
case TagType.ULongPoint: 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, udata.X);
hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 8, udata.Y); hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 8, udata.Y);
break; break;
case TagType.LongPoint: 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, lidata.X);
hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 8, lidata.Y); hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 8, lidata.Y);
break; break;
case TagType.ULongPoint3: 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, ludata3.X);
hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 16, ludata3.Y); hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 16, ludata3.Y);
hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 24, ludata3.Z); hb.WriteULongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 24, ludata3.Z);
break; break;
case TagType.LongPoint3: 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, lidata3.X);
hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 16, lidata3.Y); hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 16, lidata3.Y);
hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 24, lidata3.Z); hb.WriteLongDirect(hb.ValueAddress + hb.CurrentCount * tag.SizeOfValue + 24, lidata3.Z);
break; break;
} }
hb.WriteInt(hb.QualityAddress + hb.CurrentCount, value.Quality); hb.WriteInt(hb.QualityAddress + hb.CurrentCount, quality);
hb.EndTime = value.Time; hb.EndTime = datetime;
hb.CurrentCount++; hb.CurrentCount++;
hb.Relase(); hb.Relase();
...@@ -1756,6 +1943,31 @@ namespace Cdy.Tag ...@@ -1756,6 +1943,31 @@ namespace Cdy.Tag
return ManualRecordHisValues(id, value, timeUnit); 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>
/// ///
/// </summary> /// </summary>
...@@ -1796,6 +2008,33 @@ namespace Cdy.Tag ...@@ -1796,6 +2008,33 @@ namespace Cdy.Tag
return true; 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... #endregion ...Methods...
#region ... Interfaces ... #region ... Interfaces ...
......
...@@ -26,7 +26,7 @@ namespace DBRuntime.His ...@@ -26,7 +26,7 @@ namespace DBRuntime.His
/// <summary> /// <summary>
/// ///
/// </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... #endregion ...Variables...
...@@ -44,6 +44,30 @@ namespace DBRuntime.His ...@@ -44,6 +44,30 @@ namespace DBRuntime.His
#region ... Methods ... #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>
/// ///
/// </summary> /// </summary>
...@@ -51,31 +75,27 @@ namespace DBRuntime.His ...@@ -51,31 +75,27 @@ namespace DBRuntime.His
/// <returns></returns> /// <returns></returns>
public ManualHisDataMemoryBlock Get(int size) 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); var pp = mFreePools[size];
if (pp.Count() > 0) if (pp.Count > 0)
{ {
var bnb = pp.First().Key; var bnb = pp.Dequeue();
mPools[size][bnb] = true;
return bnb; return bnb;
} }
else else
{ {
var bnb = NewBlock(size); var bnb = NewBlock(size);
mPools[size].Add(bnb, true);
return bnb; return bnb;
} }
} }
else else
{ {
var bnb = NewBlock(size); var bnb = NewBlock(size);
Dictionary<ManualHisDataMemoryBlock, bool> dd = new Dictionary<ManualHisDataMemoryBlock, bool>(); Queue<ManualHisDataMemoryBlock> dd = new Queue<ManualHisDataMemoryBlock>();
dd.Add(bnb, true); mFreePools.Add(size, dd);
mPools.Add(size, dd);
return bnb; return bnb;
} }
} }
...@@ -98,13 +118,13 @@ namespace DBRuntime.His ...@@ -98,13 +118,13 @@ namespace DBRuntime.His
public void Release(ManualHisDataMemoryBlock block) public void Release(ManualHisDataMemoryBlock block)
{ {
var size = (int)block.AllocSize; lock (mFreePools)
if(mPools.ContainsKey(size))
{ {
var vv = mPools[size]; var size = (int)block.AllocSize;
if(vv.ContainsKey(block)) if (mFreePools.ContainsKey(size))
{ {
vv[block] = false; var vv = mFreePools[size];
vv.Enqueue(block);
block.Clear(); block.Clear();
} }
} }
......
...@@ -27,7 +27,7 @@ namespace DBRuntime.His ...@@ -27,7 +27,7 @@ namespace DBRuntime.His
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
private Dictionary<MarshalMemoryBlock, bool> mPools = new Dictionary<MarshalMemoryBlock, bool>(); private Dictionary<long, Queue<MarshalMemoryBlock>> mFreePools = new Dictionary<long, Queue<MarshalMemoryBlock>>();
#endregion ...Variables... #endregion ...Variables...
...@@ -52,19 +52,27 @@ namespace DBRuntime.His ...@@ -52,19 +52,27 @@ namespace DBRuntime.His
/// <returns></returns> /// <returns></returns>
public MarshalMemoryBlock Get(long size) public MarshalMemoryBlock Get(long size)
{ {
lock (mPools) lock (mFreePools)
{ {
var mms = mPools.Where(e => !e.Value && e.Key.AllocSize == size); if (mFreePools.ContainsKey(size))
if (mms.Count() > 0)
{ {
var vv = mms.First().Key; var pp = mFreePools[size];
mPools[vv] = true; if (pp.Count > 0)
return vv; {
var bnb = pp.Dequeue();
return bnb;
}
else
{
var bnb = NewBlock(size);
return bnb;
}
} }
else else
{ {
var bnb = NewBlock(size); var bnb = NewBlock(size);
mPools.Add(bnb, true); Queue<MarshalMemoryBlock> dd = new Queue<MarshalMemoryBlock>();
mFreePools.Add(size, dd);
return bnb; return bnb;
} }
} }
...@@ -77,7 +85,7 @@ namespace DBRuntime.His ...@@ -77,7 +85,7 @@ namespace DBRuntime.His
/// <returns></returns> /// <returns></returns>
private MarshalMemoryBlock NewBlock(long size) private MarshalMemoryBlock NewBlock(long size)
{ {
return new MarshalMemoryBlock(size).Clear(); return new MarshalMemoryBlock(size,(int)size).Clear();
} }
/// <summary> /// <summary>
...@@ -87,11 +95,16 @@ namespace DBRuntime.His ...@@ -87,11 +95,16 @@ namespace DBRuntime.His
public void Release(MarshalMemoryBlock block) 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... #endregion ...Methods...
......
...@@ -17,6 +17,7 @@ using System.Buffers; ...@@ -17,6 +17,7 @@ using System.Buffers;
using DotNetty.Common; using DotNetty.Common;
using DBRuntime.His; using DBRuntime.His;
using System.Collections; using System.Collections;
using System.Drawing;
/* /*
* ****文件结构**** * ****文件结构****
...@@ -268,6 +269,12 @@ namespace Cdy.Tag ...@@ -268,6 +269,12 @@ namespace Cdy.Tag
lock (resetEvent) lock (resetEvent)
resetEvent.Reset(); resetEvent.Reset();
//#if DEBUG
Stopwatch sw = new Stopwatch();
sw.Start();
LoggerService.Service.Info("SeriseEnginer", "********开始执行存储********", ConsoleColor.Cyan);
//#endif
if (mWaitForProcessMemory.Count > 0) if (mWaitForProcessMemory.Count > 0)
{ {
SaveToFile(); SaveToFile();
...@@ -284,6 +291,11 @@ namespace Cdy.Tag ...@@ -284,6 +291,11 @@ namespace Cdy.Tag
} }
} }
//#if DEBUG
sw.Stop();
LoggerService.Service.Info("SeriseEnginer", ">>>>>>>>>完成执行存储>>>>>>> ElapsedMilliseconds:" + sw.ElapsedMilliseconds, ConsoleColor.Cyan);
//#endif
if (mIsClosed) if (mIsClosed)
break; break;
} }
...@@ -300,11 +312,7 @@ namespace Cdy.Tag ...@@ -300,11 +312,7 @@ namespace Cdy.Tag
2. 拷贝数据块 2. 拷贝数据块
3. 更新数据块指针 3. 更新数据块指针
*/ */
//#if DEBUG
Stopwatch sw = new Stopwatch();
sw.Start();
LoggerService.Service.Info("SeriseEnginer", "********开始执行存储********", ConsoleColor.Cyan);
//#endif
HisDataPath = SelectHisDataPath(); HisDataPath = SelectHisDataPath();
List<CompressMemory2> mtmp; List<CompressMemory2> mtmp;
lock (mWaitForProcessMemory) lock (mWaitForProcessMemory)
...@@ -320,10 +328,7 @@ namespace Cdy.Tag ...@@ -320,10 +328,7 @@ namespace Cdy.Tag
vv.MakeMemoryNoBusy(); vv.MakeMemoryNoBusy();
} }
//#if DEBUG
sw.Stop();
LoggerService.Service.Info("SeriseEnginer", ">>>>>>>>>完成执行存储>>>>>>> Count:" + mtmp.Count + " ElapsedMilliseconds:" + sw.ElapsedMilliseconds, ConsoleColor.Cyan);
//#endif
} }
/// <summary> /// <summary>
...@@ -351,7 +356,7 @@ namespace Cdy.Tag ...@@ -351,7 +356,7 @@ namespace Cdy.Tag
foreach (var vv in mSeriserFiles) 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); vv.Value.ManualRequestToSeriseFile(id, data);
} }
...@@ -370,7 +375,7 @@ namespace Cdy.Tag ...@@ -370,7 +375,7 @@ namespace Cdy.Tag
HisDataPath = SelectHisDataPath(); HisDataPath = SelectHisDataPath();
lock (mCachSeriseMemoryBlock) lock (mCachSeriseMemoryBlock)
mCachSeriseMemoryBlock.Enqueue(data); mCachSeriseMemoryBlock.Enqueue(data);
if (mCachSeriseMemoryBlock.Count > 10) RequestToSave();
} }
#endregion ...Methods... #endregion ...Methods...
...@@ -444,9 +449,10 @@ namespace Cdy.Tag ...@@ -444,9 +449,10 @@ namespace Cdy.Tag
private List<int> mTagIdsCach; private List<int> mTagIdsCach;
private Dictionary<DateTime, Dictionary<int, long>> mPointerCach = new Dictionary<DateTime, Dictionary<int, long>>(); private Dictionary<DateTime, Dictionary<int, long>> mPointerCach = new Dictionary<DateTime, Dictionary<int, long>>();
private int mId = 0;
#endregion ...Variables... #endregion ...Variables...
#region ... Events ... #region ... Events ...
...@@ -458,10 +464,21 @@ namespace Cdy.Tag ...@@ -458,10 +464,21 @@ namespace Cdy.Tag
#endregion ...Constructor... #endregion ...Constructor...
#region ... Properties ... #region ... Properties ...
/// <summary> /// <summary>
/// ///
/// </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> /// <summary>
/// ///
...@@ -506,6 +523,8 @@ namespace Cdy.Tag ...@@ -506,6 +523,8 @@ namespace Cdy.Tag
public bool IsNeedInit { get; set; } public bool IsNeedInit { get; set; }
private Dictionary<int, MarshalMemoryBlock> mManualHisDataCach = new Dictionary<int, MarshalMemoryBlock>();
#endregion ...Properties... #endregion ...Properties...
#region ... Methods ... #region ... Methods ...
...@@ -815,6 +834,48 @@ namespace Cdy.Tag ...@@ -815,6 +834,48 @@ namespace Cdy.Tag
return preoffset; 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>
/// 通过手动更新的方式,提交历史记录 /// 通过手动更新的方式,提交历史记录
/// </summary> /// </summary>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册