发布网友
共2个回答
懂视网
一、公共功能码定义
二、能读取的数据类型
1.bit类型,比如01功能码,读到的就是位的状态,是ON 还是OFF,也就是对应着0或1。
2.byte类型,比如03功能码。
3.short类型,比如03功能码。
4.int32类型。也还是比如03功能码。
三、整数型和小数型的转换等
1.Modbus协议进行通信的时候,所有的数据都是以整数表示,因此,实际的数据,和接收到的数据,还有有一定的差异的,需要乘以一定的比例系数。
2.在接收到的数据进行转换的时候,因为产家的不同,因此会有小数点后面的精度也不一样,因此还需要做一定的精度转换。
四、界面设计
五、通信测试
1.打开Modbus Slave,设置通信方式为Modbus RTU over tcp/ip,端口设置为502,配置功能码为0x03.设置相应寄存器的数据。
设置寄存器的值
设置需要读取数据的IP信息
四、工具下载链接
链接:http://download.csdn.net/download/dwx1005526886/10135013
Modbus通用数据读取工具设计及使用
标签:还需要 方式 csdn 端口 blog 界面设计 协议 nbsp 下载
热心网友
其实没有必要这么繁琐的,C#添加Modbus引用之后,可以使用Modbus.Utility命名空间里面有一个ReadHoldingRegister的方法,使用这个方法可以直接读取设备寄存器地址里面的数据,再把数据对应的高低位、百位组合一下就可以显示出下位机屏幕上的数据,但前提是你要有你的设备的寄存器地址详细说明,至于Modbus引用之类的,去网上搜一下NModbus Sample可以下载到Modbus协议在编程里面的详细使用方法,祝你好运!追问我试验了用ReadHoldingRegister的方法,但是没成功。
public Form1()
{
InitializeComponent();
iSlaveHandle = axMbSlaveV71.ConnectTCP(502);
}
我用下面的语句来读取的。对方说给我的数据从地址800开始。
short slaveNodeAddress=1;
short data=0;
axMbSlaveV71.ReadModbusRegister(slaveNodeAddress, 3, 800 + i, ref data);
追答不是你写的这样的,是:
ModbusSerialMaster tt = ModbusSerialMaster.CreateRtu(this.SP_COM);
ushort[] read1 = tt.ReadHoldingRegisters(deviceID1, startAddress1, addressLength1);
string Data_1 += ModbusUtility.GetSingle(read1[23], read1[22]).ToString() ;
textBox1.Text=Data_1;
我这样就可已读到数据了