C#輕松實(shí)現(xiàn)Modbus通信
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
1、前言大家好!我是付工。前面給大家介紹了一系列關(guān)于RS485與Modbus的知識。 終于有人把RS485說清楚了 2、開源通信庫通信庫是對通信協(xié)議的封裝,一般是以dll動態(tài)鏈接庫的形式存在,對于編程者來說,只需要調(diào)用庫的各種方法即可實(shí)現(xiàn)數(shù)據(jù)讀寫。 通信庫有兩種,一種是開源的,即使開源,也要注意看下開源許可證,開源并不一定免費(fèi),另外一種就是自己開發(fā)封裝的,這個需要具備一定的開發(fā)能力。 Modbus通信有很多開源通信庫,這其中使用較為廣泛的是NModbus4,NModbus4是一個開源且免費(fèi)的Modbus通信庫,它的開源許可證是MIT,是一個相對寬松的軟件授權(quán)條款,可以商用。 3、ModbusRTU通信1、在項(xiàng)目解決方案資源管理器中,選擇【引用】右擊,在彈出的界面中,點(diǎn)擊【管理NuGet程序包】選項(xiàng),如下圖所示:
2、在打開的選項(xiàng)卡中,選擇【瀏覽】,然后輸入NModbus4進(jìn)行搜索,搜索到之后,選擇最新穩(wěn)定版2.1.0,點(diǎn)擊【安裝】即可:
3、在NModbus4基礎(chǔ)上封裝一個打開串口和關(guān)閉串口的方法: private SerialPort serialPort;private ModbusSerialMaster master;public void Open(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits) { if (this.serialPort != null && this.serialPort.IsOpen) { this.serialPort.Close(); } this.serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits); this.serialPort.Open(); this.master = ModbusSerialMaster.CreateRtu(this.serialPort); this.master.Transport.WriteTimeout = 2000; this.master.Transport.ReadTimeout = 2000; this.master.Transport.WaitToRetryMilliseconds = 500; this.master.Transport.Retries = 3; } public void Close() { if (this.serialPort != null && this.serialPort.IsOpen) { this.serialPort.Close(); } this.master = null; } 4、在NModbus4基礎(chǔ)上封裝各種讀寫的方法,這里以讀取保持型寄存器為例,其他方法都是類似的: public byte[] ReadHoldingRegisters(byte slaveId, ushort start, ushort length) { try { ushort[] data = this.master.ReadHoldingRegisters(slaveId, start, length); List<byte> result = new List<byte>(); foreach (var item in data) { result.AddRange(BitConverter.GetBytes(item).Reverse()); } return result.ToArray(); } catch (Exception ex) { throw new Exception("【讀取保持寄存器】失敗:" + ex.Message); } } 基于NModbus4實(shí)現(xiàn)ModbusRTU通信,不需要關(guān)注協(xié)議及報(bào)文,只需要對NModbus4庫二次封裝即可。 4、ModbusTCP通信NModbus4不僅支持ModbusRTU通信,也同樣支持ModbusTCP通信,ModbusTCP與ModbusRTU的封裝過程非常類似,主要是存在以下兩個不同點(diǎn):
ModbusTCP通信庫封裝過程如下:1、在NModbus4基礎(chǔ)上封裝一個TCP連接和斷開的方法:
2、封裝一個讀取輸出線圈的方法,其他讀寫方法都是類似的: public bool[] ReadOutputCoils(ushort start, ushort length, byte slaveAddress = 1) { try { return this.master.ReadCoils(slaveAddress, start, length); } catch (Exception ex) { throw new Exception("【讀取輸出線圈】失敗:" + ex.Message); } } 轉(zhuǎn)自https://www.cnblogs.com/xiketangedu/p/18461727 該文章在 2024/10/14 9:48:54 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |