永攀 张 2 недель назад
Родитель
Сommit
8dd1d9c7a1
4 измененных файлов: 63 добавлений и 51 удалений
  1. +1
    -1
      ModbusDemo/Device/IModbusRTU.cs
  2. +42
    -42
      ModbusDemo/Device/ModbusRTU.cs
  3. +10
    -4
      ModbusDemo/Uitls/CheckData.cs
  4. +10
    -4
      ModbusDemo/VIewModel/CoilUCViewModel.cs

+ 1
- 1
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);



+ 42
- 42
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<byte> responseList = new List<byte>(response);
//移除前两位
responseList.RemoveRange(0, 3);
//移除后两位校验码
responseList.RemoveRange(responseList.Count - 2, 2);
responseList.Reverse();
//数组反转之后,转为二进制字符
List<string> 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<char>().ToArray();
bool[] ultimately = new bool[numberOfPoints];
for (int i = 0; i < numberOfPoints; i++)
if (CheckData.CheckResponse(response))
{
if (chars[i] == '1')
List<byte> responseList = new List<byte>(response);
//移除前两位
responseList.RemoveRange(0, 3);
//移除后两位校验码
responseList.RemoveRange(responseList.Count - 2, 2);
responseList.Reverse();
//数组反转之后,转为二进制字符
List<string> 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<char>().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;
}


}
/// <summary>
/// 写入多个线圈操作
@@ -155,12 +155,12 @@ namespace ModbusDemo.Device
/// <param name="slaveAddress">从站地址</param>
/// <param name="startAddress">起始地址</param>
/// <param name="data">写入的数据</param>
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<byte> sendByteList = new List<byte>();
//设置从站地址
@@ -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)


+ 10
- 4
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;
}



+ 10
- 4
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();
});

}


Загрузка…
Отмена
Сохранить