提交 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)
......
......@@ -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.
先完成此消息的编辑!
想要评论请 注册