C# 使用modbus 讀取PLC 寄存器地址


使用的組件Nmodbus 

定義參數,全局變量:

        //創建modbus實體對象
private static ModbusFactory modbusFactory; private static IModbusMaster master; //寫線圈或寫寄存器數組 bool[] coilsBuffer; ushort[] registerBuffer; //功能碼 string functionCode; //參數(分別為站號,起始地址,長度) byte slaveAddress; ushort startAddress; ushort numberOfPoints; //ip 地址與端口號 string IPAddress = string.Empty; int VisitPort = 502;

 初始化參數,創建連接:

         private void Connection(object sender, EventArgs e)
         {
          try
           {
                //PLC連接配置信息,PLC ip地址
                IPAddress =127.0.0.1;
//端口,modbus 默認502,根據實際情況填寫 VisitPort
=502; //初始化modbusmaster modbusFactory = new ModbusFactory(); //在本地測試 所以使用回環地址,modbus協議規定端口號 502 master = modbusFactory.CreateMaster(new TcpClient(IPAddress, VisitPort)); //設置讀取超時時間 master.Transport.ReadTimeout = 10000; master.Transport.Retries = 2000; } catch (Exception ex) { MessageBox.Show(ex.Message); } }

初始化讀寫參數

        /// <summary>
        /// 初始化讀參數
        /// </summary>
        private void SetReadParameters(int slaveAddress=1,int startAddress=200,int numberOfPoints=1)
        {
//DeviceID
slaveAddress = byte.Parse(slaveAddress);
//起始地址, startAddress
= ushort.Parse(startAddress);
//數據長度 numberOfPoints
= ushort.Parse(numberOfPoints); }

 

運行讀取方法

 private async void ExecuteFunction()
        {
            try
            {
//Moddbus共有這些功能碼

               //01 Read Coils
               //02 Read DisCrete Inputs
               //03 Read Holding Registers
               //04 Read Input Registers
               //05 Write Single Coil
               //06 Write Single Registers
               //0F Write Multiple Coils
               //10 Write Multiple Registers

                 functionCode="01 Read Coils";//根據實際點號類型選擇讀寫功能碼
                //重新實例化是為了 modbus slave更換連接時不報錯 
                //master = modbusFactory.CreateMaster(new TcpClient(IPAddress, VisitPort));
                if (functionCode != null)
                {
                    switch (functionCode)
                    {
                        case "01 Read Coils"://讀取單個線圈
                            SetReadParameters();
                            coilsBuffer = master.ReadCoils(slaveAddress, startAddress, numberOfPoints);

                            for (int i = 0; i < coilsBuffer.Length; i++)
                            {
                                SetMsg(coilsBuffer[i] + " ");
                            }
                            SetMsg("\r\n");
                            break;
                        case "02 Read DisCrete Inputs"://讀取輸入線圈/離散量線圈
                            SetReadParameters();

                            coilsBuffer = master.ReadInputs(slaveAddress, startAddress, numberOfPoints);
                            for (int i = 0; i < coilsBuffer.Length; i++)
                            {
                                SetMsg(coilsBuffer[i] + " ");
                            }
                            SetMsg("\r\n");
                            break;
                        case "03 Read Holding Registers"://讀取保持寄存器
                            SetReadParameters();
                            registerBuffer = master.ReadHoldingRegisters(slaveAddress, startAddress, numberOfPoints);
                            for (int i = 0; i < registerBuffer.Length; i++)
                            {
                                SetMsg(registerBuffer[i] + " ");
                            }
                            SetMsg("\r\n");
                            break;
                        case "04 Read Input Registers"://讀取輸入寄存器
                            SetReadParameters();
                            registerBuffer = master.ReadInputRegisters(slaveAddress, startAddress, numberOfPoints);
                            for (int i = 0; i < registerBuffer.Length; i++)
                            {
                                SetMsg(registerBuffer[i] + " ");
                            }
                            SetMsg("\r\n");
                            break;
                        case "05 Write Single Coil"://寫單個線圈
                            SetWriteParametes();
                            await master.WriteSingleCoilAsync(slaveAddress, startAddress, coilsBuffer[0]);
                            break;
                        case "06 Write Single Registers"://寫單個輸入線圈/離散量線圈
                            SetWriteParametes();
                            await master.WriteSingleRegisterAsync(slaveAddress, startAddress, registerBuffer[0]);
                            break;
                        case "0F Write Multiple Coils"://寫一組線圈
                            SetWriteParametes();
                            await master.WriteMultipleCoilsAsync(slaveAddress, startAddress, coilsBuffer);
                            break;
                        case "10 Write Multiple Registers"://寫一組保持寄存器
                            SetWriteParametes();
                            await master.WriteMultipleRegistersAsync(slaveAddress, startAddress, registerBuffer);
                            break;
                        default:
                            break;
                    }

                }
                else
                {
                    MessageBox.Show("請選擇功能碼!");
                }
                master.Dispose();
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);
            }
        }




 //展示消息

        /// <summary>
        /// SetMessage
        /// </summary>
        /// <param name="msg"></param>
        public void SetMsg(string msg)
        {     
            MessageBox.Show(msg);
        }

 


免責聲明!

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



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