Exemple #1
0
        static void Main(string[] args)
        {
            ModbusClient modBusClient = new ModbusClient("127.0.0.1", 502);

            modBusClient.Connect();
            bool[] readCoils             = modBusClient.ReadCoils(0, 10);
            int[]  readInputRegisters    = modBusClient.ReadInputRegisters(0, 10);
            int[]  readsHoldingRegisters = modBusClient.ReadHoldingRegisters(0, 10);
            bool[] readDiscreteInputs    = modBusClient.ReadDiscreteInputs(0, 10);
            int[]  ar = new int[5];
            ar[0] = 1;
            ar[1] = 2;
            ar[2] = 3;
            int[] readMultipleRegisters = modBusClient.ReadWriteMultipleRegisters(0, 10, 0, ar);

            for (int i = 0; i < readCoils.Length; i++)
            {
                Console.WriteLine("Value of Coil :" + (9 + i + 1) + " " + readCoils[i].ToString());
            }

            for (int i = 0; i < readsHoldingRegisters.Length; i++)
            {
                Console.WriteLine("Value of HoldingRegister :" + (9 + i + 1) + " " + readsHoldingRegisters[i].ToString());
            }

            Console.Read();
        }
Exemple #2
0
 public void ReadInputRegister()
 {
     try
     {
         Console.WriteLine("Please Enter The Starting Address of Input Register:");
         string holdingregister    = Console.ReadLine();
         int    register           = Convert.ToInt32(holdingregister);
         int[]  readInputRegisters = modbusClient.ReadInputRegisters(register, 50);
         if (readInputRegisters != null)
         {
             for (int i = 0; i < readInputRegisters.Length; i++)
             {
                 Console.ForegroundColor = ConsoleColor.Green;
                 Decimal _toDecimal = Convert.ToDecimal(readInputRegisters[i]);
                 Console.WriteLine((register) + ":" + "<" + _toDecimal + ">");
                 register++;
             }
         }
         Console.ResetColor();
         modbusClient.Disconnect();
         Console.ReadKey();
     }
     catch (Exception e)
     {
         Console.ForegroundColor = ConsoleColor.Red;
         Console.WriteLine(e.Message);
         Console.ResetColor();
         Console.ReadLine();
     }
 }
Exemple #3
0
        private void updateModbus()
        {
            try
            {
                int[]  registers  = modbusClient.ReadHoldingRegisters(0, 4);
                int[]  inputs     = modbusClient.ReadInputRegisters(0, 5);
                bool[] coilStatus = modbusClient.ReadCoils(0, 5);

                double pressure         = ((float)inputs[0] - 100) / 100.0;
                double tank_lvl         = inputs[1] / 10.0;
                double flow_rate        = inputs[4];
                double return_flow_rate = inputs[2];
                double tank_flow_rate   = inputs[3];
                int    mode             = registers[3];
                pump_state            = coilStatus[0];
                relief_valve_state    = coilStatus[4];
                isolation_valve_state = coilStatus[2];
                return_valve_state    = coilStatus[3];
                inlet_valve_state     = coilStatus[1];

                station_pressure.Text    = "Value: " + pressure.ToString() + " bar";
                station_flow.Text        = "Rate: " + flow_rate.ToString() + " KL/h";
                station_return_flow.Text = "Rate: " + return_flow_rate.ToString() + " KL/h";
                station_tank_flow.Text   = "Rate: " + tank_flow_rate.ToString() + " KL/h";
                station_tank_lvl.Text    = tank_lvl.ToString() + " KL";

                isolation_valve.Image = (isolation_valve_state == true) ? Image.FromFile("./sprites/valve_on.png") : Image.FromFile("./sprites/valve_off.png");
                station_pump.Image    = (pump_state == true) ? Image.FromFile("./sprites/pump_on.png") : Image.FromFile("./sprites/pump_off.png");
                relief_valve.Image    = (relief_valve_state == true) ? Image.FromFile("./sprites/valve_on_90.png") : Image.FromFile("./sprites/valve_off_90.png");
                inlet_valve.Image     = (inlet_valve_state == true) ? Image.FromFile("./sprites/valve_on_90.png") : Image.FromFile("./sprites/valve_off_90.png");
                return_valve.Image    = (return_valve_state == true) ? Image.FromFile("./sprites/valve_on.png") : Image.FromFile("./sprites/valve_off.png");

                isolation_valve_btn.BackColor = (stations_data.stationVariables[4].man_isolation_valve_state == 1) ? Color.LimeGreen : Color.Gainsboro;
                pump_btn.BackColor            = (stations_data.stationVariables[4].man_pump_state == 1) ? Color.LimeGreen : Color.Gainsboro;
                relief_valve_btn.BackColor    = (stations_data.stationVariables[4].man_valve_state == 1) ? Color.LimeGreen : Color.Gainsboro;
                return_valve_btn.BackColor    = (stations_data.stationVariables[4].man_return_valve_state == 1) ? Color.LimeGreen : Color.Gainsboro;
                inlet_valve_btn.BackColor     = (stations_data.stationVariables[4].man_inlet_valve_state == 1) ? Color.LimeGreen : Color.Gainsboro;
            }

            catch
            {
                isolation_valve.Image = Image.FromFile("./sprites/valve_offline.png");
                station_pump.Image    = Image.FromFile("./sprites/pump_offline.png");
                relief_valve.Image    = Image.FromFile("./sprites/valve_offline_90.png");
                inlet_valve.Image     = Image.FromFile("./sprites/valve_offline_90.png");
                return_valve.Image    = Image.FromFile("./sprites/valve_offline.png");

                station_pressure.Text    = "Value: - ";
                station_flow.Text        = "Rate: - ";
                station_return_flow.Text = "Rate: - ";
                station_tank_flow.Text   = "Rate: - ";
                station_tank_lvl.Text    = " - ";

                isolation_valve_btn.Enabled = false;
                pump_btn.Enabled            = false;
                relief_valve_btn.Enabled    = false;
                return_valve_btn.Enabled    = false;
                inlet_valve_btn.Enabled     = false;
            }
        }
        public static int[] LayDuLieuTCPInputRegister(ModbusClient modbus, ushort quantityInputRegisters, ushort minAddressInputRegister, ThietBiModel thietBiModel)
        {
            List <int> readInputRegisters = new List <int>();

            if (quantityInputRegisters != 0)
            {
                try
                {
                    int soNguyenSauChia = quantityInputRegisters / DonViQuantityMoiLanDoc;
                    for (int i = 0; i <= soNguyenSauChia; i++)
                    {
                        if (i != soNguyenSauChia)
                        {
                            int startAddress = i * DonViQuantityMoiLanDoc + minAddressInputRegister;
                            int quantity     = DonViQuantityMoiLanDoc - minAddressInputRegister;
                            var temp         = modbus.ReadInputRegisters(startAddress, (ushort)(quantity));
                            readInputRegisters.AddRange(temp.ToList());
                        }
                        else if (i == soNguyenSauChia)
                        {
                            int startAddress = i * DonViQuantityMoiLanDoc + minAddressInputRegister;
                            int quantity     = quantityInputRegisters % DonViQuantityMoiLanDoc - minAddressInputRegister;
                            if (quantity != 0)
                            {
                                var temp = modbus.ReadInputRegisters(startAddress, (ushort)(quantity));
                                readInputRegisters.AddRange(temp.ToList());
                            }
                        }
                    }
                }
                catch (ModbusException ex)
                {
                    ExceptionFunctionCode(ex, thietBiModel);
                    throw;
                }
                catch (Exception ex)//Lỗi lấy dữ liệu thất bại
                {
                    ExceptionErrorConnection(ex, thietBiModel);
                    throw;
                }
            }
            return(readInputRegisters.ToArray());
        }
