diff --git a/HTCoreServiceApp/Common/ScanTagsPara.cs b/HTCoreServiceApp/Common/ScanTagsPara.cs
index 3b1240c..4d53c15 100644
--- a/HTCoreServiceApp/Common/ScanTagsPara.cs
+++ b/HTCoreServiceApp/Common/ScanTagsPara.cs
@@ -18,6 +18,19 @@ namespace HTCoreServiceApp.Common
public string SystemName { get; set; }
public string GroupName { get; set; }
public int? UpdateRate { get; set; }
+ ///
+ /// 数据存储周期(毫秒),用于控制数据存储到数据库的频率
+ /// 默认值: 1000
+ ///
+ public int? StorageRate { get; set; } = 1000;
+ ///
+ /// 存储周期计时器,记录距离上次存储的累计时间(毫秒)
+ ///
+ public long StorageTimer { get; set; }
+ ///
+ /// 上次存储的时间戳
+ ///
+ public long LastStorageTime { get; set; }
public string DriverName { get; set;}
public AddressArg AddressArg { get; set; }
public bool IncludeBChaned { get; set; }
diff --git a/HTCoreServiceApp/Communicate/ModbusTcp/ModbusTcpClientExample.cs b/HTCoreServiceApp/Communicate/ModbusTcp/ModbusTcpClientExample.cs
index 9d6da02..21bef3f 100644
--- a/HTCoreServiceApp/Communicate/ModbusTcp/ModbusTcpClientExample.cs
+++ b/HTCoreServiceApp/Communicate/ModbusTcp/ModbusTcpClientExample.cs
@@ -99,8 +99,19 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
ScanTagsPara scanTagsPara = new ScanTagsPara();
scanTagsPara.GroupName = MetaGroups.Where(x=>x.GroupId == metaGroup.Key.GroupId).ToList().First().GroupName;
scanTagsPara.UpdateRate = MetaGroups.Where(x => x.GroupId == metaGroup.Key.GroupId).ToList().First().UpdateRate;
+ scanTagsPara.StorageRate = MetaGroups.Where(x => x.GroupId == metaGroup.Key.GroupId).ToList().First().StorageRate;
scanTagsPara.IsConsecutive = (bool)MetaGroups.Where(x => x.GroupId == metaGroup.Key.GroupId).ToList().First().IsActive;
scanTagsPara.IsActive = MetaGroups.Where(x => x.GroupId == metaGroup.Key.GroupId).ToList().First().IsActive;
+
+ // 初始化存储周期相关字段
+ scanTagsPara.StorageTimer = 0;
+ scanTagsPara.LastStorageTime = 0;
+ // 如果没有设置存储周期,默认等于更新周期(保持原有行为)
+ if (scanTagsPara.StorageRate == null || scanTagsPara.StorageRate <= 0)
+ {
+ scanTagsPara.StorageRate = scanTagsPara.UpdateRate;
+ }
+
scanTagsPara.ScanTags = MetaTags.Where(x => x.GroupId == metaGroup.Key.GroupId).ToList();
if (scanTagsPara.ScanTags.Count < 1)
{
@@ -239,7 +250,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
var t1 = DateTime.Now.Millisecond;
Console.WriteLine(string.Join(",", buffer) + "ModbusTcp读取完成:" + " 字数:" + amount.ToString());
//Task saveResult = DataExtract.DataExtractCAsync(scanTagsPara.ScanTags, scanTagsPara.GroupName, scanTagsPara.DriverName, buffer, addressArg);
- DataExtractMB.DataExtractCAsync(scanTagsPara.ScanTags, scanTagsPara.SystemName, scanTagsPara.GroupName, scanTagsPara.DriverName, buffer, addressArg);
+ DataExtractMB.DataExtractCAsync(scanTagsPara.ScanTags, scanTagsPara.SystemName, scanTagsPara.GroupName, scanTagsPara.DriverName, buffer, addressArg, scanTagsPara);
var t2 = DateTime.Now.Millisecond;
var timediff = t2 - t1;
Console.WriteLine($"ModbusTcp缓存和储存耗时:{timediff}");
diff --git a/HTCoreServiceApp/DataHandle/DataExtractMB.cs b/HTCoreServiceApp/DataHandle/DataExtractMB.cs
index f075c52..cc20ba8 100644
--- a/HTCoreServiceApp/DataHandle/DataExtractMB.cs
+++ b/HTCoreServiceApp/DataHandle/DataExtractMB.cs
@@ -20,7 +20,18 @@ namespace HTCoreServiceApp.DataHandle
{
string res = await DataExtractConsecutive(metaTags, systenName, groupName, driverName, bytes, addressArg);
}
- public static Task DataExtractConsecutive(List metaTags, string systenName, string groupName, string driverName, int[] bytes, AddressArg addressArg)
+
+ public static async void DataExtractCAsync(List metaTags, string systenName, string groupName, string driverName, int[] bytes, AddressArg addressArg, ScanTagsPara scanTagsPara)
+ {
+ string res = await DataExtractConsecutive(metaTags, systenName, groupName, driverName, bytes, addressArg, scanTagsPara);
+ }
+
+ public static Task DataExtractConsecutive(List metaTags, string systenName, string groupName, string driverName, int[] bytes, AddressArg addressArg)
+ {
+ return DataExtractConsecutive(metaTags, systenName, groupName, driverName, bytes, addressArg, null);
+ }
+
+ public static Task DataExtractConsecutive(List metaTags, string systenName, string groupName, string driverName, int[] bytes, AddressArg addressArg, ScanTagsPara scanTagsPara)
{
return Task.Run(() =>
{
@@ -55,15 +66,29 @@ namespace HTCoreServiceApp.DataHandle
//Console.WriteLine($"转换耗时:{timess}");
//Console.WriteLine(string.Join(",", (Array)listMetaTagValue.ToArray()) + "字节数据转换完成" + ",数据量:" + listMetaTagValue.Count.ToString());
- //异步缓存
+ //异步缓存 - 始终执行,用于实时数据更新
Task.Run(()=>
DataLiving.DataLive2CaChe(listMetaTagValue, driverName, groupName)
);
- //异步储存
- Task.Run(() =>
- DataStorage.DataSave2DB(listMetaTagValue, systenName, driverName, groupName, hdatetime)
- );
+ //异步储存 - 根据存储周期控制是否执行
+ bool shouldStore = true;
+ if (scanTagsPara != null)
+ {
+ shouldStore = CheckStorageTiming(scanTagsPara, hdatetime);
+ }
+
+ if (shouldStore)
+ {
+ Task.Run(() =>
+ DataStorage.DataSave2DB(listMetaTagValue, systenName, driverName, groupName, hdatetime)
+ );
+ Console.WriteLine($"{driverName}_{groupName}执行数据存储");
+ }
+ else
+ {
+ Console.WriteLine($"{driverName}_{groupName}跳过数据存储(未到存储周期)");
+ }
return "0";
}
@@ -74,6 +99,38 @@ namespace HTCoreServiceApp.DataHandle
});
}
+ ///
+ /// 检查是否到达存储周期
+ /// 每一秒(unix时间戳的每一秒内)必须触发一次存储
+ ///
+ /// 扫描参数
+ /// 当前时间戳
+ /// 是否应该执行存储
+ private static bool CheckStorageTiming(ScanTagsPara scanTagsPara, long currentTime)
+ {
+ // 获取当前时间戳的秒数(去掉毫秒部分)
+ long currentSecond = currentTime / 1000;
+
+ // 如果是第一次执行,直接存储
+ if (scanTagsPara.LastStorageTime == 0)
+ {
+ scanTagsPara.LastStorageTime = currentTime;
+ return true;
+ }
+
+ // 获取上次存储时间的秒数(去掉毫秒部分)
+ long lastStorageSecond = scanTagsPara.LastStorageTime / 1000;
+
+ // 如果当前秒数大于上次存储的秒数,说明已经进入新的一秒,需要执行存储
+ if (currentSecond > lastStorageSecond)
+ {
+ scanTagsPara.LastStorageTime = currentTime;
+ return true;
+ }
+
+ return false;
+ }
+
///
/// 父类的value赋值给子类
///
diff --git a/HTCoreServiceApp/Models/MetaGroup.cs b/HTCoreServiceApp/Models/MetaGroup.cs
index 4db31a1..8f800e4 100644
--- a/HTCoreServiceApp/Models/MetaGroup.cs
+++ b/HTCoreServiceApp/Models/MetaGroup.cs
@@ -36,6 +36,12 @@ namespace HTCoreServiceApp.Models
[SugarColumn(ColumnName="UpdateRate" )]
public int? UpdateRate { get; set; }
///
+ /// 数据存储周期(毫秒),用于控制数据存储到数据库的频率,应小于等于UpdateRate
+ /// 默认值: ((1000))
+ ///
+ [SugarColumn(ColumnName="StorageRate" )]
+ public int? StorageRate { get; set; } = 1000;
+ ///
///
///
[SugarColumn(ColumnName="DeadBand" )]
diff --git a/HTCoreServiceApp/appsettings.json b/HTCoreServiceApp/appsettings.json
index 7948782..4bddc66 100644
--- a/HTCoreServiceApp/appsettings.json
+++ b/HTCoreServiceApp/appsettings.json
@@ -1,7 +1,7 @@
{
"ConnectionStrings": {
"Type": "SqlServer",
- "SqlServer": "Zk48ARnbLq1Lk+lzxvCij1zzENjv04mu23Y8D8hdM3VxApXnvB2iA7xm5JfYWNkbLw7YB0A01VrIJSpoUrEMyqiV8fRiux6LH2hkV1/VLUdoCCG+zOCCkqgML8iuOSXlbE2i3UagxHrXZhgxt4C3ifaWykWgbiGq9h4U4WfKnimMXuCqhSgUm9Gk3c/2KDxSWgLrKUW29N2X4oWhBbwjWg=="
+ "SqlServer": "Zk48ARnbLq1Lk+lzxvCij1zzENjv04mu23Y8D8hdM3VxApXnvB2iA7xm5JfYWNkbR4m0u8SvmSkPpW1HqgyIlX9lbHiIuIQpS6lLThUT43JYrzX58HTXFtr/7DZ/QgrdUaOZqOBpVB9riZ4eSsJ+swn6WOptm+aEuvxLC/6Te15/OW/WsUX/Mhwb55VidHdGGLY2nbbpX8GYelD8PXMznA=="
},
"Logging": {
"LogLevel": {