Пример #1
0
 /// <inheritdoc />
 /// <summary>
 ///
 /// </summary>
 /// <param name="signal"></param>
 protected override void ResetData(PlaceSignalDescription signal)
 {
     if (signal.Protocol == Protocol.Rs232)
     {
         ArincFunc.ResetData(signal);
     }
 }
 /// <summary>
 /// Задание настроек каналу
 /// </summary>
 /// <param name="signal"></param>
 /// <param name="type"></param>
 /// <param name="frequency"></param>
 public void Config(PlaceSignalDescription signal, TypeChannel type, FREQ frequency)
 {
     Check(signal, type == TypeChannel.Rx ? Port429.MaxRxChannel : Port429.MaxTxChannel);
     // Задание частоты обмена
     App.TaskManager.PortArinc.Config(signal.Device ?? 0, ( byte )type, ( byte )(signal.Channel ?? 0),
                                      frequency, true);
 }
        /// <summary>
        /// Выдача данных
        /// </summary>
        /// <param name="signal"></param>
        /// <param name="template"></param>
        /// <param name="address"></param>
        /// <param name="count"></param>
        /// <param name="time"></param>
        public void SetData(PlaceSignalDescription signal, uint template, int address, int count, int time)
        {
            if (count == 0)
            {
                return;
            }
            // Проверка допустимости данных сигнала
            Check(signal, Port429.MaxTxChannel);
            // Формирования данных для выдачи
            // Сброс бита четности и адреса
            template &= 0x7FFFFF00;
            var data = new uint[count];

            for (var i = 0; i < count; i++)
            {
                data[i] = GetWordParity(template | ( uint )((address + i) & 0xFF));
            }
            // Выдача данных платой
            App.TaskManager.PortArinc.Write(signal.Device ?? 0, ( ushort )(signal.Channel ?? 0), data, count);
            // Ожидание завершения выдачи данных
            Thread.Sleep(time);
            // TODO НАДО думать
            //// Ожидание завершения выдачи
            //App.MyWork.PortArinc.CheckTx((int)index, (byte)channel, time);
            //// Ожидание завершения выдачи
            //Thread.Sleep(50);
        }
 /// <summary>
 /// Выдача разовой команды
 /// </summary>
 /// <param name="signal"></param>
 /// <param name="value"></param>
 public void Set(PlaceSignalDescription signal, byte value)
 {
     Check(signal);
     // Задание РКП
     App.TaskManager.Port1753.WriteBit(signal.Device ?? 0, signal.Channel ?? 0, signal.Pin ?? 0,
                                       ( byte )(value & 0x1));
 }
