diff --git a/HTCoreServiceApp/Common/ScanTimer.cs b/HTCoreServiceApp/Common/ScanTimer.cs index 47e14ff..da6bb72 100644 --- a/HTCoreServiceApp/Common/ScanTimer.cs +++ b/HTCoreServiceApp/Common/ScanTimer.cs @@ -9,9 +9,11 @@ namespace HTCoreServiceApp.Common public class ScanTimer : System.Timers.Timer { private List scanTagsParas; + private ScanTagsPara scanTagsPara; private AddressArg addressArg; public List ScanTagsParas { get => scanTagsParas; set => scanTagsParas = value; } + public ScanTagsPara ScanTagsPara { get => scanTagsPara; set => scanTagsPara = value; } public AddressArg AddressArg { get => addressArg; set => addressArg = value; } diff --git a/HTCoreServiceApp/Communicate/DriverSiemensS7/S7ClientExample.cs b/HTCoreServiceApp/Communicate/DriverSiemensS7/S7ClientExample.cs index 1e12738..c3a5695 100644 --- a/HTCoreServiceApp/Communicate/DriverSiemensS7/S7ClientExample.cs +++ b/HTCoreServiceApp/Communicate/DriverSiemensS7/S7ClientExample.cs @@ -80,7 +80,7 @@ namespace HTCoreServiceApp.Communicate.DriverSiemensS7 Client.SetConnectionType(0x3); Client.ConnTimeout= Timeout; - Client.RecvTimeout = 50; + Client.RecvTimeout = 200; @@ -168,21 +168,24 @@ namespace HTCoreServiceApp.Communicate.DriverSiemensS7 /// public void ScanConsecutive(List scanTagsParas) { - ScanTimer timerScan = new ScanTimer(); - if (scanTagsParas[0].UpdateRate > 0) + foreach (var scanTagsPara in scanTagsParas) { - timerScan.Interval = (double)scanTagsParas[0].UpdateRate; - } - else - { - timerScan.Interval = 1000; - } - timerScan.ScanTagsParas= scanTagsParas; + ScanTimer timerScan = new ScanTimer(); + if (scanTagsPara.UpdateRate > 0) + { + timerScan.Interval = (double)scanTagsPara.UpdateRate; + } + else + { + timerScan.Interval = 1000; + } + timerScan.ScanTagsPara = scanTagsPara; - //timerScan.AddressArg = PLCHelper.GetAddressArg(scanTagsParas.ScanTags); + //timerScan.AddressArg = PLCHelper.GetAddressArg(scanTagsParas.ScanTags); - timerScan.Elapsed += new System.Timers.ElapsedEventHandler(TimerScanConsecutive_Elapsed); - timerScan.Enabled = true; + timerScan.Elapsed += new System.Timers.ElapsedEventHandler(TimerScanConsecutive_Elapsed); + timerScan.Enabled = true; + } } /// /// 连续读取timer事件 @@ -191,157 +194,157 @@ namespace HTCoreServiceApp.Communicate.DriverSiemensS7 /// private void TimerScanConsecutive_Elapsed(object? sender, System.Timers.ElapsedEventArgs e) { + long hdatetime = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds(); ScanTimer timerScan = (ScanTimer)sender; - List scanTagsParas = timerScan.ScanTagsParas; + ScanTagsPara scanTagsPara = timerScan.ScanTagsPara; //AddressArg addressArg = timerScan.AddressArg; - foreach (var scanTagsPara in scanTagsParas) + + if (scanTagsPara.IsActive == false) + return; + if (Client.Connected) { - if (scanTagsPara.IsActive == false) - break; - if (Client.Connected) + + var addressArg = scanTagsPara.AddressArg; + + //object _lock = new(); + + Task task = Task.Run(() => { - - var addressArg = scanTagsPara.AddressArg; - - //object _lock = new(); - - Task task = Task.Run(() => + lock (_lock) { - lock (_lock) + try { - try + var tcollstart = DateTime.Now; + //CodingTools.StartTime = DateTime.Now.Millisecond;//de + //scanTagsPara.ScanTags.Min(x => x.Address); + //scanTagsPara.ScanTags.Min(x => x.Address);提高速度应放在timer事件前,测试后更改 + int startAdress = addressArg.Start; + int Area = 132; + int DBNumber = 0; + if (scanTagsPara.GroupName.Contains("DB")) { - var tcollstart = DateTime.Now; - //CodingTools.StartTime = DateTime.Now.Millisecond;//de - //scanTagsPara.ScanTags.Min(x => x.Address); - //scanTagsPara.ScanTags.Min(x => x.Address);提高速度应放在timer事件前,测试后更改 - int startAdress = addressArg.Start; - int Area = 132; - int DBNumber = 0; - if (scanTagsPara.GroupName.Contains("DB")) + DBNumber = int.Parse(Regex.Replace(scanTagsPara.GroupName, "[a-z]", "", RegexOptions.IgnoreCase)); + } + else + { + DBNumber = int.Parse(scanTagsPara.GroupName); + } + int amount = addressArg.Length; + int WordLen = 2; + byte[] buffer = new byte[amount]; + int pdu = PLCHelper.GetSiemensPDU(PLCType) * 2 - 18; + int Result = 0; + + + //byte[] bufferr = new byte[amount]; + Result = ReadArea(Area, DBNumber, startAdress, amount, WordLen, ref buffer); + + + //if (amount <= pdu) + //{ + // Result = ReadArea(Area, DBNumber, startAdress, amount, WordLen, ref buffer); + //} + //else + //{ + // //int additional = amount- pdu; + // int forCount = (int)Math.Ceiling(float.Parse(((float)amount / (float)pdu).ToString())); + // List bytes= new List(); + // for (int i = 0; i < forCount; i++) + // { + // if ((amount - (i * pdu)) > pdu) + // { + // int start = startAdress + i * pdu; + // byte[] bytes1 = new byte[pdu]; + // Result = ReadArea(Area, DBNumber, start, pdu, WordLen, ref bytes1); + // bytes.Add(bytes1); + // } + // else + // { + // int start = startAdress + i * pdu; + // byte[] bytes1 = new byte[amount - (i * pdu)]; + // Result = ReadArea(Area, DBNumber, start, amount - (i * pdu), WordLen, ref bytes1); + // bytes.Add(bytes1); + // } + // Thread.Sleep(3); + // } + // var byetstemp = Array.Empty(); + // foreach (var buff in bytes) + // { + // byetstemp = byetstemp.Concat(buff).ToArray(); + // } + // buffer = byetstemp; + //} + + + var tcollend = DateTime.Now; + var timecolldiff = tcollend - tcollstart; + Console.WriteLine($"S7读取耗时:{timecolldiff},设备:{DriverName}变量组:{scanTagsPara.GroupName}"); + //CodingTools.EndTime = DateTime.Now.Millisecond;//de + //var timess = (CodingTools.EndTime - CodingTools.StartTime).ToString(); + //Console.WriteLine($"读取耗时:{timess}"); + if (Result == 0) + { + var t1 = DateTime.Now; + Console.WriteLine(string.Join(",", buffer) + "S7读取完成:DB" + DBNumber.ToString() + ",字节数:" + amount.ToString()); + //Task saveResult = DataExtract.DataExtractCAsync(scanTagsPara.ScanTags, scanTagsPara.GroupName, scanTagsPara.DriverName, buffer, addressArg); + var ss = new DataExtract(); + + Task.Run(()=> + + ss.DataExtractCAsync(scanTagsPara.ScanTags, scanTagsPara.SystemName, scanTagsPara.GroupName, scanTagsPara.DriverName, buffer, addressArg, hdatetime) + ); + var t2 = DateTime.Now; + var timediff = t2- t1; + Console.WriteLine($"S7缓存和储存耗时:{timediff}"); { - DBNumber = int.Parse(Regex.Replace(scanTagsPara.GroupName, "[a-z]", "", RegexOptions.IgnoreCase)); + //if (saveResult.Result == 0) + //{ + // //logger + //} + //else + //{ + // //logger + //} + } - else + if(scanTagsPara.IncludeBChaned) { - DBNumber = int.Parse(scanTagsPara.GroupName); - } - int amount = addressArg.Length; - int WordLen = 2; - byte[] buffer = new byte[amount]; - int pdu = PLCHelper.GetSiemensPDU(PLCType) * 2 - 18; - int Result = 0; - - - //byte[] bufferr = new byte[amount]; - Result = ReadArea(Area, DBNumber, startAdress, amount, WordLen, ref buffer); - - - //if (amount <= pdu) - //{ - // Result = ReadArea(Area, DBNumber, startAdress, amount, WordLen, ref buffer); - //} - //else - //{ - // //int additional = amount- pdu; - // int forCount = (int)Math.Ceiling(float.Parse(((float)amount / (float)pdu).ToString())); - // List bytes= new List(); - // for (int i = 0; i < forCount; i++) - // { - // if ((amount - (i * pdu)) > pdu) - // { - // int start = startAdress + i * pdu; - // byte[] bytes1 = new byte[pdu]; - // Result = ReadArea(Area, DBNumber, start, pdu, WordLen, ref bytes1); - // bytes.Add(bytes1); - // } - // else - // { - // int start = startAdress + i * pdu; - // byte[] bytes1 = new byte[amount - (i * pdu)]; - // Result = ReadArea(Area, DBNumber, start, amount - (i * pdu), WordLen, ref bytes1); - // bytes.Add(bytes1); - // } - // Thread.Sleep(3); - // } - // var byetstemp = Array.Empty(); - // foreach (var buff in bytes) - // { - // byetstemp = byetstemp.Concat(buff).ToArray(); - // } - // buffer = byetstemp; - //} - - - var tcollend = DateTime.Now; - var timecolldiff = tcollend - tcollstart; - Console.WriteLine($"S7读取耗时:{timecolldiff},设备:{DriverName}变量组:{scanTagsPara.GroupName}"); - //CodingTools.EndTime = DateTime.Now.Millisecond;//de - //var timess = (CodingTools.EndTime - CodingTools.StartTime).ToString(); - //Console.WriteLine($"读取耗时:{timess}"); - if (Result == 0) - { - var t1 = DateTime.Now; - Console.WriteLine(string.Join(",", buffer) + "S7读取完成:DB" + DBNumber.ToString() + ",字节数:" + amount.ToString()); - //Task saveResult = DataExtract.DataExtractCAsync(scanTagsPara.ScanTags, scanTagsPara.GroupName, scanTagsPara.DriverName, buffer, addressArg); - var ss = new DataExtract(); - long hdatetime = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds(); - Task.Run(()=> - - ss.DataExtractCAsync(scanTagsPara.ScanTags, scanTagsPara.SystemName, scanTagsPara.GroupName, scanTagsPara.DriverName, buffer, addressArg, hdatetime) - ); - var t2 = DateTime.Now; - var timediff = t2- t1; - Console.WriteLine($"S7缓存和储存耗时:{timediff}"); + var BChanged = GetVlaue((short)DataType.BOOL, scanTagsPara.BChangedAddress, buffer, addressArg); + if(BChanged == "True") { - //if (saveResult.Result == 0) - //{ - // //logger - //} - //else - //{ - // //logger - //} - - } - if(scanTagsPara.IncludeBChaned) - { - var BChanged = GetVlaue((short)DataType.BOOL, scanTagsPara.BChangedAddress, buffer, addressArg); - if(BChanged == "True") + var ReadSetResult = StartReadSetupParameter(); + if (ReadSetResult == 0) { - var ReadSetResult = StartReadSetupParameter(); - if (ReadSetResult == 0) - { - SetDeviceData(scanTagsPara.GroupName, "BChanged", "0"); - } + SetDeviceData(scanTagsPara.GroupName, "BChanged", "0"); } } } - else if (Result != 0) - { - Console.WriteLine("S7读取失败:DB" + DBNumber.ToString() + ",ERRORCODE:" + Result.ToString()); - LogHelper.LogWrite("S7读取失败:DB" + DBNumber.ToString() + ",ERRORCODE:" + Result.ToString()); - //Close(); - //Thread.Sleep(50); - //Connect(); - } - } - catch (Exception ex) + else if (Result != 0) { - LogHelper.LogWrite($"{DriverName}读取失败,S7错误信息{ex}"); - } - } + Console.WriteLine("S7读取失败:DB" + DBNumber.ToString() + ",ERRORCODE:" + Result.ToString()); + LogHelper.LogWrite("S7读取失败:DB" + DBNumber.ToString() + ",ERRORCODE:" + Result.ToString()); + //Close(); + //Thread.Sleep(50); + //Connect(); + } - }); - } - else - { - LogHelper.LogWrite($"{DriverName}读取失败,S7未连接"); - //Connect(); - } - Thread.Sleep(50); + } + catch (Exception ex) + { + LogHelper.LogWrite($"{DriverName}读取失败,S7错误信息{ex}"); + } + } + + }); } + else + { + LogHelper.LogWrite($"{DriverName}读取失败,S7未连接"); + //Connect(); + } + Thread.Sleep(50); + } /// diff --git a/HTCoreServiceApp/HTCoreServiceApp.csproj b/HTCoreServiceApp/HTCoreServiceApp.csproj index ad24c6d..237c48c 100644 --- a/HTCoreServiceApp/HTCoreServiceApp.csproj +++ b/HTCoreServiceApp/HTCoreServiceApp.csproj @@ -36,16 +36,16 @@ --> - + - + diff --git a/HTCoreServiceApp/Program.cs b/HTCoreServiceApp/Program.cs index a182e24..8923a5a 100644 --- a/HTCoreServiceApp/Program.cs +++ b/HTCoreServiceApp/Program.cs @@ -45,6 +45,7 @@ namespace HTCoreServiceApp builder.Services.AddTransient(); builder.Services.AddSingleton(); + var app = builder.Build(); #region ڵapi @@ -76,7 +77,17 @@ namespace HTCoreServiceApp #region ޽ڵapi #endregion + dataLiveCacheApi.MapGet("/GetLiveSystemAllData/systemName={systemName}", + async (string systemName, DataLiveCache dlc) + => Results.Content(await dlc.GetLiveSystemAllData(systemName))); + dataLiveCacheApi.MapGet("/GetLiveDriverAllData/driverName={driverName}", + async (string driverName, DataLiveCache dlc) + => Results.Content(await dlc.GetLiveDriverAllData(driverName))); + + dataLiveCacheApi.MapGet("/GetLiveGroupAllData/groupName={groupName}", + async (string groupName, DataLiveCache dlc) + => Results.Content(await dlc.GetLiveGroupAllData(groupName))); #region api #endregion diff --git a/HTCoreServiceApp/WebApis/DataLiveCache.cs b/HTCoreServiceApp/WebApis/DataLiveCache.cs index 875a075..42f2bcb 100644 --- a/HTCoreServiceApp/WebApis/DataLiveCache.cs +++ b/HTCoreServiceApp/WebApis/DataLiveCache.cs @@ -13,6 +13,8 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; +using System.Text.Json.Nodes; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace HTCoreServiceApp.WebApi { @@ -34,27 +36,35 @@ namespace HTCoreServiceApp.WebApi public async Task GetLiveSystemData(string systemName) { - var dict = new Dictionary(); - var json = new JObject(); var db = new SqlSugarClient(StaticLibrary.DBConfig); var systemId = db.Queryable().Where(x => x.SystemName == systemName).First().SystemId; var groupList = db.Queryable().Where(x => x.SystemId == systemId).ToList(); + + var driverdataDict = new Dictionary>>(); //var jlist = new List(); //var driverList = new List(); foreach (var group in groupList) { + var groupdataDict = new Dictionary(); + var groupName = group.GroupName; var driverName = db.Queryable().Where(x => x.DriverId == group.DriverId).First().DriverName; - var data = StaticLibrary.MemoryCacheHelper.GetString(groupName); - - - json.Add(driverName, new JObject(groupName, data)); + var data = JsonConvert.DeserializeObject(StaticLibrary.MemoryCacheHelper.GetString(groupName)); ; + groupdataDict.Add( groupName, (JToken?)data ); + if(driverdataDict.Keys.Contains(driverName)) + { + driverdataDict[driverName].Add(groupdataDict); + } + else + { + driverdataDict.Add(driverName,new List>() { groupdataDict }); + } //driverList.Add(driverName); //if (json.ContainsKey(driverName)) //{ @@ -63,7 +73,15 @@ namespace HTCoreServiceApp.WebApi //jlist.Add(new JObject(groupName, data)); } - return json.ToString(); + var rejson = JsonConvert.SerializeObject(driverdataDict, Newtonsoft.Json.Formatting.Indented); + return rejson; + + //var groupJson = new JObject + // { + // { groupName, (JToken?)data } + // }; + + //json.Add(driverName, groupJson); } public async Task GetLiveDriverData(string driverName) { @@ -131,5 +149,73 @@ namespace HTCoreServiceApp.WebApi //var cache = StaticLibrary.MemoryCacheHelper.Get>(driverName).Where(x => x.GroupName == groupName).First(); //return LiveJsonIntegrate.MetaTagValue2Json(cache, tagName); //} + + public async Task GetLiveSystemAllData(string systemName) + { + var json = new JObject(); + var db = new SqlSugarClient(StaticLibrary.DBConfig); + var systemId = db.Queryable().Where(x => x.SystemName == systemName).First().SystemId; + var groupList = db.Queryable().Where(x => x.SystemId == systemId).ToList(); + foreach (var group in groupList) + { + + + + var data = JsonConvert.DeserializeObject(StaticLibrary.MemoryCacheHelper.GetString(group.GroupName)); + json.Merge((JToken?)data); + + + } + + + return json.ToString(); + + //var groupJson = new JObject + // { + // { groupName, (JToken?)data } + // }; + + //json.Add(driverName, groupJson); + } + public async Task GetLiveDriverAllData(string driverName) + { + var dict = new Dictionary(); + var json = new JObject(); + var db = new SqlSugarClient(StaticLibrary.DBConfig); + var driverId = db.Queryable().Where(x => x.DriverName == driverName).First().DriverId; + var groupList = db.Queryable().Where(x => x.DriverId == driverId).ToList(); + foreach (var group in groupList) + { + var groupName = group.GroupName; + var data = JsonConvert.DeserializeObject(StaticLibrary.MemoryCacheHelper.GetString(groupName)); + json.Merge((JToken?)data); + } + return json.ToString(); + } + //[HttpGet] + public async Task GetLiveGroupAllData(string groupName) + { + //var cache = StaticLibrary.MemoryCacheHelper.Get>(driverName).Where(x=>x.GroupName == groupName).First(); + //var val = new List(); + //StaticLibrary.MemoryCacheHelper.TryGetValue(driverName,out val); + //return LiveJsonIntegrate.MetaValues2Json(val.FirstOrDefault()); + + //public static string StringToJson(string JsonString) + //{ // string 转换成Json JsonDocument jsonDocument = JsonDocument.Parse(JsonString);//这里序列化成json return JsonSerializer.Serialize(jsonDocument.RootElement); }//在main中调用 + + try + { + //var result = StaticLibrary.MemoryCacheHelper.GetString(groupName); + + //Console.WriteLine(result); + //return result; + //return valueJson.ToString(); + return StaticLibrary.MemoryCacheHelper.GetString(groupName); + } + catch (Exception ex) + { + return ex.Message; + } + } } }