提交 5f951971 编写于 作者: cdy816's avatar cdy816

性能优化

上级 45d7b693
......@@ -8,4 +8,8 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
</Project>
......@@ -532,6 +532,27 @@ namespace Cdy.Tag
}
/// <summary>
///
/// </summary>
/// <param name="offset"></param>
/// <param name="value"></param>
public void WriteLongDirect(long offset, long value)
{
IntPtr hd;
long ost;
if (IsCrossDataBuffer(offset, 8))
{
WriteBytesDirect(offset, BitConverter.GetBytes(value));
}
else
{
hd = RelocationAddress(offset, out ost);
MemoryHelper.WriteInt64((void*)hd, ost, value);
}
}
/// <summary>
///
/// </summary>
......@@ -612,6 +633,62 @@ namespace Cdy.Tag
WriteBytes(offset, values, 0, values.Length);
}
/// <summary>
///
/// </summary>
/// <param name="offset"></param>
/// <param name="values"></param>
public void WriteBytesDirect(long offset, byte[] values)
{
WriteBytesDirect(offset, values, 0, values.Length);
}
/// <summary>
/// 清空值
/// </summary>
/// <param name="offset"></param>
/// <param name="len"></param>
public void Clear(long offset,long len)
{
int id = (int)(offset / BufferItemSize);
long ost = offset % BufferItemSize;
if (len + ost < BufferItemSize)
{
System.Array.Clear(mBuffers[id], (int)ost, (int)len);
}
else
{
int ll = BufferItemSize - (int)ost;
System.Array.Clear(mBuffers[id], (int)ost, (int)ll);
if (len - ll < BufferItemSize)
{
id++;
System.Array.Clear(mBuffers[id], 0, (int)(len - ll));
}
else
{
long ltmp = len - ll;
int bcount = ll / BufferItemSize;
int i = 0;
for (i = 0; i < bcount; i++)
{
id++;
System.Array.Clear(mBuffers[id], 0, BufferItemSize);
}
int otmp = ll % BufferItemSize;
if (otmp > 0)
{
id++;
System.Array.Clear(mBuffers[id], 0, otmp);
}
}
}
}
/// <summary>
///
/// </summary>
......@@ -641,7 +718,57 @@ namespace Cdy.Tag
if (len - ll < BufferItemSize)
{
id++;
Buffer.BlockCopy(values, ll+ valueoffset, mBuffers[id], 0, len - ll);
Buffer.BlockCopy(values, ll + valueoffset, mBuffers[id], 0, len - ll);
}
else
{
long ltmp = len - ll;
int bcount = ll / BufferItemSize;
int i = 0;
for (i = 0; i < bcount; i++)
{
id++;
Buffer.BlockCopy(values, valueoffset + ll + i * BufferItemSize, mBuffers[id], 0, BufferItemSize);
}
int otmp = ll % BufferItemSize;
if (otmp > 0)
{
id++;
Buffer.BlockCopy(values, valueoffset + ll + i * BufferItemSize, mBuffers[id], 0, otmp);
}
}
}
Position = offset + len;
}
/// <summary>
///
/// </summary>
/// <param name="offset"></param>
/// <param name="values"></param>
/// <param name="valueoffset"></param>
/// <param name="len"></param>
public void WriteBytesDirect(long offset, byte[] values, int valueoffset, int len)
{
int id = (int)(offset / BufferItemSize);
long ost = offset % BufferItemSize;
if (len + ost < BufferItemSize)
{
Buffer.BlockCopy(values, valueoffset, mBuffers[id], (int)ost, len);
}
else
{
int ll = BufferItemSize - (int)ost;
Buffer.BlockCopy(values, valueoffset, mBuffers[id], (int)ost, ll);
if (len - ll < BufferItemSize)
{
id++;
Buffer.BlockCopy(values, ll + valueoffset, mBuffers[id], 0, len - ll);
}
else
{
......@@ -651,18 +778,17 @@ namespace Cdy.Tag
for (i = 0; i < bcount; i++)
{
id++;
Buffer.BlockCopy(values, valueoffset+ll + i * BufferItemSize, mBuffers[id], 0, BufferItemSize);
Buffer.BlockCopy(values, valueoffset + ll + i * BufferItemSize, mBuffers[id], 0, BufferItemSize);
}
int otmp = ll % BufferItemSize;
if (otmp > 0)
{
id++;
Buffer.BlockCopy(values, valueoffset+ll + i * BufferItemSize, mBuffers[id], 0, otmp);
Buffer.BlockCopy(values, valueoffset + ll + i * BufferItemSize, mBuffers[id], 0, otmp);
}
}
}
Position = offset + len;
}
/// <summary>
......@@ -680,6 +806,19 @@ namespace Cdy.Tag
Position = offset + 1;
}
/// <summary>
///
/// </summary>
/// <param name="offset"></param>
/// <param name="value"></param>
public void WriteByteDirect(long offset, byte value)
{
IntPtr hd;
long ost;
hd = RelocationAddress(offset, out ost);
MemoryHelper.WriteByte((void*)hd, ost, value);
}
/// <summary>
///
/// </summary>
......@@ -733,6 +872,22 @@ namespace Cdy.Tag
}
}
public void WriteIntDirect(long offset, int value)
{
IntPtr hd;
long ost;
if (IsCrossDataBuffer(offset, 4))
{
WriteBytesDirect(offset, BitConverter.GetBytes(value));
}
else
{
hd = RelocationAddress(offset, out ost);
MemoryHelper.WriteInt32((void*)hd, ost, value);
}
}
/// <summary>
///
/// </summary>
......@@ -755,6 +910,26 @@ namespace Cdy.Tag
}
}
/// <summary>
///
/// </summary>
/// <param name="offset"></param>
/// <param name="value"></param>
public void WriteUIntDirect(long offset, uint value)
{
IntPtr hd;
long ost;
if (IsCrossDataBuffer(offset, 4))
{
WriteBytesDirect(offset, BitConverter.GetBytes(value));
}
else
{
hd = RelocationAddress(offset, out ost);
MemoryHelper.WriteUInt32((void*)hd, ost, value);
}
}
/// <summary>
///
/// </summary>
......@@ -777,6 +952,26 @@ namespace Cdy.Tag
}
}
/// <summary>
///
/// </summary>
/// <param name="offset"></param>
/// <param name="value"></param>
public void WriteShortDirect(long offset, short value)
{
IntPtr hd;
long ost;
if (IsCrossDataBuffer(offset, 2))
{
WriteBytesDirect(offset, BitConverter.GetBytes(value));
}
else
{
hd = RelocationAddress(offset, out ost);
MemoryHelper.WriteShort((void*)hd, ost, value);
}
}
/// <summary>
///
/// </summary>
......@@ -799,6 +994,26 @@ namespace Cdy.Tag
}
}
/// <summary>
///
/// </summary>
/// <param name="offset"></param>
/// <param name="value"></param>
public void WriteUShortDirect(long offset, ushort value)
{
IntPtr hd;
long ost;
if (IsCrossDataBuffer(offset, 2))
{
WriteBytesDirect(offset, BitConverter.GetBytes(value));
}
else
{
hd = RelocationAddress(offset, out ost);
MemoryHelper.WriteUShort((void*)hd, ost, value);
}
}
/// <summary>
///
/// </summary>
......@@ -814,6 +1029,19 @@ namespace Cdy.Tag
Position = offset + sdata.Length + 1;
}
/// <summary>
///
/// </summary>
/// <param name="offset"></param>
/// <param name="value"></param>
/// <param name="encode"></param>
public void WriteStringDirect(long offset, string value, Encoding encode)
{
var sdata = encode.GetBytes(value);
WriteByte(offset, (byte)sdata.Length);
WriteBytes(offset + 1, sdata);
}
/// <summary>
///
/// </summary>
......
......@@ -30,7 +30,7 @@ namespace Cdy.Tag
try
{
byte* addr = (byte*)ptr + ofs;
*(addr) = val;
addr[0] = val;
}
catch (NullReferenceException)
{
......@@ -111,20 +111,20 @@ namespace Cdy.Tag
try
{
byte* addr = (byte*)ptr + ofs;
if ((unchecked((int)addr) & 0x3) == 0)
//if ((unchecked((int)addr) & 0x3) == 0)
{
// aligned write
*((int*)addr) = val;
}
else
{
// unaligned write
byte* valPtr = (byte*)&val;
addr[0] = valPtr[0];
addr[1] = valPtr[1];
addr[2] = valPtr[2];
addr[3] = valPtr[3];
}
//else
//{
// // unaligned write
// byte* valPtr = (byte*)&val;
// addr[0] = valPtr[0];
// addr[1] = valPtr[1];
// addr[2] = valPtr[2];
// addr[3] = valPtr[3];
//}
}
catch (NullReferenceException)
{
......@@ -177,20 +177,20 @@ namespace Cdy.Tag
try
{
byte* addr = (byte*)ptr + ofs;
if ((unchecked((int)addr) & 0x3) == 0)
//if ((unchecked((int)addr) & 0x3) == 0)
{
// aligned write
*((int*)addr) = *(int*)(&val);
}
else
{
// unaligned write
byte* valPtr = (byte*)&val;
addr[0] = valPtr[0];
addr[1] = valPtr[1];
addr[2] = valPtr[2];
addr[3] = valPtr[3];
}
//else
//{
// // unaligned write
// byte* valPtr = (byte*)&val;
// addr[0] = valPtr[0];
// addr[1] = valPtr[1];
// addr[2] = valPtr[2];
// addr[3] = valPtr[3];
//}
}
catch (NullReferenceException)
{
......@@ -210,24 +210,24 @@ namespace Cdy.Tag
try
{
byte* addr = (byte*)ptr + ofs;
if ((unchecked((int)addr) & 0x7) == 0)
//if ((unchecked((int)addr) & 0x7) == 0)
{
// aligned write
*((Int64*)addr) = val;
}
else
{
// unaligned write
byte* valPtr = (byte*)&val;
addr[0] = valPtr[0];
addr[1] = valPtr[1];
addr[2] = valPtr[2];
addr[3] = valPtr[3];
addr[4] = valPtr[4];
addr[5] = valPtr[5];
addr[6] = valPtr[6];
addr[7] = valPtr[7];
}
//else
//{
// // unaligned write
// byte* valPtr = (byte*)&val;
// addr[0] = valPtr[0];
// addr[1] = valPtr[1];
// addr[2] = valPtr[2];
// addr[3] = valPtr[3];
// addr[4] = valPtr[4];
// addr[5] = valPtr[5];
// addr[6] = valPtr[6];
// addr[7] = valPtr[7];
//}
}
catch (NullReferenceException)
{
......
......@@ -5,4 +5,3 @@ D:\Project\Galaxy\Cdy.Tag\obj\Debug\netstandard2.0\Cdy.Tag.AssemblyInfoInputs.ca
D:\Project\Galaxy\Cdy.Tag\obj\Debug\netstandard2.0\Cdy.Tag.AssemblyInfo.cs
D:\Project\Galaxy\Cdy.Tag\obj\Debug\netstandard2.0\Cdy.Tag.dll
D:\Project\Galaxy\Cdy.Tag\obj\Debug\netstandard2.0\Cdy.Tag.pdb
D:\Project\Galaxy\Cdy.Tag\obj\Debug\netstandard2.0\Cdy.Tag.csprojAssemblyReference.cache
......@@ -8,6 +8,10 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Cdy.Tag.Common\Cdy.Tag.Common.csproj" />
<ProjectReference Include="..\Cdy.Tag\Cdy.Tag.csproj" />
......
......@@ -175,7 +175,8 @@ namespace Cdy.Tag
mTargetMemory.MakeMemoryBusy();
Compress();
sm.Clear();
//sm.Clear();
ServiceLocator.Locator.Resolve<IHisEngine>().ClearMemoryHisData(sm);
sm.MakeMemoryNoBusy();
LoggerService.Service.Info("Compress", ">>>>>>>>>压缩完成>>>>>>>>>" + mTargetMemory.UsedSize);
......
......@@ -17,7 +17,7 @@ namespace Cdy.Tag
/// <summary>
/// 历史数据引擎
/// </summary>
public class HisEnginer
public class HisEnginer: IHisEngine
{
#region ... Variables ...
......@@ -82,7 +82,7 @@ namespace Cdy.Tag
/// <summary>
///
/// </summary>
private ValueChangedMemoryCacheProcesser mLastValueChangedProcesser = new ValueChangedMemoryCacheProcesser();
private ValueChangedMemoryCacheProcesser mLastValueChangedProcesser = new ValueChangedMemoryCacheProcesser() { Name = "ValueChanged0" };
private System.Timers.Timer mRecordTimer;
......@@ -216,7 +216,7 @@ namespace Cdy.Tag
{
if(!mLastValueChangedProcesser.AddTag(mHisTag))
{
mLastValueChangedProcesser = new ValueChangedMemoryCacheProcesser();
mLastValueChangedProcesser = new ValueChangedMemoryCacheProcesser() { Name = "ValueChanged"+mTagCount };
mValueChangedProcesser.Add(mLastValueChangedProcesser);
}
}
......@@ -338,32 +338,47 @@ namespace Cdy.Tag
}
/// <summary>
///
/// </summary>
private void PrepareForReadyMemory()
{
//写入时间
mCurrentMemory.WriteDatetime(1, mLastProcessTime);
HisRunTag.StartTime = mLastProcessTime;
}
/// <summary>
/// 清空内存
/// </summary>
private void InitMemory()
private void InitMemory(MemoryBlock memory)
{
LoggerService.Service.Info("Record", "内存初始化开始 ");
//LoggerService.Service.Info("Record", "内存初始化开始 ");
//Stopwatch sw2 = new Stopwatch();
//sw2.Start();
//mCurrentMemory.Clear();
//LoggerService.Service.Info("Record", "内存初始化开始 清空完成");
//写入时间
mCurrentMemory.WriteDatetime(1, mLastProcessTime);
////写入时间
//memory.WriteDatetime(1, mLastProcessTime);
//写入变量个数
mCurrentMemory.WriteInt(9, mTagCount);
memory.WriteInt(9, mTagCount);
//写入时间内存保存数据的时间
mCurrentMemory.WriteInt(13, MemoryCachTime);
memory.WriteInt(13, MemoryCachTime);
//写入最小时间间隔
mCurrentMemory.WriteInt(17, MemoryTimeTick);
memory.WriteInt(17, MemoryTimeTick);
int offset = 21;
//LoggerService.Service.Info("Record", "内存初始化开始 头数据写入完成");
foreach (var vv in mHisTags)
{
mCurrentMemory.WriteInt(offset, vv.Value.Id); //Tag id int(4)
mCurrentMemory.WriteInt(offset + 4, vv.Value.BlockHeadStartAddr); //历史数据偏移地址 int(4)
mCurrentMemory.WriteInt(offset + 8, vv.Value.DataSize); //历史数据大小 int(4)
memory.WriteInt(offset, vv.Value.Id); //Tag id int(4)
memory.WriteInt(offset + 4, vv.Value.BlockHeadStartAddr); //历史数据偏移地址 int(4)
memory.WriteInt(offset + 8, vv.Value.DataSize); //历史数据大小 int(4)
offset += 12;
vv.Value.UpdateHeader(memory);
}
HisRunTag.StartTime = mLastProcessTime;
//sw2.Stop();
//LoggerService.Service.Info("Record", "内存初始化完成"+sw2.ElapsedMilliseconds);
//HisRunTag.StartTime = mLastProcessTime;
}
/// <summary>
......@@ -375,6 +390,12 @@ namespace Cdy.Tag
{
vv.Start();
}
foreach(var vv in mValueChangedProcesser)
{
vv.Start();
}
mRecordTimer = new System.Timers.Timer(MemoryTimeTick);
mRecordTimer.Elapsed += MRecordTimer_Elapsed;
mRecordTimer.Start();
......@@ -382,8 +403,10 @@ namespace Cdy.Tag
LoggerService.Service.Info("Record", "历史变量个数: "+this.mHisTags.Count);
InitMemory();
InitMemory(mMemory1);
InitMemory(mMemory2);
PrepareForReadyMemory();
mMemory1.MakeMemoryNoBusy();
mMemory2.MakeMemoryNoBusy();
}
......@@ -407,19 +430,19 @@ namespace Cdy.Tag
private void SwitchMemory()
{
var mcc = mCurrentMemory;
LoggerService.Service.Info("Record", @"");
LoggerService.Service.Info("Record", ".....开始Memory选择.....");
//LoggerService.Service.Info("Record", @"");
//LoggerService.Service.Info("Record", ".....开始Memory选择.....");
if (mCurrentMemory == mMemory1)
{
CheckMemoryIsReady(mMemory2);
CurrentMemory = mMemory2;
LoggerService.Service.Info("Record", "选择 Memory2 ");
//LoggerService.Service.Info("Record", "选择 Memory2 ");
}
else
{
CheckMemoryIsReady(mMemory1);
CurrentMemory = mMemory1;
LoggerService.Service.Info("Record", "选择 Memory1 ");
//LoggerService.Service.Info("Record", "选择 Memory1 ");
}
if (mcc != null)
......@@ -429,26 +452,19 @@ namespace Cdy.Tag
ServiceLocator.Locator.Resolve<IDataCompress>().RequestToCompress(mcc);
//new System.Threading.Tasks.TaskFactory().StartNew(new Action(() => {
//}));
//System.Threading.Tasks.Task.Run(new Action(() => {
// ServiceLocator.Locator.Resolve<IDataCompress>().RequestToCompress(mcc);
//}));
LoggerService.Service.Info("Record", "提交内存 "+mcc.Name+" 进行压缩");
//LoggerService.Service.Info("Record", "提交内存 "+mcc.Name+" 进行压缩");
}
InitMemory();
LoggerService.Service.Info("Record", "内存初始化完成");
PrepareForReadyMemory();
//LoggerService.Service.Info("Record", "内存初始化完成");
foreach (var vv in mHisTags.Values)
{
vv.Reset();
}
LoggerService.Service.Info("Record", ".....结束Memory选择.....");
//LoggerService.Service.Info("Record", ".....结束Memory选择.....");
LoggerService.Service.Info("Record", "");
//LoggerService.Service.Info("Record", "");
}
/// <summary>
......@@ -474,12 +490,20 @@ namespace Cdy.Tag
var mm = (dt.Hour * 24 + dt.Minute * 60 + dt.Second) / MemoryCachTime;
if (mm!=mLastProcessTick )
{
LoggerService.Service.Info("Record", "------------------------------------------------------------");
LoggerService.Service.Info("Record", "<<<------------------------------------------------------>>>");
string timestring = "";
Stopwatch sw = new Stopwatch();
long ltmp;
sw.Start();
ltmp = sw.ElapsedMilliseconds;
timestring = "开始:"+ ltmp + ",";
//LoggerService.Service.Info("Record", "开始新的DataRegion");
if (mLastProcessTick != -1)
{
LoggerService.Service.Info("Record", "开始记录尾部数据");
//LoggerService.Service.Info("Record", "开始记录尾部数据");
//在内存尾部一次填充所有值
if (mCurrentMemory != null)
{
//foreach (var vv in mRecordTimerProcesser)
......@@ -487,11 +511,13 @@ namespace Cdy.Tag
// vv.RecordAllValue(dt);
//}
System.Threading.Tasks.Parallel.ForEach(mRecordTimerProcesser, (vv) => {
System.Threading.Tasks.Parallel.ForEach(mRecordTimerProcesser, (vv) =>
{
vv.RecordAllValue(dt);
});
System.Threading.Tasks.Parallel.ForEach(mValueChangedProcesser, (vv) => {
System.Threading.Tasks.Parallel.ForEach(mValueChangedProcesser, (vv) =>
{
vv.RecordAllValue(dt);
});
......@@ -500,41 +526,52 @@ namespace Cdy.Tag
// vv.RecordAllValue(dt);
//}
}
LoggerService.Service.Info("Record", "结束记录尾部数据");
timestring += "写入尾部数据:" + (sw.ElapsedMilliseconds - ltmp) + ",";
ltmp = sw.ElapsedMilliseconds;
//LoggerService.Service.Info("Record", "结束记录尾部数据");
mLastProcessTime = dt;
//将之前的Memory提交到历史存储流程中
SwitchMemory();
}
timestring += "内存初始化:" + (sw.ElapsedMilliseconds - ltmp) + ",";
ltmp = sw.ElapsedMilliseconds;
mLastProcessTick = mm;
LoggerService.Service.Info("Record",mCurrentMemory.Name + " 开始工作 ");
//LoggerService.Service.Info("Record",mCurrentMemory.Name + " 开始工作 ");
//在内存头部一次填充所有值
System.Threading.Tasks.Parallel.ForEach(mRecordTimerProcesser, (vv) => {
vv.WriteHeader();
vv.RecordAllValue(dt);
});
//foreach (var vv in mRecordTimerProcesser)
//{
// vv.WriteHeader();
// vv.RecordAllValue(dt);
//}
//foreach (var vv in mValueChangedProcesser)
//{
// vv.WriteHeader();
// vv.RecordAllValue(dt);
//}
System.Threading.Tasks.Parallel.ForEach(mValueChangedProcesser, (vv) => {
vv.WriteHeader();
System.Threading.Tasks.Parallel.ForEach(mRecordTimerProcesser, (vv) =>
{
//vv.WriteHeader();
vv.RecordAllValue(dt);
});
System.Threading.Tasks.Parallel.ForEach(mValueChangedProcesser, (vv) =>
{
//vv.WriteHeader();
vv.RecordAllValue(dt);
});
timestring += "写入头部值:" + (sw.ElapsedMilliseconds - ltmp) + ",";
ltmp = sw.ElapsedMilliseconds;
sw.Stop();
LoggerService.Service.Info("Record","内存初始化:"+ sw.ElapsedMilliseconds+" timespan:"+ timestring);
//LoggerService.Service.Info("Record", " 完成DataRegion切换 ");
LoggerService.Service.Info("Record", "------------------------------------------------------------");
LoggerService.Service.Info("Record", ">>>------------------------------------------------------<<<");
}
else
{
......@@ -586,6 +623,22 @@ namespace Cdy.Tag
}
/// <summary>
///
/// </summary>
/// <param name="memory"></param>
public void ClearMemoryHisData(MemoryBlock memory)
{
Stopwatch sw = new Stopwatch();
sw.Start();
foreach(var vv in mHisTags)
{
vv.Value.ClearDataValue(memory);
}
sw.Stop();
LoggerService.Service.Info("Record", "清空数据区耗时:" + sw.ElapsedMilliseconds);
}
#endregion ...Methods...
......
......@@ -212,9 +212,16 @@ namespace Cdy.Tag
int offset = 12;
for (int i = 0; i < count; i++)
{
var id = mProcessMemory.ReadInt(offset);
var addr = mProcessMemory.ReadLong(offset + 4);
memoryAddrs.Add(id, addr);
try
{
var id = mProcessMemory.ReadInt(offset);
var addr = mProcessMemory.ReadLong(offset + 4);
memoryAddrs.Add(id, addr);
}
catch
{
}
offset += 12;
}
......
......@@ -133,54 +133,70 @@ namespace Cdy.Tag
/// <summary>
/// 写入头部信息
/// </summary>
public void UpdateHeader()
/// <param name="block"></param>
public void UpdateHeader(MemoryBlock block)
{
//数据块头部结构
//数据区大小(int)+记录类型(byte)+变量类型(byte)+压缩类型(byte)+压缩参数1(float)+压缩参数2(float)+压缩参数3(float)
//var bids = BitConverter.GetBytes(this.HisQulityStartAddr - this.HisValueStartAddr);
//Buffer.BlockCopy(HisAddr, BlockHeadStartAddr, bids, 0, bids.Length);
HisAddr.WriteBytes(BlockHeadStartAddr, headBytes);
//HisAddr.WriteInt(BlockHeadStartAddr, this.HisQulityStartAddr - this.TimerValueStartAddr);
////写入记录类型
//HisAddr.WriteByte(BlockHeadStartAddr+4, (byte)this.Type);
////写入变量类型
//HisAddr.WriteByte(BlockHeadStartAddr+5, (byte)this.TagType);
////写入压缩类型
//HisAddr.WriteByte(BlockHeadStartAddr+6, (byte)this.CompressType);
////写入压缩附属参数
//HisAddr.WriteFloat(BlockHeadStartAddr + 7, CompressParameter1);
//HisAddr.WriteFloat(BlockHeadStartAddr + 11, CompressParameter2);
//HisAddr.WriteFloat(BlockHeadStartAddr + 15, CompressParameter3);
block.WriteBytes(BlockHeadStartAddr, headBytes);
}
/// <summary>
/// 清空数值区
/// </summary>
/// <param name="block"></param>
public void ClearDataValue(MemoryBlock memory)
{
long len = HisQulityStartAddr + MaxCount - TimerValueStartAddr;
memory.Clear(TimerValueStartAddr, len);
}
///// <summary>
///// 写入头部信息
///// </summary>
//public void UpdateHeader()
//{
// //数据块头部结构
// //数据区大小(int)+记录类型(byte)+变量类型(byte)+压缩类型(byte)+压缩参数1(float)+压缩参数2(float)+压缩参数3(float)
// //var bids = BitConverter.GetBytes(this.HisQulityStartAddr - this.HisValueStartAddr);
// //Buffer.BlockCopy(HisAddr, BlockHeadStartAddr, bids, 0, bids.Length);
// HisAddr.WriteBytes(BlockHeadStartAddr, headBytes);
// //HisAddr.WriteInt(BlockHeadStartAddr, this.HisQulityStartAddr - this.TimerValueStartAddr);
// ////写入记录类型
// //HisAddr.WriteByte(BlockHeadStartAddr+4, (byte)this.Type);
// ////写入变量类型
// //HisAddr.WriteByte(BlockHeadStartAddr+5, (byte)this.TagType);
// ////写入压缩类型
// //HisAddr.WriteByte(BlockHeadStartAddr+6, (byte)this.CompressType);
// ////写入压缩附属参数
// //HisAddr.WriteFloat(BlockHeadStartAddr + 7, CompressParameter1);
// //HisAddr.WriteFloat(BlockHeadStartAddr + 11, CompressParameter2);
// //HisAddr.WriteFloat(BlockHeadStartAddr + 15, CompressParameter3);
//}
/// <summary>
/// 在每个内存块的开始和结束部分插入值
/// </summary>
public void AppendValue(DateTime time)
public void AppendValue(int tim)
{
//数据内容:时间戳(time1+time2+...) + 数值区(value1+value2+...)+质量戳区(q1+q2+....)
//更新数值
//实时数据内存结构为:实时值+时间戳+质量戳
//写入时间戳
int tim = (int)((time - StartTime).TotalMilliseconds / HisEnginer.MemoryTimeTick);
HisAddr.WriteInt(TimerValueStartAddr + Count * 2, tim);
HisAddr.WriteIntDirect(TimerValueStartAddr + Count * 2, tim);
//写入数值
HisAddr.WriteBytes(HisValueStartAddr + Count * SizeOfValue, RealMemoryAddr, RealValueAddr, SizeOfValue);
HisAddr.WriteBytesDirect(HisValueStartAddr + Count * SizeOfValue, RealMemoryAddr, RealValueAddr, SizeOfValue);
//Buffer.BlockCopy(RealMemoryAddr, RealValueAddr, HisAddr, HisValueStartAddr + Count * SizeOfValue, SizeOfValue);
//更新质量戳
//实时数据内存结构为:实时值+时间戳+质量戳
//在现有质量戳基础上+100表示,该数值是强制添加到内存中的
byte bval = (byte)(RealMemoryAddr[RealValueAddr + SizeOfValue + 8] + 100);
HisAddr[HisQulityStartAddr + Count] = bval;
HisAddr.WriteByteDirect(HisQulityStartAddr + Count, bval);
Count = ++Count > MaxCount ? MaxCount : Count;
}
......@@ -188,24 +204,24 @@ namespace Cdy.Tag
/// <summary>
/// 更新历史数据到缓存中
/// </summary>
public void UpdateValue(DateTime time)
public void UpdateValue(int tim)
{
//数据内容: 时间戳(time1+time2+...) +数值区(value1+value2+...)+质量戳区(q1+q2+....)
//更新数值
//实时数据内存结构为:实时值+时间戳+质量戳
//Buffer.BlockCopy(RealMemoryAddr, RealValueAddr, HisAddr, HisValueStartAddr + Count * SizeOfValue, SizeOfValue);
//写入时间戳
int tim = (int)((time - StartTime).TotalMilliseconds / HisEnginer.MemoryTimeTick);
//int tim = (int)((time - StartTime).TotalMilliseconds / HisEnginer.MemoryTimeTick);
HisAddr.WriteInt(TimerValueStartAddr + Count * 2, tim);
HisAddr.WriteIntDirect(TimerValueStartAddr + Count * 2, tim);
//写入数值
HisAddr.WriteBytes(HisValueStartAddr + Count * SizeOfValue, RealMemoryAddr, RealValueAddr, SizeOfValue);
HisAddr.WriteBytesDirect(HisValueStartAddr + Count * SizeOfValue, RealMemoryAddr, RealValueAddr, SizeOfValue);
//更新质量戳
//实时数据内存结构为:实时值+时间戳+质量戳
HisAddr[HisQulityStartAddr + Count] = RealMemoryAddr[RealValueAddr + SizeOfValue + 8];
HisAddr.WriteByteDirect(HisQulityStartAddr + Count, RealMemoryAddr[RealValueAddr + SizeOfValue + 8]);
// HisAddr[HisQulityStartAddr + Count] = RealMemoryAddr[RealValueAddr + SizeOfValue + 8];
// Buffer.BlockCopy(RealMemoryAddr, RealValueAddr + SizeOfValue + 8, HisAddr, HisQulityStartAddr + Count, 1);
......
......@@ -148,19 +148,19 @@ namespace Cdy.Tag
mCurrentCount = 0;
}
/// <summary>
///
/// </summary>
public void WriteHeader()
{
foreach(var vv in mTimerTags.Values)
{
foreach(var vvv in vv)
{
vvv.UpdateHeader();
}
}
}
///// <summary>
/////
///// </summary>
//public void WriteHeader()
//{
// foreach(var vv in mTimerTags.Values)
// {
// foreach(var vvv in vv)
// {
// vvv.UpdateHeader();
// }
// }
//}
/// <summary>
/// 记录所有值
......@@ -232,9 +232,11 @@ namespace Cdy.Tag
/// <param name="tags"></param>
private void ProcessAppendValue(List<HisRunTag> tags)
{
int tim = (int)((mLastUpdateTime - HisRunTag.StartTime).TotalMilliseconds / HisEnginer.MemoryTimeTick);
foreach (var vv in tags)
{
vv.AppendValue(mLastUpdateTime);
vv.AppendValue(tim);
}
}
......@@ -244,9 +246,10 @@ namespace Cdy.Tag
/// <param name="tags"></param>
private void ProcessTags(List<HisRunTag> tags)
{
foreach(var vv in tags)
int tim = (int)((mLastUpdateTime - HisRunTag.StartTime).TotalMilliseconds / HisEnginer.MemoryTimeTick);
foreach (var vv in tags)
{
vv.UpdateValue(mLastUpdateTime);
vv.UpdateValue(tim);
}
}
......
......@@ -159,16 +159,16 @@ namespace Cdy.Tag
mCurrentCount = 0;
}
/// <summary>
///
/// </summary>
public void WriteHeader()
{
foreach (var vv in mTags.Values)
{
vv.UpdateHeader();
}
}
///// <summary>
/////
///// </summary>
//public void WriteHeader()
//{
// foreach (var vv in mTags.Values)
// {
// vv.UpdateHeader();
// }
//}
/// <summary>
/// 记录所有值
......@@ -178,15 +178,17 @@ namespace Cdy.Tag
try
{
mLastUpdateTime = time;
int tim = (int)((mLastUpdateTime - HisRunTag.StartTime).TotalMilliseconds / HisEnginer.MemoryTimeTick);
foreach (var vv in mTags)
{
if (mChangedTags.ContainsKey(vv.Key) && mChangedTags[vv.Key])
{
mTags[vv.Key].UpdateValue(mLastUpdateTime);
mTags[vv.Key].UpdateValue(tim);
}
else
{
vv.Value.AppendValue(mLastUpdateTime);
vv.Value.AppendValue(tim);
}
}
}
......@@ -209,11 +211,12 @@ namespace Cdy.Tag
if (mIsClosed) break;
try
{
int tim = (int)((mLastUpdateTime - HisRunTag.StartTime).TotalMilliseconds / HisEnginer.MemoryTimeTick);
foreach (var vv in mChangedTags)
{
if (vv.Value)
{
mTags[vv.Key].UpdateValue(mLastUpdateTime);
mTags[vv.Key].UpdateValue(tim);
}
else
{
......
//==============================================================
// Copyright (C) 2020 Inc. All rights reserved.
//
//==============================================================
// Create by 种道洋 at 2020/2/13 14:07:00.
// Version 1.0
// 种道洋
//==============================================================
using System;
using System.Collections.Generic;
using System.Text;
namespace Cdy.Tag
{
/// <summary>
///
/// </summary>
public interface IHisEngine
{
/// <summary>
/// 清空内存数据区域
/// </summary>
public void ClearMemoryHisData(MemoryBlock memory);
}
}
......@@ -183,6 +183,8 @@ namespace Cdy.Tag
ServiceLocator.Locator.Registor<IRealData>(realEnginer);
ServiceLocator.Locator.Registor<IRealDataNotify>(realEnginer);
ServiceLocator.Locator.Registor<IHisEngine>(hisEnginer);
ServiceLocator.Locator.Registor<IDataCompress>(compressEnginer);
ServiceLocator.Locator.Registor<IDataSerialize>(seriseEnginer);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册