diff --git a/ModbusDemo/Device/IModbusRTU.cs b/ModbusDemo/Device/IModbusRTU.cs index 352af03..0a0a0bf 100644 --- a/ModbusDemo/Device/IModbusRTU.cs +++ b/ModbusDemo/Device/IModbusRTU.cs @@ -11,7 +11,7 @@ namespace ModbusDemo.Device public bool[] ReadCoil(byte slaveAddress, ushort startAddress, ushort numberOfPoints); - public bool WriteCoil(byte slaveAddress, ushort startAddress, bool[] data); + public void WriteCoil(byte slaveAddress, ushort startAddress, bool[] data); public ushort[] ReadRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints); diff --git a/ModbusDemo/Device/ModbusRTU.cs b/ModbusDemo/Device/ModbusRTU.cs index 467da75..7f669e4 100644 --- a/ModbusDemo/Device/ModbusRTU.cs +++ b/ModbusDemo/Device/ModbusRTU.cs @@ -56,7 +56,7 @@ namespace ModbusDemo.Device byte[] sendByte = sendByteList.ToArray(); int maxRetries = 3; // 最大重试次数 int attempt = 0; - + while (attempt < maxRetries) { try @@ -83,7 +83,7 @@ namespace ModbusDemo.Device } //将操作失败的指令,插入数据库 string RequestStr = ByteArrayToString(sendByte); - + ModbusLog m = new ModbusLog(); m.OperationType = "读线圈"; m.ResponseData = ""; @@ -101,53 +101,53 @@ namespace ModbusDemo.Device string responseStr = ByteArrayToString(response); ModbusLog m = new ModbusLog(); m.OperationType = "读线圈"; - m.ResponseData = RequestStr; - m.RequestData = responseStr; + m.ResponseData = responseStr; + m.RequestData = RequestStr; _modbusDbContext.Add(m); _modbusDbContext.SaveChanges(); //判断发送回来的数据是否正确 - if(CheckData.CheckResponse(response)) - { - if (!CRCUitl.ValidateCRC(response)) - { - MessageBox.Show("0x14:CRC校验错误"); - return null; - } - } - - - List responseList = new List(response); - //移除前两位 - responseList.RemoveRange(0, 3); - //移除后两位校验码 - responseList.RemoveRange(responseList.Count - 2, 2); - responseList.Reverse(); - //数组反转之后,转为二进制字符 - List StringList = responseList.Select(m => Convert.ToString(m, 2)).ToList(); - - var result = ""; - - foreach (var item in StringList) - { - result += item.PadLeft(8, '0'); - } - //先将字符串转为数组,再反转,再转为字节数组 - char[] chars = result.ToArray().Reverse().ToArray(); - bool[] ultimately = new bool[numberOfPoints]; - for (int i = 0; i < numberOfPoints; i++) + if (CheckData.CheckResponse(response)) { - if (chars[i] == '1') + List responseList = new List(response); + //移除前两位 + responseList.RemoveRange(0, 3); + //移除后两位校验码 + responseList.RemoveRange(responseList.Count - 2, 2); + responseList.Reverse(); + //数组反转之后,转为二进制字符 + List StringList = responseList.Select(m => Convert.ToString(m, 2)).ToList(); + + var result = ""; + + foreach (var item in StringList) { - ultimately[i] = true; + result += item.PadLeft(8, '0'); } - else + //先将字符串转为数组,再反转,再转为字节数组 + char[] chars = result.ToArray().Reverse().ToArray(); + bool[] ultimately = new bool[numberOfPoints]; + for (int i = 0; i < numberOfPoints; i++) { - ultimately[i] = false; + if (chars[i] == '1') + { + ultimately[i] = true; + } + else + { + ultimately[i] = false; + } } + return ultimately; } - return ultimately; + else + { + return null; + } + + + } /// /// 写入多个线圈操作 @@ -155,12 +155,12 @@ namespace ModbusDemo.Device /// 从站地址 /// 起始地址 /// 写入的数据 - public bool WriteCoil(byte slaveAddress, ushort startAddress, bool[] data) + public void WriteCoil(byte slaveAddress, ushort startAddress, bool[] data) { if (!_serialPort.IsOpen) { MessageBox.Show("串口没有链接,请先链接"); - return false; + return ; } List sendByteList = new List(); //设置从站地址 @@ -244,10 +244,10 @@ namespace ModbusDemo.Device if (!CRCUitl.ValidateCRC(response)) { MessageBox.Show("0x14:CRC校验错误"); - return false; } + } - return true; + } public ushort[] ReadRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints) diff --git a/ModbusDemo/Uitls/CheckData.cs b/ModbusDemo/Uitls/CheckData.cs index f581607..31854d5 100644 --- a/ModbusDemo/Uitls/CheckData.cs +++ b/ModbusDemo/Uitls/CheckData.cs @@ -12,6 +12,11 @@ namespace ModbusDemo.Uitls public static bool CheckResponse(byte[] response) { + if (response.Length == 0) + { + MessageBox.Show("返回数据为空", "error", MessageBoxButton.OK, MessageBoxImage.Error); + return false; + } // 检查数组长度是否足够 if (response.Length > 1) { @@ -24,13 +29,14 @@ namespace ModbusDemo.Uitls if (highNibble == 8) { MessageBox.Show($"数据错误:错误码为:0x{response[2]:X2}"); - + return false; } - return false; } - if(response.Length == 0) + + + if (!CRCUitl.ValidateCRC(response)) { - MessageBox.Show("返回数据为空","error",MessageBoxButton.OK,MessageBoxImage.Error); + MessageBox.Show("0x14:CRC校验错误"); return false; } diff --git a/ModbusDemo/VIewModel/CoilUCViewModel.cs b/ModbusDemo/VIewModel/CoilUCViewModel.cs index 3973686..b031a5a 100644 --- a/ModbusDemo/VIewModel/CoilUCViewModel.cs +++ b/ModbusDemo/VIewModel/CoilUCViewModel.cs @@ -195,6 +195,7 @@ namespace ModbusDemo.VIewModel if (result == null) { MessageBox.Show("读取失败", "error", MessageBoxButton.OK, MessageBoxImage.Error); + ModbusLogList = GetOperateCoil(); return; } @@ -239,13 +240,18 @@ namespace ModbusDemo.VIewModel //使用子线程执行,避免ui线程卡顿 Task.Run(() => { - bool boo= _modbusRTU.WriteCoil(writeSlaveAddressValue, WriteStartAddressValue, data); - if (boo) + _modbusRTU.WriteCoil(writeSlaveAddressValue, WriteStartAddressValue, data); + ModbusLogList = GetOperateCoil(); + ModbusLog modbusLog = ModbusLogList.FirstOrDefault(); + if (modbusLog != null && modbusLog.ResponseData != string.Empty) { MessageBox.Show("写入成功"); + + } + else + { + MessageBox.Show("WriteData 格式无效", "error", MessageBoxButton.OK, MessageBoxImage.Error); } - - ModbusLogList = GetOperateCoil(); }); }