modbus断线重连修复,modbus科学计数法数据处理
This commit is contained in:
@ -73,7 +73,7 @@ namespace HTCoreServiceApp.Common
|
|||||||
return addressArg;
|
return addressArg;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AddressArg GetAddressArg_Modbus_Word(List<MetaTag> metaTags)
|
public static AddressArg GetAddressArg_Modbus_Word(List<MetaTag> metaTags, string addressOffset)
|
||||||
{
|
{
|
||||||
//list为空的报错处理
|
//list为空的报错处理
|
||||||
AddressArg addressArg = new AddressArg();
|
AddressArg addressArg = new AddressArg();
|
||||||
@ -108,8 +108,8 @@ namespace HTCoreServiceApp.Common
|
|||||||
lastDataLenght = 2;
|
lastDataLenght = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
var offset = int.Parse(addressOffset);
|
||||||
addressArg.Start = (int)f_min;
|
addressArg.Start = (int)f_min + offset;
|
||||||
//addressArg.Length = (int)f_max + lastDataLenght -1;
|
//addressArg.Length = (int)f_max + lastDataLenght -1;
|
||||||
addressArg.Length = (int)f_max - (int)f_min + lastDataLenght;
|
addressArg.Length = (int)f_max - (int)f_min + lastDataLenght;
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@ namespace HTCoreServiceApp.Communicate.Modbus
|
|||||||
public bool IsConnected { get; set; }
|
public bool IsConnected { get; set; }
|
||||||
|
|
||||||
public int Timeout { get; set; }
|
public int Timeout { get; set; }
|
||||||
|
public string AddressOffset { get; set; }
|
||||||
|
|
||||||
public bool isScan { 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);
|
SlaveID = byte.Parse(tagGroup.Arguments.Where(x => x.PropertyName == "SlaveID").First().PropertyValue);
|
||||||
PLCType = tagGroup.Arguments.Where(x => x.PropertyName == "PLCType").First().PropertyValue;
|
PLCType = tagGroup.Arguments.Where(x => x.PropertyName == "PLCType").First().PropertyValue;
|
||||||
Timeout = int.Parse(tagGroup.Arguments.Where(x => x.PropertyName == "TimeOut").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;
|
MetaGroups =tagGroup.Groups;
|
||||||
MetaTags = tagGroup.Tags;//只有一组
|
MetaTags = tagGroup.Tags;//只有一组
|
||||||
DriverName = tagGroup.DriverName;
|
DriverName = tagGroup.DriverName;
|
||||||
@ -110,7 +112,7 @@ namespace HTCoreServiceApp.Communicate.Modbus
|
|||||||
scanTagsPara.DriverName = DriverName;
|
scanTagsPara.DriverName = DriverName;
|
||||||
var groupSysId = MetaGroups.Where(x => x.GroupId == metaGroup.Key.GroupId).ToList().First().SystemId;
|
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.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);
|
scanTagsParas.Add(scanTagsPara);
|
||||||
}
|
}
|
||||||
//if 添加连续或单变量读取标记
|
//if 添加连续或单变量读取标记
|
||||||
|
@ -38,7 +38,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
|
|||||||
{
|
{
|
||||||
public enum RegisterOrder { LowHigh = 0, HighLow = 1 };
|
public enum RegisterOrder { LowHigh = 0, HighLow = 1 };
|
||||||
private bool debug=false;
|
private bool debug=false;
|
||||||
private TcpClient tcpClient;
|
public TcpClient tcpClient;
|
||||||
private string ipAddress = "127.0.0.1";
|
private string ipAddress = "127.0.0.1";
|
||||||
private int port = 502;
|
private int port = 502;
|
||||||
private uint transactionIdentifierInternal = 0;
|
private uint transactionIdentifierInternal = 0;
|
||||||
|
@ -16,6 +16,7 @@ using System.Net;
|
|||||||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||||
using Pipelines.Sockets.Unofficial.Arenas;
|
using Pipelines.Sockets.Unofficial.Arenas;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
|
||||||
namespace HTCoreServiceApp.Communicate.ModbusTcp
|
namespace HTCoreServiceApp.Communicate.ModbusTcp
|
||||||
{
|
{
|
||||||
@ -30,6 +31,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
|
|||||||
|
|
||||||
public int Timeout { get; set; }
|
public int Timeout { get; set; }
|
||||||
|
|
||||||
|
public string AddressOffset { get; set; }
|
||||||
public bool isScan { get; set; }
|
public bool isScan { get; set; }
|
||||||
|
|
||||||
public System.Timers.Timer ScanTimer { 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);
|
SlaveID = int.Parse(tagGroup.Arguments.Where(x => x.PropertyName == "SlaveID").First().PropertyValue);
|
||||||
PLCType = tagGroup.Arguments.Where(x => x.PropertyName == "PLCType").First().PropertyValue;
|
PLCType = tagGroup.Arguments.Where(x => x.PropertyName == "PLCType").First().PropertyValue;
|
||||||
Timeout = int.Parse(tagGroup.Arguments.Where(x => x.PropertyName == "TimeOut").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;
|
MetaGroups =tagGroup.Groups;
|
||||||
MetaTags = tagGroup.Tags;//只有一组
|
MetaTags = tagGroup.Tags;//只有一组
|
||||||
DriverName = tagGroup.DriverName;
|
DriverName = tagGroup.DriverName;
|
||||||
@ -107,7 +110,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
|
|||||||
scanTagsPara.DriverName = DriverName;
|
scanTagsPara.DriverName = DriverName;
|
||||||
var groupSysId = MetaGroups.Where(x => x.GroupId == metaGroup.Key.GroupId).ToList().First().SystemId;
|
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.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);
|
scanTagsParas.Add(scanTagsPara);
|
||||||
}
|
}
|
||||||
//if 添加连续或单变量读取标记
|
//if 添加连续或单变量读取标记
|
||||||
@ -168,7 +171,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
|
|||||||
|
|
||||||
if (scanTagsPara.IsActive == false)
|
if (scanTagsPara.IsActive == false)
|
||||||
return;
|
return;
|
||||||
if (Client.Connected)
|
if (TcpConnected && Client.Connected)
|
||||||
{
|
{
|
||||||
|
|
||||||
var addressArg = scanTagsPara.AddressArg;
|
var addressArg = scanTagsPara.AddressArg;
|
||||||
@ -256,10 +259,11 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
|
|||||||
{
|
{
|
||||||
Console.WriteLine("MB读取失败:"+" ERROR:" + Result.ToString());
|
Console.WriteLine("MB读取失败:"+" ERROR:" + Result.ToString());
|
||||||
LogHelper.LogWrite("MB读取失败:"+" ERROR:" + Result.ToString());
|
LogHelper.LogWrite("MB读取失败:"+" ERROR:" + Result.ToString());
|
||||||
//Close();
|
TcpConnected = false;
|
||||||
//Thread.Sleep(50);
|
//Close();
|
||||||
//Connect();
|
//Thread.Sleep(50);
|
||||||
}
|
//Connect();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@ -394,8 +398,18 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
|
|||||||
buffer = Client.ReadHoldingRegisters(start, Amount);
|
buffer = Client.ReadHoldingRegisters(start, Amount);
|
||||||
return Result;
|
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();
|
return Result = ex.ToString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -411,7 +425,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
|
|||||||
private void TimerCheckConnect_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
|
private void TimerCheckConnect_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
|
||||||
{
|
{
|
||||||
timerCheck.Enabled = false;
|
timerCheck.Enabled = false;
|
||||||
if (Client.Connected)
|
if (Client.Connected && TcpConnected)
|
||||||
{
|
{
|
||||||
timerCheck.Enabled = true;
|
timerCheck.Enabled = true;
|
||||||
return;
|
return;
|
||||||
@ -435,7 +449,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
|
|||||||
{
|
{
|
||||||
Result = ex.ToString();
|
Result = ex.ToString();
|
||||||
}
|
}
|
||||||
if (Result == "" && Client.Connected)
|
if (Result == "" && Client.Connected && TcpConnected)
|
||||||
{
|
{
|
||||||
IsConnected = true;
|
IsConnected = true;
|
||||||
//log
|
//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()
|
public bool Close()
|
||||||
{
|
{
|
||||||
var Result = "";
|
var Result = "";
|
||||||
@ -526,7 +550,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
string[] address_arr = startaddress.Split('.');
|
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]);
|
address_dem = int.Parse(address_arr[1]);
|
||||||
}
|
}
|
||||||
catch (Exception exp)
|
catch (Exception exp)
|
||||||
@ -537,7 +561,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
address_int = int.Parse(startaddress);
|
address_int = int.Parse(startaddress) + int.Parse(AddressOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
//int start = int.Parse(startaddress);
|
//int start = int.Parse(startaddress);
|
||||||
@ -736,7 +760,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
string[] address_arr = startaddress.Split('.');
|
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]);
|
address_dem = int.Parse(address_arr[1]);
|
||||||
}
|
}
|
||||||
catch (Exception exp)
|
catch (Exception exp)
|
||||||
@ -747,7 +771,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
address_int = int.Parse(startaddress);
|
address_int = int.Parse(startaddress) + int.Parse(AddressOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
byte[] revbuffer_w;// = new byte[maxreg + 2];
|
byte[] revbuffer_w;// = new byte[maxreg + 2];
|
||||||
|
@ -166,7 +166,7 @@ namespace HTCoreServiceApp.DataHandle
|
|||||||
{
|
{
|
||||||
case (short)DataType.FLOAT:
|
case (short)DataType.FLOAT:
|
||||||
//return S7.GetRealAt(bytes, address_int).ToString();
|
//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:
|
case (short)DataType.BOOL:
|
||||||
//return S7.GetBitAt(bytes, address_int,address_dem).ToString();
|
//return S7.GetBitAt(bytes, address_int,address_dem).ToString();
|
||||||
byte[] Mask = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
|
byte[] Mask = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
|
||||||
|
@ -159,7 +159,7 @@ namespace HTCoreServiceApp.DataHandle
|
|||||||
switch (dataType)
|
switch (dataType)
|
||||||
{
|
{
|
||||||
case (short)DataType.FLOAT:
|
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:
|
case (short)DataType.BOOL:
|
||||||
int[] Mask = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200,0x400,0x800,0x1000,0x2000,0x4000,0x8000};
|
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;
|
if (address_dem < 0) address_dem = 0;
|
||||||
|
@ -171,7 +171,7 @@ namespace HTCoreServiceApp.DataHandle
|
|||||||
{
|
{
|
||||||
case (short)DataType.FLOAT:
|
case (short)DataType.FLOAT:
|
||||||
//return S7.GetRealAt(bytes, address_int).ToString();
|
//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:
|
case (short)DataType.BOOL:
|
||||||
//return S7.GetBitAt(bytes, address_int,address_dem).ToString();
|
//return S7.GetBitAt(bytes, address_int,address_dem).ToString();
|
||||||
byte[] Mask = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
|
byte[] Mask = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
|
||||||
|
@ -90,6 +90,7 @@ namespace HTCoreServiceApp.DataHandle
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine($"报错sql:{sql}");
|
||||||
Console.WriteLine($"{driverName}_{GroupName} 写入出错:{ex}");
|
Console.WriteLine($"{driverName}_{GroupName} 写入出错:{ex}");
|
||||||
db.Dispose();
|
db.Dispose();
|
||||||
return -1;
|
return -1;
|
||||||
@ -179,6 +180,7 @@ namespace HTCoreServiceApp.DataHandle
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine($"报错sql:{sql}");
|
||||||
Console.WriteLine($"{driverName}_{GroupName}写入出错:{ex}");
|
Console.WriteLine($"{driverName}_{GroupName}写入出错:{ex}");
|
||||||
db.Dispose();
|
db.Dispose();
|
||||||
//return -1;
|
//return -1;
|
||||||
|
@ -3,6 +3,9 @@ using HTCoreServiceApp.DataHandle;
|
|||||||
using HTCoreServiceApp.WebApi;
|
using HTCoreServiceApp.WebApi;
|
||||||
using Microsoft.AspNetCore.Http.Headers;
|
using Microsoft.AspNetCore.Http.Headers;
|
||||||
using Microsoft.AspNetCore.Http.HttpResults;
|
using Microsoft.AspNetCore.Http.HttpResults;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.AspNetCore.ResponseCompression;
|
||||||
|
using Microsoft.AspNetCore.Server.Kestrel.Core;
|
||||||
using SqlSugar;
|
using SqlSugar;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
@ -47,15 +50,26 @@ namespace HTCoreServiceApp
|
|||||||
options.SizeLimit = 10000;
|
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.AddTransient<DataExtract>();
|
||||||
builder.Services.AddSingleton<DeviceControl>();
|
builder.Services.AddSingleton<DeviceControl>();
|
||||||
|
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
#region <EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>api
|
#region <EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>api
|
||||||
var dataLiveCacheApi = app.MapGroup("/DataLiveCache");
|
var dataLiveCacheApi = app.MapGroup("/DataLiveCache");
|
||||||
dataLiveCacheApi.MapGet("/Get",
|
dataLiveCacheApi.MapGet("/Get",
|
||||||
@ -81,6 +95,14 @@ namespace HTCoreServiceApp
|
|||||||
dataLiveCacheApi.MapGet("/GetLiveTagData/groupName={groupName}&tagName={tagName}",
|
dataLiveCacheApi.MapGet("/GetLiveTagData/groupName={groupName}&tagName={tagName}",
|
||||||
async (string groupName, string tagName, DataLiveCache dlc)
|
async (string groupName, string tagName, DataLiveCache dlc)
|
||||||
=> Results.Content(await dlc.GetLiveTagData(groupName,tagName)));
|
=> 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
|
#endregion
|
||||||
|
|
||||||
#region <EFBFBD>ڵ<EFBFBD>api
|
#region <EFBFBD>ڵ<EFBFBD>api
|
||||||
@ -125,10 +147,31 @@ namespace HTCoreServiceApp
|
|||||||
async (string tagName, string value,HttpContext context, DeviceControl dc)
|
async (string tagName, string value,HttpContext context, DeviceControl dc)
|
||||||
=> Results.Content(await dc.SetDeviceTagData(tagName, value ,context)));
|
=> 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}",
|
deviceControl.MapGet("/SetDeviceBlockData/driverName={driverName}&address={address}&value={value}",
|
||||||
async (string driverName, string address, string value, DeviceControl dc)
|
async (string driverName, string address, string value, DeviceControl dc)
|
||||||
=> Results.Content(await dc.SetDeviceBlockData(driverName, address, value)));
|
=> 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[] {
|
var sampleTodos = new Todo[] {
|
||||||
new(1, "Walk the dog"),
|
new(1, "Walk the dog"),
|
||||||
new(2, "Do the dishes", DateOnly.FromDateTime(DateTime.Now)),
|
new(2, "Do the dishes", DateOnly.FromDateTime(DateTime.Now)),
|
||||||
@ -145,12 +188,15 @@ namespace HTCoreServiceApp
|
|||||||
: Results.NotFound());
|
: Results.NotFound());
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
app.UseResponseCompression();
|
||||||
|
app.UseCors("AllowAll");
|
||||||
|
app.UseRouting();
|
||||||
app.Run();
|
app.Run();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
|
||||||
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[]))]
|
[JsonSerializable(typeof(Todo[]))]
|
||||||
internal partial class AppJsonSerializerContext : JsonSerializerContext
|
internal partial class AppJsonSerializerContext : JsonSerializerContext
|
||||||
|
@ -154,6 +154,66 @@ namespace HTCoreServiceApp.WebApi
|
|||||||
}
|
}
|
||||||
return value;
|
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]
|
//[HttpGet]
|
||||||
//public string GetLiveTagData(string driverName, string groupName ,string tagName)
|
//public string GetLiveTagData(string driverName, string groupName ,string tagName)
|
||||||
//{
|
//{
|
||||||
|
@ -244,6 +244,207 @@ namespace HTCoreServiceApp.WebApi
|
|||||||
return reCode.ToString();
|
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)
|
public async Task<string> SetDeviceBlockData(string driverName, string address, string value)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"ConnectionStrings": {
|
"ConnectionStrings": {
|
||||||
"Type": "SqlServer",
|
"Type": "SqlServer",
|
||||||
"SqlServer": "Zk48ARnbLq1Lk+lzxvCij1zzENjv04mu23Y8D8hdM3VxApXnvB2iA7xm5JfYWNkbyFTPYdwgHe54spCgmPUkzbL5/xWeXNpL5Ipe5+CdPqI+3KVDSaT3SB+v2dgdez3xKByNOkqT3RgONsqI1KDtQjqQMv4zDQlzlPfn0ORsvuomcEOokHHiIw3CIFjEHtfnGcA4a/Gznsypv4sQcSbThw=="
|
"SqlServer": "Zk48ARnbLq1Lk+lzxvCij1zzENjv04mu23Y8D8hdM3VxApXnvB2iA7xm5JfYWNkbLw7YB0A01VrIJSpoUrEMyqiV8fRiux6LH2hkV1/VLUdoCCG+zOCCkqgML8iuOSXlbE2i3UagxHrXZhgxt4C3ifaWykWgbiGq9h4U4WfKnimMXuCqhSgUm9Gk3c/2KDxSWgLrKUW29N2X4oWhBbwjWg=="
|
||||||
},
|
},
|
||||||
"Logging": {
|
"Logging": {
|
||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
|
Reference in New Issue
Block a user