由于感觉上一次写的篇幅过长,所以新开一贴,继续介绍Modbus TCP/IP的初步认识,
书接上回
3)、03(0x03)功能码--------读保持寄存器
请求与响应格式
这是一个请求读寄存器108-110 的实例:
private void send03_Click(object sender, EventArgs e)
{
byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x6C, 0x00, 0x03 };
newclient.Send(data);
}
public void showMsg03(string msg)
{
//在线程里以安全方式调用控件
if (receive0x01.InvokeRequired)
{
MyInvoke _myinvoke = new MyInvoke(showMsg03);
receive0x03.Invoke(_myinvoke, new object[] { msg });
}
else
{
receive0x03.AppendText(msg);
}
}
private void send05_Click(object sender, EventArgs e)
{
byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, 0xAD, 0xFF, 0x00 };
newclient.Send(data);
}
public void showMsg05(string msg)
{
//在线程里以安全方式调用控件
if (receive0x05.InvokeRequired)
{
MyInvoke _myinvoke = new MyInvoke(showMsg05);
receive0x05.Invoke(_myinvoke, new object[] { msg });
}
else
{
receive0x05.AppendText(msg);
}
}
5)、06 (0x06)写单个寄存器
请求与应答PDU
这是一个请求将十六进制00 03 写入寄存器2的实例:
程序如下:
private void send06_Click(object sender, EventArgs e)
{
byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x06, 0x00, 0x01, 0x00, 0x03 };
newclient.Send(data);
}
public void showMsg06(string msg)
{
//在线程里以安全方式调用控件
if (receive0x06.InvokeRequired)
{
MyInvoke _myinvoke = new MyInvoke(showMsg06);
receive0x06.Invoke(_myinvoke, new object[] { msg });
}
else
{
receive0x06.AppendText(msg);
}
}
在一个远程设备中,使用该功能码强制线圈序列中的每个线圈为ON 或OFF。
域比特位置中的逻辑“1”请求相应输出为ON。
域比特位置中的逻辑“0”请求相应输出为OFF。
请求与应答PDU
这是一个请求从线圈20 开始写入10 个线圈的实例:
private void send0F_Click(object sender, EventArgs e)
{
byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x01, 0x0F, 0x00, 0x14, 0x00, 0x0A, 0x02, 0xCD, 0x01 };
newclient.Send(data);
}
程序如下:
public void showMsg0F(string msg)
{
//在线程里以安全方式调用控件
if (receive0x0F.InvokeRequired)
{
MyInvoke _myinvoke = new MyInvoke(showMsg0F);
receive0x0F.Invoke(_myinvoke, new object[] { msg });
}
else
{
receive0x0F.AppendText(msg);
}
}
Modbus TCP响应
我们的软件所收到的数据
7)、16 (0x10)写多个寄存器
请求与应答PDU
这是一个请求将十六进制00 0A 和01 02 写入以2 开始的两个寄存器的实例:
private void send10_Click(object sender, EventArgs e)
{
byte[] data = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x01, 0x10, 0x00, 0x02, 0x00, 0x02, 0x04, 0x00,0x0A,0x01, 0x02 };
newclient.Send(data);
}
public void showMsg10(string msg)
{
//在线程里以安全方式调用控件
if (receive0x10.InvokeRequired)
{
MyInvoke _myinvoke = new MyInvoke(showMsg10);
receive0x10.Invoke(_myinvoke, new object[] { msg });
}
else
{
receive0x10.AppendText(msg);
}
}