modbus断线重连修复,modbus科学计数法数据处理

This commit is contained in:
dell
2025-06-17 16:53:12 +08:00
parent c94a18b7c3
commit 1e92ad4cf1
12 changed files with 363 additions and 28 deletions

View File

@ -73,7 +73,7 @@ namespace HTCoreServiceApp.Common
return addressArg;
}
public static AddressArg GetAddressArg_Modbus_Word(List<MetaTag> metaTags)
public static AddressArg GetAddressArg_Modbus_Word(List<MetaTag> 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;

View File

@ -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 添加连续或单变量读取标记

View File

@ -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;

View File

@ -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];

View File

@ -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 };

View File

@ -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;

View File

@ -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 };

View File

@ -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;

View File

@ -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,9 +50,20 @@ namespace HTCoreServiceApp
options.SizeLimit = 10000;
});
//builder.Services.AddEndpointsApiExplorer();
builder.Services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
options.Providers.Add<BrotliCompressionProvider>();
});
//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<DataLiveCache>();//<2F><><EFBFBD><EFBFBD>api<70><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>
builder.Services.AddTransient<DataLiveCache>();//<2F><><EFBFBD><EFBFBD>api<70><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>
builder.Services.AddTransient<DataExtract>();
builder.Services.AddSingleton<DeviceControl>();
@ -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 <EFBFBD>޽ڵ<EFBFBD>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 <20>˵<EFBFBD>
deviceControl.MapPost("/SetDevicePlcTagDataPost",
async ([FromBody] PlcTagData data, HttpContext context, DeviceControl dc) =>
{
var start = DateTime.Now;
// <20><>֤<EFBFBD><D6A4><EFBFBD><EFBFBD>
if (string.IsNullOrWhiteSpace(data.DeviceCode) || string.IsNullOrWhiteSpace(data.PlcTag))
return Results.BadRequest("<22><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PLC<4C><43>ǩ<EFBFBD><C7A9><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>");
// <20><><EFBFBD><EFBFBD>ԭ<EFBFBD>з<EFBFBD><D0B7><EFBFBD>
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);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
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

View File

@ -154,6 +154,66 @@ namespace HTCoreServiceApp.WebApi
}
return value;
}
public async Task<string> GetLiveTagData(string tagName)
{
//var cache = StaticLibrary.MemoryCacheHelper.Get<List<LiveGroupDictionary>>(driverName).Where(x=>x.GroupName == groupName).First();
//var val = new List<LiveGroupDictionary>();
//StaticLibrary.MemoryCacheHelper.TryGetValue(driverName,out val);
//return LiveJsonIntegrate.MetaValues2Json(val.FirstOrDefault());
//!!!!重要校验有无groupName
var groupName = "";
var db = new SqlSugarClient(StaticLibrary.DBConfig);
var groupId = db.Queryable<MetaTag>().Where(x=>x.TagName == tagName).First().GroupId;
if(groupId > 0 && groupId != null)
{
groupName = db.Queryable<MetaGroup>().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<string> GetLiveDevicePlcTagData(string deviceCode, string plcTag)
{
//var cache = StaticLibrary.MemoryCacheHelper.Get<List<LiveGroupDictionary>>(driverName).Where(x=>x.GroupName == groupName).First();
//var val = new List<LiveGroupDictionary>();
//StaticLibrary.MemoryCacheHelper.TryGetValue(driverName,out val);
//return LiveJsonIntegrate.MetaValues2Json(val.FirstOrDefault());
//!!!!重要校验有无groupName
var groupName = "";
var db = new SqlSugarClient(StaticLibrary.DBConfig);
var tagName = db.Queryable<MetaTag>().Where(x => x.PLCAddress == $"{deviceCode}_{plcTag}").First().TagName;
var groupId = db.Queryable<MetaTag>().Where(x => x.TagName == tagName).First().GroupId;
if (groupId > 0 && groupId != null)
{
groupName = db.Queryable<MetaGroup>().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)
//{

View File

@ -244,6 +244,207 @@ namespace HTCoreServiceApp.WebApi
return reCode.ToString();
}
public async Task<string> 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<List<LiveGroupDictionary>>(driverName).Where(x=>x.GroupName == groupName).First();
//var val = new List<LiveGroupDictionary>();
//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<string> 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<string> SetDeviceBlockData(string driverName, string address, string value)
{

View File

@ -1,7 +1,7 @@
{
"ConnectionStrings": {
"Type": "SqlServer",
"SqlServer": "Zk48ARnbLq1Lk+lzxvCij1zzENjv04mu23Y8D8hdM3VxApXnvB2iA7xm5JfYWNkbyFTPYdwgHe54spCgmPUkzbL5/xWeXNpL5Ipe5+CdPqI+3KVDSaT3SB+v2dgdez3xKByNOkqT3RgONsqI1KDtQjqQMv4zDQlzlPfn0ORsvuomcEOokHHiIw3CIFjEHtfnGcA4a/Gznsypv4sQcSbThw=="
"SqlServer": "Zk48ARnbLq1Lk+lzxvCij1zzENjv04mu23Y8D8hdM3VxApXnvB2iA7xm5JfYWNkbLw7YB0A01VrIJSpoUrEMyqiV8fRiux6LH2hkV1/VLUdoCCG+zOCCkqgML8iuOSXlbE2i3UagxHrXZhgxt4C3ifaWykWgbiGq9h4U4WfKnimMXuCqhSgUm9Gk3c/2KDxSWgLrKUW29N2X4oWhBbwjWg=="
},
"Logging": {
"LogLevel": {