public void WriteSettingsAsync(IAinSettingsPart settings, Action <Exception> callback)
 {
     _writer.WriteSettingsAsync(settings, callback);
 }
Beispiel #2
0
        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;
            }
        }