/// <summary> /// Читает массив слов из устройства и обновляет UI /// </summary> /// <param name="_configFormDevice"></param> private void AnalyzeConfigFromDevice(ushort[] _configFormDevice) { if (_configFormDevice == null) { return; } if (_configFormDevice.Count() == 5) { byte[] byteArray = ArrayExtension.UshortArrayToByteArray(_configFormDevice); IOTimeout = Converters.Convert.ConvertFromDecToHex(byteArray[0]); ResponseAwait = _configFormDevice[1]; TransmitEnableDelay = _configFormDevice[3]; TransmitDisableDelay = _configFormDevice[4]; TypeAddress = Converters.Convert.ConvertFromDecToHexStr(byteArray[1]); IOTimeout = Converters.Convert.ConvertFromDecToHex(byteArray[0]); Config915Series config = new Config915Series(byteArray[5]); SelectedSpeed = config.ModbusSpeed; BitValues = config.BitValues; ParityOdd = config.ParityOdd; ParityExistence = config.ParityExistence; StopBitsCount = config.StopBitCount; } else { MessageBox.Show("Ошибка при чтении конфигурации."); } }
/// <summary> /// Формирует массив слов, который будет записан в устройство /// </summary> /// <returns></returns> private ushort[] GenerateConfigForDevice() { List <byte> byteArr = new List <byte>(); List <ushort> confToDevice = new List <ushort>(); Config915Series conf915 = new Config915Series(SelectedSpeed, BitValues, ParityOdd, ParityExistence, StopBitsCount); SpreadTypeAddress(); byteArr.Add(IOTimeout); byteArr.Add((byte)((Type << 4) + Address)); confToDevice.Add(ArrayExtension.ByteArrayToUshortArray(byteArr.ToArray()).First()); confToDevice.Add(ResponseAwait); confToDevice.Add(conf915.Config); confToDevice.Add(TransmitEnableDelay); confToDevice.Add(TransmitDisableDelay); return(confToDevice.ToArray()); }
/// <summary> /// Запись запросов для люксметра (обожаю, когда вылазят новые требования, когда я уже всю логику взаимодействия продумал) /// </summary> /// <param name="_pos"></param> public async void WriteLuxmetrRequest(int _pos) { List <byte> byteArr = new List <byte>(); List <ushort> confToDevice = new List <ushort>(); Config915Series conf915 = new Config915Series(115200, false, false, false, false); byteArr.Add(100); byteArr.Add((byte)((0x0E << 4) + _pos)); confToDevice.Add(ArrayExtension.ByteArrayToUshortArray(byteArr.ToArray()).First()); confToDevice.Add(200); confToDevice.Add(conf915.Config); confToDevice.Add(40); confToDevice.Add(20); ushort[] req915lower = confToDevice.ToArray(); byteArr.Clear(); confToDevice.Clear(); //запрос для люксметра, пишется в область памяти запросов к подчиненным устройствам byteArr.Add(0x00); //период byteArr.Add(0x01); //адрес+тип модуля byteArr.Add(0x00); //команда byteArr.Add(0x00); //адрес пар-ра в модуле 1 byteArr.Add(0x00); //адрес пар-ра в модуле 2 byteArr.Add(0x06); //адрес пар-ра в базе 1 byteArr.Add(0x40); //ажрес пар-ра в базе 2 byteArr.Add(0x01); //число пар-ров byte[] byteArray = byteArr.ToArray(); ArrayExtension.SwapArrayItems(ref byteArray); confToDevice.AddRange(ArrayExtension.ByteArrayToUshortArray(byteArray)); ushort[] reqLux = confToDevice.ToArray(); ModuleRequest mr = new ModuleRequest(reqLux); StringBuilder sb = new StringBuilder(); sb.AppendLine("Будет произведена запись со следующими параметрами:"); sb.AppendLine("Модуль связи: МС915 с низом на позицию " + _pos.ToString()); sb.AppendLine("Ожидание ответа: 200 (*0,5 мс)"); sb.AppendLine("Скорость: 115200"); sb.AppendLine("Биты данных: 8 бит"); sb.AppendLine("Паритет: нечет"); sb.AppendLine("Паритет: нет"); sb.AppendLine("Число стоп битов: 1 бит"); sb.AppendLine("Таймаут ввода/вывода: 100 (*0,1 мс)"); sb.AppendLine("Включение передачи: 40 (*0,1 мс)"); sb.AppendLine("Выключение передачи: 20 (*0,1 мс)"); sb.AppendLine("Также будет добавлен запрос к подчиненному устройтсву(люксметру):"); sb.AppendLine(mr.UIRequest); sb.AppendLine("Продолжить?"); if (MessageBox.Show(sb.ToString(), "Внимание", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { try { ushort[] LRC = new ushort[] { 1 };//договор был изначально на одно устройство, так что ничего придумывать не буду await RTUConnectionGlobal.SendDataByAddressAsync(1, LOWER_MODULE_REQUEST_TO_SLAVES_COUNT_ADDRESS, LRC); Thread.Sleep(100); await RTUConnectionGlobal.SendDataByAddressAsync(1, LOWER_MODULE_ADDRESS, req915lower); Thread.Sleep(100); await RTUConnectionGlobal.SendDataByAddressAsync(1, SLAVE_MODULE_REQUEST_START_ADDRESS, reqLux); Thread.Sleep(100); ShowMessage("Запись произведена.", "Информация", MessageBoxImage.Information); } catch { ShowMessage("При записи в устройство произошла ошибка.", "Внимение", MessageBoxImage.Warning); } } else { ShowMessage("Запись не была произведена", "Информация", MessageBoxImage.Information); } }
/// <summary> /// Анализ модулей, прочитанных из устройства + их расстановка по местам /// </summary> private async void AnalyzeModulesFromDevice() { byte _firstModulePos; if (IsToggleCrate918Checked) { _firstModulePos = 0; } else { _firstModulePos = 1; } /// читаем модуль с верхом try { ushort[] upperModule = await RTUConnectionGlobal.GetDataByAddress(1, UPPER_MODULE_ADDRESS, 5); if (upperModule != null) { byte[] byteArrayUpper = ArrayExtension.UshortArrayToByteArray(upperModule); string _typeAddressUpper = Converters.Convert.ConvertFromDecToHexStr(byteArrayUpper[1]); byte _typeUpper = Converters.Convert.ConvertFromHexToDec((byte)Int32.Parse(_typeAddressUpper.First().ToString(), System.Globalization.NumberStyles.HexNumber)); byte _addressUpper = Converters.Convert.ConvertFromHexToDec((byte)Int32.Parse(_typeAddressUpper.Last().ToString(), System.Globalization.NumberStyles.HexNumber)); string upperName = "Заглушка"; if (_typeUpper != 0) { if (_typeUpper == 0x0E) { //немного костыли, но че уж поделать, если таски возникают после того, как ниписано практически все Config915Series cfg915 = new Config915Series(byteArrayUpper[5]); if (cfg915.ModbusSpeed == 115200) { upperName = "MС915"; } if (cfg915.ModbusSpeed == 19200) { upperName = "MС917"; } } if (_typeUpper == 0x0F) { upperName = "MС911"; } this.ModuleListForUI[_addressUpper - _firstModulePos] = upperName; } } } catch (Exception ex) { ShowMessage("При чтении запроса модуля связи с верхом произошла ошибка.", "Внимание", MessageBoxImage.Warning); } /// читаем модуль с низом try { ushort[] slaveCount = await RTUConnectionGlobal.GetDataByAddress(1, LOWER_MODULE_REQUEST_TO_SLAVES_COUNT_ADDRESS, 1); if (slaveCount[0] != 0) { ushort[] lowerModule = await RTUConnectionGlobal.GetDataByAddress(1, LOWER_MODULE_ADDRESS, 5); if (lowerModule != null) { byte[] byteArrayLower = ArrayExtension.UshortArrayToByteArray(lowerModule); string _typeAddressLower = Converters.Convert.ConvertFromDecToHexStr(byteArrayLower[1]); byte _typeLower = Converters.Convert.ConvertFromHexToDec((byte)Int32.Parse(_typeAddressLower.First().ToString(), System.Globalization.NumberStyles.HexNumber)); byte _addressLower = Converters.Convert.ConvertFromHexToDec((byte)Int32.Parse(_typeAddressLower.Last().ToString(), System.Globalization.NumberStyles.HexNumber)); string lowerName = "Заглушка"; if (_typeLower == 0x0E) { lowerName = "Люксметр"; } this.ModuleListForUI[_addressLower - _firstModulePos] = lowerName; } } } catch (Exception ex) { ShowMessage("При чтении запроса модуля связи с низом произошла ошибка.", "Внимание", MessageBoxImage.Warning); } ///модули for (int i = 0; i < RequestsFromDevice.Count(); i++) { this.ModuleListForUI[RequestsFromDevice[i].CrateAddress - _firstModulePos] = GetModuleNameFromType(RequestsFromDevice[i].Type, RequestsFromDevice[i].ParameterCount); } ///верх ///низ }