vg

Ответы в темах

Просмотр 15 сообщений - с 151 по 165 (из 252 всего)
  • Автор
    Записи
  • в ответ на: Antimalware Windows 10 #17448
    vg
    Участник

    Для всех линий связи используется драйвер KpModbus.dll (за исключением SMS-оповещения, там используется KpSms.dll).

    Опрос КП — https://pastenow.ru/42885dfdbd3e088f1bc1887676608c1f
    Основные настройки — https://pastenow.ru/648caf8ed2e21354c93e2ecb4cc99501

    в ответ на: Масштабирование проекта #17447
    vg
    Участник

    Главный экран — https://pastenow.ru/d5c59ee0d4828b0f6da2c8c0b1299757
    По нажатию на выделенную прямоугольную область происходит переход на схему «цеха».

    Схема цеха — https://pastenow.ru/9f3f06a6410708510fe2b7dda642e8ce
    По нажатию на интегральный индикатор состояния (разноцветные круги) происходит переход на мнемосхему машины.

    Мнемосхема машины — https://pastenow.ru/6cc295e12eebc093b603985cefb3cc23
    Таких машин 8 и они одинаковые. В ячейках В1, Г1 и т.д. отображаются измеряемые устройством параметры с соответствующей индикацией. Под каждой парой ячеек В и Г расположена «кнопка График». На графике отображены уставки (одни и те же для каждой машины и каждой пары), а также сами значения ячеек В и Г.
    В левом нижнем углу расположена «кнопка Состояния каналов» (на скриншоте «Каналы — норма»). При нажатии появляется вплывающее окно о состоянии каналов измерительного устройства. В нижней части расположена информация о наработке в разных режимах (Режим1, Режим2, Режим3). Над ячейками В1 и Г1 и т.д. расположены интегральные индикаторы П1, П2 и т.д., отображающие худшее состояние пары. При нажатии на эти индикаторы появляется всплывающее окно с отображением дополнительных измеряемых устройством параметров. Справа также расположена «кнопка Диагностика», по нажатию на которую, произойдёт переход на соответствующий экран.

    Диагностика — https://pastenow.ru/fe09b8dc73eb56ccc6cbd46461ae4f06
    Здесь отображаются результаты некоторой диагностики, которая считывается из БД. Соответственно у каждой машины свои точки и свои результаты диагностики этих точек. По нажатию на любую строку появляется всплывающее окно с историей развития этого дефекта.

    Собственно такая структура у проекта.

    vg
    Участник

    В общем, как обычно, я сам напортачил.

    Дело было в том, что передача конфигурации не проходила из-за ошибки в формуле. И как следствие не обновлялось название КП с параметрами при попытке просмотра данных. После исправления своей оплошности всё работает как надо.

    vg
    Участник

    Большое спасибо за ответы.

    vg
    Участник

    Благодарю за ответ. Подскажите пожалуйста что почитать, куда посмотреть для разработки такого клиента?

    vg
    Участник

    Забыл написать, что период отчёта может быть как фиксированный (час, сутки, неделя и т.д.) так и произвольный, а следовательно нужно обеспечить выбор этого периода. Значит модуль, по всей видимости, не подходит.

    vg
    Участник

    Mikhail, реализовал это во внешнем приложении, которое будет запускаться по нажатию на графический элемент веб-интерфейса.

    vg
    Участник

    В целом задача выглядит следующим образом:

    По нажатию на графический элемент в веб-интерфейсе SCADA-системы сформировать отчёт в файле Word, в котором будут отображаться архивные данные в виде таблиц и графиков.

    По сути я уже все данные достал, но реализация кривая(на мой взгляд), как моя жизнь, из-за большого количества костылей. Костыли эти у меня получились в виду того, что я не понял как считать только то, что мне нужно в приложении и соответственно считываю в данный момент весь архив за нужный период. Затем с помощью метода AddSrez() «соединяю» все экземпляры SrezTableLight и получаю «общую» таблицу. После этого перебираю всю эту большую таблицу для извлечения нужных мне данных и сохраняю только данные по необходимым каналам.

    Основная сложность для меня представляется в определении данных по номеру канала, так как весь итоговый SrezTableLight я оставлять не хочу, так как он слишком громоздкий, а в новой структуре (я записываю в List<List<List<object>>> :)) номер канала записываю в нижнем List`е и в итоге получается много ненужных операций при извлечении данных. Я понимаю, что алгоритм плохой, но по другому не придумал.

    Мы с Вами уже обсуждали ранее некоторые моменты и Вы рекомендовали делать это отдельным приложением, а не модулем (из-за требований к безопасности модуля, если не ошибаюсь).

    vg
    Участник

    P.S.

    А если можно сразу считать срезы по конкретным входным каналам, то это будет просто фантастика.

    vg
    Участник

    Всё оказалось просто:

    
                DataTable dataTable = new DataTable("BaseTable");
                BaseAdapter adapter = new BaseAdapter();
                adapter.FileName = @"C:\SCADA\BaseDAT\incnl.dat";
                adapter.Fill(dataTable, true);
                List<int> inputChannelList = new List<int>();
                for(int i = 0; i < dataTable.Rows.Count; i++)
                {
                    if((int)dataTable.Rows[i].ItemArray[4] == objectNumber)
                    {
                        inputChannelList.Add((int)dataTable.Rows[i].ItemArray[0]);
                    }
                }

    Где
    dataTable.Rows[i].ItemArray[4] — колонка таблицы входных каналов «Объект»
    dataTable.Rows[i].ItemArray[0] — колонка номеров входных каналов
    objectNumber — индекс соответствующего объекта в таблице «Объекты»

    vg
    Участник

    Да-да, разумеется, спасибо, у меня «свойство bool» существует внутри класса и выполняет функцию глобальной переменной во время циклической отработки каналов, значение для которой я как раз и задаю в формуле. А из формул разумеется возвращаю double.

    vg
    Участник

    Последний вариант, кстати, почему то не работает.

    Ошибка:
    Недопустимый токен «=» в объявлении класса, структуры или интерфейса

    Тогда остаётся предыдущий вариант 🙂

    vg
    Участник

    А ещё лучше написать так:

    public bool CheckFirstCycleMode1 { get; set; } = true;

    vg
    Участник

    Проблема была в некорректно написанных свойствах класса.

    Изначально:

    public bool CheckFirstCycleMode1
                {
                    get
                    {
                        return CheckFirstCycleMode1;
                    }
                    set
                    {
                        CheckFirstCycleMode1 = true;
                    }
                }

    Исправлено:

    private bool checkFirstCycleMode1;
    public bool CheckFirstCycleMode1
                {
                    get
                    {
                        return checkFirstCycleMode1;
                    }
                    set
                    {
                        checkFirstCycleMode1 = true;
                    }
                }
    vg
    Участник

    P.S.

    Считываю данные с эмулятора. Но с ним проблем никогда не возникало. Если передать конфигурацию во время работы эмулятора, то веб-интерфейс сразу «виснет». Если же сделать это при выключенном эмуляторе, а затем включить снова, то такой вариант работает 2 минуты и также падает в обморок.

Просмотр 15 сообщений - с 151 по 165 (из 252 всего)