Exemple #5
0
        private void button_givedata_Click(object sender, EventArgs e)
        {
            dataGridView1.Rows.Clear();

            modbusClient = new ModbusClient("192.168.100.8", 502);    //Ip-Address and Port of Modbus-TCP-Server
            modbusClient.Connect();

            try
            {
                int Address = Convert.ToInt32(startingAddress.Text);
                int kolvo   = Convert.ToInt32(quantity.Text);

                if (RadioHolding.Checked == true)
                {
                    int[] readHoldingRegisters = modbusClient.ReadHoldingRegisters((Address - 40001), (kolvo - Address + 1));

                    for (int i = 0; i < readHoldingRegisters.Length; i++)
                    {
                        if (i < readHoldingRegisters.Length - 1)
                        {
                            dataGridView1.Rows.Insert(i, 1);
                        }

                        dataGridView1.Rows[i].Cells[1].Value = readHoldingRegisters[i].ToString();
                        dataGridView1.Rows[i].Cells[0].Value = (Address + i);
                    }
                }

                if (RadioInput.Checked == true)
                {
                    int[] ReadInputRegisters = modbusClient.ReadInputRegisters((Address - 30001), (kolvo - Address + 1));

                    for (int i = 0; i < ReadInputRegisters.Length; i++)
                    {
                        if (i < ReadInputRegisters.Length - 1)
                        {
                            dataGridView1.Rows.Insert(i, 1);
                        }

                        dataGridView1.Rows[i].Cells[1].Value = ReadInputRegisters[i].ToString();
                        dataGridView1.Rows[i].Cells[0].Value = (Address + i);
                    }
                }
                button_changedata.Enabled = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString() + "\n\nДиапазон адрессов:\n\nInputRegister - 30001\nHoldingRegisters - 40001");
            }
        }
        public void lerDados(int tipo)
        {
            int startadd, quant;
            string[] dados = new string[1];

            try
            {
                if (modbus.Connected)
                {
                    if (int.TryParse(tb_endi.Text, out startadd) && int.TryParse(tb_quantidade.Text, out quant)
                    {
                        tb_dados.Text = "";

                        switch (tipo)
                        {
                            case 1:
                                bool[] dadosCo = modbus.ReadCoils(startadd, quant);
                                dados = dadosCo.Select(x => x.ToString()).ToArray();
                                break;
                            case 2:
                                bool[] dadosDI = modbus.ReadDiscreteInputs(startadd, quant);
                                dados = dadosDI.Select(x => x.ToString()).ToArray();
                                break;
                            case 3:
                                int[] dadosHR = modbus.ReadHoldingRegisters(startadd, quant);
                                dados = dadosHR.Select(x => x.ToString()).ToArray();
                                break;
                            case 4:
                                int[] dadosIR = modbus.ReadInputRegisters(startadd, quant);
                                dados = dadosIR.Select(x => x.ToString()).ToArray();
                                break;
                        }

                        for (int i = 0; i < dados.Length; i++)
                        {
                            tb_dados.Text += "Dado " + i.ToString() + ": " + dados[i].ToString() + "\r\n";
                        }
                    }
                }
                else
                {
                    MessageBox.Show("Servidor MODBUS TCP Desconectado");
                }
            }
            catch (Exception err)
            {
                MessageBox.Show("Erro na leitura dos dados MODBUS. \r\nErro: " + err.Message);
            }
        }
Exemple #7
0
        private string ReadDataFromSlave(int FunctionCode, int startingAddress)
        {
            try     // 데이터 Gathering 시도
            {
                switch (FunctionCode)
                {
                case 0:
                    return(modbusClient.ReadCoils(startingAddress, 1)[0].ToString());    // FC 1 00000-100000 시작번지 부터 지정한 개수 읽기

                case 1:
                    return(modbusClient.ReadDiscreteInputs(startingAddress, 1)[0].ToString());     // FC 2 100001-200000

                case 2:
                    return(modbusClient.ReadHoldingRegisters(startingAddress, 1)[0].ToString());       // FC 3 400001-500000

                case 3:
                    return(modbusClient.ReadInputRegisters(startingAddress, 1)[0].ToString()); // FC 4 300000-400000

                default:                                                                       // 이외의 값이 들어올 때 처리
                    return(null);
                }
            }
            catch (Exception)
            {
                return(null);
            }
            #region 예외처리 보관함

            /*catch (ModbusException) // 모드버스 예외 발생 시
             * {
             *  i--;        // 예외 발생한 부분 다시 반복
             * }
             * catch (TimeoutException)    // 타임 아웃 에러 시
             * {
             *  i--;        // 예외 발생한 부분 다시 반복
             * }
             * catch (StackOverflowException)  // 데이터 과다복용 사망 시
             * {
             *  i--;
             * }
             * catch (NullReferenceException)
             * {
             *  readData[i] = "Null 붙잡을 노래";
             * }
             */
            #endregion
        }
        public int[] ReadInputRegister(byte slaveAddress, ushort startAddress, ushort numberOfPoints)
        {
            Log.Debug("GET ReadInputRegister: SlaveAddress {0}, StartAddress {1}, NumberOfPoints {2}", slaveAddress, startAddress, numberOfPoints);

            try
            {
                _master.UnitIdentifier = slaveAddress;
                var response = _master.ReadInputRegisters(startAddress, numberOfPoints);
                Log.Debug("RESPONSE ReadInputRegister: {0}", String.Join(",", response));
                return(response);
            }
            catch (Exception ex)
            {
                Log.Error(ex, "ERROR: ReadInputRegister: SlaveAddress {0}, StartAddress {1}, NumberOfPoints {2} - MSG: {3}", slaveAddress, startAddress, numberOfPoints, ex.Message);
                //throw ex;
                return(null);
            }
        }
Exemple #9
0
        // read %AI
        public int[] ReadAI(int startingAddress, int quantity)
        {
            int[] val = new int[quantity];
            try
            {
                ModbusClient client = new ModbusClient(IPAddress, Port);

                client.Connect();
                val = client.ReadInputRegisters(startingAddress, quantity);
                client.Disconnect();
            }
            catch
            {
            }


            return(val);
        }
 //点击连接
 private void b_connect_Click(object sender, RoutedEventArgs e)
 {
     modbusClient.Connect();
     Thread.Sleep(1000);
     int[] i = modbusClient.ReadInputRegisters(10, 1);
     foreach (int team in i)
     {
         if (team != 1)
         {
             ConnectStatus.Content = "连接失败";
         }
         else
         {
             ConnectStatus.Content    = "连接成功";
             ConnectStatus.Foreground = new SolidColorBrush(Colors.Green);
         }
     }
 }
        public int get_EtatMachine()
        {
            int registre;

            try
            {
                //string data = "";
                int[] readHoldingRegisters = modbusClient.ReadInputRegisters(0, 2);
                registre = readHoldingRegisters[1];

                //data += registre;

                //MessageBox.Show(data);
            }
            catch
            {
                registre = 0;
                //MessageBox.Show("Connexion automate interrompue.");
            }
            return(registre);
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            try
            {
                if (svimaster.Connected == false)
                {
                    svimaster.UnitIdentifier    = 1;    // Not necessary since default slaveID = 1;
                    svimaster.Baudrate          = 9600; // Not necessary since default baudrate = 9600
                    svimaster.Parity            = System.IO.Ports.Parity.Even;
                    svimaster.StopBits          = System.IO.Ports.StopBits.One;
                    svimaster.ConnectionTimeout = 1000;
                    svimaster.Connect();
                    label1.BackColor = Color.YellowGreen;
                    label1.Text      = "Connect";
                }


                if (svimaster.Connected == true)
                {
                    int[] Weight;
                    float NetWeight;
                    Weight             = svimaster.ReadInputRegisters(25, 2);
                    NetWeight          = ModbusClient.ConvertRegistersToFloat(Weight);
                    textBoxWeight.Text = Convert.ToString(Convert.ToUInt64(NetWeight.ToString()) - Convert.ToUInt64(textBoxNumberOfPareSnag.Text));
                }
            }

            catch
            {
                svimaster.Disconnect();
                try
                {
                    svimaster.Connect();
                }
                catch
                {
                    textBoxWeight.Text = "99999999";
                }
            }
        }
Exemple #13
0
        public async Task ClientReadInputRegisterTest()
        {
            // Function Code 0x04

            var expectedRequest  = new byte[] { 0, 0, 0, 6, 3, 4, 0, 6, 0, 3 };
            var expectedResponse = new List <Register>
            {
                new Register {
                    Address = 6, Value = 123
                },
                new Register {
                    Address = 7, Value = 0
                },
                new Register {
                    Address = 8, Value = 12345
                }
            };

            using (var server = new MiniTestServer())
            {
                server.RequestHandler = (request, clientIp) =>
                {
                    CollectionAssert.AreEqual(expectedRequest, request.Skip(2).ToArray(), "Request is incorrect");
                    Console.WriteLine("Server sending response");
                    return(new byte[] { request[0], request[1], 0, 0, 0, 9, 3, 4, 6, 0, 123, 0, 0, 48, 57 });
                };
                server.Start();
                using (var client = new ModbusClient(IPAddress.Loopback, server.Port, new ConsoleLogger()))
                {
                    await client.Connect();

                    Assert.IsTrue(client.IsConnected);

                    var registers = await client.ReadInputRegisters(3, 6, 3);

                    Assert.IsTrue(string.IsNullOrWhiteSpace(server.LastError), server.LastError);
                    CollectionAssert.AreEqual(expectedResponse, registers, "Response is incorrect");
                }
            }
        }
Exemple #14
0
        private void btnReadInputRegisters_Click(object sender, EventArgs e)
        {
            try
            {
                if (!modbusClient.Connected)
                {
                    button3_Click(null, null);
                }

                int[] serverResponse = modbusClient.ReadInputRegisters(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);
            }
        }
Exemple #15
0
 //lấy dữ liệu của các thiết bị
 private void getDataDevice(KeyValuePair <string, DeviceModel> deviceUnit, string filePath)
 {
     string[] output = new string[deviceUnit.Value.ListDuLieuChoTungPLC.Count];
     //doc tung dong trong list data cua 1 device
     for (int i = 0; i < deviceUnit.Value.ListDuLieuChoTungPLC.Count; i++)
     {
         DuLieuModel duLieuTemp   = deviceUnit.Value.ListDuLieuChoTungPLC.ElementAt(i).Value;
         string      giaTriDuLieu = "";
         try
         {
             if (Convert.ToInt32(duLieuTemp.DiaChi) <= 65536)
             {
                 bool[] readCoil = mobus.ReadCoils(Convert.ToInt32(duLieuTemp.DiaChi), 1);
                 giaTriDuLieu = readCoil[0].ToString();
             }
             else if (Convert.ToInt32(duLieuTemp.DiaChi) <= 165536 && Convert.ToInt32(duLieuTemp.DiaChi) >= 100001)
             {
                 bool[] discreteInput = mobus.ReadDiscreteInputs(Convert.ToInt32(duLieuTemp.DiaChi) - 100001, 1);
                 giaTriDuLieu = discreteInput[0].ToString();
             }
             else if (Convert.ToInt32(duLieuTemp.DiaChi) <= 365536 && Convert.ToInt32(duLieuTemp.DiaChi) >= 300001)
             {
                 int[] readRegister = mobus.ReadInputRegisters(Convert.ToInt32(duLieuTemp.DiaChi) - 300001, 1);
                 giaTriDuLieu = readRegister[0].ToString();
             }
             else if (Convert.ToInt32(duLieuTemp.DiaChi) <= 465536 && Convert.ToInt32(duLieuTemp.DiaChi) >= 400001)
             {
                 int[] readHoldingRegister = mobus.ReadHoldingRegisters(Convert.ToInt32(duLieuTemp.DiaChi) - 400001, 1);
                 giaTriDuLieu = readHoldingRegister[0].ToString();
             }
             duLieuTemp.GiaTri                = Convert.ToInt32(giaTriDuLieu);
             duLieuTemp.ThoiGianDocGiuLieu    = DateTime.Now;
             deviceUnit.Value.TrangThaiKetNoi = 1;
         }
         catch (Exception ex)
         {
         }
     }
 }
        private void timer2_Tick(object sender, EventArgs e)
        {
            try
            {
                timer2.Enabled = false;
                bool[] readCoils             = modbusClient.ReadCoils(Decimal.ToInt32(nudCoil1.Value), 1);
                bool[] readCoils2            = modbusClient.ReadCoils(Decimal.ToInt32(nudCoil2.Value), 1);
                int[]  readHoldingRegisters  = modbusClient.ReadHoldingRegisters(Decimal.ToInt32(nudReg1.Value), 1);
                int[]  readHoldingRegisters2 = modbusClient.ReadHoldingRegisters(Decimal.ToInt32(nudReg2.Value), 1);
                int[]  readInputRegisters    = modbusClient.ReadInputRegisters(0, 1);// đọc analogue input

                txtGiaTri1.Text  = readHoldingRegisters[0].ToString();
                txtGiaTri2.Text  = readHoldingRegisters2[0].ToString();
                chk1.Checked     = readCoils[0];
                chk2.Checked     = readCoils2[0];
                txtInputReg.Text = readInputRegisters[0].ToString();
                timer2.Enabled   = true;
            }
            catch
            {
                lblStatus.Text = "Error";
            }
        }
        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);
            }
        }
