Example #1
0
        public Response GetDataFromDevice(DataFromDevice data)
        {
            Response res = new Response();

            res.ResponseMessage = "Success";
            res.ResponseStatus  = "S";
            return(res);
        }
Example #2
0
 public IHttpActionResult GetDataFromDevice(DataFromDevice oData)
 {
     return(Ok(dev.GetDataFromDevice(oData)));
 }
Example #3
0
        private async void ModbusTest_Click(object sender, RoutedEventArgs e)
        {
            DataFromDevice.Clear();
            // Восстановление цвета по умолчанию (для тестирования)
            foreach (ViewShield s in myPanel.Children)
            {
                foreach (object d in s.ShieldPanel.Children)
                {
                    if (d is ViewDevice)
                    {
                        ((ViewDevice)d).ClearValue(Control.BackgroundProperty);
                    }
                }
            }

            // Читаем конфигурацию для опрашиваемых устройств
            try
            {
                progressBar.Visibility = Visibility.Visible;
                foreach (ViewShield s in myPanel.Children)       // Перебираем все шкафы
                {
                    foreach (object d in s.ShieldPanel.Children) // Перебираем все устройства
                    {
                        if (d is ViewDevice)
                        {
                            // Запрос при тестировании
                            byte[] modbusTransmit = Modbus.Request((byte)((ViewDevice)d).Header.DeviceAddress, 3, 0, 2); // Формируем modbus-запрос

                            // Если используется Ethernet
                            if (TypeConnection == "Modbus RTU Over TCP/IP")
                            {
                                for (int i = 0; i < int.Parse(CountPorts); i++)
                                {
                                    byte[] modbusReceive = Modbus.Response(Modbus.Exchange(ServerIP, int.Parse(NumberServerPort[i]), modbusTransmit)); // Принимаем modbus-ответ
                                    bool   testOK        = modbusReceive[0] == (byte)((ViewDevice)d).Header.DeviceAddress ? true : false;
                                    if (testOK)
                                    {
                                        /*
                                         * Здесь необходимо реализовать метод по формированию запросов и разбор ответов для заполнения таблицы с данными от устройств
                                         */
                                        #region Формирование запросов и разбор ответов для заполнения таблицы с данными от устройств

                                        foreach (Signal sg in ((ViewDevice)d).Signal)
                                        {
                                            // Формируем modbus-запрос
                                            if (sg.DataType == "INT" || sg.DataType == "WORD" || sg.DataType == "BOOL")
                                            {
                                                modbusTransmit = Modbus.Request((byte)((ViewDevice)d).Header.DeviceAddress, (byte)sg.FunctionCode, (ushort)sg.RegisterAddress, 1);
                                            }
                                            else
                                            {
                                                modbusTransmit = Modbus.Request((byte)((ViewDevice)d).Header.DeviceAddress, (byte)sg.FunctionCode, (ushort)sg.RegisterAddress, 2);
                                            }

                                            // Принимаем modbus-ответ
                                            modbusReceive = Modbus.Response(Modbus.Exchange(ServerIP, int.Parse(NumberServerPort[i]), modbusTransmit));
                                            // Если код функции больше 128, значит устройство сообщает об ошибке. Необходимо пропустить обработку данного сигнала
                                            if (modbusReceive[1] <= 128)
                                            {
                                                // Смотрим сколько байт данных доступно и выделяем их из modbus-ответа
                                                byte[] data = new byte[modbusReceive[2]];
                                                for (int j = 0; j < modbusReceive[2]; j++)
                                                {
                                                    data[j] = modbusReceive[j + 3];
                                                }

                                                // Обрабатываем данные в соответствии с их типом
                                                string tempReceive = "";
                                                if (sg.DataType == "INT" || sg.DataType == "WORD")
                                                {
                                                    tempReceive = Modbus.ParseWord(data)[0].ToString();
                                                }
                                                else if (sg.DataType == "BOOL")
                                                {
                                                    tempReceive = Convert.ToInt16(Modbus.ParseBool(data, sg.BitNumber, true)).ToString();
                                                }

                                                ViewDataDevice newViewDataDevice = new ViewDataDevice();
                                                newViewDataDevice.ShieldName    = ((ViewDevice)d).Header.ShieldName + ((ViewDevice)d).Header.ShieldNumber;
                                                newViewDataDevice.DeviceType    = ((ViewDevice)d).Header.DeviceType;
                                                newViewDataDevice.DeviceAddress = ((ViewDevice)d).Header.DeviceAddress;
                                                newViewDataDevice.SignalName    = sg.SignalName;
                                                newViewDataDevice.DataValue     = tempReceive;

                                                DataFromDevice.Add(newViewDataDevice);
                                            }
                                        }

                                        #endregion

                                        switch (i)
                                        {
                                        case 0:
                                            ((ViewDevice)d).Background = Brushes.Yellow;
                                            break;

                                        case 1:
                                            ((ViewDevice)d).Background = Brushes.Lime;
                                            break;

                                        case 2:
                                            ((ViewDevice)d).Background = Brushes.Cyan;
                                            break;

                                        case 3:
                                            ((ViewDevice)d).Background = Brushes.Magenta;
                                            break;
                                        }
                                        break;
                                    }
                                    else
                                    {
                                        ((ViewDevice)d).Background = Brushes.Red;
                                    }
                                }
                            }
                            else if (TypeConnection == "Serial Port")
                            {
                                for (int i = 0; i < int.Parse(CountPorts); i++)
                                {
                                    int    dataBits = 8;
                                    string stopBits = "1";
                                    try
                                    {
                                        port             = new SerialPort();
                                        port.PortName    = NumberComPort[i];
                                        port.BaudRate    = ((ViewDevice)d).Header.DeviceBaudRate;
                                        port.Parity      = (Parity)Enum.Parse(typeof(Parity), ((ViewDevice)d).Header.DeviceParity);
                                        port.DataBits    = dataBits;
                                        port.StopBits    = (StopBits)Enum.Parse(typeof(StopBits), stopBits);
                                        port.ReadTimeout = 500;
                                    }
                                    catch
                                    {
                                        MessageBox.Show("Ошибка соединения\nПожалуй проверьте настройки сети и попробуйте еще раз!");
                                    }
                                    try
                                    {
                                        port.Open();
                                    }
                                    catch (Exception)
                                    {
                                        MessageBox.Show("Невозможно открыть порт");
                                        return;
                                    }
                                    // Запись сообщения в порт
                                    port.Write(modbusTransmit, 0, modbusTransmit.Length);

                                    byte[] response = new byte[255];

                                    try
                                    {
                                        port.Read(response, 0, 255);
                                        byte[] modbusReceive = Modbus.Response(response); // Принимаем modbus-ответ
                                        bool   testOK        = modbusReceive[0] == (byte)((ViewDevice)d).Header.DeviceAddress ? true : false;
                                        if (testOK)
                                        {
                                            #region Формирование запросов и разбор ответов для заполнения таблицы с данными от устройств

                                            foreach (Signal sg in ((ViewDevice)d).Signal)
                                            {
                                                // Формируем modbus-запрос
                                                if (sg.DataType == "INT" || sg.DataType == "WORD" || sg.DataType == "BOOL")
                                                {
                                                    modbusTransmit = Modbus.Request((byte)((ViewDevice)d).Header.DeviceAddress, (byte)sg.FunctionCode, (ushort)sg.RegisterAddress, 1);
                                                }
                                                else
                                                {
                                                    modbusTransmit = Modbus.Request((byte)((ViewDevice)d).Header.DeviceAddress, (byte)sg.FunctionCode, (ushort)sg.RegisterAddress, 2);
                                                }

                                                // Отправляем modbus-запрос
                                                port.Write(modbusTransmit, 0, modbusTransmit.Length);
                                                // Принимаем modbus-ответ
                                                response = new byte[255];
                                                port.Read(response, 0, 255);
                                                modbusReceive = Modbus.Response(response);
                                                // Если код функции больше 128, значит устройство сообщает об ошибке. Необходимо пропустить обработку данного сигнала
                                                if (modbusReceive[1] <= 128)
                                                {
                                                    // Смотрим сколько байт данных доступно и выделяем их из modbus-ответа
                                                    byte[] data = new byte[modbusReceive[2]];
                                                    for (int j = 0; j < modbusReceive[2]; j++)
                                                    {
                                                        data[j] = modbusReceive[j + 3];
                                                    }

                                                    // Обрабатываем данные в соответствии с их типом
                                                    string tempReceive = "";
                                                    if (sg.DataType == "INT" || sg.DataType == "WORD")
                                                    {
                                                        tempReceive = Modbus.ParseWord(data)[0].ToString();
                                                    }
                                                    else if (sg.DataType == "BOOL")
                                                    {
                                                        tempReceive = Convert.ToInt16(Modbus.ParseBool(data, sg.BitNumber, true)).ToString();
                                                    }
                                                    /* Здесь  надо будет добавить обработку 4-байтных данных */

                                                    ViewDataDevice newViewDataDevice = new ViewDataDevice();
                                                    newViewDataDevice.ShieldName    = ((ViewDevice)d).Header.ShieldName + ((ViewDevice)d).Header.ShieldNumber;
                                                    newViewDataDevice.DeviceType    = ((ViewDevice)d).Header.DeviceType;
                                                    newViewDataDevice.DeviceAddress = ((ViewDevice)d).Header.DeviceAddress;
                                                    newViewDataDevice.SignalName    = sg.SignalName;
                                                    newViewDataDevice.DataValue     = tempReceive;

                                                    DataFromDevice.Add(newViewDataDevice);
                                                }
                                            }

                                            #endregion

                                            // Меняем цвет устройства в зависимости от того на каком порте оно сидит
                                            switch (i)
                                            {
                                            case 0:
                                                ((ViewDevice)d).Background = Brushes.Yellow;
                                                break;

                                            case 1:
                                                ((ViewDevice)d).Background = Brushes.Lime;
                                                break;

                                            case 2:
                                                ((ViewDevice)d).Background = Brushes.Cyan;
                                                break;

                                            case 3:
                                                ((ViewDevice)d).Background = Brushes.Magenta;
                                                break;
                                            }
                                            break;
                                        }
                                        else
                                        {
                                            ((ViewDevice)d).Background = Brushes.Red;
                                        }
                                    }
                                    catch (TimeoutException)
                                    {
                                        //MessageBox.Show("Время ожидания истекло");
                                        ((ViewDevice)d).Background = Brushes.Red;
                                        //return;
                                    }
                                    finally
                                    {
                                        port.Close();
                                    }
                                }
                            }
                            statusBar.Text = "Выполняется тестирование: " + ((ViewDevice)d).Header.ShieldName + ((ViewDevice)d).Header.ShieldNumber + ", " + ((ViewDevice)d).Header.DeviceType + "(Slave " + ((ViewDevice)d).Header.DeviceAddress + ")";
                        }
                        progressBar.Maximum = myPanel.Children.Count * s.ShieldPanel.Children.Count;
                        progressBar.Value++;
                        await Task.Delay(100);
                    }
                }
                statusBar.Text = "Готово";
                MessageBox.Show("Тестирование завершено!", "Тестирование", MessageBoxButton.OK);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка при выполнении тестирования!\n" + ex.Message, "Тестирование", MessageBoxButton.OK);
            }
            finally
            {
                progressBar.Value      = 0;
                progressBar.Visibility = Visibility.Hidden;
                statusBar.Text         = "";
            }
        }