Показано с 1 по 4 из 4

Тема: ФБ C# как организовать не блокирующую задержку внутри скрипта?

  1. #1

    По умолчанию ФБ C# как организовать не блокирующую задержку внутри скрипта?

    Пытаюсь выполнить следующий код в ФБ, ожидаю что значения переменной на выходе будет меняться с интервалами времени в 2 сек. При выполнении значение на выходе постоянно одно - "2".
    public partial class ФБ : ScriptBase
    {
    public override void Start()
    {
    Параметр1=1;
    WaitNSeconds(2);
    Параметр1=2;
    WaitNSeconds(2);
    }
    private static void WaitNSeconds(int segundos)
    {
    if (segundos < 1) return;
    DateTime _desired = DateTime.Now.AddSeconds(segundos);
    while (DateTime.Now < _desired)
    {
    //System.Windows.Forms.Application.DoEvents();
    }
    }
    }

  2. #2

    По умолчанию

    Вы ерунду написали.
    Во первых метод Start вызывается один раз при старте скады.
    Во вторых нельзя вызывать такие бесконечные циклы.

    Вам нужно сделать у ФБ периодический опрос, в методе Execute когда вы запускаете ваш таймер, прибавить к текущему времени нужное количество секунд и выйти из метода. В следующем заходе проверяете включен ли ваш таймер и не достигло ли текущее время заданного
    Спасибо.

  3. #3

    По умолчанию

    Цитата Сообщение от SCADAMaster Посмотреть сообщение
    Вы ерунду написали.
    Во первых метод Start вызывается один раз при старте скады.
    Во вторых нельзя вызывать такие бесконечные циклы.

    Вам нужно сделать у ФБ периодический опрос, в методе Execute когда вы запускаете ваш таймер, прибавить к текущему времени нужное количество секунд и выйти из метода. В следующем заходе проверяете включен ли ваш таймер и не достигло ли текущее время заданного
    Возможно я не достаточно понятно обозначил проблему. Теперь пишем не ерунду:

    public partial class ФБ : ScriptBase
    {
    static PreciseTimer timer = new PreciseTimer();
    public override void Execute()// значения 1 2 1 2 1 2 с указанной задержкой
    {
    Параметр1=1;
    timer.Wait(2*100*100*100);//Ждем 2 секунды
    Параметр1=2;
    timer.Wait(2*100*100*100);
    }
    }
    public class PreciseTimer
    {
    IntPtr _timerHandle;

    public PreciseTimer()
    {
    _timerHandle = CreateWaitableTimer(IntPtr.Zero, false, null);
    }

    public bool Wait(long microseconds)
    {
    // задаётся 100-наносекундными интервалами
    long time = -microseconds * 10;
    if (SetWaitableTimer(_timerHandle, ref time, 0, IntPtr.Zero, IntPtr.Zero, false))
    {
    int result = WaitForSingleObject(_timerHandle, INFINITE);
    if (result == 0)
    return true;
    }
    return false;
    }

    const uint INFINITE = 0xFFFFFFFF;

    [DllImport("kernel32.dll")]
    static extern IntPtr CreateWaitableTimer(IntPtr lpTimerAttributes,
    bool bManualReset,
    string lpTimerName);

    [DllImport("kernel32.dll")]
    static extern bool SetWaitableTimer(IntPtr hTimer,
    ref long pDueTime,
    int lPeriod,
    IntPtr pfnCompletionRoutine,
    IntPtr lpArgToCompletionRoutine,
    bool fResume);

    [DllImport("kernel32.dll")]
    static extern int WaitForSingleObject(IntPtr handle, uint milliseconds);
    }

    В VS этот алгоритм отрабатывает. Мне нужны временные задержки, которые не будут блокировать выполнение основного потока.
    Пока получаю такое сообщение : Зависание рабочего потока ID=10300 - Объект 1 : Выполнение Объект 1.Скрипт : Разрушительный сбой

  4. #4

    По умолчанию

    Мы вам объяснили как сделать в прошлом сообщении
    Периодический опрос у ФБ, и Execute сравниваете сохраненное время с текущим
    Спасибо.

Похожие темы

  1. Ответов: 5
    Последнее сообщение: 05.03.2018, 15:28
  2. Ответов: 10
    Последнее сообщение: 31.10.2017, 20:59
  3. ТРМ 251 сделать временную задержку
    от pan1 в разделе Эксплуатация
    Ответов: 6
    Последнее сообщение: 06.04.2016, 15:34
  4. Как сделать временную задержку на ST?
    от Starikov Alexander в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 09.02.2010, 13:22

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •