예제 #1
0
        private void btnReadHoldingRegisters_Click(object sender, EventArgs e)
        {
            try
            {
                if (!modbusClient.Connected)
                {
                    modbusClient.IPAddress = txtIpAddressInput.Text;
                    modbusClient.Port      = int.Parse(txtPortInput.Text);
                    modbusClient.Connect();
                }


                int[] serverResponse = modbusClient.ReadHoldingRegisters(int.Parse(txtStartingAddressInput.Text) - 1, int.Parse(txtNumberOfValuesInput.Text));

                lsbAnswerFromServer.Items.Clear();
                for (int i = 0; i < serverResponse.Length; i++)
                {
                    lsbAnswerFromServer.Items.Add(serverResponse[i]);
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message, "Exception Reading values from Server", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                modbusClient.Disconnect();
            }
        }
예제 #2
0
        private void TMR_Read_Tick(object sender, EventArgs e)
        {
            int[] tmp;

            if (modbusClient.Connected)
            {
                try
                {
                    tmp = modbusClient.ReadHoldingRegisters(iCurrentAddress, 1);
                    LB_Data.Items.Add(iCurrentAddress + " => " + tmp[0]);
                    HoldingRegisters[iCurrentAddress] = tmp[0];
                }
                catch (Exception ex)
                {
                }

                iCurrentAddress++;

                if (iCurrentAddress > NUD_MaxAddr.Value)
                {
                    iCurrentAddress  = (int)NUD_MaxAddr.Value;
                    TMR_Read.Enabled = false;
                }
            }
            else
            {
                TMR_Read.Enabled = false;
            }

            RefreshGUI();
        }
예제 #3
0
        static void Main(string[] args)
        {
            //    int[] registers = EasyModbus.ModbusClient.ConvertStringToRegisters("hello");
            // SerialPort serialport = new SerialPort("COM3");

            /*          serialport.PortName = "COM3";
             *        serialport.BaudRate = 9600;
             *        serialport.Parity = Parity.None;
             *        serialport.StopBits = StopBits.One;
             *        byte[] buffer = new byte[50];
             *        serialport.Open();
             *        byte[] bufferout = new byte[50];
             *        int numberOfBytesRead = 0;
             *        do
             *        {
             *            int quantity = serialport.Read(buffer, 0, 15);
             *            Buffer.BlockCopy(buffer, 0, bufferout, numberOfBytesRead, quantity);
             *            numberOfBytesRead = numberOfBytesRead + quantity;
             *        }
             *        while (numberOfBytesRead < 5);
             *        for (int i = 0; i < 15; i++)
             *        Console.WriteLine(bufferout[i].ToString());
             *        serialport.Write("ddddddddd");*/
            EasyModbus.ModbusClient modbusClient = new EasyModbus.ModbusClient("COM3");
            modbusClient.SerialPort = "COM3";
            //EasyModbus.ModbusClient modbusClient = new EasyModbus.ModbusClient("127.0.0.1", 502);
            modbusClient.ConnectionTimeout = 5000;
            modbusClient.LogFileFilename   = "test.txt";
            modbusClient.UnitIdentifier    = 0xF7;

            modbusClient.Connect();
            while (true)
            {
                //      Console.WriteLine("Execute FC5");
                //      modbusClient.WriteSingleCoil(0, true);
                //      Console.WriteLine("Execute FC6");
                //      modbusClient.WriteSingleRegister(0, 1234);
                //      Console.WriteLine("Execute FC15");
                //      modbusClient.WriteMultipleCoils(0, new bool[] { true, false, true, false, true, false, true });
                //Console.WriteLine("Execute FC16");
                //modbusClient.WriteMultipleRegisters(0, EasyModbus.ModbusClient.ConvertStringToRegisters("hallo2"));
                //modbusClient.Disconnect();
                //System.Threading.Thread.Sleep(100);
                //modbusClient.Connect();

                //Console.WriteLine("Execute FC3");
                //Console.WriteLine("Value of Holding Register 1000: " + modbusClient.ReadHoldingRegisters(1000, 1)[0]);

                Console.WriteLine("Read and Publish Input Registers");
                modbusClient.WriteSingleRegister(60, 1234);
                int[] holdingRegister = modbusClient.ReadHoldingRegisters(60, 2);
                //Console.WriteLine(holdingRegister[0]);


                // System.Threading.Thread.Sleep(1000);
            }
            modbusClient.Disconnect();
            Console.ReadKey();
        }
예제 #4
0
 public void TestEasyModbus()
 {
     EasyModbus.ModbusClient mc = new EasyModbus.ModbusClient()
     {
         IPAddress         = "127.0.0.1",
         Port              = 502,
         ConnectionTimeout = 5 * 1000,
     };
     mc.Connect();
     if (mc.Connected)
     {
         var data = mc.ReadHoldingRegisters(0, 10);
         Console.WriteLine(string.Join(" ", data));
     }
 }
예제 #5
0
 public void ThenTheResultShouldBeInt()
 {
     try
     {
         int[] serverResponse = mdbus.ReadHoldingRegisters(2279, 3);
         for (int i = 0; i < serverResponse.Length; i++)
         {
             IoC.Logger.Log($"{2279 + i} value {serverResponse[i]}", LogLevel.Informative);
         }
         WhenIPressDisconnect();
     }
     catch (Exception)
     {
         throw;
     }
 }
예제 #6
0
 public static void ReadRegisters(int start, int length)
 {
     if (PLC.Connected)
     {
         int[] data = new int[length];
         GVL.readexc = false;
         try
         {
             data = PLC.ReadHoldingRegisters(start, length);
             for (int i = 0; i < length; i++)
             {
                 GVL.registers[i + start] = data[i];
             }
         }
         catch (EasyModbus.Exceptions.ModbusException e)
         {
             GVL.readexc = true;
             for (int i = 0; i < length; i++)
             {
                 GVL.registers[i + start] = -200;
             }
             MessageBox.Show("Error Read Registers : " + e.Message, "Info", MessageBoxButtons.OK, MessageBoxIcon.Error);
         }
         catch (System.Net.Sockets.SocketException e)
         {
             GVL.readexc = true;
             for (int i = 0; i < length; i++)
             {
                 GVL.registers[i + start] = -500;
             }
             MessageBox.Show("Error Socket Registers : " + e.Message, "Info", MessageBoxButtons.OK, MessageBoxIcon.Error);
         }
         catch (System.IO.IOException e)
         {
             GVL.readexc = true;
             for (int i = 0; i < length; i++)
             {
                 GVL.registers[i + start] = -501;
             }
             //MessageBox.Show("Error PLC connection : " + e.Message, "Info", MessageBoxButtons.OK, MessageBoxIcon.Error);
             MessageBox.Show("Error PLC connection.", "Connection", MessageBoxButtons.OK, MessageBoxIcon.Error);
         }
     }
 }
예제 #7
0
        /// <summary>
        /// Read Holding Registers from Master device (Function code 3)
        /// </summary>
        /// <param name="startingAddress">the first holding register address to be read</param>
        /// <param name="quantity">number of holding registers to be read</param>
        public int[] ReadHoldingRegisters(int startingAddress, int quantity)
        {
            try
            {
                if (!modbusClient.Connected)
                {
                    return(null);
                }
                else
                {
                    return(modbusClient.ReadHoldingRegisters(startingAddress - 1, quantity));
                }
            }
            catch (Exception ex)
            {
                // log this error in to log file.
                IoC.Logger.Log($"{ex.Message}");

                // inform the user about this error
                IoC.Communication.Log += $"{DateTime.Now.ToLocalTime():MM/dd/yy HH:mm:ss.fff}: Exception occurred. {ex.Message}.\n";
                return(null);
            }
        }
예제 #8
0
        public void GetValues(ConnectionProperties connectionProperties)
        {
            modbusClient = connectionProperties.modbusClient;
            if (!modbusClient.Connected)
            {
                modbusClient.IPAddress = connectionProperties.ModbusTCPAddress;
                modbusClient.Port      = connectionProperties.Port;
                modbusClient.Connect();
            }
            foreach (FunctionProperties functionProperty in connectionProperties.FunctionPropertiesList)
            {
                switch (functionProperty.FunctionCode)
                {
                case FunctionCode.ReadCoils:
                    functionProperty.values = modbusClient.ReadCoils(functionProperty.StartingAdress, functionProperty.Quantity);
                    break;

                case FunctionCode.ReadDiscreteInputs:
                    functionProperty.values = modbusClient.ReadDiscreteInputs(functionProperty.StartingAdress, functionProperty.Quantity);
                    break;

                case FunctionCode.ReadHoldingRegisters:
                    functionProperty.values = modbusClient.ReadHoldingRegisters(functionProperty.StartingAdress, functionProperty.Quantity);
                    break;

                case FunctionCode.ReadInputRegisters:
                    functionProperty.values = modbusClient.ReadInputRegisters(functionProperty.StartingAdress, functionProperty.Quantity);
                    break;

                default: break;
                }
            }
            if (valuesChanged != null)
            {
                valuesChanged(this);
            }
        }
예제 #9
0
        private void ConnectPLC(object item)
        {
            try
            {
                List <string[]> informations = excelInfors.FindAll(x => x[1] != "" && x[2] != "" && x[3] != "");

                float Temperature = 0;
                float Humidity    = 0;

                foreach (string[] infor in informations)
                {
                    float value   = 0;
                    var   tagName = infor[0];
                    var   ip      = (string)infor[1];
                    var   port    = Int32.Parse(infor[2]);
                    EasyModbus.ModbusClient modbusClient = new EasyModbus.ModbusClient(ip, port);
                    try
                    {
                        ////Increase the Connection Timeout to 5 seconds
                        modbusClient.ConnectionTimeout = 5000;
                        modbusClient.Connect();


                        var   address         = Int32.Parse(infor[3]);
                        var   length          = Int32.Parse(infor[4]);
                        int[] holdingRegister = modbusClient.ReadHoldingRegisters(address - 1, length);


                        var rawValue = holdingRegister[0];
                        value = Convert.ToSingle(Decimal.Divide(rawValue, 10));
                    }
                    catch (Exception ex)
                    {
                    }

                    try
                    {
                        using (SqlConnection connection = new SqlConnection(conString))
                            using (SqlCommand command = new SqlCommand("Insert into [ADVANTECH WISE-4220] (Time, TagName, Value, MachineIRAI, SensorIRAI) values(@date,@tagName,@value,@irai,@sensorIrai)", connection))
                            {
                                command.Parameters.AddWithValue("date", System.DateTime.Now);
                                command.Parameters.AddWithValue("tagName", tagName);
                                command.Parameters.AddWithValue("value", value);
                                command.Parameters.AddWithValue("irai", infor[5]);
                                command.Parameters.AddWithValue("sensorIrai", infor[6]);

                                connection.Open();
                                command.ExecuteNonQuery();
                                connection.Close();
                            }
                    }
                    catch (Exception ex)
                    {
                    }

                    if (tagName == "Temperature")
                    {
                        Temperature = value;
                    }
                    if (tagName == "Humidity")
                    {
                        Humidity = value;
                    }

                    PropertyState matrix = (PropertyState)FindPredefinedNode(new NodeId(infor[0], NamespaceIndex), typeof(PropertyState));


                    matrix.Value = value;
                    matrix.ClearChangeMasks(SystemContext, true);

                    modbusClient.Disconnect();
                }


                var data = new Record();
                data.Temperature = Temperature;
                data.Humidity    = Humidity;

                MongoHelper.Asset.UpdatePrimaryValue("0990-MY.0027101.0000000001-#TS-00058200.0000000005.0002", data);
            }
            catch (Exception e)
            {
                Utils.Trace(e, "Unexpected error during simulation.");
            }
        }
예제 #10
0
        private void UpdateTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            lock (locker)
            {
                if (modbusClient != null)
                {
                    updateTimer.Stop();

                    DateTime updateStart = DateTime.Now;

                    bool  updateSucces     = false;
                    int[] inverterResponse = null;
                    int[] meterResponse    = null;;

                    TimeSpan inverterReadDuration = TimeSpan.MinValue;
                    TimeSpan meterReadDuration    = TimeSpan.MinValue;
                    string   ExceptionText        = "";
                    try
                    {
                        if (!ConnectionEstablished)
                        {
                            try
                            {
                                ConnectToModBus();
                                log.Debug($"Modbus connection established for {IPAdress}:{ModBusPort}");
                            }
                            catch (Exception E)
                            {
                                log.Debug($"A exeception occured while establishing Modbos connection to {IPAdress}:{ModBusPort}. {E.Message}", E);
                                throw new Exception($"A exeception occured while establishing Modbos connection to {IPAdress}:{ModBusPort} {E.Message}", E);
                            }
                        }

                        if (ReadInverterData)
                        {
                            try
                            {
                                DateTime StartTime = DateTime.Now;
                                inverterResponse     = modbusClient.ReadHoldingRegisters(inverterStartPos, inverterNumberOfRegisters);
                                inverterReadDuration = DateTime.Now - StartTime;
                                log.Debug($"Inverter data read: {inverterReadDuration.TotalMilliseconds}ms");
                            }
                            catch (Exception E)
                            {
                                log.Debug($"Reading inverter data failed. {E.Message}", E);
                                throw new Exception($"Reading inverter data failed. {E.Message}", E);
                            }

                            if (inverterResponse == null || inverterResponse.All(v => v == 0))
                            {
                                log.Debug("No valid data received from inverter.");
                                throw new Exception("No valid data received from inverter.");
                            }
                        }

                        if (ReadMeterData)
                        {
                            try
                            {
                                DateTime StartTime = DateTime.Now;
                                meterResponse     = modbusClient.ReadHoldingRegisters(meterStartPos, meterNumberOfRegisters);
                                meterReadDuration = DateTime.Now - StartTime;
                                log.Debug($"Meter data read: {meterReadDuration.TotalMilliseconds}ms");
                            }
                            catch (Exception E)
                            {
                                log.Debug($"Reading meter data failed. {E.Message}", E);
                                throw new Exception($"Reading meter data failed. {E.Message}", E);
                            }


                            if (meterResponse == null || meterResponse.All(v => v == 0))
                            {
                                log.Debug("No valid data received from inverter.");
                                throw new Exception("No valid data received from inverter.");
                            }
                        }
                    }
                    catch (Exception E)
                    {
                        ExceptionText = E.Message;
                    }

                    if (!ExceptionText.IsNullOrWhiteSpace())
                    {
                        log.Debug($"Exception occured while establishing the connection or while reading data.\n{ExceptionText}");
                        DisconnectFromModbus();
                    }
                    else
                    {
                        ModbusDataUpdater U = new ModbusDataUpdater();

                        try
                        {
                            switch (DataUpdateMode)
                            {
                            case DataUpdateModeEnum.UpdateExistingObjects:

                                lock (DataLocker)
                                {
                                    if (SolarEdgeFullData == null)
                                    {
                                        SolarEdgeFullData = new SolarEdgeFullData();
                                    }

                                    if (ReadInverterData)
                                    {
                                        U.UpdateData(inverterResponse, inverterStartPos, SolarEdgeFullData);
                                    }
                                    if (ReadMeterData)
                                    {
                                        U.UpdateData(meterResponse, meterStartPos, SolarEdgeFullData);
                                    }

                                    if (_SolarEdgeBaseData == null)
                                    {
                                        SolarEdgeBaseData = new SolarEdgeBaseData();
                                    }
                                    if (ReadInverterData)
                                    {
                                        U.UpdateData(inverterResponse, inverterStartPos, SolarEdgeBaseData);
                                    }
                                    if (ReadMeterData)
                                    {
                                        U.UpdateData(meterResponse, meterStartPos, SolarEdgeBaseData);
                                    }
                                };
                                break;

                            case DataUpdateModeEnum.CreateNewObjects:
                                SolarEdgeFullData FD = new SolarEdgeFullData();
                                if (ReadInverterData)
                                {
                                    U.UpdateData(inverterResponse, inverterStartPos, FD);
                                }
                                if (ReadMeterData)
                                {
                                    U.UpdateData(meterResponse, meterStartPos, FD);
                                }

                                SolarEdgeBaseData BD = new SolarEdgeBaseData();
                                if (ReadInverterData)
                                {
                                    U.UpdateData(inverterResponse, inverterStartPos, BD);
                                }
                                if (ReadMeterData)
                                {
                                    U.UpdateData(meterResponse, meterStartPos, BD);
                                }


                                lock (DataLocker)
                                {
                                    SolarEdgeFullData = FD;
                                    SolarEdgeBaseData = BD;
                                };
                                break;

                            default:
                                log.Error($"Unknown {nameof(DataUpdateMode)} {DataUpdateMode}");
                                throw new Exception($"Unknown {nameof(DataUpdateMode)} {DataUpdateMode}");
                            }



                            successiveFailCount = 0;
                            updateSucces        = true;
                            log.Debug("Data successfully updated");
                        }
                        catch (Exception E)
                        {
                            successiveFailCount++;

                            log.Warn($"Updating data failed. {E.Message}", E);

                            if (successiveFailCount > maxSuccessiveFails)
                            {
                                DisconnectFromModbus();
                                log.Debug($"Disconnected from Modbus on {IPAdress}:{ModBusPort}\n{ExceptionText}. Data update failed more than {maxSuccessiveFails} times.");
                                successiveFailCount = 0;
                            }
                        }
                    }



                    if (updateSucces)
                    {
                        LastDataUpdate = DateTime.Now;

                        SolarEdgeDataIsValid = true;

                        StartDataValidTimeoutTimer();

                        OnSolarEdgeDataUpdated();
                    }
                    else
                    {
                        OnSolarEdgeDataUpdateFailed();
                    }


                    int totalUpdateDurationMs = (int)(DateTime.Now - updateStart).TotalMilliseconds;

                    int sleepDurationMs = (RefreshIntervalMs - totalUpdateDurationMs).Limit(MinIntervalBetweenUpdatesMs.Limit(10, int.MaxValue), int.MaxValue);

                    log.Debug($"Update duration {totalUpdateDurationMs}ms. Will wait for {sleepDurationMs}ms before next update.");

                    updateTimer.Interval = sleepDurationMs;

                    updateTimer.Start();
                }
                else
                {
                    log.Warn($"{nameof(modbusClient)} is null. Most likely Stop has been called.");
                }
            }
        }