Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
cdy816
Mars
提交
5f951971
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 搜索 >>
提交
5f951971
编写于
2月 14, 2020
作者:
cdy816
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
性能优化
上级
45d7b693
变更
19
隐藏空白更改
内联
并排
Showing
19 changed file
with
504 addition
and
159 deletion
+504
-159
Cdy.Tag.Common/Cdy.Tag.Common.csproj
Cdy.Tag.Common/Cdy.Tag.Common.csproj
+4
-0
Cdy.Tag.Common/Common/MemoryBlock.cs
Cdy.Tag.Common/Common/MemoryBlock.cs
+232
-4
Cdy.Tag.Common/Common/MemoryHelper.cs
Cdy.Tag.Common/Common/MemoryHelper.cs
+35
-35
Cdy.Tag.Common/bin/Debug/netstandard2.0/Cdy.Tag.Common.dll
Cdy.Tag.Common/bin/Debug/netstandard2.0/Cdy.Tag.Common.dll
+0
-0
Cdy.Tag.Common/bin/Debug/netstandard2.0/Cdy.Tag.Common.pdb
Cdy.Tag.Common/bin/Debug/netstandard2.0/Cdy.Tag.Common.pdb
+0
-0
Cdy.Tag.Common/obj/Debug/netstandard2.0/Cdy.Tag.Common.dll
Cdy.Tag.Common/obj/Debug/netstandard2.0/Cdy.Tag.Common.dll
+0
-0
Cdy.Tag.Common/obj/Debug/netstandard2.0/Cdy.Tag.Common.pdb
Cdy.Tag.Common/obj/Debug/netstandard2.0/Cdy.Tag.Common.pdb
+0
-0
Cdy.Tag/obj/Debug/netstandard2.0/Cdy.Tag.csproj.FileListAbsolute.txt
.../Debug/netstandard2.0/Cdy.Tag.csproj.FileListAbsolute.txt
+0
-1
DataRunner/DataRunner.csproj
DataRunner/DataRunner.csproj
+4
-0
DataRunner/His/Compress/CompressEnginer.cs
DataRunner/His/Compress/CompressEnginer.cs
+2
-1
DataRunner/His/HisEnginer.cs
DataRunner/His/HisEnginer.cs
+101
-48
DataRunner/His/Serise/SeriseEnginer.cs
DataRunner/His/Serise/SeriseEnginer.cs
+10
-3
DataRunner/His/Tag/HisRunTag.cs
DataRunner/His/Tag/HisRunTag.cs
+54
-38
DataRunner/His/TimerMemoryCacheProcesser.cs
DataRunner/His/TimerMemoryCacheProcesser.cs
+19
-16
DataRunner/His/ValueChangedMemoryCacheProcesser.cs
DataRunner/His/ValueChangedMemoryCacheProcesser.cs
+16
-13
DataRunner/Interface/IHisEngine.cs
DataRunner/Interface/IHisEngine.cs
+25
-0
DataRunner/Runner.cs
DataRunner/Runner.cs
+2
-0
Mars/.vs/Mars/v16/.suo
Mars/.vs/Mars/v16/.suo
+0
-0
Mars/.vs/Mars/v16/Server/sqlite3/storage.ide
Mars/.vs/Mars/v16/Server/sqlite3/storage.ide
+0
-0
未找到文件。
Cdy.Tag.Common/Cdy.Tag.Common.csproj
浏览文件 @
5f951971
...
...
@@ -8,4 +8,8 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
</Project>
Cdy.Tag.Common/Common/MemoryBlock.cs
浏览文件 @
5f951971
...
...
@@ -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>
...
...
Cdy.Tag.Common/Common/MemoryHelper.cs
浏览文件 @
5f951971
...
...
@@ -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
)
{
...
...
Cdy.Tag.Common/bin/Debug/netstandard2.0/Cdy.Tag.Common.dll
浏览文件 @
5f951971
无法预览此类型文件
Cdy.Tag.Common/bin/Debug/netstandard2.0/Cdy.Tag.Common.pdb
浏览文件 @
5f951971
无法预览此类型文件
Cdy.Tag.Common/obj/Debug/netstandard2.0/Cdy.Tag.Common.dll
浏览文件 @
5f951971
无法预览此类型文件
Cdy.Tag.Common/obj/Debug/netstandard2.0/Cdy.Tag.Common.pdb
浏览文件 @
5f951971
无法预览此类型文件
Cdy.Tag/obj/Debug/netstandard2.0/Cdy.Tag.csproj.FileListAbsolute.txt
浏览文件 @
5f951971
...
...
@@ -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
DataRunner/DataRunner.csproj
浏览文件 @
5f951971
...
...
@@ -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" />
...
...
DataRunner/His/Compress/CompressEnginer.cs
浏览文件 @
5f951971
...
...
@@ -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
);
...
...
DataRunner/His/HisEnginer.cs
浏览文件 @
5f951971
...
...
@@ -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", "内存初始化开始 清空完成");
//写入时间
mCurrentM
emory
.
WriteDatetime
(
1
,
mLastProcessTime
);
//
//
写入时间
//m
emory.WriteDatetime(1, mLastProcessTime);
//写入变量个数
m
CurrentM
emory
.
WriteInt
(
9
,
mTagCount
);
memory
.
WriteInt
(
9
,
mTagCount
);
//写入时间内存保存数据的时间
m
CurrentM
emory
.
WriteInt
(
13
,
MemoryCachTime
);
memory
.
WriteInt
(
13
,
MemoryCachTime
);
//写入最小时间间隔
m
CurrentM
emory
.
WriteInt
(
17
,
MemoryTimeTick
);
memory
.
WriteInt
(
17
,
MemoryTimeTick
);
int
offset
=
21
;
//LoggerService.Service.Info("Record", "内存初始化开始 头数据写入完成");
foreach
(
var
vv
in
mHisTags
)
{
m
CurrentM
emory
.
WriteInt
(
offset
,
vv
.
Value
.
Id
);
//Tag id int(4)
m
CurrentM
emory
.
WriteInt
(
offset
+
4
,
vv
.
Value
.
BlockHeadStartAddr
);
//历史数据偏移地址 int(4)
m
CurrentM
emory
.
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
...
...
...
DataRunner/His/Serise/SeriseEnginer.cs
浏览文件 @
5f951971
...
...
@@ -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
;
}
...
...
DataRunner/His/Tag/HisRunTag.cs
浏览文件 @
5f951971
...
...
@@ -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
.
WriteInt
Direct
(
TimerValueStartAddr
+
Count
*
2
,
tim
);
//写入数值
HisAddr
.
WriteBytes
(
HisValueStartAddr
+
Count
*
SizeOfValue
,
RealMemoryAddr
,
RealValueAddr
,
SizeOfValue
);
HisAddr
.
WriteBytes
Direct
(
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
.
WriteInt
Direct
(
TimerValueStartAddr
+
Count
*
2
,
tim
);
//写入数值
HisAddr
.
WriteBytes
(
HisValueStartAddr
+
Count
*
SizeOfValue
,
RealMemoryAddr
,
RealValueAddr
,
SizeOfValue
);
HisAddr
.
WriteBytes
Direct
(
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);
...
...
DataRunner/His/TimerMemoryCacheProcesser.cs
浏览文件 @
5f951971
...
...
@@ -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
);
}
}
...
...
DataRunner/His/ValueChangedMemoryCacheProcesser.cs
浏览文件 @
5f951971
...
...
@@ -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
{
...
...
DataRunner/Interface/IHisEngine.cs
0 → 100644
浏览文件 @
5f951971
//==============================================================
// 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
);
}
}
DataRunner/Runner.cs
浏览文件 @
5f951971
...
...
@@ -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
);
...
...
Mars/.vs/Mars/v16/.suo
浏览文件 @
5f951971
无法预览此类型文件
Mars/.vs/Mars/v16/Server/sqlite3/storage.ide
浏览文件 @
5f951971
无法预览此类型文件
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录