modbus断线重连修复,modbus科学计数法数据处理
This commit is contained in:
@ -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;
|
||||
|
||||
|
@ -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 添加连续或单变量读取标记
|
||||
|
@ -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;
|
||||
|
@ -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,6 +259,7 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
|
||||
{
|
||||
Console.WriteLine("MB读取失败:"+" ERROR:" + Result.ToString());
|
||||
LogHelper.LogWrite("MB读取失败:"+" ERROR:" + Result.ToString());
|
||||
TcpConnected = false;
|
||||
//Close();
|
||||
//Thread.Sleep(50);
|
||||
//Connect();
|
||||
@ -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];
|
||||
|
@ -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 };
|
||||
|
@ -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;
|
||||
|
@ -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 };
|
||||
|
@ -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;
|
||||
|
@ -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,6 +50,17 @@ namespace HTCoreServiceApp
|
||||
options.SizeLimit = 10000;
|
||||
});
|
||||
|
||||
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>
|
||||
@ -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,11 +188,14 @@ namespace HTCoreServiceApp
|
||||
: Results.NotFound());
|
||||
|
||||
#endregion
|
||||
|
||||
app.UseResponseCompression();
|
||||
app.UseCors("AllowAll");
|
||||
app.UseRouting();
|
||||
app.Run();
|
||||
}
|
||||
}
|
||||
|
||||
// <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[]))]
|
||||
|
@ -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)
|
||||
//{
|
||||
|
@ -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)
|
||||
{
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"ConnectionStrings": {
|
||||
"Type": "SqlServer",
|
||||
"SqlServer": "Zk48ARnbLq1Lk+lzxvCij1zzENjv04mu23Y8D8hdM3VxApXnvB2iA7xm5JfYWNkbyFTPYdwgHe54spCgmPUkzbL5/xWeXNpL5Ipe5+CdPqI+3KVDSaT3SB+v2dgdez3xKByNOkqT3RgONsqI1KDtQjqQMv4zDQlzlPfn0ORsvuomcEOokHHiIw3CIFjEHtfnGcA4a/Gznsypv4sQcSbThw=="
|
||||
"SqlServer": "Zk48ARnbLq1Lk+lzxvCij1zzENjv04mu23Y8D8hdM3VxApXnvB2iA7xm5JfYWNkbLw7YB0A01VrIJSpoUrEMyqiV8fRiux6LH2hkV1/VLUdoCCG+zOCCkqgML8iuOSXlbE2i3UagxHrXZhgxt4C3ifaWykWgbiGq9h4U4WfKnimMXuCqhSgUm9Gk3c/2KDxSWgLrKUW29N2X4oWhBbwjWg=="
|
||||
},
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
|
Reference in New Issue
Block a user