好看的企业网站,上海网站开发建设找哪家,做网站怎么改关键词,建网站 多少钱钱Modbus入门 ModbusModbus模拟工具模拟工具使用配置Slave配置Poll C#使用ModBus通讯在无法使用 SerialPort类 的情况下使用TCP进行 Modbus modbus使用范围广泛#xff0c;广泛应用于各类仪表#xff0c;PLC等。它属于应用层协议#xff0c;底层硬件基于485/以太网。 Modbus的… Modbus入门 ModbusModbus模拟工具模拟工具使用配置Slave配置Poll C#使用ModBus通讯在无法使用 SerialPort类 的情况下使用TCP进行 Modbus modbus使用范围广泛广泛应用于各类仪表PLC等。它属于应用层协议底层硬件基于485/以太网。 Modbus的存储区有输入线圈布尔只读代号1区输入寄存器寄存器只读代号3区输出线圈读写布尔代号0区输出寄存器寄存器读写代号4区
Modbus是典型的半双工模式有且只有一个master请求由master发出slave响应。slave之间不能通讯只能通过master转达。相当于master是客户端slave都是服务器。
Modbus模拟工具
模拟工具使用Modbus Slave 以及 Modbus Poll 。其中 Slave相当于服务器Modbus SlavePoll相当于客户端Modbus Master。
模拟工具使用
配置Slave
配置Slave 基本配置配置完选择ok接下来只要配置要使用的接口方式网卡串口等 选择接口方式选择串口初始化波特率、数据位、校验位、停止位然后选择ok即可打开链接。
配置Poll
打开Poll选择需要进行的操作
选择写入可以寄存器会发现Slave这边对应的已经改变了 上面type中可以写入浮点数等类型。
C#使用ModBus通讯
使用NuGet中的NModbus4通讯库进行ModBus RTU串口通讯
namespace ModusCommunication
{internal class Program{static void Main(string[] args){ModuleHandle moduleHandle new ModuleHandle(); // NuGet 安装 NModbus4 库// 确定通讯方式 这边是串口SerialPort port new SerialPort(COM2);// 波特率port.BaudRate 9600;// 数据位port.DataBits 8;// 停止位port.StopBits StopBits.One;// 校验位port.Parity Parity.None;port.Open();var master ModbusSerialMaster.CreateRtu(port);// 读取保持型寄存器 slaveid 寄存器起始位置 读取个数ushort [] values master.ReadHoldingRegisters(1,10,2);Console.WriteLine($index 10:{values[0]},index 11:{values[1]});// 写入保持型寄存器 slaveid 在18号寄存器 写入 133master.WriteSingleRegister(1, 18, 133);// 读写线圈型寄存器 bool [] coils master.ReadCoils(2, 0, 3);Console.WriteLine($index 0:{coils[0]},index 2:{coils[2]});// 写入线圈状态 将2号线圈寄存器值改为falsemaster.WriteSingleCoil(2, 2, false);// 在10寄存器处写入浮点数实际占用1011两个寄存器master.WriteFloat(1, 10, 3.14f);Console.WriteLine($写入浮点数:3.14);// 读取浮点数 浮点数在Modbus中是由两位寄存器构成一位寄存器是16bitfloat val master.ReadFloat(1, 10, 2);Console.WriteLine($浮点数 index 10-11:{val});Console.ReadLine();port.Close();}}
}public static class NModbusExtensions
{/// summary/// 从寄存器中读取float值/// /summary/// param namemaster/param/// param nameslaveAddress/param/// param namestartAddress/param/// param namenumberOfPoints/param/// returns/returns/// exception crefException/exceptionpublic static float ReadFloat(this ModbusSerialMaster master , byte slaveAddress, ushort startAddress, ushort numberOfPoints){try{float? floatValue;ushort[] registers master.ReadHoldingRegisters(slaveAddress, startAddress, 2); // 2寄存器对应一个浮点数if (registers.Length 2){// 从两个16位整数重新组合为浮点数ushort intValue1 registers[1]; // 低位ushort intValue2 registers[0]; // 高位byte[] bytes new byte[4];Buffer.BlockCopy(new ushort[] { intValue1, intValue2 }, 0, bytes, 0, 4);floatValue BitConverter.ToSingle(bytes, 0);return floatValue.Value;}else{throw new Exception();}}catch(Exception ex){throw new Exception(读取失败);}}/// summary/// 向寄存器中写入浮点数/// /summary/// param namemaster/param/// param nameslaveAddress/param/// param namestartAddress/param/// param namevalue/parampublic static void WriteFloat(this ModbusSerialMaster master, byte slaveAddress, ushort startAddress, float value){// 将浮点数转换为字节数组byte[] bytes BitConverter.GetBytes(value);// 提取字节数组中的两个16位整数ushort intValue1 BitConverter.ToUInt16(bytes, 0); // 低位ushort intValue2 BitConverter.ToUInt16(bytes, 2); // 高位master.WriteMultipleRegisters(slaveAddress, startAddress, new ushort[] { intValue2, intValue1 });}}在无法使用 SerialPort类 的情况下使用TCP进行
在Web以及移动端是不能使用SerialPort的这时候可以使用TCP进行链接 在slave连接配置中是有ip地址以及端口的可以通过这个进行ModbusTcp通讯 NuGet 安装 ModbusTcp 包 static async void ModbusTCPTest()
{ModbusTcp.ModbusClient client new ModbusTcp.ModbusClient(127.0.0.1, 502);client.Init();// 读取一个 整数short[] values await client.ReadRegistersAsync(15,1);Console.WriteLine($index 15:{values[0]});// 读取两个浮点数float[] value await client.ReadRegistersFloatsAsync(10, 4);Console.WriteLine($index 10-11:{value[0]},index 12-13:{value[1]});
}