山西建龙封存,新增施耐德写入

This commit is contained in:
dell
2025-02-19 15:58:01 +08:00
parent 14c9698de9
commit d19b153ac3
5 changed files with 464 additions and 11 deletions

View File

@ -496,14 +496,467 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
}
public int Write(WritePara writePara)
/// <summary>
/// 写入方法
/// </summary>
/// <param name="writePara"></param>
/// <returns></returns>
public int Write(WritePara writePara)
{
throw new NotImplementedException();
//var t1 = DateTime.Now;
int reCode = 0;
//JObject valueJson = JObject.Parse(writePara);
var srcValue = writePara.Value; //valueJson[propertyName: "Value"].ToString();
var writeAddress = writePara.WriteAddress;//valueJson[propertyName: "WriteAddress"].ToString();
var dataType = writePara.DataType;//short.Parse(valueJson[propertyName: "DataType"].ToString());
//var groupName = writePara.GroupName; //valueJson[propertyName: "GroupName"].ToString();
//var windex = writeAddress.IndexOf(".");
//writeAddress = writeAddress.Remove(windex, 1).Insert(windex, ",");
//var array = writeAddress.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
//var DBNum_string = array[0].ToString();
//var DBNum = int.Parse(Regex.Replace(DBNum_string, "[a-z]", "", RegexOptions.IgnoreCase));
var address = writeAddress;
string startaddress = Regex.Replace(address, "[a-z]", "", RegexOptions.IgnoreCase);
int address_dem = 0;
int address_int = 0;
if (startaddress.Contains(".") && startaddress.Length > 2)
{
try
{
string[] address_arr = startaddress.Split('.');
address_int = int.Parse(address_arr[0]);
address_dem = int.Parse(address_arr[1]);
}
catch (Exception exp)
{
//logger
LogHelper.LogWrite("MB写入数据出错分离浮点的起始地址和bit位置出错 Address" + writeAddress.ToString() + ",ERROR" + exp.ToString());
}
}
else
{
address_int = int.Parse(startaddress);
}
//int start = int.Parse(startaddress);
int[] revbuffer_w;// = new byte[maxreg + 2];
decimal value = decimal.Parse(srcValue);
lock (_lock)
{
if (dataType == (short)DataType.BOOL)
{
var boolbyte = new int[2];
var rebooltempread = ReadHoldingRegisters(address_int, 1, ref boolbyte);// ReadArea(132, DBNum, address_int, 1, 2, ref boolbyte);
byte lowByte = (byte)(boolbyte[0] & 0xFF); // 低字节
byte highByte = (byte)((boolbyte[0] >> 8) & 0xFF); // 高字节
var writeintarray = new int[2] { lowByte, highByte };
Console.WriteLine(rebooltempread);
var writeint = 0;
if (address_dem<8)
{
var bytetemp = ConvertDecimalToBinary(lowByte);
Thread.Sleep(10);
var temval = (float)value;
bool bl = temval > 0.0f ? true : false;
//var rtbyte = revbuffer_w[address_int];
//var rtbuff = Sharp7.S7. rtbyte
SetBitAt(ref bytetemp, 0, address_dem, bl);
writeint = ConvertBinaryToInt(bytetemp[0], highByte);
//writeintarray[0] = writeint;
}
else
{
address_dem = address_dem - 8;
var bytetemp = ConvertDecimalToBinary(highByte);
Thread.Sleep(10);
var temval = (float)value;
bool bl = temval > 0.0f ? true : false;
//var rtbyte = revbuffer_w[address_int];
//var rtbuff = Sharp7.S7. rtbyte
SetBitAt(ref bytetemp, 0, address_dem, bl);
writeint = ConvertBinaryToInt(lowByte, bytetemp[0]);
//writeintarray[1] = writeint;
}
ushort combined = (ushort)((highByte << 8) | lowByte);
try
{
Client.WriteSingleRegister(address_int, writeint);
}
catch (Exception ex)
{
reCode = -1;
LogHelper.LogWrite($"{DriverName}的modbus写入数据出错写入布尔数据出错 Address" + writeAddress.ToString() + ",ERROR" + ex.ToString());
}
}
else if (dataType == (short)DataType.FLOAT)
{
var writeBuff = ModbusClient.ConvertFloatToRegisters((float)value);
try
{
Client.WriteMultipleRegisters(address_int, writeBuff);//.WriteArea(132, DBNum, address_int, 4, 2, revbuffer_w);
}
catch (Exception ex)
{
reCode = -1;
LogHelper.LogWrite($"{DriverName}的modbus写入数据出错写入浮点数据出错 Address" + writeAddress.ToString() + ",ERROR" + ex.ToString());
}
}
else if (dataType == (short)DataType.IFLOAT)
{
var writeBuff = ModbusClient.ConvertFloatToRegisters((float)value);
try
{
Client.WriteMultipleRegisters(address_int, writeBuff);//.WriteArea(132, DBNum, address_int, 4, 2, revbuffer_w);
}
catch (Exception ex)
{
reCode = -1;
LogHelper.LogWrite($"{DriverName}的modbus写入数据出错写入浮点数据出错 Address" + writeAddress.ToString() + ",ERROR" + ex.ToString());
}
}
else if (dataType == (short)DataType.INT)
{
var writeBuff = ModbusClient.ConvertIntToRegisters((int)value);
try
{
Client.WriteMultipleRegisters(address_int, writeBuff);//.WriteArea(132, DBNum, address_int, 4, 2, revbuffer_w);
}
catch (Exception ex)
{
reCode = -1;
LogHelper.LogWrite($"{DriverName}的modbus写入数据出错写入整型数据出错 Address" + writeAddress.ToString() + ",ERROR" + ex.ToString());
}
}
else if (dataType == (short)DataType.WORD)
{
var writeBuff = ModbusClient.ConvertLongToRegisters((long)value);
try
{
Client.WriteMultipleRegisters(address_int, writeBuff);//.WriteArea(132, DBNum, address_int, 4, 2, revbuffer_w);
}
catch (Exception ex)
{
reCode = -1;
LogHelper.LogWrite($"{DriverName}的modbus写入数据出错写入字数据出错 Address" + writeAddress.ToString() + ",ERROR" + ex.ToString());
}
}
else if (dataType == (short)DataType.BYTE)
{
var writeBuff = ModbusClient.ConvertIntToRegisters((int)value);
try
{
Client.WriteMultipleRegisters(address_int, writeBuff);//.WriteArea(132, DBNum, address_int, 4, 2, revbuffer_w);
}
catch (Exception ex)
{
reCode = -1;
LogHelper.LogWrite($"{DriverName}的modbus写入数据出错写入字节数据出错 Address" + writeAddress.ToString() + ",ERROR" + ex.ToString());
}
}
else if (dataType == (short)DataType.PBOOL)
{
var boolbyte = new int[2];
var rebooltempread = ReadHoldingRegisters(address_int, 1, ref boolbyte);// ReadArea(132, DBNum, address_int, 1, 2, ref boolbyte);
byte lowByte = (byte)(boolbyte[0] & 0xFF); // 低字节
byte highByte = (byte)((boolbyte[0] >> 8) & 0xFF); // 高字节
var writeintarray = new int[2] { lowByte, highByte };
Console.WriteLine(rebooltempread);
var writeint = 0;
if (address_dem < 8)
{
var bytetemp = ConvertDecimalToBinary(lowByte);
Thread.Sleep(10);
var temval = (float)value;
bool bl = temval > 0.0f ? true : false;
//var rtbyte = revbuffer_w[address_int];
//var rtbuff = Sharp7.S7. rtbyte
SetBitAt(ref bytetemp, 0, address_dem, bl);
writeint = ConvertBinaryToInt(bytetemp[0], highByte);
//writeintarray[0] = writeint;
}
else
{
address_dem = address_dem - 8;
var bytetemp = ConvertDecimalToBinary(highByte);
Thread.Sleep(10);
var temval = (float)value;
bool bl = temval > 0.0f ? true : false;
//var rtbyte = revbuffer_w[address_int];
//var rtbuff = Sharp7.S7. rtbyte
SetBitAt(ref bytetemp, 0, address_dem, bl);
writeint = ConvertBinaryToInt(lowByte, bytetemp[0]);
//writeintarray[1] = writeint;
}
ushort combined = (ushort)((highByte << 8) | lowByte);
try
{
Client.WriteSingleRegister(address_int, writeint);
}
catch (Exception ex)
{
reCode = -1;
LogHelper.LogWrite($"{DriverName}的modbus写入数据出错写入P布尔数据出错 Address" + writeAddress.ToString() + ",ERROR" + ex.ToString());
}
}
else
{
}
}
Console.WriteLine(writePara);
//var t2 = DateTime.Now;
//var timediff = t2 - t1;
//Console.WriteLine($"S7写入耗时{timediff}");
return reCode;
}
public int WriteBlock(WriteBlockPara writePara)
{
throw new NotImplementedException();
//var t1 = DateTime.Now;
int reCode = 0;
//JObject valueJson = JObject.Parse(writePara);
var srcValue = writePara.Value; //valueJson[propertyName: "Value"].ToString();
var writeAddress = writePara.WriteAddress;//valueJson[propertyName: "WriteAddress"].ToString();
var dataType = writePara.DataType;//short.Parse(valueJson[propertyName: "DataType"].ToString());
var windex = writeAddress.IndexOf(".");
writeAddress = writeAddress.Remove(windex, 1).Insert(windex, ",");
var array = writeAddress.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var DBNum_string = array[0].ToString();
var DBNum = int.Parse(Regex.Replace(DBNum_string, "[a-z]", "", RegexOptions.IgnoreCase));
var address = array[1].ToString();
string startaddress = Regex.Replace(address, "[a-z]", "", RegexOptions.IgnoreCase);
int address_dem = 0;
int address_int = 0;
if (startaddress.Contains(".") && startaddress.Length > 2)
{
try
{
string[] address_arr = startaddress.Split('.');
address_int = int.Parse(address_arr[0]);
address_dem = int.Parse(address_arr[1]);
}
catch (Exception exp)
{
//logger
LogHelper.LogWrite("S7写入数据出错分离浮点的起始地址和bit位置出错 Address" + writeAddress.ToString() + ",ERROR" + exp.ToString());
}
}
else
{
address_int = int.Parse(startaddress);
}
byte[] revbuffer_w;// = new byte[maxreg + 2];
decimal value = decimal.Parse(srcValue);
lock (_lock)
{
if (dataType == (short)DataType.BOOL)
{
var boolbyte = new int[2];
var rebooltempread = ReadHoldingRegisters(address_int, 1, ref boolbyte);// ReadArea(132, DBNum, address_int, 1, 2, ref boolbyte);
byte lowByte = (byte)(boolbyte[0] & 0xFF); // 低字节
byte highByte = (byte)((boolbyte[0] >> 8) & 0xFF); // 高字节
var writeintarray = new int[2] { lowByte, highByte };
Console.WriteLine(rebooltempread);
var writeint = 0;
if (address_dem < 8)
{
var bytetemp = ConvertDecimalToBinary(lowByte);
Thread.Sleep(10);
var temval = (float)value;
bool bl = temval > 0.0f ? true : false;
//var rtbyte = revbuffer_w[address_int];
//var rtbuff = Sharp7.S7. rtbyte
SetBitAt(ref bytetemp, 0, address_dem, bl);
writeint = ConvertBinaryToInt(bytetemp[0], highByte);
//writeintarray[0] = writeint;
}
else
{
address_dem = address_dem - 8;
var bytetemp = ConvertDecimalToBinary(highByte);
Thread.Sleep(10);
var temval = (float)value;
bool bl = temval > 0.0f ? true : false;
//var rtbyte = revbuffer_w[address_int];
//var rtbuff = Sharp7.S7. rtbyte
SetBitAt(ref bytetemp, 0, address_dem, bl);
writeint = ConvertBinaryToInt(lowByte, bytetemp[0]);
//writeintarray[1] = writeint;
}
ushort combined = (ushort)((highByte << 8) | lowByte);
try
{
Client.WriteSingleRegister(address_int, writeint);
}
catch (Exception ex)
{
reCode = -1;
LogHelper.LogWrite($"{DriverName}的modbus写入数据出错写入布尔数据出错 Address" + writeAddress.ToString() + ",ERROR" + ex.ToString());
}
}
else if (dataType == (short)DataType.FLOAT)
{
var writeBuff = ModbusClient.ConvertFloatToRegisters((float)value);
try
{
Client.WriteMultipleRegisters(address_int, writeBuff);//.WriteArea(132, DBNum, address_int, 4, 2, revbuffer_w);
}
catch (Exception ex)
{
reCode = -1;
LogHelper.LogWrite($"{DriverName}的modbus写入数据出错写入浮点数据出错 Address" + writeAddress.ToString() + ",ERROR" + ex.ToString());
}
}
else if (dataType == (short)DataType.IFLOAT)
{
var writeBuff = ModbusClient.ConvertFloatToRegisters((float)value);
try
{
Client.WriteMultipleRegisters(address_int, writeBuff);//.WriteArea(132, DBNum, address_int, 4, 2, revbuffer_w);
}
catch (Exception ex)
{
reCode = -1;
LogHelper.LogWrite($"{DriverName}的modbus写入数据出错写入浮点数据出错 Address" + writeAddress.ToString() + ",ERROR" + ex.ToString());
}
}
else if (dataType == (short)DataType.INT)
{
var writeBuff = ModbusClient.ConvertIntToRegisters((int)value);
try
{
Client.WriteMultipleRegisters(address_int, writeBuff);//.WriteArea(132, DBNum, address_int, 4, 2, revbuffer_w);
}
catch (Exception ex)
{
reCode = -1;
LogHelper.LogWrite($"{DriverName}的modbus写入数据出错写入整型数据出错 Address" + writeAddress.ToString() + ",ERROR" + ex.ToString());
}
}
else if (dataType == (short)DataType.WORD)
{
var writeBuff = ModbusClient.ConvertLongToRegisters((long)value);
try
{
Client.WriteMultipleRegisters(address_int, writeBuff);//.WriteArea(132, DBNum, address_int, 4, 2, revbuffer_w);
}
catch (Exception ex)
{
reCode = -1;
LogHelper.LogWrite($"{DriverName}的modbus写入数据出错写入字数据出错 Address" + writeAddress.ToString() + ",ERROR" + ex.ToString());
}
}
else if (dataType == (short)DataType.BYTE)
{
var writeBuff = ModbusClient.ConvertIntToRegisters((int)value);
try
{
Client.WriteMultipleRegisters(address_int, writeBuff);//.WriteArea(132, DBNum, address_int, 4, 2, revbuffer_w);
}
catch (Exception ex)
{
reCode = -1;
LogHelper.LogWrite($"{DriverName}的modbus写入数据出错写入字节数据出错 Address" + writeAddress.ToString() + ",ERROR" + ex.ToString());
}
}
else if (dataType == (short)DataType.PBOOL)
{
var boolbyte = new int[2];
var rebooltempread = ReadHoldingRegisters(address_int, 1, ref boolbyte);// ReadArea(132, DBNum, address_int, 1, 2, ref boolbyte);
byte lowByte = (byte)(boolbyte[0] & 0xFF); // 低字节
byte highByte = (byte)((boolbyte[0] >> 8) & 0xFF); // 高字节
var writeintarray = new int[2] { lowByte, highByte };
Console.WriteLine(rebooltempread);
var writeint = 0;
if (address_dem < 8)
{
var bytetemp = ConvertDecimalToBinary(lowByte);
Thread.Sleep(10);
var temval = (float)value;
bool bl = temval > 0.0f ? true : false;
//var rtbyte = revbuffer_w[address_int];
//var rtbuff = Sharp7.S7. rtbyte
SetBitAt(ref bytetemp, 0, address_dem, bl);
writeint = ConvertBinaryToInt(bytetemp[0], highByte);
//writeintarray[0] = writeint;
}
else
{
address_dem = address_dem - 8;
var bytetemp = ConvertDecimalToBinary(highByte);
Thread.Sleep(10);
var temval = (float)value;
bool bl = temval > 0.0f ? true : false;
//var rtbyte = revbuffer_w[address_int];
//var rtbuff = Sharp7.S7. rtbyte
SetBitAt(ref bytetemp, 0, address_dem, bl);
writeint = ConvertBinaryToInt(lowByte, bytetemp[0]);
//writeintarray[1] = writeint;
}
ushort combined = (ushort)((highByte << 8) | lowByte);
try
{
Client.WriteSingleRegister(address_int, writeint);
}
catch (Exception ex)
{
reCode = -1;
LogHelper.LogWrite($"{DriverName}的modbus写入数据出错写入P布尔数据出错 Address" + writeAddress.ToString() + ",ERROR" + ex.ToString());
}
}
else
{
}
}
Console.WriteLine(writePara);
//var t2 = DateTime.Now;
//var timediff = t2 - t1;
//Console.WriteLine($"S7写入耗时{timediff}");
return reCode;
}
public byte[] ConvertDecimalToBinary(int decimalNumber)
{
// 计算需要多少个字节来表示这个数
int byteCount = (int)Math.Ceiling(Math.Log(decimalNumber + 1, 2) / 8.0);
// 确保至少有一个字节即使输入是0
byteCount = Math.Max(byteCount, 1);
byte[] binary = new byte[byteCount];
for (int i = 0; i < byteCount; i++)
{
// 从低位到高位填充字节
binary[i] = (byte)(decimalNumber >> (8 * i) & 0xFF);
}
// 反转数组,因为我们是从低位开始填充的
Array.Reverse(binary);
return binary;
}
public int ConvertBinaryToInt(byte lowByte, byte highByte)
{
ushort combined = (ushort)((highByte << 8) | lowByte);
return combined;
}
public static void SetBitAt(ref byte[] Buffer, int Pos, int Bit, bool Value)
{
byte[] Mask = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
if (Bit < 0) Bit = 0;
if (Bit > 7) Bit = 7;
if (Value)
Buffer[Pos] = (byte)(Buffer[Pos] | Mask[Bit]);
else
Buffer[Pos] = (byte)(Buffer[Pos] & ~Mask[Bit]);
}
/*
/// <summary>

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<!--<InvariantGlobalization>true</InvariantGlobalization>-->
@ -57,9 +57,9 @@
<ItemGroup>
<PackageReference Include="libplctag" Version="1.2.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="8.0.0" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.5" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.1" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="9.0.1" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.21.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="SqlSugarCore" Version="5.1.4.166" />
<PackageReference Include="System.IO.Ports" Version="8.0.0" />

View File

@ -125,9 +125,9 @@ namespace HTCoreServiceApp
async (string tagName, string value,HttpContext context, DeviceControl dc)
=> Results.Content(await dc.SetDeviceTagData(tagName, value ,context)));
deviceControl.MapGet("/SetBlockData/driverName={driverName}&address={address}&value={value}",
deviceControl.MapGet("/SetDeviceBlockData/driverName={driverName}&address={address}&value={value}",
async (string driverName, string address, string value, DeviceControl dc)
=> Results.Content(await dc.SetBlockData(driverName, address, value)));
=> Results.Content(await dc.SetDeviceBlockData(driverName, address, value)));
var sampleTodos = new Todo[] {
new(1, "Walk the dog"),

View File

@ -244,7 +244,7 @@ namespace HTCoreServiceApp.WebApi
return reCode.ToString();
}
public async Task<string> SetBlockData(string driverName, string address, string value)
public async Task<string> SetDeviceBlockData(string driverName, string address, string value)
{

View File

@ -1,7 +1,7 @@
{
"ConnectionStrings": {
"Type": "SqlServer",
"SqlServer": "Zk48ARnbLq1Lk+lzxvCij1zzENjv04mu23Y8D8hdM3VxApXnvB2iA7xm5JfYWNkbR4m0u8SvmSkPpW1HqgyIlX9lbHiIuIQpS6lLThUT43JYrzX58HTXFtr/7DZ/QgrdUaOZqOBpVB9riZ4eSsJ+swn6WOptm+aEuvxLC/6Te15/OW/WsUX/Mhwb55VidHdGGLY2nbbpX8GYelD8PXMznA=="
"SqlServer": "Zk48ARnbLq1Lk+lzxvCij1zzENjv04mu23Y8D8hdM3VxApXnvB2iA7xm5JfYWNkbyFTPYdwgHe54spCgmPUkzbL5/xWeXNpL5Ipe5+CdPqI+3KVDSaT3SB+v2dgdez3xKByNOkqT3RgONsqI1KDtQjqQMv4zDQlzlPfn0ORsvuomcEOokHHiIw3CIFjEHtfnGcA4a/Gznsypv4sQcSbThw=="
},
"Logging": {
"LogLevel": {