diff --git a/HTCoreServiceApp/Communicate/ModbusTcp/ModbusTcpClientExample.cs b/HTCoreServiceApp/Communicate/ModbusTcp/ModbusTcpClientExample.cs
index 780928b..472982d 100644
--- a/HTCoreServiceApp/Communicate/ModbusTcp/ModbusTcpClientExample.cs
+++ b/HTCoreServiceApp/Communicate/ModbusTcp/ModbusTcpClientExample.cs
@@ -496,14 +496,467 @@ namespace HTCoreServiceApp.Communicate.ModbusTcp
}
- public int Write(WritePara writePara)
+ ///
+ /// 写入方法
+ ///
+ ///
+ ///
+ 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]);
}
/*
///
diff --git a/HTCoreServiceApp/HTCoreServiceApp.csproj b/HTCoreServiceApp/HTCoreServiceApp.csproj
index 0c0b82b..d743e55 100644
--- a/HTCoreServiceApp/HTCoreServiceApp.csproj
+++ b/HTCoreServiceApp/HTCoreServiceApp.csproj
@@ -1,7 +1,7 @@
- net8.0
+ net9.0
enable
enable
@@ -57,9 +57,9 @@
-
-
-
+
+
+
diff --git a/HTCoreServiceApp/Program.cs b/HTCoreServiceApp/Program.cs
index aa9cb0f..9f56c4b 100644
--- a/HTCoreServiceApp/Program.cs
+++ b/HTCoreServiceApp/Program.cs
@@ -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"),
diff --git a/HTCoreServiceApp/WebApis/DeviceController.cs b/HTCoreServiceApp/WebApis/DeviceController.cs
index b87be91..0ed9d5a 100644
--- a/HTCoreServiceApp/WebApis/DeviceController.cs
+++ b/HTCoreServiceApp/WebApis/DeviceController.cs
@@ -244,7 +244,7 @@ namespace HTCoreServiceApp.WebApi
return reCode.ToString();
}
- public async Task SetBlockData(string driverName, string address, string value)
+ public async Task SetDeviceBlockData(string driverName, string address, string value)
{
diff --git a/HTCoreServiceApp/appsettings.json b/HTCoreServiceApp/appsettings.json
index 4bddc66..35ad134 100644
--- a/HTCoreServiceApp/appsettings.json
+++ b/HTCoreServiceApp/appsettings.json
@@ -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": {