/// <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)); }
/// <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)); }
/// <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); }
/// <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); }
/// <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}"); } }
/// <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(); }
/// <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(); } }
/// <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)); }
/// <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}"); } }
/// <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); }
/// <inheritdoc /> /// <summary> /// /// </summary> /// <param name="signal"></param> /// <param name="value"></param> protected override void Set(PlaceSignalDescription signal, byte value) => Pci1753Func.Set(signal, value);
/// <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)); }
/// <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 });