Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
cdy816
Mars
提交
2b3d6b81
Mars
项目概览
cdy816
/
Mars
通知
3
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Mars
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
2b3d6b81
编写于
10月 13, 2020
作者:
cdy816
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Bug 修改
上级
42dd0285
变更
14
隐藏空白更改
内联
并排
Showing
14 changed file
with
527 addition
and
97 deletion
+527
-97
Common/Cdy.Tag.Common/Common/FixedMemoryBlock.cs
Common/Cdy.Tag.Common/Common/FixedMemoryBlock.cs
+2
-2
Common/Cdy.Tag.Common/Common/MarshalFixedMemoryBlock.cs
Common/Cdy.Tag.Common/Common/MarshalFixedMemoryBlock.cs
+2
-2
Common/Cdy.Tag.Common/Common/MarshalMemoryBlock.cs
Common/Cdy.Tag.Common/Common/MarshalMemoryBlock.cs
+8
-2
Common/Cdy.Tag.Common/Common/MemoryBlock.cs
Common/Cdy.Tag.Common/Common/MemoryBlock.cs
+2
-2
Common/Cdy.Tag.Driver/IRealTagProducter.cs
Common/Cdy.Tag.Driver/IRealTagProducter.cs
+7
-1
Common/Cdy.Tag.Driver/ITagHisvalueProducter.cs
Common/Cdy.Tag.Driver/ITagHisvalueProducter.cs
+39
-0
Driver/SimDriver/Driver.cs
Driver/SimDriver/Driver.cs
+48
-2
RunTime/DBInRun/Properties/launchSettings.json
RunTime/DBInRun/Properties/launchSettings.json
+1
-1
RunTime/DBRuntime/His/Compress/CompressMemory2.cs
RunTime/DBRuntime/His/Compress/CompressMemory2.cs
+2
-2
RunTime/DBRuntime/His/Compress/Special/LosslessCompressUnit2.cs
...e/DBRuntime/His/Compress/Special/LosslessCompressUnit2.cs
+1
-1
RunTime/DBRuntime/His/HisEnginer2.cs
RunTime/DBRuntime/His/HisEnginer2.cs
+279
-40
RunTime/DBRuntime/His/ManualHisDataMemoryBlockPool.cs
RunTime/DBRuntime/His/ManualHisDataMemoryBlockPool.cs
+37
-17
RunTime/DBRuntime/His/MarshalMemoryBlockPool.cs
RunTime/DBRuntime/His/MarshalMemoryBlockPool.cs
+25
-12
RunTime/DBRuntime/His/SeriseEnginer2.cs
RunTime/DBRuntime/His/SeriseEnginer2.cs
+74
-13
未找到文件。
Common/Cdy.Tag.Common/Common/FixedMemoryBlock.cs
浏览文件 @
2b3d6b81
...
...
@@ -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;
}
...
...
Common/Cdy.Tag.Common/Common/MarshalFixedMemoryBlock.cs
浏览文件 @
2b3d6b81
...
...
@@ -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;
}
...
...
Common/Cdy.Tag.Common/Common/MarshalMemoryBlock.cs
浏览文件 @
2b3d6b81
...
...
@@ -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;
}
...
...
Common/Cdy.Tag.Common/Common/MemoryBlock.cs
浏览文件 @
2b3d6b81
...
...
@@ -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;
}
...
...
Common/Cdy.Tag.Driver/IRealTagProducter.cs
浏览文件 @
2b3d6b81
...
...
@@ -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>
...
...
Common/Cdy.Tag.Driver/ITagHisvalueProducter.cs
浏览文件 @
2b3d6b81
...
...
@@ -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>
...
...
Driver/SimDriver/Driver.cs
浏览文件 @
2b3d6b81
...
...
@@ -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
);
}
...
...
RunTime/DBInRun/Properties/launchSettings.json
浏览文件 @
2b3d6b81
...
...
@@ -2,7 +2,7 @@
"profiles"
:
{
"DBInRun"
:
{
"commandName"
:
"Executable"
,
"executablePath"
:
"C:
\\
Users
\\
c
dy81
\\
source
\\
repos
\\
mars
\\
Output
\\
DBInRun.exe"
"executablePath"
:
"C:
\\
Users
\\
c
hongdaoyang
\\
source
\\
repos
\\
mars
\\
Output
\\
DBInRun.exe"
}
}
}
\ No newline at end of file
RunTime/DBRuntime/His/Compress/CompressMemory2.cs
浏览文件 @
2b3d6b81
...
...
@@ -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); //写入数据大小
...
...
RunTime/DBRuntime/His/Compress/Special/LosslessCompressUnit2.cs
浏览文件 @
2b3d6b81
...
...
@@ -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
)
...
...
RunTime/DBRuntime/His/HisEnginer2.cs
浏览文件 @
2b3d6b81
...
...
@@ -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
.
T
ime
.
Date
;
var
mms
=
(
int
)(
value
.
T
ime
.
Subtract
(
vdata
).
TotalSeconds
/
MergeMemoryTime
);
var
vdata
=
datet
ime
.
Date
;
var
mms
=
(
int
)(
datet
ime
.
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
.
T
ime
>
hb
.
EndTime
)
if
(
hb
.
CurrentCount
<
hb
.
MaxCount
&&
datet
ime
>
hb
.
EndTime
)
{
hb
.
Lock
();
var
vtime
=
(
int
)((
value
.
T
ime
-
hb
.
Time
).
TotalMilliseconds
/
timeUnit
);
var
vtime
=
(
int
)((
datet
ime
-
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
.
Q
uality
);
hb
.
EndTime
=
value
.
T
ime
;
hb
.
WriteInt
(
hb
.
QualityAddress
+
hb
.
CurrentCount
,
q
uality
);
hb
.
EndTime
=
datet
ime
;
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
...
...
...
RunTime/DBRuntime/His/ManualHisDataMemoryBlockPool.cs
浏览文件 @
2b3d6b81
...
...
@@ -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
(
m
Free
Pools
)
{
if
(
mPools
.
ContainsKey
(
size
))
if
(
m
Free
Pools
.
ContainsKey
(
size
))
{
var
pp
=
m
Pools
[
size
].
Where
(
e
=>
!
e
.
Value
)
;
if
(
pp
.
Count
()
>
0
)
var
pp
=
m
FreePools
[
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
();
}
}
...
...
RunTime/DBRuntime/His/MarshalMemoryBlockPool.cs
浏览文件 @
2b3d6b81
...
...
@@ -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
(
m
Free
Pools
)
{
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
...
...
...
RunTime/DBRuntime/His/SeriseEnginer2.cs
浏览文件 @
2b3d6b81
...
...
@@ -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
.
Id
Start
&&
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录