Пример #5
0
 /// <summary>
 /// Задание настроек
 /// </summary>
 /// <param name="signal"></param>
 /// <param name="type"></param>
 /// <param name="frequency"></param>
 public void Config(PlaceSignalDescription signal, TypeChannel type, FREQ frequency)
 {
     Check(signal, type == TypeChannel.Rx
         ? ArincDevice.RxChannel
         : ArincDevice.TxChannel);
     // Задание частоты обмена
     Config(signal.Device ?? 0, signal.Channel ?? 0, ( byte )type, frequency);
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="signal"></param>
        /// <returns></returns>
        public uint GetWord(PlaceSignalDescription signal)
        {
            // Проверка допустимости данных сигнала
            Check(signal);
            var word = Arinc429FunctionClass.GetWord(signal.Device ?? 0, ChannelArincUpc10ToVm7, signal.Word ?? 0);

            CheckWord(signal, word);
            return(word);
        }
        /// <summary>
        /// Получение счетчиков обновленных слов
        /// </summary>
        /// <param name="signal"></param>
        /// <returns></returns>
        public uint GetCounters(PlaceSignalDescription signal)
        {
            Check(signal, Port429.MaxRxChannel);
            // Чтение данных
            int readed;

            App.TaskManager.PortArinc.Read(signal.Device ?? 0, ( ushort )(signal.Channel ?? 0), out readed);
            return(( uint )readed);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="signal"></param>
        /// <returns></returns>
        public byte GetRk(PlaceSignalDescription signal)
        {
            // Проверка допустимости данных сигнала
            Check(signal);
            var word = Arinc429FunctionClass.GetWord(signal.Device ?? 0, ChannelArincUpc10ToVm7, signal.Word ?? 0);

            CheckWord(signal, word);
            return(( byte )((word >> (signal.Pin ?? 0)) & 0x1));
        }
Пример #9
0
        /// <inheritdoc />
        /// <summary>
        ///
        /// </summary>
        /// <param name="signal"></param>
        /// <param name="count"></param>
        /// <returns></returns>
        protected override double Get(PlaceSignalDescription signal, int count)
        {
            // Получение эхо-РКВ по каналу Arinc429
            var arinc_value = Upc10Func.GetWord(signal);
            // Проверка значения угла ДОЗ
            var test_value = ( double )((arinc_value >> 16) & 0xFFFU);

            return(test_value * 4096 / 360);
        }
Пример #10
0
 /// <inheritdoc />
 /// <summary>
 ///
 /// </summary>
 /// <param name="signal"></param>
 /// <param name="type"></param>
 /// <param name="frequency"></param>
 protected override void Config(PlaceSignalDescription signal, TypeChannel type, FREQ frequency)
 {
     if (signal.Protocol == Protocol.Pci429)
     {
         Pci429Func.Config(signal, type, frequency);
     }
     else
     {
         ArincFunc.Config(signal, type, frequency);
     }
 }
 /// <summary>
 /// Выдача РКВ
 /// </summary>
 /// <param name="signal"></param>
 /// <param name="value"></param>
 public void Set(PlaceSignalDescription signal, byte value)
 {
     Check(signal);
     // Формирование шаблона РК
     // Сброс значение РК в 0
     // Установка значения РК в заданное
     _rkoWord = (_rkoWord & ~( uint )(1 << (signal.Pin ?? 0))) |
                ( uint )((value & 1) << (signal.Pin ?? 0));
     // Установка РКВ из ВМ-7
     Set(signal.Device ?? 0, _rkoWord);
 }
Пример #12
0
 /// <inheritdoc />
 /// <summary>
 ///
 /// </summary>
 /// <param name="signal"></param>
 /// <param name="value"></param>
 protected override void Set(PlaceSignalDescription signal, byte value)
 {
     if (signal.Protocol == Protocol.Upc10)
     {
         Upc10Func.SetRk(signal, value);
     }
     else
     {
         RkFunc.Set(signal, value);
     }
 }
        /// <summary>
        /// Проверка допустимости данных сигнала
        /// </summary>
        /// <param name="signal"></param>
        private void Check(PlaceSignalDescription signal)
        {
            const string protocol    = Protocol.Pci1753;
            var          max_device  = App.TaskManager.Port1753.MaxDevice;
            var          max_channel = App.TaskManager.Port1753.MaxChannel;
            const int    maxPin      = 8;

            // Проверка инициализации интерфейсной платы
            if (null == App.TaskManager.Port1753 || !App.TaskManager.Port1753.IsInit)
            {
                throw new Exception <DeviceNotInitializedExceptionArgs>(new DeviceNotInitializedExceptionArgs(),
                                                                        "Ошибка! Плата PCI-1753 не инициализирована");
            }
            // Проверка допустимости количества устройств
            if (max_device <= 0)
            {
                throw new ArgumentOutOfRangeException($"Максимальное количество устройств = {max_device}");
            }
            // Проверка допустимости количества каналов
            if (max_channel <= 0)
            {
                throw new ArgumentOutOfRangeException($"Максимальное количество каналов = {max_channel}");
            }
            // Проверка допустимости сигнала
            if (signal == null)
            {
                throw new ArgumentOutOfRangeException($"Ошибка допустимости сигнала {nameof( signal )} = null");
            }
            // Проверка допустимости протокола
            if (signal.Protocol != protocol)
            {
                throw new ArgumentOutOfRangeException(
                          $"Ошибка допустимости протокола {signal.Name} - {signal.Protocol}");
            }
            // Проверка допустимости номера устройства
            if (signal.Device == null || signal.Device < 0 || signal.Device >= max_device)
            {
                throw new ArgumentOutOfRangeException(
                          $"Ошибка допустимости номера устройства {signal.Name} - {signal.Device}");
            }
            // Проверка допустимости номера канала
            if (signal.Channel == null || signal.Channel <= 0 || signal.Channel > max_channel)
            {
                throw new ArgumentOutOfRangeException(
                          $"Ошибка допустимости номера канала {signal.Name} - {signal.Channel}");
            }
            // Проверка допустимости номера пина
            if (signal.Pin == null || signal.Pin < 0 || signal.Pin >= maxPin)
            {
                throw new ArgumentOutOfRangeException(
                          $"Ошибка допустимости номера пина {signal.Name} - {signal.Pin}");
            }
        }
Пример #14
0
        /// <inheritdoc />
        /// <summary>
        ///
        /// </summary>
        /// <param name="signal"></param>
        /// <param name="count"></param>
        /// <returns></returns>
        protected override double Get(PlaceSignalDescription signal, int count)
        {
            // ReSharper disable once SwitchStatementMissingSomeCases
            switch (signal.Protocol)
            {
            case Protocol.Pci1747U:
                return(Pci1747UFunc.Get(signal, count));

            case Protocol.Rs232:
                return(AsFunc.Get(signal, count));
            }
            throw new System.NotImplementedException();
        }
Пример #15
0
        /// <inheritdoc />
        /// <summary>
        ///
        /// </summary>
        /// <param name="signal"></param>
        /// <returns></returns>
        protected override byte Get(PlaceSignalDescription signal)
        {
            switch (signal.Protocol)
            {
            case Protocol.Pci1753: return(Pci1753Func.Get(signal));

            case Protocol.Rs232:   return(RkFunc.Get(signal));

            case Protocol.Upc10:   return(Upc10Func.GetRk(signal));

            default:               throw new System.ArgumentException();
            }
        }
Пример #16
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="signal"></param>
        /// <param name="count"></param>
        /// <returns></returns>
        public double Get(PlaceSignalDescription signal, int count = 3)
        {
            Check(signal);

            var data = new List <double>();

            // Получение аналогового сигнала с интерфейсной платы PCI-1747U
            for (var i = 0; i < count; i++)
            {
                data.Add(App.TaskManager.Port1747U.Read(signal.Device ?? 0, signal.Channel ?? 0));
            }
            // Среднее значение
            return(data.Average() * AsDevice.Lsb * (signal.Coefficient ?? 1) - (signal.Offset ?? 0));
        }
        /// <summary>
        /// Проверка допустимости данных сигнала
        /// </summary>
        /// <param name="signal"></param>
        /// <param name="maxChannel"></param>
        private void Check(PlaceSignalDescription signal, int maxChannel)
        {
            const string protocol = Protocol.Rs232;
            // ReSharper disable once ConvertToConstant.Local
            var max_device = PortRs232.MaxDevice;

            // Проверка инициализации СОМ-портов
            if (null == App.TaskManager.PortCom || !App.TaskManager.PortCom.IsInit)
            {
                throw new Exception <DeviceNotInitializedExceptionArgs>(new DeviceNotInitializedExceptionArgs(),
                                                                        "Ошибка! СОМ-порт не инициализирован");
            }
            // Проверка допустимости количества устройств
            if (max_device <= 0)
            {
                throw new ArgumentOutOfRangeException($"Максимальное количество устройств = {max_device}");
            }
            // Проверка допустимости количества каналов
            if (maxChannel <= 0)
            {
                throw new ArgumentOutOfRangeException($"Максимальное количество каналов = {maxChannel}");
            }
            // Проверка допустимости сигнала
            if (signal == null)
            {
                throw new ArgumentOutOfRangeException($"Ошибка допустимости сигнала {nameof( signal )} = null");
            }
            // Проверка допустимости протокола
            if (signal.Protocol != protocol)
            {
                throw new ArgumentOutOfRangeException(
                          $"Ошибка допустимости протокола {signal.Name} - {signal.Protocol}");
            }
            // Проверка допустимости номера устройства
            if (signal.Device == null || signal.Device < 0 || signal.Device >= max_device)
            {
                throw new ArgumentOutOfRangeException(
                          $"Ошибка допустимости номера устройства {signal.Name} - {signal.Device}");
            }
            // Проверка допустимости номера канала
            if (signal.Channel == null || signal.Channel <= 0 || signal.Channel > maxChannel)
            {
                throw new ArgumentOutOfRangeException(
                          $"Ошибка допустимости номера канала {signal.Name} - {signal.Channel}");
            }
        }
        /// <summary>
        /// Прием аналогового сигнала
        /// </summary>
        /// <param name="signal"></param>
        /// <param name="count"></param>
        /// <returns></returns>
        public double Get(PlaceSignalDescription signal, int count = 3)
        {
            Check(signal, AsDevice.AdcChannel);

            // Цикл проходов
            var data = new List <double>();

            for (var i = 0; i < count; i++)
            {
                // Чтение АСП
                var value = Get(signal.Device ?? 0, signal.Channel ?? 0);
                // Преобразование в напряжение
                data.Add(( short )value >> 4);
            }
            // Среднее значение
            return(data.Average() * AsDevice.Lsb * (signal.Coefficient ?? 1) - (signal.Offset ?? 0));
        }
Пример #19
0
        /// <inheritdoc />
        /// <summary>
        ///
        /// </summary>
        /// <param name="signal"></param>
        /// <param name="value"></param>
        protected override void Set(PlaceSignalDescription signal, double value)
        {
            // Рассчет контрольного занчения синуса и косинуса угла поворота ДОЗ
            var ideal_angle = Math.PI * value / 180.0;

            if (signal.Signal == "ПК PCI-1721: 68-pin SCSI pin 67 port VOUT0")
            {
                var sin_voltage = ( ushort )(5 * Math.Sin(ideal_angle));
                // Выдача контрольных значений в виде аналоговых сигналов из платы PCI-1721
                Pci1721Func.Set(signal, sin_voltage);
            }
            else
            {
                var cos_voltage = ( ushort )(5 * Math.Cos(ideal_angle));
                // Выдача контрольных значений в виде аналоговых сигналов из платы PCI-1721
                Pci1721Func.Set(signal, cos_voltage);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="signal"></param>
        private void Check(PlaceSignalDescription signal)
        {
            const string protocol = Protocol.Upc10;
            // ReSharper disable once ConvertToConstant.Local
            var       max_device = PortRs232.MaxDevice;
            const int maxWord    = 256;
            const int maxPin     = 32;

            // Проверка инициализации СОМ-портов
            if (null == App.TaskManager.PortCom || !App.TaskManager.PortCom.IsInit)
            {
                throw new Exception <DeviceNotInitializedExceptionArgs>(new DeviceNotInitializedExceptionArgs(),
                                                                        "Ошибка! СОМ-порт не инициализирован");
            }
            // Проверка допустимости сигнала
            if (signal == null)
            {
                throw new ArgumentOutOfRangeException($"Ошибка допустимости данных {nameof( signal )} = null");
            }
            if (signal.Protocol != protocol)
            {
                throw new ArgumentOutOfRangeException(
                          $"Ошибка допустимости протокола {signal.Name} - {signal.Protocol}");
            }
            // Проверка допустимости индекса устройства
            if (signal.Device == null || signal.Device < 0 || signal.Device >= max_device)
            {
                throw new ArgumentOutOfRangeException(
                          $"Ошибка допустимости номера устройства {signal.Name} - {signal.Device}");
            }
            // Проверка допустимости номера слова
            if (signal.Word == null || signal.Word < 0 || signal.Word >= maxWord)
            {
                throw new ArgumentOutOfRangeException(
                          $"Ошибка допустимости номера слова {signal.Name} - {signal.Word}");
            }
            // Проверка допустимости пина слова
            if (signal.Pin == null || signal.Pin < 0 || signal.Pin >= maxPin)
            {
                throw new ArgumentOutOfRangeException(
                          $"Ошибка допустимости номера пина {signal.Name} - {signal.Pin}");
            }
        }
Пример #21
0
        /// <summary>
        /// Подпрограмма запуска теста
        /// </summary>
        /// <returns></returns>
        private int Test()
        {
            // Количество ошибок в тесте
            var count_err = 0;

            // Настройка режима работы ProgressBar
            App.MyWindows.IndeterminateProgress = true;

            // Создание сигнала
            var signal = new PlaceSignalDescription(_indexDevice, "РКВ LED", "РК СВЕТОДИОДА", "ВМ-7 word 0 pin 31");

            // Выключение светодиода
            _rs232Func.Set(signal, 0);
            // Создание объекта Timer c периодом 500 миллисекунд
            byte count_led = 1;
            // Включение/выключение светодиода
            var timer = new Timer(o => { _rs232Func.Set(signal, count_led++); }, null, 0, Period);
            // Выдача сообщения пользователю
            var result = MessageBox.Show(
                messageBoxText:
                App.TaskManager.NameChanneList[_indexDevice] +
                "Визуально проконтролируйте моргание светодиода." +
                Environment.NewLine +
                "При отсутствии моргания нажмите кнопку НЕТ." +
                Environment.NewLine +
                "При наличии моргания нажмите кнопку ДА." +
                Environment.NewLine +
                "При нажатии кнопки тест будет завершен.",
                caption: @"Контроль работоспособности светодиода",
                button: MessageBoxButton.YesNo,
                icon: MessageBoxImage.Question,
                defaultResult: MessageBoxResult.Yes,
                options: MessageBoxOptions.DefaultDesktopOnly);

            count_err += result == MessageBoxResult.Yes ? 0 : 1;
            // Сброс таймера
            timer.Dispose();
            // Выключение светодиода
            _rs232Func.Set(signal, 0);
            // Настройка режима работы ProgressBar
            App.MyWindows.IndeterminateProgress = false;
            return(count_err);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="signal"></param>
        /// <param name="word"></param>
        /// <returns></returns>
        private static void CheckWord(PlaceSignalDescription signal, uint word)
        {
            // Проверка идентификатора канала
            var ik = (word >> 8) & 0x3U;

            // ReSharper disable once InvertIf
            if (ik != 0)
            {
                throw new Exception <Upc10ExceptionArgs>(new Upc10ExceptionArgs(),
                                                         $"Ошибка! Слово {word:X8} проверка идентификатора канала {ik:D2} - отказ");
            }
            if (signal?.Word == 251 || signal?.Word == 252)
            {
                CheckMcWord(word);
            }
            else
            {
                CheckMcCommand(word);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="signal"></param>
        /// <param name="value"></param>
        public void SetRk(PlaceSignalDescription signal, byte value)
        {
            // Проверка допустимости данных сигнала
            Check(signal);

            // Формирование шаблона РК
            // Сброс значение РК в 0
            _rkoWord[signal.Word ?? 0] &= ~( uint )(1 << (signal.Pin ?? 0));
            // Установка значения РК в заданное
            _rkoWord[signal.Word ?? 0] |= ( uint )(value << (signal.Pin ?? 0));
            // Формирование слова Arinc429
            // Идентификатор канала  = 00
            // Матрица состояния     = 00 ( Нормальная работа )
            _rkoWord[signal.Word ?? 0] =
                (_rkoWord[signal.Word ?? 0] & 0x1FFFF000) | ( uint )(signal.Word ?? 0);
            // Вычисление бита четности
            _rkoWord[signal.Word ?? 0] = Pci429FunctionClass.GetWordParity(_rkoWord[signal.Word ?? 0]);
            // Установка РКВ из УПС-10
            _func.SetData(signal.Device ?? 0, ChannelArincVm7ToUpc10, signal.Word ?? 0, _rkoWord[signal.Word ?? 0],
                          1);
        }
        /// <summary>
        /// Получение данных
        /// </summary>
        /// <param name="signal"></param>
        /// <param name="count"></param>
        /// <param name="time"></param>
        /// <returns></returns>
        public uint[] GetData(PlaceSignalDescription signal, int count, int time)
        {
            // Проверка допустимости данных сигнала
            Check(signal, Port429.MaxRxChannel);

            // Чтение полученных данных из платы PCI429
            int readed;
            var data = App.TaskManager.PortArinc.Read(signal.Device ?? 0, ( ushort )(signal.Channel ?? 0),
                                                      count, time, out readed);
            // Из интерфейсной платы принимаются только выданные слова
            // Алгоритм же проверяет весь фрейм
            // Формирование массива
            var value = new uint[ArincDevice.RxData];

            for (var i = 0; i < value.Length; i++)
            {
                value[i] = ( uint )(0xFF - i);
            }
            foreach (var t in data)
            {
                value[t & 0xFF] = t;
            }
            return(value);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="signal"></param>
        /// <param name="counters"></param>
        /// <returns></returns>
        private static int CheckCounters(PlaceSignalDescription signal, IEnumerable <uint> counters)
        {
            var count_err = 0;
            var str       = string.Empty;

            // Проверка занчений счетчиков обновленных слов
            foreach (var t in counters)
            {
                // Проверка отсуствия лишних слов
                if (t == 0)
                {
                    continue;
                }
                count_err++;
                str += $"{signal.Channel,3:D3} {"Ошибка данных",15} обновлено {t,1:D} слов" + Environment.NewLine;
            }
            // Вывод пользователю
            if (count_err != 0)
            {
                App.TaskManager.Log.WriteAsync(
                    $"{"Контроль счетчиков",-22} {signal?.Name,-10} - {signal?.Signal,-24} - {"отказ" + Environment.NewLine + str}");
            }
            return(count_err);
        }
Пример #26
0
 /// <inheritdoc />
 /// <summary>
 ///
 /// </summary>
 /// <param name="signal"></param>
 /// <param name="value"></param>
 protected override void Set(PlaceSignalDescription signal, byte value) => Pci1753Func.Set(signal, value);
Пример #27
0
 /// <summary>
 /// Выдача сигнала
 /// </summary>
 /// <param name="signal"></param>
 /// <param name="value"></param>
 public void Set(PlaceSignalDescription signal, double value)
 {
     Check(signal);
     // Выдача аналогового сигнала с интерфейсной платы PCI-1724U
     App.TaskManager.Port1724U.Write(signal.Device ?? 0, signal.Channel ?? 0, value);
 }
 /// <summary>
 /// Прием РКП
 /// </summary>
 /// <param name="signal"></param>
 /// <returns></returns>
 public byte Get(PlaceSignalDescription signal)
 {
     Check(signal);
     // Прием разовой команды
     return(( byte )Get(signal.Device ?? 0, signal.Word ?? 0, signal.Pin ?? 0));
 }
Пример #29
0
 /// <inheritdoc />
 /// <summary>
 ///
 /// </summary>
 /// <param name="signal"></param>
 /// <returns></returns>
 protected override byte Get(PlaceSignalDescription signal) => RkFunc.Get(signal);
 private static int CheckCounters(PlaceSignalDescription signal, uint counters) =>
 CheckCounters(signal, new[] { counters });