C# Modbus TCP通信协议#
我在寻求一点帮助。 我有一个通过Modbus TCP与控制器通信的程序。 唯一的问题是我无法将Nop从125扩展到400,因为我收到了非法的数据地址错误消息。 你能帮我做这个吗C# Modbus TCP通信协议#,c#,modbus,modbus-tcp,C#,Modbus,Modbus Tcp,我在寻求一点帮助。 我有一个通过Modbus TCP与控制器通信的程序。 唯一的问题是我无法将Nop从125扩展到400,因为我收到了非法的数据地址错误消息。 你能帮我做这个吗 try { byte slaveid = 1; byte function = 4; ushort id = function; ushort startAddress = 0;
try
{
byte slaveid = 1;
byte function = 4;
ushort id = function;
ushort startAddress = 0;
uint NoP = 125;
byte[] frame = ReadInputRegistersMsg(id, slaveid, startAddress, function, NoP);
this.Write(frame); //data send to controller
Thread.Sleep(100);
byte[] buffReceiver = this.Read(); //data recieving from controller
int SizeByte = buffReceiver[8]; // Data what I got from the controller
UInt16[] temp = null;
if (function != buffReceiver[7])
{
byte[] byteMsg = new byte[9];
Array.Copy(buffReceiver, 0, byteMsg, 0, byteMsg.Length);
byte[] data = new byte[SizeByte];
textBox2.Text = Display(byteMsg);
byte[] errorbytes = new byte[3];
Array.Copy(buffReceiver, 6, errorbytes, 0, errorbytes.Length);
this.CheckValidate(errorbytes); // check the answer -> error message
}
else
{
byte[] byteMsg = new byte[9 + SizeByte];
Array.Copy(buffReceiver, 0, byteMsg, 0, byteMsg.Length);
byte[] data = new byte[SizeByte];
textBox2.Text = Display(byteMsg); // Show received messages in windows form app
Array.Copy(buffReceiver, 9, data, 0, data.Length);
temp = Word.ConvertByteArrayToWordArray(data); // Convert Byte[]-> Word[]
}
// Result
if (temp == null) return;
string result = string.Empty;
//foreach (var item in temp) // show all the data
for(int i=0;i<100;i++) // show the first 100 data
{
//result += string.Format("{0} ", item);
result += temp[i];
}
textBox3.Text = result; // insert the result into the textbox (windows form app)
}
catch
{
}
唯一使用的地方是作为我们看不到的方法的参数(
readinputregistersmssg
)。这就是发生异常的地方吗?或者…?我重新回答了这个问题@MarcGravel什么给了你一个“非法数据地址”错误消息-你要将帧发送到的设备?最后我在维基百科中找到了一个描述:功能代码4(读取输入寄存器)和功能代码3(读取保持寄存器)请求:要读取的第一个寄存器的地址(16位)要读取的寄存器数(16位)正常响应:在(8位)寄存器值之后的寄存器值字节数(每个寄存器16位),因为寄存器值的字节数为8位宽,最大modbus消息大小为256字节,一次只能读取modbus RTU的125个寄存器和modbus TCP的123个寄存器。[13]所以基本上:125是协议强加的硬限制?只是检查一下这里没有你要找的东西。。。?
private byte[] ReadInputRegistersMsg(ushort id, byte slaveAddress, ushort startAddress, byte function, uint NoP)
{
byte[] frame = new byte[12];
frame[0] = (byte)(id >> 8); // Transaction Identifier High
frame[1] = (byte)id; // Transaction Identifier Low
frame[2] = 0; // Protocol Identifier High
frame[3] = 0; // Protocol Identifier Low
frame[4] = 0; // Message Length High
frame[5] = 6; // Message Length Low(6 bytes to follow)
frame[6] = slaveAddress; // Slave address(Unit Identifier)
frame[7] = function; // Function
frame[8] = (byte)(startAddress >> 8); // Starting Address High
frame[9] = (byte)startAddress; // Starting Address Low
frame[10] = (byte)(NoP >> 8); // Quantity of Registers High
frame[11] = (byte)NoP; // Quantity of Registers Low
return frame;
}