public Response GetDataFromDevice(DataFromDevice data) { Response res = new Response(); res.ResponseMessage = "Success"; res.ResponseStatus = "S"; return(res); }
public IHttpActionResult GetDataFromDevice(DataFromDevice oData) { return(Ok(dev.GetDataFromDevice(oData))); }
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 = ""; } }