Запуск команды КП по таймеру или времени

Стартовая страница Форумы Разработка и интеграция Запуск команды КП по таймеру или времени

Просмотр 2 сообщений - с 1 по 2 (из 2 всего)
  • Автор
    Сообщения
  • #7378
    Kazam
    Участник

    Добрый день! Если у вас возникает проблема запуск команды ТУ по графику, но нет возможности использовать модуль Автоматического управления, можно поступить так:
    Берем тестовый модуль и изменяем код:

    Объявим класс UkutsScheduler

        public class UkutsScheduler
        {
            public void Start(string ctrlNum, string Name, string CronString)
            {
                Random rn = new Random();
                int interval = rn.Next(10,58);     
                ISchedulerFactory sf = new StdSchedulerFactory();
                IScheduler scheduler = sf.GetScheduler();
                scheduler.Start();
         
                IJobDetail job = JobBuilder.Create<StartJobArchive>().Build();
               
                job.JobDataMap.Add("ctrlNum",ctrlNum);
    
                    ITrigger trigger = TriggerBuilder.Create()  // создаем триггер
                        .WithIdentity("trigger" + ctrlNum, "group1")     // идентифицируем триггер с именем и группой
                        .StartNow()                                           // запуск сразу после начала выполнения
                          .WithSimpleSchedule(x => x
                            .WithIntervalInMinutes(interval)
                            .RepeatForever())
                        .Build();                               // создаем триггер
    
                    scheduler.ScheduleJob(job, trigger);        // начинаем выполнение работы
                scheduler.ResumeJob(job.Key);
            }
        }
     public class StartJobArchive : IJob
            {
                void IJob.Execute(IJobExecutionContext context)
                {
                    Log.WriteLineDelegate writeToLog;
                    writeToLog = text => { }; // заглушка
                    CommSettings cm = new CommSettings("localhost",10000,"ScadaApi","ScadaApi", 10000);
                    ServerComm sc = new ServerComm(cm, writeToLog);
                    sc.SendBinaryCommand(0, Convert.ToInt32(context.JobDetail.JobDataMap.Get("ctrlNum")), new byte[] { 0x00, 0x00 }, out bool result);
                    sc.Close();
                }
            }

    Используем так:
    ` UkutsScheduler US = new UkutsScheduler();
    US.Start(CtrlNum, «NameKP», «cron string»);
    log.WriteAction(«Триггер №: «+NV.Get(key) + » запущен в работу»);`

    Используем библиотеку Quartz.Net для запуска задач. Реализуем класс StartJobArchive, где описывается метод Execute который непосредственно отправляем команду (номер канала управления передается через IJobExecutionContext).

    В примере используется генератор псевдослучайных чисел который генерируется в пределах 10,58 минут. Что и передается в интервал триггера.

    Обратите внимание что, есть переменная CronString в которую можно передать Cron запись периода и немного изменить код создания триггера. Ибо Quartz.Net умеет такой синтаксис.

    #7382
    Mikhail
    Модератор

    Добрый день!

    Можно конечно, но гораздо лучше поддержать проект Rapid SCADA и приобрести модуль, который вполне доступен по цене ))

Просмотр 2 сообщений - с 1 по 2 (из 2 всего)
  • Вы должны авторизироваться для ответа в этой теме.