NetCore下模擬和使用Modbus工業通信協議


Tips:

  1、目前NetCore下與Modbus通信的框架主要選擇了 Modbus.Net  https://github.com/parallelbgls/Modbus.Net

  2、modbus是常用的工業通信協議,在軟件調試時可以通過modbus poll+slave模擬通信通過達到調試目的,下圖是我使用軟件

            1)為串口模擬工具

            2)為Modbus Slave模擬工具

            3)為Modbus Poll模擬,修改對應Value值即可發送到Slave

   

  調用和測試代碼:

  

   public class ModbusTest
    {
        public Dictionary<string, ReturnUnit> GetModbusValues(List<AddressUnit> addresses, ModbusType connectType = ModbusType.Tcp, string connectString = "127.0.0.1")
        {
            var _modbusTcpMachine = new ModbusMachine(connectType, connectString, addresses, true, 2, 0);

            var result = _modbusTcpMachine.GetDatas(MachineGetDataType.Address);

            return result;
        }

        public bool SetModbusValues(List<AddressUnit> addresses, Dictionary<string, double> setDict, ModbusType connectType = ModbusType.Tcp, string connectString = "127.0.0.1")
        {
            var _modbusTcpMachine = new ModbusMachine(connectType, connectString, addresses, true, 2, 0);

            var result = _modbusTcpMachine.SetDatas(MachineSetDataType.Address, setDict);

            return result;
        }

        //獲取測試
        [Obsolete("固定寫死的測試方法,臨時測試用")]
        public void TestGetModbusValues()
        {
            var addresses = new List<AddressUnit>();
            for (int i = 0; i < 6; i++)
            {
                addresses.Add(new AddressUnit { Id = "1", Area = "4X", Address = i + 1, DataType = typeof(ushort) });
            }

            var _modbusTcpMachine = new ModbusMachine(ModbusType.RtuInTcp, "127.0.0.1", addresses, true, 2, 0);

            var result = _modbusTcpMachine.GetDatas(MachineGetDataType.Address);

            foreach (var item in result)
            {
                Console.WriteLine($"Key:{item.Key} Value:{item.Value.PlcValue}");
            }
        }

        //設置測試
        [Obsolete("固定寫死的測試方法,臨時測試用")]
        public void TestSetModbusValues()
        {
            var addresses = new List<AddressUnit>();
            var setDict = new Dictionary<string, double>();
            for (int i = 0; i < 6; i++)
            {
                addresses.Add(new AddressUnit { Id = "1", Area = "4X", Address = i + 1, DataType = typeof(ushort) });
                var r = new Random();
                var intValue = r.Next(0, 100);
                System.Threading.Thread.Sleep(100);
                setDict.Add($"4X {i + 1}.0", intValue);
            }

            var _modbusTcpMachine = new ModbusMachine(ModbusType.RtuInTcp, "127.0.0.1", addresses, true, 2, 0);

            _modbusTcpMachine.SetDatas(MachineSetDataType.Address, setDict);
        }
    }

 

   也可以使用Modbus-TCP Client Tester來模擬展現,可以寫入或讀寫寄存器

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM