private byte[] BuildReadCommand(ModBusFunctionMask mask, ushort address, ushort length) { ushort messageId = GetMessageId(); byte[] buffer = new byte[12]; buffer[0] = (byte)(messageId / 256); buffer[1] = (byte)(messageId % 256); buffer[5] = 0x06; buffer[6] = station; buffer[7] = (byte)mask; buffer[8] = (byte)(address / 256); buffer[9] = (byte)(address % 256); buffer[10] = (byte)(length / 256); buffer[11] = (byte)(length % 256); return(buffer); }
/// <summary> /// 读取服务器的数据,需要指定不同的功能码 /// </summary> /// <param name="function"></param> /// <param name="address"></param> /// <param name="length"></param> /// <returns></returns> private OperateResult <byte[]> ReadModBusBase(ModBusFunctionMask function, ushort address, ushort length) { OperateResult <byte[]> resultBytes = CheckModbusTcpResponse(BuildReadCommand(function, address, length)); if (resultBytes.IsSuccess) { // 二次数据处理 if (resultBytes.Content?.Length >= 9) { byte[] buffer = new byte[resultBytes.Content.Length - 9]; Array.Copy(resultBytes.Content, 9, buffer, 0, buffer.Length); resultBytes.Content = buffer; } } return(resultBytes); }
private void userButton3_Click(object sender, EventArgs e) { // 00 00 00 00 00 06 FF 03 00 00 00 10 HslCommunication.OperateResult <byte[]> read = null; ModBusFunctionMask mask = (ModBusFunctionMask)comboBox1.SelectedItem; switch (mask) { case ModBusFunctionMask.ReadCoil: { // 读线圈 read = busTcpClient.ReadCoil(ushort.Parse(textBox4.Text), ushort.Parse(textBox5.Text)); break; } case ModBusFunctionMask.ReadDiscrete: { // 读离散值 read = busTcpClient.ReadDiscrete(ushort.Parse(textBox4.Text), ushort.Parse(textBox5.Text)); break; } case ModBusFunctionMask.ReadRegister: { // 读寄存器 read = busTcpClient.ReadRegister(ushort.Parse(textBox4.Text), ushort.Parse(textBox5.Text)); break; } default: break; } if (read != null) { if (read.IsSuccess) { textBox2.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " :" + HslCommunication.BasicFramework.SoftBasic.ByteToHexString(read.Content, ' ') + Environment.NewLine); } else { MessageBox.Show(read.ToMessageShowString()); } } }
/// <summary> /// 读取服务器的线圈,对应功能码0x01 /// </summary> /// <param name="function"></param> /// <param name="address"></param> /// <param name="length"></param> /// <returns></returns> private OperateResult <byte[]> ReadModBusBase(ModBusFunctionMask function, ushort address, ushort length) { OperateResult <byte[]> resultBytes = ReadFromModBusServer(BuildReadCommand(function, address, length)); if (resultBytes.IsSuccess) { // 二次数据处理 if (resultBytes.Content?.Length >= 9) { byte[] buffer = new byte[resultBytes.Content.Length - 9]; Array.Copy(resultBytes.Content, 9, buffer, 0, buffer.Length); resultBytes.Content = buffer; } else { // 数据异常 resultBytes.IsSuccess = false; resultBytes.Message = "数据异常"; } } return(resultBytes); }