vg

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

Просмотр 15 сообщений - с 181 по 195 (из 252 всего)
  • Автор
    Записи
  • в ответ на: Архив #17123
    vg
    Участник

    Удалось разрешить проблему подвисания выносом создания отчёта Word в фоновый процесс:

    public override void OnCommandReceived(int ctrlCnlNum, Command cmd, int userID, ref bool passToClients)
            {
                // the method executes when a command has been received
                // метод выполняется после приёма команды ТУ
                if (ctrlCnlNum == 7)
                {
                    new Thread(ExecWord).Start();   // Вызов ExecWord() в новом потоке.
                }
                WriteToLog("Process command by the module " + Name, Log.ActTypes.Action);
            }

    Собственно метод ExecWord реализуется ниже в этом же классе ModTestLogic : ModLogic

    vg
    Участник

    Не удалось ссылку прикрепить к теме, в которой Вы давали ответ.

    Тема «Статус входного канала по нажатию кнопки».

    vg
    Участник

    Вебстанция — 5.1.0.0
    Графики Про — 5.1.0.0

    В демо-проекте у меня реализованы графики и в новой вкладе, и во всплывающем окне по ссылке. К сожалению везде как на скриншоте в первом сообщении.

    P.S.

    Возможно это те самые побочные эффекты от исправления бага масштабирования? 🙂

    Ссылка

    На 2-й странице, в конце.

    • Ответ изменён 5 лет, 11 месяцев назад пользователем vg.
    • Ответ изменён 5 лет, 11 месяцев назад пользователем vg.
    • Ответ изменён 5 лет, 11 месяцев назад пользователем vg.
    • Ответ изменён 5 лет, 11 месяцев назад пользователем Mikhail.
    в ответ на: Архив #17116
    vg
    Участник

    В продолжение темы работы со своими модулями.

    Набросал пример для формирования файла Word с отчётом. По принятию команды ТУ запускаю шаблон Word и заполняю его значениями.

    Секунды на 4, 5 подвисает веб-приложение, затем отвисает и продолжает работать как обычно.

    Ввиду того, что в коде запускается шаблон документа Word, использую ScadaServerMono, иначе вообще виснет всё и не оживает.

    Засёк время выполнения кода в консольном приложении — около 4 секунд. То есть как раз где то время подвисания.

    Выходит, что если я хочу добиться своего, то мне нужно запускать формирование отчёта в фоновом процессе?

    Собственно сам код:

    public override void OnCommandReceived(int ctrlCnlNum, Command cmd, int userID, ref bool passToClients)
            {
                // the method executes when a command has been received
                // метод выполняется после приёма команды ТУ
                if (ctrlCnlNum == 7)
                {
                    long dtStart = DateTime.Now.Ticks;
                    long dtEnd;
                    SrezTableLight snapshotTable = new SrezTableLight();
                    SrezAdapter adapter = new SrezAdapter();
                    adapter.FileName = @"C:\SCADA\ArchiveDAT\Cur\current.dat";
                    adapter.Fill(snapshotTable);
                    File.Create(PATH).Close();
                    using (StreamWriter sw = new StreamWriter(PATH, false, System.Text.Encoding.Default))
                    {
                        for (int i = 0; i < snapshotTable.SrezList.Values[0].CnlData.Length; i++)
                        {
                            for (int j = 0; j < inputChannelArray.Length; j++)
                            {
                                if (snapshotTable.SrezList.Values[0].CnlNums[i] == inputChannelArray[j])
                                {
                                    sw.WriteLine(snapshotTable.SrezList.Values[0].CnlData[i].Val.ToString());
                                }
                            }
                        }
                    }
    
                    Word._Application application;
                    Word._Document document = null;
                    Object missingObj = System.Reflection.Missing.Value;
                    Object trueObj = true;
                    Object falseObj = false;
                    //создаем обьект приложения word
                    application = new Word.Application();
                    // создаем путь к файлу
                    Object templatePathObj = REPORT_SCHEME_PATH;
    
                    // если вылетим не этом этапе, приложение останется открытым
                    try
                    {
                        document = application.Documents.Add(ref templatePathObj, ref missingObj, ref missingObj, ref missingObj);
                    }
                    catch (Exception error)
                    {
                        document.Close(ref falseObj, ref missingObj, ref missingObj);
                        application.Quit(ref missingObj, ref missingObj, ref missingObj);
                        document = null;
                        application = null;
                        throw error;
                    }
    
                    Word.Table table = document.Tables[1];
                    table.Cell(1, 2).Range.Text = MACHINE_NAME;
                    table.Cell(2, 2).Range.Text = OPERATION_NUMBER;
                    table.Cell(3, 2).Range.Text = OPERATION_DATE;
                    table.Cell(5, 2).Range.Text = START_TIME;
                    table.Cell(5, 3).Range.Text = END_TIME;
                    table.Cell(6, 2).Range.Text = OPERATOR_SURNAME;
    
                    Word.Table dataTable = document.Tables[2];
                    dataTable.Cell(3, 3).Range.Text = t1VertMin.ToString();
                    dataTable.Cell(3, 4).Range.Text = t1VertMax.ToString();
                    dataTable.Cell(4, 3).Range.Text = t1GorMin.ToString();
                    dataTable.Cell(4, 4).Range.Text = t1GorMax.ToString();
                    dataTable.Cell(5, 3).Range.Text = t2VertMin.ToString();
                    dataTable.Cell(5, 4).Range.Text = t2VertMax.ToString();
                    dataTable.Cell(6, 3).Range.Text = t2GorMin.ToString();
                    dataTable.Cell(6, 4).Range.Text = t2GorMax.ToString();
                    dataTable.Cell(7, 3).Range.Text = t3VertMin.ToString();
                    dataTable.Cell(7, 4).Range.Text = t3VertMax.ToString();
                    dataTable.Cell(8, 3).Range.Text = t3GorMin.ToString();
                    dataTable.Cell(8, 4).Range.Text = t3GorMax.ToString();
                    dataTable.Cell(9, 3).Range.Text = t4VertMin.ToString();
                    dataTable.Cell(9, 4).Range.Text = t4VertMax.ToString();
                    dataTable.Cell(10, 3).Range.Text = t4GorMin.ToString();
                    dataTable.Cell(10, 4).Range.Text = t4GorMax.ToString();
                    dataTable.Cell(11, 3).Range.Text = oMin.ToString();
                    dataTable.Cell(11, 4).Range.Text = oMax.ToString();
    
                    string SAVE_PATH = @"путь_" +
                             DateTime.Now.Day.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Year.ToString() + "_" + 
                             DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + 
                             ".doc";
                    Object pathToSaveObj = SAVE_PATH;
                    document.SaveAs(ref pathToSaveObj, Word.WdSaveFormat.wdFormatDocument, ref missingObj,
                        ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj,
                        ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj, ref missingObj,
                        ref missingObj);
                    dtEnd = DateTime.Now.Ticks;
                    File.AppendAllText(PATH, dtStart.ToString() + " " + dtEnd.ToString());
                    /*try
                    {
                        System.Diagnostics.Process[] proc = System.Diagnostics.Process.GetProcessesByName("Microsoft Word");
                        proc[0].Kill();
                    }
                    catch (InvalidCastException e)
                    {
    
                    }*/
    в ответ на: Графики Про — доработка #17111
    vg
    Участник

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

    в ответ на: Архив #17105
    vg
    Участник

    Разобрался. Действительно нужно прописывать всю логику внутрь методов подобным этому public override void OnCommandReceived(int ctrlCnlNum, Command cmd, int userID, ref bool passToClients) и выставлять условия, по которым сервер будет определять когда отрабатывать те или иные методы в модуле.

    Примерный вариант:

    public class ModTestLogic : ModLogic
        {
            public override string Name
            {
                get
                {
                    return "ModTest";
                }
            }
            public const string Path = "какой то путь";
    
            public override void OnCommandReceived(int ctrlCnlNum, Command cmd, int userID, ref bool passToClients)
            {
                // the method executes when a command has been received
                // метод выполняется после приёма команды ТУ
                if(ctrlCnlNum == 7)
                {
                    SrezTableLight snapshotTable = new SrezTableLight();
                    SrezAdapter adapter = new SrezAdapter();
                    adapter.FileName = @"C:\SCADA\ArchiveDAT\Cur\current.dat";
                    adapter.Fill(snapshotTable);
                    File.Create(Path).Close();
                    using (StreamWriter sw = new StreamWriter(Path, false, System.Text.Encoding.Default))
                    {
                        for (int i = 0; i < snapshotTable.SrezList.Count; i++)
                        {
                            sw.WriteLine(snapshotTable.SrezList.Values[i].ToString());
                        }
                    }
                    File.AppendAllText(Path, "Свободу попугаям");
                }
                WriteToLog("Process command by the module " + Name, Log.ActTypes.Action);
            }
        }

    Правда StreamWriter пока не записывает в txt-файл сохранённый(по крайней мере предполагается, что он сохранён) в таблицу срез, но это я одолею.
    Зато теперь по нажатию кнопки в веб-приложении, благодаря строке кода
    File.AppendAllText(Path, "Свободу попугаям");,

    в нужный файл добавляется текст «Свободу попугаям»!

    Ещё раз спасибо за ответы.

    в ответ на: Архив #17104
    vg
    Участник

    Может быть я просто должен ставить условия по передаваемым параметрам вроде этого?

    public SrezTableLight Table { get; set; }
            public const string Path = "какой то путь";
            public SrezTableLight ReadValue(SrezTableLight snapshotTable)
            {
                snapshotTable = new SrezTableLight();
                SrezAdapter adapter = new SrezAdapter();
                adapter.FileName = @"C:\SCADA\ArchiveDAT\Cur\current.dat";
                adapter.Fill(snapshotTable);
                return snapshotTable;
            }
    
    public override void OnCommandReceived(int ctrlCnlNum, Command cmd, int userID, ref bool passToClients)
            {
                // the method executes when a command has been received
                // метод выполняется после приёма команды ТУ
                if(ctrlCnlNum == 10)
                {
                    ReadValue(Table);
                    File.Create(Path).Close();
                    using (StreamWriter sw = new StreamWriter(Path, false, System.Text.Encoding.Default))
                    {
                        for (int i = 0; i < Table.SrezList.Count; i++)
                        {
                            sw.WriteLine(Table.SrezList.Values[i].ToString());
                        }
                    }
                }
                WriteToLog("Process command by the module " + Name, Log.ActTypes.Action);
            }
    в ответ на: Архив #17102
    vg
    Участник

    Romiros, спасибо за ответ!

    Mikhail, да, в описании отображается сообщение:
    «Серверный модуль для тестирования.»

    Немного растерялся в дальнейшей реализации.
    Если Вас не затруднит, можете пояснить передаваемые параметры в этот метод?

    public override void OnCommandReceived(int ctrlCnlNum, Command cmd, int userID, ref bool passToClients)

    int ctrlCnlNum — это номер канала, на который будет реагировать сервер?
    Command cmd — это какой то тип передаваемой команды по аналогии со «Стандартный», «Бинарный»?
    bool passToClients — какой то пароль для клиентов, не понимаю о чём речь.

    P.S.

    И даже поняв как настроить эти параметры, я не понимаю каким образом сервер будет подхватывать входные каналы из Rapid Scada.

    • Ответ изменён 5 лет, 11 месяцев назад пользователем vg.
    в ответ на: Архив #17092
    vg
    Участник

    Скачал Ваш пример выложенный на GitHub, в нём разумеется конфликтов нет, хотя даже при обновлении ссылок на библиотеки (Log и ScadaServerCommon) я всё равно не видел классов ModLogic и ModView. А по идее они лежат именно в ScadaServerCommon.dll, если я правильно понял.

    Добавил свой метод, собрал решение, закинул в папку ScadaServer/Mod. Всё прекрасно активируется. Но собственно как теперь вызвать нужный мне метод?)
    ё
    В моём случае интересует отработка методов по нажатию кнопки, то есть мне нужен метод:

    public override void OnCommandReceived(int ctrlCnlNum, Command cmd, int userID, ref bool passToClients)

    По приёму команды ТУ.

    Но ведь движок всё равно не увидит этот метод, так как он не видит Scada.Server.Modules, а следовательно и не увидит класса ModTestLogic.
    Движок видит только Scada.Server.Engine

    Очевидно, что я чего то не понимаю, но не понимаю что именно).

    P.S.
    Извиняюсь за флуд выше

    в ответ на: Архив #17091
    vg
    Участник

    В модулях при активации увидел ошибку:

    Ошибка при создании экземпляра класса интерфейса модуля ModArchTestView: Не удалось привести тип объекта «Scada.Server.Modules.ModArchTestView» к типу «Scada.Server.Modules.ModView».

    Значит нужны оба класса, но каким боком получить доступ к родительским классам не понимаю.

    в ответ на: Архив #17090
    vg
    Участник

    P.S.S.

    Мне нужен доступ только к моим функциям в созданной библиотеке.

    в ответ на: Архив #17088
    vg
    Участник

    Благодарю за разъяснение!

    Проконсультируйте пожалуйста по разработке модулей.

    Пытаюсь следовать рекомендациям с Вашего сайта. Классы SrezTable и т.д. доступны, а вот сделать мои классы наследником от ModLogic и ModView не удаётся.

    P.S.

    Если мне не нужен интерфейс модуля могу ли я оставить класс View пустым?

    • Ответ изменён 5 лет, 11 месяцев назад пользователем vg.
    в ответ на: Чтение из БД #17076
    vg
    Участник

    Есть данные, считанные из текстового файла (числа и даты), которые хочу использовать как ключи для получения информации из БД. Данные эти изменяются редко(вдруг важно).

    В общем есть представление как сделать это только через запросы, но это большая портянка с большим количеством вложенных запросов(вероятно из-за невысокого уровня в SQL), поэтому думал тут срезать углы.
    Думал сейчас просто задам WHERE = Val(1) и будет всё хорошо).

    • Ответ изменён 5 лет, 11 месяцев назад пользователем vg.
    vg
    Участник

    Благодарствую!

    в ответ на: Режим шаблонов схем #16974
    vg
    Участник

    А вы проверяли смещение каналов на новом компоненте схем «График»?

    Указал во входных каналах диапазон 2005-2012.
    Далее в аргументах представления в таблице интерфейсов прописал формулу inCnlOffset=2&ctrlCnlOffset=2.

    Не сработало. Хотя на другой схеме, в которой указаны конкретные каналы, сработало.

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