Exemple #18
0
        private void timer2_Tick(object sender, EventArgs e)
        {
            if (ligadot)
            {
                if (modbusClient == null)
                {
                    return;
                }

                try
                {
                    //le a temperatura e mostra no supervisório  tratar tensão de o a 10
                    int temperatura = modbusClient.ReadInputRegisters(128, 1)[0];
                    temperatura     = (temperatura / 1000) + 20;
                    trackBar4.Value = temperatura;
                    string temp = temperatura.ToString();
                    label19.Text = temp;

                    //le a tensão e mostra no supervisório tratar de 1 a 5
                    int    tensao = modbusClient.ReadHoldingRegisters(3128, 1)[0]; // recebe valor de 400 a 2000 (1 a 5)
                    double tensa  = (tensao - 400) * 0.137;
                    string tens   = tensa.ToString();
                    label31.Text = tens;

                    // pega a vazão do arduino e envia para o CLP
                    //transforma o valor de vazao para o CLP
                    float vaz = vazao * 1000;
                    int   val = (int)vaz;
                    modbusClient.WriteSingleRegister(10020, val);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Erro na escrita de dados no CLP!");
                }
            }
        }
Exemple #19
0
        private void Read_Data()
        {
            modbusClient = new ModbusClient("127.0.0.1", 502);    //Ip-Address and Port of Modbus-TCP-Server
            // modbusClient.Disconnect();


            try
            {
                modbusClient.Connect();
                b_Modbus_Connect = true;
            }
            catch (Exception)
            {
                b_Modbus_Connect = false;
                SaveLogFile("Modbus 연결 실패");
                return;
            }

            while (true)
            {
                try
                {
                    n_Value_pm25 = modbusClient.ReadInputRegisters(0, 20);
                    System.Threading.Thread.Sleep(1000);
                    n_Value_pm10 = modbusClient.ReadInputRegisters(100, 20);
                    System.Threading.Thread.Sleep(1000);
                    n_SensorState = modbusClient.ReadInputRegisters(200, 20);
                }
                catch (Exception)
                {
                    modbusClient.Disconnect();
                    b_Modbus_Connect = false;
                    SaveLogFile("Modbus data Read Fail");
                    n_SensorState = Enumerable.Repeat(3, 20).ToArray();
                    return;
                }

                for (int i = 0; i < 6; i++)
                {
                    DateTime dataTime = DateTime.Now;

                    string time  = DateTime.Now.ToString("yy_MM");
                    string time1 = DateTime.Now.ToString("yy-MM-dd-HH-mm-ss");

                    string sInsert_Text = "INSERT INTO sensor_data_";

                    sInsert_Text += time + " VALUES (null," + Convert.ToString(i + 1) + ",'" + time1 + "',";

                    sInsert_Text += Convert.ToString(n_Value_pm25[i * 2]) + "," + Convert.ToString(n_Value_pm10[i * 2]) + ")";

                    if (mysql.sql(sInsert_Text) == false)
                    {
                        SaveLogFile("insert Fail" + sInsert_Text);
                        string s_Create_Query = "CREATE TABLE `manage`.`sensor_data_#Date` " +
                                                "(`index_id` BIGINT(20) NOT NULL AUTO_INCREMENT,`class` INT(11) NOT NULL,	"
                                                + "`regdate` TIMESTAMP NULL DEFAULT NULL,	`pm2.5` INT(11) NULL DEFAULT '0',	"
                                                + "`pm10` INT(11) NULL DEFAULT '0', INDEX `index_id` (`index_id`) USING BTREE)";

                        s_Create_Query = s_Create_Query.Replace("#Date", time);

                        mysql.sql(s_Create_Query); //년월 테이블 생성
                        mysql.sql(sInsert_Text);   //실패한 데이터 다시 insert
                    }

                    if (n_Config_Value[i] <= n_Value_pm25[i * 2] && b_Alarm[i] == false)
                    {
                        b_Alarm[i] = true;
                        string sInsert_AlarmText = "INSERT INTO alarm_list VALUES (null," + Convert.ToString(i + 1) + ",'" + time1 + "',";
                        sInsert_AlarmText += Convert.ToString(n_Config_Value[i]) + "," + Convert.ToString(n_Config_Value2[i]) +
                                             "," + Convert.ToString(n_Value_pm25[i * 2]) + "," + Convert.ToString(n_Value_pm10[i * 2]) + ")";
                        mysql.sql(sInsert_AlarmText);
                    }
                    else if (n_Config_Value[i] >= n_Value_pm25[i * 2] && b_Alarm[i] == true)
                    {
                        b_Alarm[i] = false;
                    }

                    if (n_Config_Value2[i] <= n_Value_pm10[i * 2] && b_Alarm2[i] == false)
                    {
                        b_Alarm2[i] = true;
                        string sInsert_AlarmText = "INSERT INTO alarm_list VALUES (null," + Convert.ToString(i + 1) + ",'" + time1 + "',";
                        sInsert_AlarmText += Convert.ToString(n_Config_Value[i]) + "," + Convert.ToString(n_Config_Value2[i]) +
                                             "," + Convert.ToString(n_Value_pm25[i * 2]) + "," + Convert.ToString(n_Value_pm10[i * 2]) + ")";
                        mysql.sql(sInsert_AlarmText);
                    }
                    else if (n_Config_Value2[i] >= n_Value_pm10[i * 2] && b_Alarm2[i] == true)
                    {
                        b_Alarm2[i] = false;
                    }
                }


                SetLabel(label_Class1PM25, n_Value_pm25[0].ToString());
                SetLabel(label_Class2PM25, n_Value_pm25[2].ToString());
                SetLabel(label_Class3PM25, n_Value_pm25[4].ToString());
                SetLabel(label_Class4PM25, n_Value_pm25[6].ToString());
                SetLabel(label_Class5PM25, n_Value_pm25[8].ToString());
                SetLabel(label_Class6PM25, n_Value_pm25[10].ToString());

                SetLabel(label_Class1PM10, n_Value_pm10[0].ToString());
                SetLabel(label_Class2PM10, n_Value_pm10[2].ToString());
                SetLabel(label_Class3PM10, n_Value_pm10[4].ToString());
                SetLabel(label_Class4PM10, n_Value_pm10[6].ToString());
                SetLabel(label_Class5PM10, n_Value_pm10[8].ToString());
                SetLabel(label_Class6PM10, n_Value_pm10[10].ToString());

                System.Threading.Thread.Sleep(1000);
            }
            b_Modbus_Connect = false;
        }
