標籤:number status 控制 wait art gis nts 使用 puts
前言:最近在做一個項目,需要使用ModBus RTU與PLC進行通訊,現在將使用過程記錄,以便備查。
一、什麼是ModBus通訊協議
Modbus協議是應用於電子控制器上的一種通用語言,此協議支援傳統的RS-232、RS-422、RS-485和乙太網路裝置。
ModBus功能碼
| 01 |
READ COIL STATUS |
| 02 |
READ INPUT STATUS |
| 03 |
READ HOLDING REGISTER |
| 04 |
READ INPUT REGISTER |
| 05 |
WRITE SINGLE COIL |
| 06 |
WRITE SINGLE REGISTER |
| 15 |
WRITE MULTIPLE COIL |
| 16 |
WRITE MULTIPLE REGISTER |
二、ModBus通訊協議的.Net實現
因為實現並不困難,網上有許多網友自己的實現,但在這裡我推薦一個github的開源實作類別庫:NModBus4,github地址:https://github.com/NModbus4/NModbus4。針對TCP、UDP、RTU等的ModBus通訊方式都有實現。
讀寫方法:
| 方法名 |
作用 |
所需參數 |
傳回值 |
對應功能碼 |
| ReadCoils |
讀取DO的狀態 |
從站地址(8位) byte slaveAddress 起始地址(16位) ushort startAddress 讀取數量(16位) ushort numberOfPoints |
bool[] |
01 |
| ReadInputs |
讀取DI的狀態 |
從站地址(8位) byte slaveAddress 起始地址(16位) ushort startAddress 讀取數量(16位) ushort numberOfPoints |
bool[] |
02 |
| ReadHoldingRegisters |
讀取AO的值 |
從站地址(8位) byte slaveAddress 起始地址(16位) ushort startAddress 讀取數量(16位) ushort numberOfPoints |
ushort[] |
03 |
| ReadInputRegisters |
讀取AI的值 |
從站地址(8 位) byte slaveAddress 起始地址(16位) ushort startAddress 讀取數量(16位) ushort numberOfPoints |
ushort[] |
04 |
| WriteSingleCoil |
寫入值到DO |
從站地址(8位) byte slaveAddress 線圈地址(16位) ushort coilAddress 寫入值(布爾型) bool value |
無傳回值 |
05 |
| WriteSingleRegister |
寫入值到AO |
從站地址(8位) byte slaveAddress 寄存器地址(16位) ushort registerAddress 寫入值(16位) ushort value |
無傳回值 |
06 |
| WriteMultipleCoils |
寫多線圈寄存器 |
從站地址(8位) byte slaveAddress 起始地址(16位) ushort startAddress 寫入值(布爾型數組) bool[] data |
無傳回值 |
15 |
| WriteMultipleRegisters |
寫多個保持寄存器 |
從站地址(8位) byte slaveAddress 起始地址(16位) ushort startAddress, 寄存器值(16位整型數組) ushort[] data |
無傳回值 |
16 |
| ReadWriteMultipleRegisters |
讀寫多個保持寄存器 |
從站地址(8位) byte slaveAddress 讀起始地址(16位) ushort startReadAddress 讀取數量(16位) ushort numberOfPointsToRead, 寫入起始地址(16位) ushort startWriteAddress, 寫入值(16位整型數組) ushort[] writeData |
ushort[] |
23 |
每個方法都有各自的非同步方法呼叫實現。
這裡以RTU展示其使用方法:
1 /// <summary> 2 /// 建立 ModBus RTU 串連 3 /// </summary> 4 /// <param name="portName">連接埠號碼</param> 5 /// <param name="baudRate">傳輸速率</param> 6 /// <param name="parity">同位位元</param> 7 /// <param name="dataBits">資料位元</param> 8 /// <param name="stopBits">停止位</param> 9 /// <returns></returns>10 public IModbusSerialMaster CreateModBusRtuConnection(string portName,int baudRate,Parity parity,int dataBits,StopBits stopBits)11 {12 return CreateModBusRtuConnect(new SerialPort(portName, baudRate, parity, dataBits, stopBits));13 }14 15 public IModbusSerialMaster CreateModBusRtuConnection(SerialPort serialPort)16 {17 IModbusSerialMaster master = null;18 if (!serialPort.IsOpen)19 {20 try21 {22 serialPort.Open();23 }24 catch (Exception e)25 {26 throw e;27 }28 }29 try30 {31 master = ModbusSerialMaster.CreateRtu(serialPort);32 ///同時也可以配置master的一些參數33 master.Transport.ReadTimeout = 100;//讀取資料逾時100ms34 master.Transport.WriteTimeout = 100;//寫入資料逾時100ms35 master.Transport.Retries = 3;//重試次數36 master.Transport.WaitToRetryMilliseconds = 10;//稍候再試37 38 }39 catch(Exception e)40 { throw e;41 }42 return master;43 }44 }View Code
NModBus的使用