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": {