通過串口進行通信 :
1、將 NMobus 類庫導入工程中,添加引用、命名空間。工程屬性必須配置 為 .NET 4.0。
2、創建 SerialPort 類的一個實例,配置參數,打開串口,如:
public SerialPort port = new SerialPort(“ COM1” )//創建串口
port.BaudRate = 9600;//配置
port.DataBits = 8;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.Open();//打開串口
3、調用相應方法創建 Modbus 主站,如:
IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port); //創建 Rtu 傳輸模式、通過串口 port 通信的主站 master IModbusSerialMaster master = ModbusSerialMaster.CreateAscii(port); //ASCII傳輸模式
4、配置參數,如:
master.Transport.ReadTimeout = 1000;//讀取串口數據超時為 1000ms master.Transport.WriteTimeout = 1000;//寫入串口數據超時
master.Transport.Retries = 3;//重試次數
master.Transport.WaitToRetryMilliSeconds = 250;//重試間隔
5、調用相應方法執行功能,如:
try
{
master.WriteMultipleRegisters(slaveId, startAddress, registers); }
有以下幾種功能:
//讀線圈,參數:從站地址 (8位 ) 、起始地址 (16位 ) 、數量 (16位 ) ;返回布爾型數 組
bool[] ReadCoils(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
//讀輸入離散量,參數:從站地址 (8位 ) 、起始地址 (16位 ) 、數量 (16位 ) ;返回布 爾型數組
bool[] ReadInputs(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
//讀保持寄存器,參數:從站地址 (8位 ) 、起始地址 (16位 ) 、數量 (16位 ) ;返回 16位整型數組
ushort[] ReadHoldingRegisters(byte slaveAddress, ushort startAddress, ushort
numberOfPoints);
//讀輸入寄存器,參數:從站地址 (8位 ) 、起始地址 (16位 ) 、數量 (16位 ) ;返回 16位整型數組
ushort[] ReadInputRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
//寫單個線圈,參數:從站地址 (8位 ) ,線圈地址 (16位 ) ,線圈值 (布爾型 ) void WriteSingleCoil(byte slaveAddress, ushort coilAddress, bool value);
//寫單個寄存器,參數:從站地址 (8位 ) ,寄存器地址 (16位 ) ,寄存器值 (16位 ) void WriteSingleRegister(byte slaveAddress, ushort registerAddress, ushort value);
//寫多個寄存器,參數:從站地址 (8位 ) ,起始地址 (16位 ) ,寄存器值 (16位整型 數組 )
void WriteMultipleRegisters(byte slaveAddress, ushort startAddress, ushort[] data);
//寫多個線圈,參數:從站地址 (8位 ) ,起始地址 (16位 ) ,線圈值 (布爾型數組 ) void WriteMultipleCoils(byte slaveAddress, ushort startAddress, bool[] data);
//讀寫多個寄存器,參數:從站地址 (8位 ) ,讀起始地址 (16位 ) ,數量 (16位 ) ,寫 起始地址 (16位 ) ,寫入值 (16位整型數組 ) ;返回 16位整型數組
ushort[] ReadWriteMultipleRegisters(byte slaveAddress, ushort startReadAddress, ushort numberOfPointsToRead, ushort startWriteAddress, ushort[] writeData);
6、使用 catch 語句捕捉異常:
如果執行沒有出錯,則不拋出異常,如果是執行讀操作則能得到相應的 返回值。
響應超時會拋出 TimeoutException 類型的異常 ;
接收到從站的異常響應時會拋出 SlaveException 類型的異常, 這一類異常 包含 SlaveExceptionCode 屬性,即異常碼,通過判斷異常碼能得知出錯的原因。
NModbus Sample Code
Simple Modbus serial RTU master write holding registers example.
using (SerialPort port = new SerialPort("COM1"))
{
// configure serial port
port.BaudRate = 9600;
port.DataBits = 8;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.Open();
// create modbus master
IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);
byte slaveID = 1;
ushort startAddress = 100;
ushort[] registers = new ushort[] { 1, 2, 3 };
// write three registers
master.WriteMultipleRegisters(slaveID, startAddress, registers);
}
Simple Modbus serial ASCII master read holding registers example.
using (SerialPort port = new SerialPort("COM1"))
{
// configure serial port
port.BaudRate = 9600;
port.DataBits = 8;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.Open();
// create modbus master
IModbusSerialMaster master = ModbusSerialMaster.CreateAscii(port);
byte slaveID = 1;
ushort startAddress = 1;
ushort numRegisters = 5;
// read five registers
ushort[] registers = master.ReadHoldingRegisters(slaveID, startAddress, numRegisters);
for (int i = 0; i < numRegisters; i++)
Console.WriteLine("Register {0}={1}", startAddress + i, registers[i]);
}
// output:
// Register 1=0
// Register 2=0
// Register 3=0
// Register 4=0
// Register 5=0
Simple Modbus serial USB RTU master write multiple coils example.
using (FtdUsbPort port = new FtdUsbPort(0))
{
// configure usb port
port.BaudRate = 9600;
port.DataBits = 8;
port.Parity = FtdParity.None;
port.StopBits = FtdStopBits.One;
port.Open();
// create modbus master
IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);
byte slaveID = 1;
ushort startAddress = 1;
// write three coils
master.WriteMultipleCoils(slaveID, startAddress, new bool[] { true, false, true });
}
Donate
NModbus is developed and
maintained on a voluntary basis
and provided free of charge.
Upcoming Features
WPF NModbus Master
Master Console Wrapper
FTDI USB Slave
Home
Samples
Downloads
Discussion
Issues
NModbus
http://web.archive.org/web/20090601225835/http://www...
第1頁共6頁
2011/07/069:49
Simple Modbus serial USB ASCII master write multiple coils example.
using (FtdUsbPort port = new FtdUsbPort(0))
{
// configure usb port
port.BaudRate = 9600;
port.DataBits = 8;
port.Parity = FtdParity.None;
port.StopBits = FtdStopBits.One;
port.Open();
// create modbus master
IModbusSerialMaster master = ModbusSerialMaster.CreateAscii(port);
byte slaveID = 1;
ushort startAddress = 1;
// write three coils
master.WriteMultipleCoils(slaveID, startAddress, new bool[] { true, false, true });
}
Simple Modbus TCP master read inputs example.
using (TcpClient client = new TcpClient("127.0.0.1", 502))
{
ModbusIpMaster master = ModbusIpMaster.CreateTcp(client);
// read five input values
ushort startAddress = 100;
ushort numInputs = 5;
bool[] inputs = master.ReadInputs(startAddress, numInputs);
for (int i = 0; i < numInputs; i++)
Console.WriteLine("Input {0}={1}", startAddress + i, inputs[i] ? 1 : 0);
}
// output:
// Input 100=0
// Input 101=0
// Input 102=0
// Input 103=0
// Input 104=0
Simple Modbus UDP master write coils example.
using (UdpClient client = new UdpClient())
{
IPEndPoint endPoint = new IPEndPoint(new IPAddress(new byte[] { 127, 0, 0, 1 }), 502);
client.Connect(endPoint);
ModbusIpMaster master = ModbusIpMaster.CreateUdp(client);
ushort startAddress = 1;
// write three coils
master.WriteMultipleCoils(startAddress, new bool[] { true, false, true });
}
Simple Modbus serial RTU slave example.
using (SerialPort slavePort = new SerialPort("COM2"))
{
// configure serial port
slavePort.BaudRate = 9600;
slavePort.DataBits = 8;
slavePort.Parity = Parity.None;
slavePort.StopBits = StopBits.One;
slavePort.Open();
byte unitID = 1;
// create modbus slave
ModbusSlave slave = ModbusSerialSlave.CreateRtu(unitID, slavePort);
slave.DataStore = DataStoreFactory.CreateDefaultDataStore();
slave.Listen();
}
NModbus
http://web.archive.org/web/20090601225835/http://www...
第2頁共6頁
2011/07/069:49
Simple Modbus Serial ASCII slave example.
using (SerialPort slavePort = new SerialPort("COM2"))
{
// configure serial port
slavePort.BaudRate = 9600;
slavePort.DataBits = 8;
slavePort.Parity = Parity.None;
slavePort.StopBits = StopBits.One;
slavePort.Open();
byte unitID = 1;
// create modbus slave
ModbusSlave slave = ModbusSerialSlave.CreateAscii(unitID, slavePort);
slave.DataStore = DataStoreFactory.CreateDefaultDataStore();
slave.Listen();
}
Simple Modbus serial RTU slave example.
using (SerialPort slavePort = new SerialPort("COM2"))
{
// configure serial port
slavePort.BaudRate = 9600;
slavePort.DataBits = 8;
slavePort.Parity = Parity.None;
slavePort.StopBits = StopBits.One;
slavePort.Open();
byte unitID = 1;
// create modbus slave
ModbusSlave slave = ModbusSerialSlave.CreateRtu(unitID, slavePort);
slave.DataStore = DataStoreFactory.CreateDefaultDataStore();
slave.Listen();
}
Simple Modbus TCP slave example.
byte slaveID = 1;
int port = 502;
IPAddress address = new IPAddress(new byte[] { 127, 0, 0, 1 });
// create and start the TCP slave
TcpListener slaveTcpListener = new TcpListener(address, port);
slaveTcpListener.Start();
ModbusSlave slave = ModbusTcpSlave.CreateTcp(slaveID, slaveTcpListener);
slave.DataStore = DataStoreFactory.CreateDefaultDataStore();
slave.Listen();
// prevent the main thread from exiting
Thread.Sleep(Timeout.Infinite);
Simple Modbus UDP slave example.
using (UdpClient client = new UdpClient(502))
{
ModbusUdpSlave slave = ModbusUdpSlave.CreateUdp(client);
slave.DataStore = DataStoreFactory.CreateDefaultDataStore();
slave.Listen();
// prevent the main thread from exiting
Thread.Sleep(Timeout.Infinite);
}
Modbus TCP master and slave example.
byte slaveID = 1;
int port = 502;
IPAddress address = new IPAddress(new byte[] { 127, 0, 0, 1 });
NModbus
http://web.archive.org/web/20090601225835/http://www...
第3頁共6頁
2011/07/069:49