# task

Управляет организацией процесса выполнения модулей. Задача - это отдельный поток (thread), у которого есть список модулей, которые требуется выполнять с заданной периодичностью.

    module.taskMain:
      enable:   on
      period:   1000
      modules:
           _set(taskB,1)
           _set(taskA,1)
           _wait(taskA,2)
           _wait(taskB,2)
           SHDSH
           _sleep(100)
           _set(taskA,3)
           _wait(taskA,4)

    module.taskA:
      enable:   on
      period:   0
      modules:
           _wait(1)
           plci1
           prks1
           pdat1
           _set(2)
           _wait(3)
           plco1
           _sleep(100)
           _set(4)

    module.taskB:
      enable:   on
      period:   0
      modules:
           _wait(1)
           icp1
           icp2
           _set(2)

Параметр | Умолчание | Описание
--- | --- | ---
delayStart | - | задержка начала выполнения задачи при старте приложения, мс
period | - | период выполнения одного цикла, мс
modules | - | список имен модулей, команды синхронизации и задержки

При подаче команды start все модули плагина task инициализируются и создают отдельные потоки, в который с заданной периодичность вызываются модули в указанной последовательности. После подачи команды stop потоки уничтожаются.

## Синхронизация

Модули задач (или потоки) могут работать как независимо друг от друга, так и синхронно. Для этого каждая задача имеет внутреннюю переменную, доступную для чтения и записи другими задачами. Команды работы с данной переменной помещаются в список `modules`:

_set(value) | установить значение собственной переменной
_set(task, value) | установить значение переменной другой задачи

Команды установки могут принимать только положительные значения (от 0 включительно и выше). Изначально переменные инициализируются в 0.

_wait(value) | ожидание заданного значения собственной переменной
_wait(task, value) | ожидание заданного значения переменной другой задачи

Ожидание чужой переменной длится не более заданного времени period, если собственный period больше 0. При превышении времени ожидания (тайм-ауте), в переменную записывается значение -1, ожидание прекращается, задача переходит к выполнению следующей позиции в списке modules. Если же period равен 0, ожидание длится неопределенно долго.

Ожидание собственной переменной всегда длится неопределенно долго. Если в процессе ожидания в собственной переменной появляется не желаемое значение, а -1, то ожидание прекращается, и задача продолжает свое выполнение.

Значение -1 устанавливается и сбрасывается автоматически, исключая взаимоблокировки задач. Его нельзя использовать при конфигурировании с командами _set и _wait.

## Другие команды

_sleep(ms) | задержка выполнения задачи в мс

## Теги

running | состояние
statebaton | синхронизационный тег (используется только для отладки)
timecounter | кол-во отработанных циклов
timecycle | время рабты последнего цикла, мс
timetotal | общее время работы, мс