diff --git a/HTCoreServiceApp/Common/PLCHelper.cs b/HTCoreServiceApp/Common/PLCHelper.cs index 260045d..42d6d39 100644 --- a/HTCoreServiceApp/Common/PLCHelper.cs +++ b/HTCoreServiceApp/Common/PLCHelper.cs @@ -73,7 +73,7 @@ namespace HTCoreServiceApp.Common return addressArg; } - public static AddressArg GetAddressArg_Modbus_Word(List metaTags) + public static AddressArg GetAddressArg_Modbus_Word(List metaTags, string addressOffset) { //list为空的报错处理 AddressArg addressArg = new AddressArg(); @@ -108,8 +108,8 @@ namespace HTCoreServiceApp.Common lastDataLenght = 2; } } - - addressArg.Start = (int)f_min; + var offset = int.Parse(addressOffset); + addressArg.Start = (int)f_min + offset; //addressArg.Length = (int)f_max + lastDataLenght -1; addressArg.Length = (int)f_max - (int)f_min + lastDataLenght; diff --git a/HTCoreServiceApp/Communicate/Modbus/ModbusClientExample.cs b/HTCoreServiceApp/Communicate/Modbus/ModbusClientExample.cs index 3d2105c..ca9199c 100644 --- a/HTCoreServiceApp/Communicate/Modbus/ModbusClientExample.cs +++ b/HTCoreServiceApp/Communicate/Modbus/ModbusClientExample.cs @@ -32,6 +32,7 @@ namespace HTCoreServiceApp.Communicate.Modbus public bool IsConnected { get; set; } public int Timeout { get; set; } + public string AddressOffset { get; set; } public bool isScan { get; set; } @@ -67,6 +68,7 @@ namespace HTCoreServiceApp.Communicate.Modbus SlaveID = byte.Parse(tagGroup.Arguments.Where(x => x.PropertyName == "SlaveID").First().PropertyValue); PLCType = tagGroup.Arguments.Where(x => x.PropertyName == "PLCType").First().PropertyValue; Timeout = int.Parse(tagGroup.Arguments.Where(x => x.PropertyName == "TimeOut").First().PropertyValue); + AddressOffset = tagGroup.Arguments.Where(x => x.PropertyName == "AddressOffset").First().PropertyValue; MetaGroups =tagGroup.Groups; MetaTags = tagGroup.Tags;//只有一组 DriverName = tagGroup.DriverName; @@ -110,7 +112,7 @@ namespace HTCoreServiceApp.Communicate.Modbus scanTagsPara.DriverName = DriverName; var groupSysId = MetaGroups.Where(x => x.GroupId == metaGroup.Key.GroupId).ToList().First().SystemId; scanTagsPara.SystemName = Systems.Where(x => x.SystemId == groupSysId).ToList().First().SystemName; - scanTagsPara.AddressArg = PLCHelper.GetAddressArg_Modbus_Word(scanTagsPara.ScanTags); + scanTagsPara.AddressArg = PLCHelper.GetAddressArg_Modbus_Word(scanTagsPara.ScanTags,addressOffset:AddressOffset); scanTagsParas.Add(scanTagsPara); } //if 添加连续或单变量读取标记 diff --git a/HTCoreServiceApp/Communicate/ModbusTcp/ModbusClient.cs b/HTCoreServiceApp/Communicate/ModbusTcp/ModbusClient.cs index 013a4ed..9c6ec3b 100644 --- a/HTCoreServiceApp/Communicate/ModbusTcp/ModbusClient.cs +++ b/HTCoreServiceApp/Communicate/ModbusTcp/ModbusClient.cs @@ -38,7 +38,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp { public enum RegisterOrder { LowHigh = 0, HighLow = 1 }; private bool debug=false; - private TcpClient tcpClient; + public TcpClient tcpClient; private string ipAddress = "127.0.0.1"; private int port = 502; private uint transactionIdentifierInternal = 0; diff --git a/HTCoreServiceApp/Communicate/ModbusTcp/ModbusTcpClientExample.cs b/HTCoreServiceApp/Communicate/ModbusTcp/ModbusTcpClientExample.cs index 472982d..9d6da02 100644 --- a/HTCoreServiceApp/Communicate/ModbusTcp/ModbusTcpClientExample.cs +++ b/HTCoreServiceApp/Communicate/ModbusTcp/ModbusTcpClientExample.cs @@ -16,6 +16,7 @@ using System.Net; using static System.Runtime.InteropServices.JavaScript.JSType; using Pipelines.Sockets.Unofficial.Arenas; using System.Numerics; +using System.Net.Sockets; namespace HTCoreServiceApp.Communicate.ModbusTcp { @@ -30,6 +31,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp public int Timeout { get; set; } + public string AddressOffset { get; set; } public bool isScan { get; set; } public System.Timers.Timer ScanTimer { get ; set; } @@ -67,6 +69,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp SlaveID = int.Parse(tagGroup.Arguments.Where(x => x.PropertyName == "SlaveID").First().PropertyValue); PLCType = tagGroup.Arguments.Where(x => x.PropertyName == "PLCType").First().PropertyValue; Timeout = int.Parse(tagGroup.Arguments.Where(x => x.PropertyName == "TimeOut").First().PropertyValue); + AddressOffset = tagGroup.Arguments.Where(x => x.PropertyName == "AddressOffset").First().PropertyValue; MetaGroups =tagGroup.Groups; MetaTags = tagGroup.Tags;//只有一组 DriverName = tagGroup.DriverName; @@ -107,7 +110,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp scanTagsPara.DriverName = DriverName; var groupSysId = MetaGroups.Where(x => x.GroupId == metaGroup.Key.GroupId).ToList().First().SystemId; scanTagsPara.SystemName = Systems.Where(x => x.SystemId == groupSysId).ToList().First().SystemName; - scanTagsPara.AddressArg = PLCHelper.GetAddressArg_Modbus_Word(scanTagsPara.ScanTags); + scanTagsPara.AddressArg = PLCHelper.GetAddressArg_Modbus_Word(scanTagsPara.ScanTags,AddressOffset); scanTagsParas.Add(scanTagsPara); } //if 添加连续或单变量读取标记 @@ -168,7 +171,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp if (scanTagsPara.IsActive == false) return; - if (Client.Connected) + if (TcpConnected && Client.Connected) { var addressArg = scanTagsPara.AddressArg; @@ -256,10 +259,11 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp { Console.WriteLine("MB读取失败:"+" ERROR:" + Result.ToString()); LogHelper.LogWrite("MB读取失败:"+" ERROR:" + Result.ToString()); - //Close(); - //Thread.Sleep(50); - //Connect(); - } + TcpConnected = false; + //Close(); + //Thread.Sleep(50); + //Connect(); + } } catch (Exception ex) @@ -394,8 +398,18 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp buffer = Client.ReadHoldingRegisters(start, Amount); return Result; } - catch(Exception ex) + catch (IOException ex) when (ex.InnerException is SocketException se && se.SocketErrorCode == SocketError.ConnectionReset) { + // 记录错误并重试 + Console.WriteLine("MB连接被远程主机重置,重试..."); + //TcpConnected = false; + Client.Disconnect(); + return Result = ex.ToString(); + } + catch (Exception ex) + { + //TcpConnected = false; + Client.Disconnect(); return Result = ex.ToString(); } } @@ -411,7 +425,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp private void TimerCheckConnect_Elapsed(object? sender, System.Timers.ElapsedEventArgs e) { timerCheck.Enabled = false; - if (Client.Connected) + if (Client.Connected && TcpConnected) { timerCheck.Enabled = true; return; @@ -435,7 +449,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp { Result = ex.ToString(); } - if (Result == "" && Client.Connected) + if (Result == "" && Client.Connected && TcpConnected) { IsConnected = true; //log @@ -454,6 +468,16 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp } + public bool TcpConnected + { + get + { + if (Client.tcpClient == null) + return false; + return Client.tcpClient.Connected; + } + set { } + } public bool Close() { var Result = ""; @@ -526,7 +550,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp try { string[] address_arr = startaddress.Split('.'); - address_int = int.Parse(address_arr[0]); + address_int = int.Parse(address_arr[0]) + int.Parse(AddressOffset); address_dem = int.Parse(address_arr[1]); } catch (Exception exp) @@ -537,7 +561,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp } else { - address_int = int.Parse(startaddress); + address_int = int.Parse(startaddress) + int.Parse(AddressOffset); } //int start = int.Parse(startaddress); @@ -736,7 +760,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp try { string[] address_arr = startaddress.Split('.'); - address_int = int.Parse(address_arr[0]); + address_int = int.Parse(address_arr[0]) + int.Parse(AddressOffset); address_dem = int.Parse(address_arr[1]); } catch (Exception exp) @@ -747,7 +771,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp } else { - address_int = int.Parse(startaddress); + address_int = int.Parse(startaddress) + int.Parse(AddressOffset); } byte[] revbuffer_w;// = new byte[maxreg + 2]; diff --git a/HTCoreServiceApp/DataHandle/DataExtractAB.cs b/HTCoreServiceApp/DataHandle/DataExtractAB.cs index 34d4694..d0a62f9 100644 --- a/HTCoreServiceApp/DataHandle/DataExtractAB.cs +++ b/HTCoreServiceApp/DataHandle/DataExtractAB.cs @@ -166,7 +166,7 @@ namespace HTCoreServiceApp.DataHandle { case (short)DataType.FLOAT: //return S7.GetRealAt(bytes, address_int).ToString(); - return BitConverter.ToSingle(new byte[] { bytes[address_int], bytes[address_int + 1], bytes[address_int + 2], bytes[address_int + 3] }, 0).ToString(); + return BitConverter.ToSingle(new byte[] { bytes[address_int], bytes[address_int + 1], bytes[address_int + 2], bytes[address_int + 3] }, 0).ToString("0.########"); case (short)DataType.BOOL: //return S7.GetBitAt(bytes, address_int,address_dem).ToString(); byte[] Mask = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; diff --git a/HTCoreServiceApp/DataHandle/DataExtractMB.cs b/HTCoreServiceApp/DataHandle/DataExtractMB.cs index 9d625bd..f075c52 100644 --- a/HTCoreServiceApp/DataHandle/DataExtractMB.cs +++ b/HTCoreServiceApp/DataHandle/DataExtractMB.cs @@ -159,7 +159,7 @@ namespace HTCoreServiceApp.DataHandle switch (dataType) { case (short)DataType.FLOAT: - return ModbusClient.ConvertRegistersToFloat(new int[] { bytes[address_int] , bytes[address_int + 1] }).ToString(); + return ModbusClient.ConvertRegistersToFloat(new int[] { bytes[address_int] , bytes[address_int + 1] }).ToString("0.########"); case (short)DataType.BOOL: int[] Mask = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200,0x400,0x800,0x1000,0x2000,0x4000,0x8000}; if (address_dem < 0) address_dem = 0; diff --git a/HTCoreServiceApp/DataHandle/DataExtractTAB.cs b/HTCoreServiceApp/DataHandle/DataExtractTAB.cs index 2e3d7e8..71b6057 100644 --- a/HTCoreServiceApp/DataHandle/DataExtractTAB.cs +++ b/HTCoreServiceApp/DataHandle/DataExtractTAB.cs @@ -171,7 +171,7 @@ namespace HTCoreServiceApp.DataHandle { case (short)DataType.FLOAT: //return S7.GetRealAt(bytes, address_int).ToString(); - return BitConverter.ToSingle(new byte[] { bytes[address_int], bytes[address_int + 1], bytes[address_int + 2], bytes[address_int + 3] }, 0).ToString(); + return BitConverter.ToSingle(new byte[] { bytes[address_int], bytes[address_int + 1], bytes[address_int + 2], bytes[address_int + 3] }, 0).ToString("0.########"); case (short)DataType.BOOL: //return S7.GetBitAt(bytes, address_int,address_dem).ToString(); byte[] Mask = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; diff --git a/HTCoreServiceApp/DataHandle/DataStorage.cs b/HTCoreServiceApp/DataHandle/DataStorage.cs index 7e22ddf..2ea510b 100644 --- a/HTCoreServiceApp/DataHandle/DataStorage.cs +++ b/HTCoreServiceApp/DataHandle/DataStorage.cs @@ -90,6 +90,7 @@ namespace HTCoreServiceApp.DataHandle } catch (Exception ex) { + Console.WriteLine($"报错sql:{sql}"); Console.WriteLine($"{driverName}_{GroupName} 写入出错:{ex}"); db.Dispose(); return -1; @@ -179,6 +180,7 @@ namespace HTCoreServiceApp.DataHandle } catch (Exception ex) { + Console.WriteLine($"报错sql:{sql}"); Console.WriteLine($"{driverName}_{GroupName}写入出错:{ex}"); db.Dispose(); //return -1; diff --git a/HTCoreServiceApp/Program.cs b/HTCoreServiceApp/Program.cs index 53462e0..02c5d74 100644 --- a/HTCoreServiceApp/Program.cs +++ b/HTCoreServiceApp/Program.cs @@ -3,6 +3,9 @@ using HTCoreServiceApp.DataHandle; using HTCoreServiceApp.WebApi; using Microsoft.AspNetCore.Http.Headers; using Microsoft.AspNetCore.Http.HttpResults; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.ResponseCompression; +using Microsoft.AspNetCore.Server.Kestrel.Core; using SqlSugar; using System.Text.Json.Serialization; @@ -47,15 +50,26 @@ namespace HTCoreServiceApp options.SizeLimit = 10000; }); - //builder.Services.AddEndpointsApiExplorer(); + builder.Services.AddResponseCompression(options => + { + options.EnableForHttps = true; + options.Providers.Add(); + }); + //builder.WebHost.ConfigureKestrel(options => + //{ + // options.ListenAnyIP(8040, listenOptions => listenOptions.Protocols = HttpProtocols.Http2); + //}); + builder.WebHost.ConfigureKestrel(options => options.Limits.KeepAliveTimeout = TimeSpan.FromSeconds(60)); + builder.Services.AddCors(options => options.AddPolicy("AllowAll", b => b.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader())); + //builder.Services.AddEndpointsApiExplorer(); - builder.Services.AddTransient();//apiٶ + builder.Services.AddTransient();//apiٶ builder.Services.AddTransient(); builder.Services.AddSingleton(); var app = builder.Build(); - + #region ڵapi var dataLiveCacheApi = app.MapGroup("/DataLiveCache"); dataLiveCacheApi.MapGet("/Get", @@ -81,6 +95,14 @@ namespace HTCoreServiceApp dataLiveCacheApi.MapGet("/GetLiveTagData/groupName={groupName}&tagName={tagName}", async (string groupName, string tagName, DataLiveCache dlc) => Results.Content(await dlc.GetLiveTagData(groupName,tagName))); + + dataLiveCacheApi.MapGet("/GetLiveTagData/tagName={tagName}", + async (string tagName, DataLiveCache dlc) + => Results.Content(await dlc.GetLiveTagData(tagName))); + + dataLiveCacheApi.MapGet("/GetLiveDevicePlcTagData/deviceCode={deviceCode}&plcTag={plcTag}", + async (string deviceCode,string plcTag, DataLiveCache dlc) + => Results.Content(await dlc.GetLiveDevicePlcTagData(deviceCode,plcTag))); #endregion #region ޽ڵapi @@ -125,10 +147,31 @@ namespace HTCoreServiceApp async (string tagName, string value,HttpContext context, DeviceControl dc) => Results.Content(await dc.SetDeviceTagData(tagName, value ,context))); + deviceControl.MapGet("/SetDevicePlcTagData/deviceCode={deviceCode}&plcTag={plcTag}&value={value}", + async (string deviceCode, string plcTag, string value, HttpContext context, DeviceControl dc) + => Results.Content(await dc.SetDevicePlcTagData(deviceCode, plcTag, value, context))); + deviceControl.MapGet("/SetDeviceBlockData/driverName={driverName}&address={address}&value={value}", async (string driverName, string address, string value, DeviceControl dc) => Results.Content(await dc.SetDeviceBlockData(driverName, address, value))); + + // POST ˵ + deviceControl.MapPost("/SetDevicePlcTagDataPost", + async ([FromBody] PlcTagData data, HttpContext context, DeviceControl dc) => + { + var start = DateTime.Now; + // ֤ + if (string.IsNullOrWhiteSpace(data.DeviceCode) || string.IsNullOrWhiteSpace(data.PlcTag)) + return Results.BadRequest("豸PLCǩΪ"); + + // ԭз + var result = await dc.SetDevicePlcTagData(data.DeviceCode, data.PlcTag, data.Value, context); + context.Response.Headers.Append("X-Server-Time", $"{(DateTime.Now - start).TotalMilliseconds}ms"); + return Results.Content(result, "text/plain"); + }); + + var sampleTodos = new Todo[] { new(1, "Walk the dog"), new(2, "Do the dishes", DateOnly.FromDateTime(DateTime.Now)), @@ -145,12 +188,15 @@ namespace HTCoreServiceApp : Results.NotFound()); #endregion - + app.UseResponseCompression(); + app.UseCors("AllowAll"); + app.UseRouting(); app.Run(); } } - - public record Todo(int Id, string? Title, DateOnly? DueBy = null, bool IsComplete = false); + // ļ¼ + public record PlcTagData(string DeviceCode, string PlcTag, string Value); + public record Todo(int Id, string? Title, DateOnly? DueBy = null, bool IsComplete = false); [JsonSerializable(typeof(Todo[]))] internal partial class AppJsonSerializerContext : JsonSerializerContext diff --git a/HTCoreServiceApp/WebApis/DataLiveCache.cs b/HTCoreServiceApp/WebApis/DataLiveCache.cs index e3572b0..dde0f06 100644 --- a/HTCoreServiceApp/WebApis/DataLiveCache.cs +++ b/HTCoreServiceApp/WebApis/DataLiveCache.cs @@ -154,6 +154,66 @@ namespace HTCoreServiceApp.WebApi } return value; } + public async Task GetLiveTagData(string tagName) + { + //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()); + + + //!!!!重要,校验有无groupName + var groupName = ""; + var db = new SqlSugarClient(StaticLibrary.DBConfig); + var groupId = db.Queryable().Where(x=>x.TagName == tagName).First().GroupId; + if(groupId > 0 && groupId != null) + { + groupName = db.Queryable().Where(x => x.GroupId == groupId).First().GroupName; + } + else + { + return $"未找到该变量{tagName}对应的组"; + } + string value = ""; + if (tagName != null && tagName != "") + { + var jLiveData = new CacheService(StaticLibrary.MemoryCache).GetDataFromDatabaseAsync(groupName).Result; + JObject valueJson = JObject.Parse(jLiveData); + value = valueJson[tagName].ToString(); + } + return value; + } + + public async Task GetLiveDevicePlcTagData(string deviceCode, string plcTag) + { + //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()); + + + //!!!!重要,校验有无groupName + var groupName = ""; + var db = new SqlSugarClient(StaticLibrary.DBConfig); + var tagName = db.Queryable().Where(x => x.PLCAddress == $"{deviceCode}_{plcTag}").First().TagName; + var groupId = db.Queryable().Where(x => x.TagName == tagName).First().GroupId; + if (groupId > 0 && groupId != null) + { + groupName = db.Queryable().Where(x => x.GroupId == groupId).First().GroupName; + } + else + { + return $"未找到该变量的写入地址{deviceCode}_{plcTag}对应的组"; + } + string value = ""; + if (tagName != null && tagName != "") + { + var jLiveData = new CacheService(StaticLibrary.MemoryCache).GetDataFromDatabaseAsync(groupName).Result; + JObject valueJson = JObject.Parse(jLiveData); + value = valueJson[tagName].ToString(); + } + return value; + } //[HttpGet] //public string GetLiveTagData(string driverName, string groupName ,string tagName) //{ diff --git a/HTCoreServiceApp/WebApis/DeviceController.cs b/HTCoreServiceApp/WebApis/DeviceController.cs index 0ed9d5a..bb8c571 100644 --- a/HTCoreServiceApp/WebApis/DeviceController.cs +++ b/HTCoreServiceApp/WebApis/DeviceController.cs @@ -244,6 +244,207 @@ namespace HTCoreServiceApp.WebApi return reCode.ToString(); } + public async Task SetDevicePlcTagData(string deviceCode, string plcTag, string value, HttpContext context) + { + var time1 = DateTime.Now; + var htsetlog = new HTLogSetDriver(); + htsetlog.EventTime = DateTime.Now; + //var t1 = DateTime.Now; + htsetlog.RequestIp = context.Connection.RemoteIpAddress.ToString();// "192.168.110.247"; + //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()); + + //var userAgent = HttpContext. + + int reCode = 0; + //直接返回,取消后续写入步骤 + //return reCode; + try + { + var tagName = metaTags.Where(x => x.PLCAddress == $"{deviceCode}_{plcTag}").FirstOrDefault().TagName; + if (!string.IsNullOrEmpty(tagName) && !string.IsNullOrEmpty(value)) + { + //var context = StaticLibrary.DBContext; + //return StaticLibrary.MemoryCacheHelper.GetString(groupName); + //var dataType = metaTags.Where(x => x.TagName == tagName && x.GroupId == groupID).First().DataType; + //var writeAddress = metaTags.Where(x => x.TagName == tagName && x.GroupId == groupID).First().PLCAddress;//231113 ,CDL QWZ 写入地址字段由WriteAddress修改为PLCAddress + var tag = metaTags.Where(x => x.TagName == tagName).First(); + var dataType = tag.DataType; + var groupID = tag.GroupId; + var driverID = metaGroups.Where(x => x.GroupId == groupID).FirstOrDefault().DriverId; + var driverName = metaDrivers.Where(x => x.DriverId == driverID).FirstOrDefault().DriverName; + var writeAddress = tag.WriteAddress;//231113 ,CDL QWZ 写入地址字段由WriteAddress修改为PLCAddress + htsetlog.WriteDriverName = driverName; + htsetlog.WriteTagName = tag.TagName; + htsetlog.WriteAddress = writeAddress; + htsetlog.WriteValue = value; + + if (writeAddress == "" || writeAddress == null) + { + reCode = 3; + htsetlog.WriteResult = reCode.ToString(); + LogHelper.SetDriverLogTask(htsetlog); + return reCode.ToString(); + } + //var windex = writeAddress.IndexOf("."); + //writeAddress = writeAddress.Remove(windex, 1).Insert(windex, ","); + //var valueHandle = 0; + if (dataType == (short)DataType.BOOL) + { + if (value.Equals("True") || value.Equals("true") || value.Equals("TRUE") || value.Equals("1")) + { + value = "1"; + } + else if (value.Equals("False") || value.Equals("false") || value.Equals("FALSE") || value.Equals("0")) + { + value = "0"; + } + } + if (dataType == (short)DataType.IFLOAT) + { + var iFloatPlaces = (int)tag.IFloatPlaces; + value = ((int)(float.Parse(value) * (int)Math.Pow(10.0f, iFloatPlaces))).ToString(); + } + var writePara = new WritePara + { + TagName = tagName, + //GroupName = groupName, + WriteAddress = writeAddress, + DataType = dataType, + Value = value + }; + //string serJson = JsonSerializer.Serialize(writePara); //JsonConvert.SerializeObject(writePara); + + //var t2 = DateTime.Now; + //var timediff = t2 - t1; + //Console.WriteLine($"写入参数初始化耗时:{timediff}"); + + foreach (var driverThread in _driverService.DriverThreads) + { + if (driverThread.driverName == driverName) + { + reCode = driverThread.DriverWrite(writePara); + htsetlog.WriteResult = reCode.ToString(); + } + } + } + else + { + reCode = 2; + htsetlog.WriteResult = reCode.ToString(); + } + } + catch (Exception ex) + { + reCode = 1; + htsetlog.WriteResult = reCode.ToString(); + htsetlog.WriteErrInformation = ex.ToString(); + + LogHelper.SetDriverLogTask(htsetlog); + + GC.Collect(); + LogHelper.LogWrite("S7写入数据出错,PLCAddresss:" + deviceCode.ToString() + "_" + plcTag.ToString() + ",ERROR:" + ex.ToString()); + return reCode.ToString() + "/t" + ex.ToString(); + } + LogHelper.SetDriverLogTask(htsetlog); + GC.Collect(); + var time2 = DateTime.Now; + var timediff = time2 - time1; + Console.WriteLine($"写入耗时:{timediff}"); + return reCode.ToString(); + } + public async Task SetDevicePlcTagDataPost(string deviceCode, string plcTag, string value, HttpContext context) + { + var time1 = DateTime.Now; + var htsetlog = new HTLogSetDriver(); + htsetlog.EventTime = DateTime.Now; + htsetlog.RequestIp = context.Connection.RemoteIpAddress.ToString(); + + int reCode = 0; + try + { + var tagName = metaTags.Where(x => x.PLCAddress == $"{deviceCode}_{plcTag}").FirstOrDefault().TagName; + if (!string.IsNullOrEmpty(tagName) && !string.IsNullOrEmpty(value)) + { + var tag = metaTags.Where(x => x.TagName == tagName).First(); + var dataType = tag.DataType; + var groupID = tag.GroupId; + var driverID = metaGroups.Where(x => x.GroupId == groupID).FirstOrDefault().DriverId; + var driverName = metaDrivers.Where(x => x.DriverId == driverID).FirstOrDefault().DriverName; + var writeAddress = tag.WriteAddress; + htsetlog.WriteDriverName = driverName; + htsetlog.WriteTagName = tag.TagName; + htsetlog.WriteAddress = writeAddress; + htsetlog.WriteValue = value; + + if (string.IsNullOrEmpty(writeAddress)) + { + reCode = 3; + htsetlog.WriteResult = reCode.ToString(); + LogHelper.SetDriverLogTask(htsetlog); + return reCode.ToString(); + } + + if (dataType == (short)DataType.BOOL) + { + if (value.Equals("True", StringComparison.OrdinalIgnoreCase) || value.Equals("1")) + { + value = "1"; + } + else if (value.Equals("False", StringComparison.OrdinalIgnoreCase) || value.Equals("0")) + { + value = "0"; + } + } + if (dataType == (short)DataType.IFLOAT) + { + var iFloatPlaces = (int)tag.IFloatPlaces; + value = ((int)(float.Parse(value) * (int)Math.Pow(10.0f, iFloatPlaces))).ToString(); + } + + var writePara = new WritePara + { + TagName = tagName, + WriteAddress = writeAddress, + DataType = dataType, + Value = value + }; + + foreach (var driverThread in _driverService.DriverThreads) + { + if (driverThread.driverName == driverName) + { + reCode = driverThread.DriverWrite(writePara); + htsetlog.WriteResult = reCode.ToString(); + } + } + } + else + { + reCode = 2; + htsetlog.WriteResult = reCode.ToString(); + } + } + catch (Exception ex) + { + reCode = 1; + htsetlog.WriteResult = reCode.ToString(); + htsetlog.WriteErrInformation = ex.ToString(); + LogHelper.SetDriverLogTask(htsetlog); + GC.Collect(); + LogHelper.LogWrite("S7写入数据出错,PLCAddresss:" + deviceCode + "_" + plcTag + ",ERROR:" + ex.ToString()); + return reCode.ToString() + "\t" + ex.ToString(); + } + + LogHelper.SetDriverLogTask(htsetlog); + GC.Collect(); + var time2 = DateTime.Now; + var timediff = time2 - time1; + Console.WriteLine($"写入耗时:{timediff}"); + return reCode.ToString(); + } public async Task SetDeviceBlockData(string driverName, string address, string value) { diff --git a/HTCoreServiceApp/appsettings.json b/HTCoreServiceApp/appsettings.json index 35ad134..7948782 100644 --- a/HTCoreServiceApp/appsettings.json +++ b/HTCoreServiceApp/appsettings.json @@ -1,7 +1,7 @@ { "ConnectionStrings": { "Type": "SqlServer", - "SqlServer": "Zk48ARnbLq1Lk+lzxvCij1zzENjv04mu23Y8D8hdM3VxApXnvB2iA7xm5JfYWNkbyFTPYdwgHe54spCgmPUkzbL5/xWeXNpL5Ipe5+CdPqI+3KVDSaT3SB+v2dgdez3xKByNOkqT3RgONsqI1KDtQjqQMv4zDQlzlPfn0ORsvuomcEOokHHiIw3CIFjEHtfnGcA4a/Gznsypv4sQcSbThw==" + "SqlServer": "Zk48ARnbLq1Lk+lzxvCij1zzENjv04mu23Y8D8hdM3VxApXnvB2iA7xm5JfYWNkbLw7YB0A01VrIJSpoUrEMyqiV8fRiux6LH2hkV1/VLUdoCCG+zOCCkqgML8iuOSXlbE2i3UagxHrXZhgxt4C3ifaWykWgbiGq9h4U4WfKnimMXuCqhSgUm9Gk3c/2KDxSWgLrKUW29N2X4oWhBbwjWg==" }, "Logging": { "LogLevel": {