/// <summary> /// Чтение запросов из устройства /// </summary> private async void OnReadFromDeviceCommand() { //херня, знаю, но смысл один и тот же. надо просто сделать недоступными кнопки на вермя чтения, а обращаться через имя я не хочу IsAutonomus = true; try { this.RequestsFromDevice.Clear(); this.ModuleRequestsForUIList.Clear(); // число запросов к модулям хранится по адресу 0х300Е, читаем 1 слово(2 байта) ushort[] RC = await RTUConnectionGlobal.GetDataByAddress(1, REQUEST_COUNT_ADDRESS, 1); RequestCountFromDevice = RC[0]; // начальный адрес ushort currentAddress = MODULE_REQUEST_START_ADDRESS; for (byte i = 0; i < RC[0]; i++) { RequestsFromDevice.Add(new ModuleRequest(await RTUConnectionGlobal.GetDataByAddress(1, currentAddress, 4))); ModuleRequestsForUIList.Add(RequestsFromDevice[i].UIRequest); currentAddress += 4; } ShowMessage("Чтение запросов прошло успешно!", "Информация", MessageBoxImage.Information); AnalyzeModulesFromDevice(); } catch (Exception ex) { ShowMessage("При чтении запросов произошла ошибка.", "Внимание", MessageBoxImage.Warning); } IsAutonomus = false; }
/// <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); } ///верх ///низ }