public void WriteSettingsAsync(IAinSettingsPart settings, Action <Exception> callback) { _writer.WriteSettingsAsync(settings, callback); }
public void WriteSettingsAsync(IAinSettingsPart settingsPart, Action <Exception> callback) { var sender = _commandSenderHost.Sender; if (sender == null) { throw new NullReferenceException("Порт передачи данных не открыт"); } var ainsCountToWriteSettings = AinsCountThreadSafe; // Читаем настройки перед записью (из хранилища, или нет - неважно) _ainSettingsReader.ReadSettingsAsync(0, false, (readSettingsException, readedAin1Settings) => { if (readSettingsException != null) { callback(new Exception( "Не удалось записать настройки, возникла ошибка при предварительном их чтении из блока АИН1 - нет ответа от BsEthernet", readSettingsException)); return; } var settingsForAin1 = new AinSettingsWritable(readedAin1Settings); settingsForAin1.ModifyFromPart(settingsPart); settingsForAin1.Imcw = (ushort)(settingsForAin1.Imcw & 0xFCFF); // биты 8 и 9 занулены, ведущий settingsForAin1.ModifyFromPart(new AinSettingsPartWritable { Ia0 = readedAin1Settings.Ia0, Ib0 = readedAin1Settings.Ib0, Ic0 = readedAin1Settings.Ic0, Udc0 = readedAin1Settings.Udc0 }); // Эти параметры всегда должны оставаться неизменными if (ainsCountToWriteSettings == 1) { // Когда в системе один блок АИН // TODO: проверить наличие связи с АИН1 settingsForAin1.Imcw = (ushort)(settingsForAin1.Imcw & 0xF0FF); // биты 8,9,10 и 11 занулены, одиночая работа var writeAin1SettingsCmd = new WriteAinSettingsCommand(0, settingsForAin1); sender.SendCommandAsync( _targerAddressHost.TargetAddress, writeAin1SettingsCmd, _writeSettingsTimeout, 2, (sendException, replyBytes) => { if (sendException != null) { callback(new Exception( "Ошибка отправки команды записи настроек АИН1 - нет ответа от BsEthernet", sendException)); return; } // Пауза _writeSettingsTimeout мс для того, чтобы АИН успел записать новые данные в EEPROM, // а затем БС-Ethernet успел их вычитать из АИН. Thread.Sleep(_writeSettingsTimeout); // Проверка записи настроек АИН1 путем их повторного чтения _ainSettingsReader.ReadSettingsAsync(0, true, (exceptionReRead1, settings1ReReaded) => { if (exceptionReRead1 != null) { callback(new Exception( "Не удалось проконтролировать корректность записи настроек АИН1 путём их повтороного вычитывания - нет ответа от BsEthernet")); return; } try { settingsForAin1.CompareSettingsAfterReReading(settings1ReReaded, 0); } catch (Exception compareEx1) { callback(new Exception( "Ошибка при повторном чтении настроек АИН1: " + compareEx1.Message, compareEx1)); return; } callback(null); }); }); } else if (ainsCountToWriteSettings == 2) { // Когда в системе два блока АИН // TODO: проверить наличие связи с АИНами settingsForAin1.Imcw = (ushort)(settingsForAin1.Imcw & 0xF0FF); // биты 8,9,11 занулены, два АИНа в системе settingsForAin1.Imcw = (ushort)(settingsForAin1.Imcw | 0x0400); // бит 10 взведен, два АИНа в системе var writeAin1SettingsCmd = new WriteAinSettingsCommand(0, settingsForAin1); sender.SendCommandAsync( _targerAddressHost.TargetAddress, writeAin1SettingsCmd, _writeSettingsTimeout, 2, (sendException, replyBytes) => { if (sendException != null) { callback(new Exception( "Ошибка отправки команды записи настроек АИН1 - нет ответа от BsEthernet", sendException)); return; } // Пауза _writeSettingsTimeout мс для того, чтобы АИН успел записать новые данные в EEPROM, // а затем БС-Ethernet успел их вычитать из АИН. Thread.Sleep(_writeSettingsTimeout); // Проверка записи настроек АИН1 путем их повторного чтения _ainSettingsReader.ReadSettingsAsync(0, true, (exceptionReRead1, settings1ReReaded) => { if (exceptionReRead1 != null) { callback(new Exception( "Не удалось проконтролировать корректность записи настроек АИН1 путём их повтороного вычитывания - нет ответа от BsEthernet")); return; } try { settingsForAin1.CompareSettingsAfterReReading(settings1ReReaded, 0); } catch (Exception compareEx1) { callback(new Exception( "Ошибка при повторном чтении настроек АИН1: " + compareEx1.Message, compareEx1)); return; } Thread.Sleep(_writeSettingsTimeout); // Читаем настройки АИН №2 перед записью (из хранилища, или нет - неважно) _ainSettingsReader.ReadSettingsAsync(1, false, (readSettings2Exception, readedAin2Settings) => { if (readSettings2Exception != null) { callback(new Exception( "Не удалось записать настройки, возникла ошибка при предварительном их чтении из блока АИН1 - нет ответа от BsEthernet", readSettings2Exception)); return; } var settingsForAin2 = new AinSettingsWritable(readedAin1Settings); settingsForAin2 .ModifyFromPart( settingsPart); // Модификация настроек значениями, введёнными пользователем settingsForAin2.ModifyFromPart(new AinSettingsPartWritable { Ia0 = readedAin2Settings.Ia0, Ib0 = readedAin2Settings.Ib0, Ic0 = readedAin2Settings.Ic0, Udc0 = readedAin2Settings.Udc0 }); // Эти параметры всегда должны оставаться неизменными settingsForAin2.Imcw = (ushort)(settingsForAin2.Imcw & 0xF0FF); // биты 9,11 занулены, ведомый 1 settingsForAin2.Imcw = (ushort)(settingsForAin2.Imcw | 0x0500); // биты 8,10 взведены,, ведомый 1 var writeAin2SettingsCmd = new WriteAinSettingsCommand(1, settingsForAin2); sender.SendCommandAsync( _targerAddressHost.TargetAddress, writeAin2SettingsCmd, _writeSettingsTimeout, 2, (sendException2, replyBytes2) => { if (sendException2 != null) { callback(new Exception( "Ошибка отправки команды записи настроек АИН2", sendException2)); return; } // Пауза _writeSettingsTimeout мс для того, чтобы АИН успел записать новые данные в EEPROM, // а затем БС-Ethernet успел их вычитать из АИН. Thread.Sleep(_writeSettingsTimeout); // Проверка записи настроек АИН2 путем их повторного чтения _ainSettingsReader.ReadSettingsAsync(1, true, (exceptionReRead2, settings2ReReaded) => { if (exceptionReRead2 != null) { callback(new Exception( "Не удалось проконтролировать корректность записи настроек АИН2 путём их повтороного вычитывания - нет ответа от BsEthernet")); return; } try { settingsForAin2.CompareSettingsAfterReReading( settings2ReReaded, 1); } catch (Exception compareEx2) { callback(new Exception( "Ошибка при повторном чтении настроек АИН2: " + compareEx2.Message, compareEx2)); return; } callback(null); }); }); }); }); }); } else if (ainsCountToWriteSettings == 3) { // Когда в системе три блока АИН // TODO: проверить наличие связи с АИНами settingsForAin1.Imcw = (ushort)(settingsForAin1.Imcw & 0xF0FF); // биты 8.9.10 занулены, три АИНа в системе settingsForAin1.Imcw = (ushort)(settingsForAin1.Imcw | 0x0800); // бит 11 взведен, три АИНа в системе var writeAin1SettingsCmd = new WriteAinSettingsCommand(0, settingsForAin1); sender.SendCommandAsync( _targerAddressHost.TargetAddress, writeAin1SettingsCmd, _writeSettingsTimeout, 2, (sendException, replyBytes) => { if (sendException != null) { callback(new Exception("Ошибка отправки команды записи настроек АИН1", sendException)); return; } // Пауза _writeSettingsTimeout мс для того, чтобы АИН успел записать новые данные в EEPROM, // а затем БС-Ethernet успел их вычитать из АИН. Thread.Sleep(_writeSettingsTimeout); // Проверка записи настроек АИН1 путем их повторного чтения _ainSettingsReader.ReadSettingsAsync(0, true, (exceptionReRead1, settings1ReReaded) => { if (exceptionReRead1 != null) { callback(new Exception( "Не удалось проконтролировать корректность записи настроек АИН1 путём их повтороного вычитывания - нет ответа от BsEthernet")); return; } try { settingsForAin1.CompareSettingsAfterReReading(settings1ReReaded, 0); } catch (Exception compareEx1) { callback(new Exception( "Ошибка при повторном чтении настроек АИН1: " + compareEx1.Message, compareEx1)); return; } Thread.Sleep(_writeSettingsTimeout); // читаем настройки АИН2 (если нет в хранилище) _ainSettingsReader.ReadSettingsAsync(1, false, (readSettings2Exception, readedAin2Settings) => { if (readSettings2Exception != null) { callback(new Exception( "Не удалось записать настройки, возникла ошибка при предварительном их чтении из блока АИН1 - нет ответа от BsEthernet", readSettings2Exception)); return; } var settingsForAin2 = new AinSettingsWritable(readedAin1Settings); settingsForAin2 .ModifyFromPart( settingsPart); // Модификация настроек значениями, введёнными пользователем settingsForAin2.ModifyFromPart(new AinSettingsPartWritable { Ia0 = readedAin2Settings.Ia0, Ib0 = readedAin2Settings.Ib0, Ic0 = readedAin2Settings.Ic0, Udc0 = readedAin2Settings.Udc0 }); // Эти параметры всегда должны оставаться неизменными settingsForAin2.Imcw = (ushort)(settingsForAin2.Imcw & 0xF0FF); // биты 9,10 занулены, ведомый 1 settingsForAin2.Imcw = (ushort)(settingsForAin2.Imcw | 0x0900); // биты 8,11 взведены, ведомый 1 var writeAin2SettingsCmd = new WriteAinSettingsCommand(1, settingsForAin2); sender.SendCommandAsync( _targerAddressHost.TargetAddress, writeAin2SettingsCmd, _writeSettingsTimeout, 2, (sendException2, replyBytes2) => { if (sendException2 != null) { callback(new Exception( "Ошибка отправки команды записи настроек АИН2", sendException2)); return; } // Пауза _writeSettingsTimeout мс для того, чтобы АИН успел записать новые данные в EEPROM, // а затем БС-Ethernet успел их вычитать из АИН. Thread.Sleep(_writeSettingsTimeout); // Проверка записи настроек АИН2 путем их повторного чтения: _ainSettingsReader.ReadSettingsAsync(1, true, (exceptionReRead2, settings2ReReaded) => { if (exceptionReRead2 != null) { callback(new Exception( "Не удалось проконтролировать корректность записи настроек АИН2 путём их повтороного вычитывания - нет ответа от BsEthernet")); return; } try { settingsForAin2.CompareSettingsAfterReReading( settings2ReReaded, 1); } catch (Exception compareEx2) { callback(new Exception( "Ошибка при повторном чтении настроек АИН2: " + compareEx2.Message, compareEx2)); return; } Thread.Sleep(_writeSettingsTimeout); // читаем настройки АИН3 (если нет в хранилище): _ainSettingsReader.ReadSettingsAsync(2, false, (readSettings3Exception, readedAin3Settings) => { if (readSettings3Exception != null) { callback(new Exception( "Не удалось записать настройки, возникла ошибка при предварительном их чтении из блока АИН1 - нет ответа от BsEthernet", readSettings3Exception)); return; } var settingsForAin3 = new AinSettingsWritable(readedAin1Settings); settingsForAin3 .ModifyFromPart( settingsPart); // Модификация настроек значениями, введёнными пользователем settingsForAin3.ModifyFromPart( new AinSettingsPartWritable { Ia0 = readedAin3Settings.Ia0, Ib0 = readedAin3Settings.Ib0, Ic0 = readedAin3Settings.Ic0, Udc0 = readedAin3Settings.Udc0 }); // Эти параметры всегда должны оставаться неизменными settingsForAin3.Imcw = (ushort)(settingsForAin3.Imcw & 0xF0FF); // биты 8,10 занулены, ведомый 2 settingsForAin3.Imcw = (ushort)(settingsForAin3.Imcw | 0x0A00); // биты 9,11 взведены, ведомый 2 var writeAin3SettingsCmd = new WriteAinSettingsCommand(2, settingsForAin3); sender.SendCommandAsync( _targerAddressHost.TargetAddress, writeAin3SettingsCmd, _writeSettingsTimeout, 2, (sendException3, replyBytes3) => { // Пауза _writeSettingsTimeout мс для того, чтобы АИН успел записать новые данные в EEPROM, // а затем БС-Ethernet успел их вычитать из АИН. Thread.Sleep(_writeSettingsTimeout); // Проверка записи настроек АИН3 путем их повторного чтения: _ainSettingsReader.ReadSettingsAsync(2, true, (exceptionReRead3, settings3ReReaded) => { if (exceptionReRead3 != null) { callback(new Exception( "Не удалось проконтролировать корректность записи настроек АИН3 путём их повтороного вычитывания - нет ответа от BsEthernet")); return; } try { settingsForAin3 .CompareSettingsAfterReReading( settings3ReReaded, 2); } catch (Exception compareEx3) { callback(new Exception( "Ошибка при повторном чтении настроек АИН3: " + compareEx3.Message, compareEx3)); return; } callback(null); }); }); }); }); }); }); }); }); } else { callback.Invoke(new Exception("Неподдердживаемое число блоков АИН: " + ainsCountToWriteSettings + ", поддерживается 1, 2 и 3 блока АИН")); } }); }
public void ModifyFromPart(IAinSettingsPart part) { if (part.KpW.HasValue) { KpW = part.KpW.Value; } if (part.KiW.HasValue) { KiW = part.KiW.Value; } if (part.FiNom.HasValue) { FiNom = part.FiNom.Value; } if (part.Imax.HasValue) { Imax = part.Imax.Value; } if (part.UdcMax.HasValue) { UdcMax = part.UdcMax.Value; } if (part.UdcMin.HasValue) { UdcMin = part.UdcMin.Value; } if (part.Fnom.HasValue) { Fnom = part.Fnom.Value; } if (part.Fmax.HasValue) { Fmax = part.Fmax.Value; } if (part.DflLim.HasValue) { DflLim = part.DflLim.Value; } if (part.FlMinMin.HasValue) { FlMinMin = part.FlMinMin.Value; } if (part.IoutMax.HasValue) { IoutMax = part.IoutMax.Value; } if (part.FiMin.HasValue) { FiMin = part.FiMin.Value; } if (part.DacCh.HasValue) { DacCh = part.DacCh.Value; } if (part.Imcw.HasValue) { Imcw = part.Imcw.Value; } if (part.Ia0.HasValue) { Ia0 = part.Ia0.Value; } if (part.Ib0.HasValue) { Ib0 = part.Ib0.Value; } if (part.Ic0.HasValue) { Ic0 = part.Ic0.Value; } if (part.Udc0.HasValue) { Udc0 = part.Udc0.Value; } if (part.TauR.HasValue) { TauR = part.TauR.Value; } if (part.Lm.HasValue) { Lm = part.Lm.Value; } if (part.Lsl.HasValue) { Lsl = part.Lsl.Value; } if (part.Lrl.HasValue) { Lrl = part.Lrl.Value; } if (part.KpFi.HasValue) { KpFi = part.KpFi.Value; } if (part.KiFi.HasValue) { KiFi = part.KiFi.Value; } if (part.KpId.HasValue) { KpId = part.KpId.Value; } if (part.KiId.HasValue) { KiId = part.KiId.Value; } if (part.KpIq.HasValue) { KpIq = part.KpIq.Value; } if (part.KiIq.HasValue) { KiIq = part.KiIq.Value; } if (part.AccDfDt.HasValue) { AccDfDt = part.AccDfDt.Value; } if (part.DecDfDt.HasValue) { DecDfDt = part.DecDfDt.Value; } if (part.Unom.HasValue) { Unom = part.Unom.Value; } if (part.TauFlLim.HasValue) { TauFlLim = part.TauFlLim.Value; } if (part.Rs.HasValue) { Rs = part.Rs.Value; } if (part.Fmin.HasValue) { Fmin = part.Fmin.Value; } if (part.TauM.HasValue) { TauM = part.TauM.Value; } if (part.TauF.HasValue) { TauF = part.TauF.Value; } if (part.TauFSet.HasValue) { TauFSet = part.TauFSet.Value; } if (part.TauFi.HasValue) { TauFi = part.TauFi.Value; } if (part.IdSetMin.HasValue) { IdSetMin = part.IdSetMin.Value; } if (part.IdSetMax.HasValue) { IdSetMax = part.IdSetMax.Value; } if (part.UchMin.HasValue) { UchMin = part.UchMin.Value; } if (part.UchMax.HasValue) { UchMax = part.UchMax.Value; } if (part.Np.HasValue) { Np = part.Np.Value; } if (part.NimpFloorCode.HasValue) { NimpFloorCode = part.NimpFloorCode.Value; } if (part.FanMode.HasValue) { FanMode = part.FanMode.Value; } if (part.DirectCurrentMagnetization.HasValue) { DirectCurrentMagnetization = part.DirectCurrentMagnetization.Value; } if (part.UmodThr.HasValue) { UmodThr = part.UmodThr.Value; } if (part.EmdecDfdt.HasValue) { EmdecDfdt = part.EmdecDfdt.Value; } if (part.TextMax.HasValue) { TextMax = part.TextMax.Value; } if (part.ToHl.HasValue) { ToHl = part.ToHl.Value; } if (part.Ain1LinkFault.HasValue) { Ain1LinkFault = part.Ain1LinkFault.Value; } if (part.Ain2LinkFault.HasValue) { Ain2LinkFault = part.Ain2LinkFault.Value; } if (part.Ain3LinkFault.HasValue) { Ain3LinkFault = part.Ain3LinkFault.Value; } }