Exemple #20
0
        static async Task RunClientAsync()
        {
            //InternalLoggerFactory.DefaultFactory.AddProvider(new ConsoleLoggerProvider((s, level) => true, false));

            ModbusClient client = new ModbusClient(0x01, "127.0.0.1");

            try
            {
                await client.Connect();

                while (true)
                {
                    Console.WriteLine(@"
<------------------------------------------------------->
1: Read Coils; 2: Read Discrete Inputs; 
3: Read Holding Registers; 4: Read Input Registers; 
5: Write Single Coil; 6: Write Single Register; 
15: Write Multiple Coils; 16: Write Multiple Registers;
<------------------------------------------------------->");
                    var line = Console.ReadLine();
                    if (string.IsNullOrEmpty(line))
                    {
                        break;
                    }

                    Console.WriteLine("<------------------------------------------------------->");
                    var command = Convert.ToInt32(line);

                    ModbusFunction response        = null;
                    ushort         startingAddress = 0x0000;
                    ushort         quantity        = 0x000A;
                    var            state           = true;
                    ushort         value           = 0x0001;

                    switch (command)
                    {
                    case 1:
                        response = client.ReadCoils(startingAddress, quantity);
                        var coils = (response as ReadCoilsResponse).Coils;
                        for (int i = 0; i < quantity; i++)
                        {
                            Console.WriteLine(coils[i]);
                        }
                        break;

                    case 2:
                        response = client.ReadDiscreteInputs(startingAddress, quantity);
                        var inputs = (response as ReadDiscreteInputsResponse).Inputs;
                        for (int i = 0; i < quantity; i++)
                        {
                            Console.WriteLine(inputs[i]);
                        }
                        break;

                    case 3:
                        response = client.ReadHoldingRegisters(startingAddress, quantity);
                        foreach (var register in (response as ReadHoldingRegistersResponse).Registers)
                        {
                            Console.WriteLine(register);
                        }
                        break;

                    case 4:
                        response = client.ReadInputRegisters(startingAddress, quantity);
                        foreach (var register in (response as ReadInputRegistersResponse).Registers)
                        {
                            Console.WriteLine(register);
                        }
                        break;

                    case 5:
                        response = client.WriteSingleCoil(startingAddress, state);
                        Console.WriteLine((response as WriteSingleCoilResponse).State == state ? "Successed" : "Failed");
                        break;

                    case 6:
                        response = client.WriteSingleRegister(startingAddress, value);
                        Console.WriteLine((response as WriteSingleRegisterResponse).Value == value ? "Successed" : "Failed");
                        break;

                    case 15:
                        var states = new bool[] { true, true, true, true, true, true, true, true, true, true };
                        response = client.WriteMultipleCoils(startingAddress, states);
                        Console.WriteLine((response as WriteMultipleCoilsResponse).Quantity == states.Length);
                        break;

                    case 16:
                        var registers = new ushort[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
                        response = client.WriteMultipleRegisters(startingAddress, registers);
                        Console.WriteLine((response as WriteMultipleRegistersResponse).Quantity == registers.Length);
                        break;
                    }
                }

                await client.Close();

                Console.ReadLine();
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message);
            }
        }
Exemple #21
0
        static void startCollecting(bool status)
        {
            try
            {
                ModbusClient modbusClient = new ModbusClient("COM3");
                modbusClient.Baudrate          = 115200; // Not necessary since default baudrate = 9600
                modbusClient.Parity            = System.IO.Ports.Parity.None;
                modbusClient.StopBits          = System.IO.Ports.StopBits.Two;
                modbusClient.ConnectionTimeout = 5000;
                modbusClient.Connect();
                Console.WriteLine("Device Connection Successful");

                String[] sensordata = { "ID", "Temp", "Humidity", "Part03", "Part05", "DateTime" };
                Console.WriteLine("Count\t" + string.Join("\t", sensordata) + "\t\t Run Time");

                SqlConnection myConnection = new SqlConnection(@"Data Source=DESKTOP-DLIT;Initial Catalog=SensorDataDB;Integrated Security=True");
                myConnection.Open();
                status = true;
                DateTime startTime = DateTime.Now;
                int      dataCount = 0;

                while (status)
                {
                    for (byte j = 1; j < 4; j++)
                    {
                        dataCount += 1;
                        modbusClient.UnitIdentifier = j;

                        //string timestamp0 = now.ToString("yyyy-MM-dd HH:mm:ss.fff"); //

                        int[]    test1      = modbusClient.ReadInputRegisters(10, 6);
                        DateTime timestamp  = DateTime.Now;
                        var      timeCount  = DateTime.Now - startTime;
                        string   timestamp0 = timestamp.ToString("yyyy-MM-dd HH:mm:ss.fff");
                        decimal  temp       = test1[0];
                        decimal  humid      = test1[1];
                        int[]    part03_arr = { 0, 0 };
                        int[]    part05_arr = { 0, 0 };
                        part03_arr[0] = test1[3];
                        part03_arr[1] = test1[2];
                        part05_arr[0] = test1[5];
                        part05_arr[1] = test1[4];
                        Int64 part03 = ModbusClient.ConvertRegistersToInt(part03_arr);
                        Int64 part05 = ModbusClient.ConvertRegistersToInt(part05_arr);
                        Console.WriteLine(dataCount + "\t" + j + "\t" + (temp / 100m).ToString("F", CultureInfo.InvariantCulture) + "\t" + (humid / 100m).ToString("F", CultureInfo.InvariantCulture) + "\t\t" + String.Format("{0:n0}", part03) + "\t" + String.Format("{0:n0}", part05) + "\t" + timestamp0 + "\t  {0}일 {1}시간 {2}분 {3}초", timeCount.Days, timeCount.Hours, timeCount.Minutes, timeCount.Seconds);

                        string sql_str_temp   = "INSERT INTO DEV_TEMP_" + j.ToString() + " (Temperature, DateAndTime) Values (@Temperature, @DateAndTime)";
                        string sql_str_humid  = "INSERT INTO DEV_HUMID_" + j.ToString() + " (Humidity, DateAndTime) Values (@Humidity, @DateAndTime)";
                        string sql_str_part03 = "INSERT INTO DEV_PART03_" + j.ToString() + " (Particle03, DateAndTime) Values (@Particle03, @DateAndTime)";
                        string sql_str_part05 = "INSERT INTO DEV_PART05_" + j.ToString() + " (Particle05, DateAndTime) Values (@Particle05, @DateAndTime)";

                        SqlCommand myCommand_temp   = new SqlCommand(sql_str_temp, myConnection);
                        SqlCommand myCommand_humid  = new SqlCommand(sql_str_humid, myConnection);
                        SqlCommand myCommand_part03 = new SqlCommand(sql_str_part03, myConnection);
                        SqlCommand myCommand_part05 = new SqlCommand(sql_str_part05, myConnection);

                        myCommand_temp.Parameters.AddWithValue("@Temperature ", (temp / 100m).ToString("F", CultureInfo.InvariantCulture));
                        myCommand_temp.Parameters.AddWithValue("@DateAndTime", timestamp0);
                        myCommand_temp.ExecuteNonQuery();

                        myCommand_humid.Parameters.AddWithValue("@Humidity", (humid / 100m).ToString("F", CultureInfo.InvariantCulture));
                        myCommand_humid.Parameters.AddWithValue("@DateAndTime", timestamp0);
                        myCommand_humid.ExecuteNonQuery();

                        myCommand_part03.Parameters.AddWithValue("@Particle03", part03);
                        myCommand_part03.Parameters.AddWithValue("@DateAndTime", timestamp0);
                        myCommand_part03.ExecuteNonQuery();

                        myCommand_part05.Parameters.AddWithValue("@Particle05", part05);
                        myCommand_part05.Parameters.AddWithValue("@DateAndTime", timestamp0);
                        myCommand_part05.ExecuteNonQuery();
                    }
                }
                myConnection.Close();
                modbusClient.Disconnect();
                Console.Write("Press any key to continue . . . ");
                Console.ReadKey(true);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
Exemple #22
0
        private void FetchFromModbusServer()
        {
            if (ModbusHost.HasValue && ModbusAddress1.Value > 0)
            {
                int registerToRead;
                switch (DataType.Value)
                {
                case DataTypeEnum.INT32:
                case DataTypeEnum.FLOAT:
                    registerToRead = 2;
                    break;

                case DataTypeEnum.LONG:
                case DataTypeEnum.DOUBLE:
                    registerToRead = 4;
                    break;

                case DataTypeEnum.INT16_SIGNED:
                case DataTypeEnum.INT16_UNSIGNED:
                default:
                    registerToRead = 1;
                    break;
                }
                ModbusClient.RegisterOrder regOrder;
                if (!RegisterOrder.HasValue || RegisterOrder.Value == ByteOrderEnum.LOW_HIGH)
                {
                    regOrder = ModbusClient.RegisterOrder.LowHigh;
                }
                else
                {
                    regOrder = ModbusClient.RegisterOrder.HighLow;
                }
                ModbusClient modbusClient = null;
                try
                {
                    modbusClient = new ModbusClient(ModbusHost.Value, ModbusPort.Value);
                    modbusClient.ConnectionTimeout = 5000;
                    modbusClient.Connect();
                    modbusClient.UnitIdentifier = (byte)ModbusID.Value;

                    int[] readHoldingRegisters;
                    switch (FunctionCode.Value)
                    {
                    case FunctionCodeEnum.FC_04:
                        readHoldingRegisters = modbusClient.ReadInputRegisters(ModbusAddress1.Value, registerToRead);
                        break;

                    case FunctionCodeEnum.FC_03:
                    default:
                        readHoldingRegisters = modbusClient.ReadHoldingRegisters(ModbusAddress1.Value, registerToRead);
                        break;
                    }

                    double result     = 0;
                    string result_str = "";

                    switch (DataType.Value)
                    {
                    case DataTypeEnum.INT32:
                        // probably signed ...
                        result = ModbusClient.ConvertRegistersToInt(readHoldingRegisters, regOrder);
                        break;

                    case DataTypeEnum.FLOAT:
                        result = ModbusClient.ConvertRegistersToFloat(readHoldingRegisters, regOrder);
                        break;

                    case DataTypeEnum.LONG:
                        result = ModbusClient.ConvertRegistersToLong(readHoldingRegisters, regOrder);
                        break;

                    case DataTypeEnum.DOUBLE:
                        result = ModbusClient.ConvertRegistersToDouble(readHoldingRegisters, regOrder);
                        break;

                    case DataTypeEnum.INT16_SIGNED:
                        result = readHoldingRegisters[0];
                        break;

                    case DataTypeEnum.INT16_UNSIGNED:
                        // unsigned
                        for (int i = 0; i < (readHoldingRegisters.Length); i++)
                        {
                            int tmp = readHoldingRegisters[i];
                            if (tmp == -32768)     // fix for 0x00
                            {
                                tmp = 0;
                            }
                            if (tmp < 0)     // no negative values !
                            {
                                tmp = tmp + (int)Math.Pow(2, 16);
                            }

                            result     = result + (tmp * Math.Pow(2, (16 * ((readHoldingRegisters.Length) - (i + 1)))));
                            result_str = result_str + " 0x" + tmp.ToString("X4");
                        }
                        break;

                    default:
                        result_str = "internal: invalid datatype";
                        break;
                    }

                    OutputValue1.Value = result;
                    ErrorMessage.Value = result_str;
                    this.SchedulerService.InvokeIn(new TimeSpan(0, 0, TimeSpan.Value), FetchFromModbusServer);
                }
                catch (Exception e)
                {
                    this.ErrorMessage.Value = e.ToString();
                    this.SchedulerService.InvokeIn(new TimeSpan(0, 1, 0), FetchFromModbusServer);
                }
                finally
                {
                    if (modbusClient != null)
                    {
                        modbusClient.Disconnect();
                    }
                }
            }
        }
Exemple #23
0
        private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                modbusClient = new ModbusClient(socket.Ip, socket.port);
                modbusClient.Connect();
                this.Invoke((MethodInvoker) delegate
                {
                    log1.listView1.Items.Add(new ListViewItem(new[] { DateTime.Now.ToString(), "connected to Ip=" + socket.Ip + "port=" + socket.Ip }));
                });
                modbusClient.Disconnect();
            }
            catch (Exception err)
            {
                this.Invoke((MethodInvoker) delegate
                {
                    //log1.textBox1.AppendText(DateTime.Now + ":\t please check your Ip or Port settings");
                    log1.listView1.Items.Add(new ListViewItem(new[] { DateTime.Now.ToString(), "please check your Ip or Port settings " + err.Message }));
                });
                goto out_s;
            }
            while (runsystem)
            {
                bool datawritten = false;
wait:
                try
                {
                    modbusClient = new ModbusClient(socket.Ip, socket.port);
                    modbusClient.Connect();
                }
                catch (Exception err)
                {
                    if (!datawritten)
                    {
                        this.Invoke((MethodInvoker) delegate
                        {
                            //log1.textBox1.AppendText(DateTime.Now + ":\t please check your Ip or Port settings");
                            log1.listView1.Items.Add(new ListViewItem(new[] { DateTime.Now.ToString(), "please check your Ip or Port settings" + err.Message }));
                        });
                        sendmail("Plc bağlantısı kesildi");
                        datawritten = true;
                    }
                    System.Threading.Thread.Sleep(1000);
                    goto wait;
                }
                List <sqlpost> post = new List <sqlpost>();
                for (int i = 0; i < set1.dataGridView1.Rows.Count - 1; i++)
                {
                    if (set1.dataGridView1.Rows[i].Cells[1].Value != null)
                    {
                        //
                        //************************************ LW **************************//
                        //
                        #region -----LW------
                        if (set1.dataGridView1.Rows[i].Cells[1].Value.ToString() == "LW")
                        {
                            int[] readHoldingRegisters;
                            try
                            {
                                readHoldingRegisters = modbusClient.ReadInputRegisters(
                                    Convert.ToInt32(set1.dataGridView1.Rows[i].Cells[0].Value), 1);
                            }
                            catch (Exception err)
                            {
                                this.Invoke((MethodInvoker) delegate
                                {
                                    log1.listView1.Items.Add(new ListViewItem(new[] { DateTime.Now.ToString(), "please check your Ethernet connection" + err.Message }));
                                });
                                goto wait;
                            }
                            if (readHoldingRegisters[0].ToString() != set1.dataGridView1.Rows[i].Cells[2].Value.ToString())
                            {
                                post.Add(new sqlpost {
                                    definition = set1.dataGridView1.Rows[i].Cells[3].Value.ToString(), address = set1.dataGridView1.Rows[i].Cells[0].Value.ToString(), value = readHoldingRegisters[0].ToString(),
                                });
                                set1.dataGridView1.Rows[i].Cells[2].Value = readHoldingRegisters[0].ToString();
                            }
                        }
                        #endregion
                        //
                        //*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! LW !!!!!!!!!!!!!!!!!!!!!!!!!*//
                        //

                        //
                        //************************************ RW **************************//
                        //
                        #region -----RW------
                        if (set1.dataGridView1.Rows[i].Cells[1].Value.ToString() == "RW")
                        {
                            int[] readHoldingRegisters;
                            try
                            {
                                readHoldingRegisters = modbusClient.ReadInputRegisters(
                                    Convert.ToInt32(set1.dataGridView1.Rows[i].Cells[0].Value) + 10000 - 1, 1);
                            }
                            catch (Exception err)
                            {
                                this.Invoke((MethodInvoker) delegate
                                {
                                    log1.listView1.Items.Add(new ListViewItem(new[] { DateTime.Now.ToString(), "please check your Ethernet connection" + err.Message }));
                                });
                                goto wait;
                            }
                            if (readHoldingRegisters[0].ToString() != set1.dataGridView1.Rows[i].Cells[2].Value.ToString())
                            {
                                post.Add(new sqlpost {
                                    definition = set1.dataGridView1.Rows[i].Cells[3].Value.ToString(), address = set1.dataGridView1.Rows[i].Cells[0].Value.ToString(), value = readHoldingRegisters[0].ToString(),
                                });
                                set1.dataGridView1.Rows[i].Cells[2].Value = readHoldingRegisters[0].ToString();
                            }
                        }
                        #endregion
                        //
                        //*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! RW !!!!!!!!!!!!!!!!!!!!!!!!!*//
                        //
                    }
                }
                modbusClient.Disconnect();
                if (post != null)
                {
                    string lastitem = null;
                    string connectionString;
                    connectionString = "Server = " + server.servername + "; Port = " + server.sql_port + "; Database = " + server.dbname + "; Uid = " +
                                       server.username + "; Pwd = " + server.password + ";";
                    using (MySqlConnection connection = new MySqlConnection(connectionString))
                    {
                        try
                        {
                            connection.Open();
                            foreach (var item in post)
                            {
                                if (item != null)
                                {
                                    lastitem = item.definition + "\t" + item.address + "\t" + DateTime.Now.ToString();
                                    MySqlCommand insertCommand = new MySqlCommand("INSERT INTO " + server.tbname + "(deviceID, value, datetime)VALUES(@0, @1, @2)", connection);
                                    insertCommand.Parameters.Add("@0", MySqlDbType.VarChar).Value = item.definition;
                                    insertCommand.Parameters.Add("@1", MySqlDbType.VarChar).Value = item.value;
                                    insertCommand.Parameters.Add("@2", MySqlDbType.VarChar).Value = DateTime.Now.ToString();
                                    insertCommand.ExecuteNonQuery();
                                    SQLerror = false;
                                    this.Invoke((MethodInvoker) delegate
                                    {
                                        log1.listView1.Items.Add(new ListViewItem(new[] { DateTime.Now.ToString(), "Data has added to SQL " }));
                                        dmon1.listView1.Items.Add(new ListViewItem(new[] { item.definition, item.address, item.value, DateTime.Now.ToString() }, "written"));
                                    });
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            if (SQLerror == false)
                            {
                                this.Invoke((MethodInvoker) delegate
                                {
                                    log1.listView1.Items.Add(new ListViewItem(new[] { DateTime.Now.ToString(), "sql error:  " + ex.Message }));
                                    sendmail("SQL bağlantı sorunu \n veri =" + lastitem + "\nyazılmadı");
                                });
                                SQLerror = true;
                            }
                        }
                    }
                }
            }
out_s:
            System.Threading.Thread.Sleep(50);
        }
        public override void Execute(ModbusClient modbusClient)
        {
            ModbusReadCommandParameters mdb_read_comm_pars = this.CommandParameters as ModbusReadCommandParameters;
            ushort startAddress = mdb_read_comm_pars.StartAddress;
            ushort quantity     = mdb_read_comm_pars.Quantity;

            if (quantity <= 0)
            {
                string message = $"Reading Quantity: {quantity} does not make sense.";
                Logger.LogError(message);
                throw new Exception(message);
            }

            if (startAddress + quantity >= ushort.MaxValue || startAddress + quantity == ushort.MinValue || startAddress == ushort.MinValue)
            {
                string message = $"Address is out of bound. Start address: {startAddress}, Quantity: {quantity}";
                Logger.LogError(message);
                throw new Exception(message);
            }

            int[] data = new int[0];

            try
            {
                if (modbusClient.Connected)
                {
                    data = modbusClient.ReadInputRegisters(startAddress - 1, quantity);
                }
                else
                {
                    Logger.LogError("modbusClient is disconected ");
                }
            }
            catch (Exception e)
            {
                Logger.LogError("Error on ReadInputRegisters()", e);
                throw e;
            }

            Data = new Dictionary <long, AnalogModbusData>(data.Length);

            var currentAddressToGidMap = SCADAModel.CurrentAddressToGidMap;
            var currentSCADAModel      = SCADAModel.CurrentScadaModel;
            var commandValuesCache     = SCADAModel.CommandedValuesCache;

            for (ushort i = 0; i < data.Length; i++)
            {
                ushort address  = (ushort)(startAddress + i);
                int    rawValue = data[i];

                //for commands enqueued during model update
                if (!currentAddressToGidMap[PointType.ANALOG_INPUT].ContainsKey(address))
                {
                    Logger.LogWarn($"ReadInputRegistersFunction execute => trying to read value on address {address}, Point type: {PointType.ANALOG_INPUT}, which is not in the current SCADA Model.");
                    continue;
                }

                long gid = currentAddressToGidMap[PointType.ANALOG_INPUT][address];

                //for commands enqueued during model update
                if (!currentSCADAModel.ContainsKey(gid))
                {
                    Logger.LogWarn($"ReadInputRegistersFunction execute => trying to read value for measurement with gid: 0x{gid:X16}, which is not in the current SCADA Model.");
                    continue;
                }

                if (!(currentSCADAModel[gid] is AnalogSCADAModelPointItem pointItem))
                {
                    string message = $"PointItem [Gid: 0x{gid:X16}] is not type AnalogSCADAModelPointItem.";
                    Logger.LogError(message);
                    throw new Exception(message);
                }

                float eguValue = pointItem.RawToEguValueConversion(rawValue);
                if (pointItem.CurrentEguValue != eguValue)
                {
                    pointItem.CurrentEguValue = eguValue;
                    Logger.LogInfo($"Alarm for Point [Gid: 0x{pointItem.Gid:X16}, Address: {pointItem.Address}] set to {pointItem.Alarm}.");
                }

                CommandOriginType commandOrigin = CommandOriginType.OTHER_COMMAND;

                if (commandValuesCache.ContainsKey(gid) && commandValuesCache[gid].Value == pointItem.CurrentRawValue)
                {
                    commandOrigin = commandValuesCache[gid].CommandOrigin;
                    commandValuesCache.Remove(gid);
                    Logger.LogDebug($"[ReadInputRegistersFunctions] Command origin of command address: {pointItem.Address} is set to {commandOrigin}.");
                }

                AnalogModbusData analogData = new AnalogModbusData(pointItem.CurrentEguValue, pointItem.Alarm, gid, commandOrigin);
                Data.Add(gid, analogData);
                //Logger.LogDebug($"ReadInputRegistersFunction execute => Current value: {pointItem.CurrentEguValue} from address: {address}, gid: 0x{gid:X16}.");
            }

            //Logger.LogDebug($"ReadInputRegistersFunction executed SUCCESSFULLY. StartAddress: {startAddress}, Quantity: {quantity}");
        }
Exemple #25
0
        public string ReadItem(ePWRREAD_ITEMS key)
        {
            if (modbusClnt.Connected)
            {
                goto LBL_ERROR;
            }
            var item = _dicItems[key];

            if (false == item.bEnb)
            {
                goto LBL_ERROR;
            }
            string rtn = null;

            switch (type)
            {
            case ePWRTYPE.ElgenBattery:
                break;

            case ePWRTYPE.ElgenCharger:
            {
                switch (key)
                {
                case ePWRREAD_ITEMS.Temp_1st:
                case ePWRREAD_ITEMS.Temp_2nd:
                case ePWRREAD_ITEMS.Temp_3th:
                case ePWRREAD_ITEMS.Temp_4th:
                {
                    modbusClnt.UnitIdentifier = 1;
                    var val = modbusClnt.ReadInputRegisters(item.add, 1).FirstOrDefault();
                    rtn = val.ToString();
                    break;
                }

                case ePWRREAD_ITEMS.Current:
                case ePWRREAD_ITEMS.Voltage:
                case ePWRREAD_ITEMS.Error:
                case ePWRREAD_ITEMS.State:
                case ePWRREAD_ITEMS.Ver:
                {
                    modbusClnt.UnitIdentifier = 2;
                    var val = modbusClnt.ReadInputRegisters(item.add, 1).FirstOrDefault();
                    switch (key)
                    {
                    case ePWRREAD_ITEMS.Current:
                    case ePWRREAD_ITEMS.Voltage:
                    case ePWRREAD_ITEMS.Temp_1st:
                    case ePWRREAD_ITEMS.Temp_2nd:
                    case ePWRREAD_ITEMS.Temp_3th:
                    case ePWRREAD_ITEMS.Temp_4th:
                    case ePWRREAD_ITEMS.Error:
                        rtn = val.ToString();
                        break;

                    case ePWRREAD_ITEMS.State: rtn = val.ToString().ToEnum <ePWR_CHR_STATE>().ToString(); break;

                    case ePWRREAD_ITEMS.Ver: rtn = (val / 100).ToString(); break;

                    default: goto LBL_ERROR;
                    }
                    break;
                }

                default: goto LBL_ERROR;
                }
                break;
            }

            case ePWRTYPE.AutonicMeter:
            {
                switch (key)
                {
                case ePWRREAD_ITEMS.Current: modbusClnt.UnitIdentifier = 2; break;

                case ePWRREAD_ITEMS.Voltage: modbusClnt.UnitIdentifier = 1; break;

                case ePWRREAD_ITEMS.Temp_1st:
                case ePWRREAD_ITEMS.Temp_2nd:
                case ePWRREAD_ITEMS.Temp_3th:
                case ePWRREAD_ITEMS.Temp_4th:   modbusClnt.UnitIdentifier = 3; break;

                default: goto LBL_ERROR;
                }
                var val = modbusClnt.ReadInputRegisters(item.add, 1).FirstOrDefault();
                switch (key)
                {
                case ePWRREAD_ITEMS.Current:
                case ePWRREAD_ITEMS.Voltage: rtn = (val / 10.0).ToString(); break;

                default: rtn = val.ToString(); break;
                }
                break;
            }

            default: goto LBL_ERROR;
            }
            return(rtn);

LBL_ERROR:
            return(null);
        }
Exemple #26
0
 public int[] ReadInputRegisters(int startReg, int length)
 {
     return(_client.ReadInputRegisters(startReg, length));
 }
        private async Task ExecuteAnalogReadCommand(ModbusFunctionCode functionCode, ushort startAddress, ushort quantity)
        {
            string verboseMessage = $"{baseLogString} entering ExecuteAnalogReadCommand method, command's functionCode: {functionCode}, startAddress: {startAddress}, quantity:{quantity}.";

            Logger.LogVerbose(verboseMessage);

            int[]     data;
            PointType pointType;

            if (functionCode == ModbusFunctionCode.READ_HOLDING_REGISTERS)
            {
                verboseMessage = $"{baseLogString} ExecuteAnalogReadCommand => about to call ModbusClient.ReadHoldingRegisters({startAddress - 1}, {quantity}) method.";
                Logger.LogVerbose(verboseMessage);

                //KEY LOGIC
                pointType = PointType.ANALOG_OUTPUT;
                data      = modbusClient.ReadHoldingRegisters(startAddress - 1, quantity);

                verboseMessage = $"{baseLogString} ExecuteAnalogReadCommand => ModbusClient.ReadHoldingRegisters({startAddress - 1}, {quantity}) method SUCCESSFULLY executed. Resulting data count: {data.Length}.";
                Logger.LogVerbose(verboseMessage);
            }
            else if (functionCode == ModbusFunctionCode.READ_INPUT_REGISTERS)
            {
                verboseMessage = $"{baseLogString} ExecuteAnalogReadCommand => about to call ModbusClient.ReadInputRegisters({startAddress - 1}, {quantity}) method.";
                Logger.LogVerbose(verboseMessage);

                //KEY LOGIC
                pointType = PointType.ANALOG_INPUT;
                data      = modbusClient.ReadInputRegisters(startAddress - 1, quantity);

                verboseMessage = $"{baseLogString} ExecuteAnalogReadCommand => ModbusClient.ReadInputRegisters({startAddress - 1}, {quantity}) method SUCCESSFULLY executed. Resulting data count: {data.Length}.";
                Logger.LogVerbose(verboseMessage);
            }
            else
            {
                string message = $"{baseLogString} ExecuteAnalogReadCommand => function code is neither ModbusFunctionCode.READ_HOLDING_REGISTERS nor ModbusFunctionCode.READ_INPUT_REGISTERS";
                Logger.LogError(message);
                throw new ArgumentException(message);
            }

            //this.analogMeasurementCache = new Dictionary<long, AnalogModbusData>(data.Length);
            this.analogMeasurementCache.Clear();

            var modelReadAccessClient   = ScadaModelReadAccessClient.CreateClient();
            var modelUpdateAccessClient = ScadaModelUpdateAccessClient.CreateClient();

            var gidToPointItemMap = await modelReadAccessClient.GetGidToPointItemMap();

            var addressToGidMap = await modelReadAccessClient.GetAddressToGidMap();

            var commandDescriptionCache = await modelReadAccessClient.GetCommandDescriptionCache();

            for (ushort i = 0; i < data.Length; i++)
            {
                ushort address  = (ushort)(startAddress + i);
                int    rawValue = data[i];

                if (!addressToGidMap.ContainsKey((short)pointType))
                {
                    Logger.LogWarning($"{baseLogString} ExecuteAnalogReadCommand => Point type: {pointType} is not in the current addressToGidMap.");
                    continue;
                }

                //for commands enqueued during model update, that are not valid
                if (!addressToGidMap[(short)pointType].ContainsKey(address))
                {
                    Logger.LogWarning($"{baseLogString} ExecuteAnalogReadCommand => trying to read value on address {address}, Point type: {pointType}, which is not in the current addressToGidMap.");
                    continue;
                }

                long gid = addressToGidMap[(short)pointType][address];

                //for commands enqueued during model update, that are not valid
                if (!gidToPointItemMap.ContainsKey(gid))
                {
                    Logger.LogWarning($"{baseLogString} ExecuteAnalogReadCommand => trying to read value for measurement with gid: 0x{gid:X16}, which is not in the current SCADA Model.");
                    continue;
                }

                if (!(gidToPointItemMap[gid] is IAnalogPointItem pointItem))
                {
                    string message = $"{baseLogString} ExecuteAnalogReadCommand => PointItem [Gid: 0x{gid:X16}] does not implement {typeof(IAnalogPointItem)}.";
                    Logger.LogError(message);
                    throw new Exception(message);
                }

                //KEY LOGIC
                if (pointItem.CurrentRawValue != rawValue)
                {
                    pointItem = (IAnalogPointItem)(await modelUpdateAccessClient.UpdatePointItemRawValue(pointItem.Gid, rawValue));
                    Logger.LogInformation($"{baseLogString} ExecuteAnalogReadCommand => Alarm for Point [Gid: 0x{pointItem.Gid:X16}, Address: {pointItem.Address}] set to {pointItem.Alarm}.");
                }

                //LOGIC
                CommandOriginType commandOrigin = CommandOriginType.UNKNOWN_ORIGIN;

                if (commandDescriptionCache.ContainsKey(gid) && commandDescriptionCache[gid].Value == pointItem.CurrentRawValue)
                {
                    commandOrigin = commandDescriptionCache[gid].CommandOrigin;
                    await modelUpdateAccessClient.RemoveCommandDescription(gid);

                    Logger.LogDebug($"{baseLogString} ExecuteAnalogReadCommand => Command origin of command address: {pointItem.Address} is set to {commandOrigin}.");

                    //LOGIC
                    AnalogModbusData analogData = new AnalogModbusData(pointItem.CurrentEguValue, pointItem.Alarm, gid, commandOrigin);
                    this.analogMeasurementCache.Add(gid, analogData);

                    verboseMessage = $"{baseLogString} ExecuteAnalogReadCommand => AnalogModbusData added to measurementCache. MeasurementGid: {analogData.MeasurementGid:X16}, Value: {analogData.Value}, Alarm: {analogData.Alarm}, CommandOrigin: {analogData.CommandOrigin} .";
                    Logger.LogVerbose(verboseMessage);
                }
            }

            //LOGIC
            await modelUpdateAccessClient.MakeAnalogEntryToMeasurementCache(this.analogMeasurementCache, true);

            verboseMessage = $"{baseLogString} ExecuteAnalogReadCommand => MakeAnalogEntryToMeasurementCache method called. measurementCache count: {this.analogMeasurementCache.Count}.";
            Logger.LogVerbose(verboseMessage);
        }
Exemple #28
0
        /// <summary>
        /// 데이터 수집하고, 수집이 정상 이루어지면 true 반환함 아니면 false.
        /// </summary>
        /// <param name="slave">ModbusClient 변수</param>
        /// <param name="id_index">ModbusClient 변수의 index값 </param>
        /// <returns></returns>
        private static bool collect(ModbusClient slave, int id_index)
        {
            bool result = false;

            allDataCollected = new List <long>();
            Int64  part_high, part_low, particle;
            string timestamp  = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
            string timestamp2 = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss.fff");
            string dataStr    = "Res: ";

            try
            {
                int[] chk = slave.ReadInputRegisters(0, 12);

                if (chk[0] != 0)
                {
                    int[] d = slave.ReadInputRegisters(0, 38);

                    if (d[0] != 0 && d[22] != 0)
                    {
                        result = true;
                        string        S_timestamp = $"20{d[12]}-0{d[13]}-{d[14].ToString("D2")} {d[15].ToString("D2")}:{d[16].ToString("D2")}:{d[17].ToString("D2")}";
                        List <string> stringNames = new List <string>()
                        {
                            "온도", "습도", "p0.1", "p0.3", "p0.5", "p1.0", "p3.0", "p5.0", "p10.0", "p25.0"
                        };

                        dataStr += timestamp2;
                        int temperature = d[18] * 100 + d[19];
                        int humidity    = d[20] * 100 + d[21];

                        allDataCollected.Add(temperature);
                        allDataCollected.Add(humidity); // "slaveId : {slave.UnitIdentifier}

                        dataStr += $", {stringNames[0]}:{d[18]}.{d[19]}, {stringNames[1]}:{d[20]}.{d[21]}, ";
                        int index = 2;
                        for (int regAdd = 22; regAdd < 38;)
                        {
                            part_high = d[regAdd] >= 0 ? d[regAdd] : 65536 + d[regAdd];
                            part_low  = d[regAdd + 1] >= 0 ? d[regAdd + 1] : 65536 + d[regAdd + 1];
                            particle  = (part_high == 65535 && part_low == 65535) ? -1 : (part_high * 65536 + part_low);
                            if (regAdd != 22 && regAdd != 30)
                            { // do not print particle 0.1um, particle3.0um whose value is always -1
                                dataStr += $"\t{stringNames[index]}: {String.Format("{0:n0}", particle)},";
                            }
                            allDataCollected.Add(particle);
                            regAdd += 2;
                            index  += 1;
                        }
                        Console.WriteLine(dataStr);
                        store2db(allDataCollected, id_index, timestamp, S_timestamp);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine($"Data Collection Error: slaveID:{slave.UnitIdentifier}, IP:{slave.IPAddress}." + e.Message + " " + e.StackTrace);
            }

            return(result);
        }
Exemple #29
0
        private void buttonExecute_Click(object sender, EventArgs e)
        {
            start   = Int32.Parse(addBox1.Text);
            licznik = Int32.Parse(addBox2.Text);
            //bool[] b;
            //var dict = new ConcurrentDictionary<int, int>();
            //var task = Task.Factory.StartNew(() => CykliczneOdpytanie(ref dict));
            //wynik = new List<ChartData>();
            //ChartData chartDate = new ChartData();



            if (functionBox.SelectedItem == "01 Read Coil Status")
            {
                cts.Cancel();
                cts.Dispose();
                cts = new CancellationTokenSource();
                ThreadPool.QueueUserWorkItem(new WaitCallback(CoilOdczyt), cts.Token);
                //Task.Factory.StartNew(() => CoilOdczyt());
                //Task.Factory.StartNew(() => backgroundWorker1.RunWorkerAsync());
                //listBox1.DataSource = modbusClient.ReadCoils(start, licznik);
                //backgroundWorker1.RunWorkerAsync();
                //Thread.Sleep(1000);

                //for (int i = 0; i < licznik; i++)
                //{
                //    chartDate.IDex = i;
                //    if (bool.Parse(listBox1.Items[i].ToString()) == false)
                //    {
                //        chartDate.Value = 0;
                //    }
                //    else if (bool.Parse(listBox1.Items[i].ToString()) == true)
                //    {
                //        chartDate.Value = 1;
                //    }

                //    wynik.Add(chartDate);
                //}
            }
            else if (functionBox.SelectedItem == "02 Read Input Status")
            {
                cts.Cancel();
                cts.Dispose();
                cts = new CancellationTokenSource();
                listBox1.DataSource = modbusClient.ReadDiscreteInputs(start, licznik);
            }
            else if (functionBox.SelectedItem == "03 Read Holding Registers")
            {
                cts.Cancel();
                cts.Dispose();
                cts = new CancellationTokenSource();
                listBox1.DataSource = modbusClient.ReadHoldingRegisters(start, licznik);
                //for (int i = 0; i < licznik; i++)
                //{
                //    chartDate.IDex = i;
                //    chartDate.Value = int.Parse(listBox1.Items[i].ToString());
                //    wynik.Add(chartDate);
                //}
            }
            else if (functionBox.SelectedItem == "04 Read Input Registers")
            {
                cts.Cancel();
                cts.Dispose();
                cts = new CancellationTokenSource();
                listBox1.DataSource = modbusClient.ReadInputRegisters(start, licznik);
            }
            else
            {
                cts.Cancel();
                cts.Dispose();
                cts = new CancellationTokenSource();
                listBox1.DataSource = modbusClient.ReadHoldingRegisters(start, licznik);
            }
        }
      } //End Function Disconnect

      /// <summary>
      /// Reads data from the Server Device.</summary>
      public bool Read(DataExtClass[] DataOut)
      {
         bool retVar = false;
         int i, j, jj, SAddress, boolReg, boolBit;
         uint highWord, lowWord;
         DAConfClass thisArea;

         //If is not initialized and not connected return  error.
         if (!(isInitialized && (DataOut != null)))
         {
            Status.NewStat(StatType.Bad, "Not Ready for Reading");
            return false;
         }

         //If the DataOut and Internal data doesnt have the correct amount of data areas return error.
         if (!((DataOut.Length == MasterDriverConf.NDataAreas) && (IntData.Length == MasterDriverConf.NDataAreas)))
         {
            Status.NewStat(StatType.Bad, "Data Containers Mismatch");
            return false;
         }

         if (!(isConnected && ModTCPObj.Connected))
         {
            Status.NewStat(StatType.Bad, "Connection Error...");
            this.Disconect();
            return false;
         }

         //Cicle thru Data Areas.
         for (i = 0; i < MasterDriverConf.NDataAreas; i++)
         {
            thisArea = MasterDataAreaConf[i];
            SAddress = int.Parse(thisArea.StartAddress);

            if (thisArea.Enable && (!thisArea.Write))
            {
               try
               {
                  //Read the data from the device
                  switch (thisArea.dataType)
                  {
                     case DriverConfig.DatType.Bool:
                        if ((thisArea.DBnumber >= 1) && (thisArea.DBnumber <= 2))
                        {
                           if (thisArea.DBnumber == 1)
                              IntData[i].dBool = ModTCPObj.ReadCoils(SAddress, thisArea.Amount);
                           if (thisArea.DBnumber == 2)
                              IntData[i].dBool = ModTCPObj.ReadDiscreteInputs(SAddress, thisArea.Amount);
                           if (IntData[i].dBool.Length == thisArea.Amount) retVar = true;
                        }
                        else if ((thisArea.DBnumber >= 3) && (thisArea.DBnumber <= 4))
                        {
                           boolReg = (int)Math.Ceiling(thisArea.Amount / 16.0);
                           if (thisArea.DBnumber == 3) IntData[i].dInt = ModTCPObj.ReadHoldingRegisters(SAddress, boolReg);
                           if (thisArea.DBnumber == 4) IntData[i].dInt = ModTCPObj.ReadInputRegisters(SAddress, boolReg);
                           //Check read complete set of data
                           if (IntData[i].dInt.Length == boolReg) retVar = true;
                        }
                        else
                        {  //Invalid Conf
                           retVar = false;
                           Status.NewStat(StatType.Warning, "Wrong FC for Read, Check Config.");
                        }
                        break;
                     case DriverConfig.DatType.Byte:
                     case DriverConfig.DatType.Word:
                        if ((thisArea.DBnumber >= 3) && (thisArea.DBnumber <= 4))
                        {
                           if (thisArea.DBnumber == 3)
                              IntData[i].dInt = ModTCPObj.ReadHoldingRegisters(SAddress, thisArea.Amount);
                           if (thisArea.DBnumber == 4)
                              IntData[i].dInt = ModTCPObj.ReadInputRegisters(SAddress, thisArea.Amount);
                           //Check read complete set of data
                           if (IntData[i].dInt.Length == thisArea.Amount) retVar = true;
                        }
                        else
                        {//Invalid Conf
                           retVar = false;
                           Status.NewStat(StatType.Warning, "Wrong FC for Read, Check Config.");
                        }
                        break;
                     case DriverConfig.DatType.DWord:
                     case DriverConfig.DatType.Real:
                        if ((thisArea.DBnumber >= 3) && (thisArea.DBnumber <= 4))
                        {
                           if (thisArea.DBnumber == 3)
                              IntData[i].dInt = ModTCPObj.ReadHoldingRegisters(SAddress, (2 * thisArea.Amount));
                           if (thisArea.DBnumber == 4)
                              IntData[i].dInt = ModTCPObj.ReadInputRegisters(SAddress, (2 * thisArea.Amount));
                           if (IntData[i].dInt.Length == (2 * thisArea.Amount)) retVar = true;
                        }
                        else
                        {//Invalid Conf
                           retVar = false;
                           Status.NewStat(StatType.Warning, "Wrong FC for Read, Check Config.");
                        }
                        break;
                     default:
                        Status.NewStat(StatType.Warning, "Wrong DataArea Type, Check Config.");
                        retVar = false;
                        break;
                  }
               }
               catch (Exception e)
               {
                  Status.NewStat(StatType.Bad, e.Message);
                  return false;
               }

               //Copy data to the Data Out
               if (retVar)
               {
                  jj = 0; //Index reinitialize

                  for (j = 0; j < thisArea.Amount; j++)
                  {
                     switch (thisArea.dataType)
                     {
                        case DriverConfig.DatType.Bool:
                           if ((thisArea.DBnumber >= 1) && (thisArea.DBnumber <= 2))
                           {
                              DataOut[i].Data.dBoolean[j] = IntData[i].dBool[j];
                           }
                           else if ((thisArea.DBnumber >= 3) && (thisArea.DBnumber <= 4))
                           {
                              boolReg = Math.DivRem(j, 16, out boolBit);
                              var b = new BitArray(new int[] { IntData[i].dInt[boolReg] }); ;
                              DataOut[i].Data.dBoolean[j] = b[boolBit];
                           }
                           break;
                        case DriverConfig.DatType.Byte:
                           DataOut[i].Data.dByte[j] = (byte)(IntData[i].dInt[j] & MaskByte);
                           break;
                        case DriverConfig.DatType.Word:
                           DataOut[i].Data.dWord[j] = (ushort)(IntData[i].dInt[j] & MaskWord);
                           break;
                        case DriverConfig.DatType.DWord:
                        case DriverConfig.DatType.Real:

                           //Endianess of the double word.
                           if (RegOrder == ModbusClient.RegisterOrder.HighLow)
                           {
                              highWord = ((uint)IntData[i].dInt[jj] & MaskWord) << 16;
                              lowWord = ((uint)IntData[i].dInt[(jj + 1)] & MaskWord);
                           }
                           else
                           {
                              highWord = ((uint)IntData[i].dInt[jj] & MaskWord);
                              lowWord = ((uint)IntData[i].dInt[(jj + 1)] & MaskWord) << 16;
                           }

                           //Store the value in the DataOut.
                           if (thisArea.dataType == DriverConfig.DatType.DWord)
                           {
                              DataOut[i].Data.dDWord[j] = (highWord | lowWord);
                           }
                           else
                           {
                              //Float point decimal.
                              DataOut[i].Data.dReal[j] = (highWord | lowWord) / ((float)1000.0);
                           }

                           jj = jj + 2;
                           break;
                        default:
                           Status.NewStat(StatType.Warning, "Wrong DataArea Type, Check Config.");
                           break;
                     }
                  } // For j

                  DataOut[i].NowTimeTicks = DateTime.UtcNow.Ticks;
               }
               else
               {
                  Status.NewStat(StatType.Warning, "ModBus Read error..");
                  DataOut[i].NowTimeTicks = 0;
               } //if retVar == 0. Was reading ok?

            }// Area Enable
         } //For cicle Data Areas.

         return retVar;
      } // End Read Function