201302260933


Таймеры

До сих пор, в основном, мы работали с простейшим алгоритмом "главного цикла контроллера":

  0 настроить устройство (SETUP).
  1 читать входы.
  2 посчитать выходы на основе собранной на входах информации.
  3 подать на выходы полученные в пункте 2 данные.
  4 идти к пункту 1.

Если нужно было замедлить прохождение пункта 2, выполнялась "бесполезная работа". Здесь на пользу приходили так называемые "side effects", или как запомнить информацию hit et nunc*. Вспомним, что в симуляторе Siemens Logo! v.7 для этого мы использовали "доморощенный" элемент (блок) DD на основе "штатного" реле RS.
 
Однако нам должен быть знаком и другой элемент регулирования скорости работы симуляции, причем она не будет зависеть ни от быстродействия компьютера, ни от модели контроллера Siemens Logo ! - это блок "асинхронный генератор импульсов". В контроллерных чипах это очень существенный момент - а именно переход от бесконечной прокрутки (polling) к работе от прерываний.
 
Чтобы не тратить впустую драгоценную энергию аккумулятора (батарейки), можно положить чип "спать", оставив работать экономичные внутренние часы (таймер), способные его "разбудить" (прерывание таймера), или довериться внешнему событию (солнце поднимется выше, лед растает, лягушка очнется) - например, это может быть прерывание от нажатия кнопки. Здесь прерывается "нормальный" режим работы - обычно это цикл, либо команда SLEEP.
 
При работе с чипом напрямую, программа использующая прерывания почти всегда сложнее кода с непрерывным опросом входов (polling - "пропалывающей белки в колесе"**). Для снижения сложности написания таких программ можно предложить по-крайней мере два решения:
   
  - правильное деление на модули + минимизация входных/выходных данных каждого модуля (повышение функциональности модуля)
  
  - открытый исходный код: не достаточно возможностей для использования модуля через интерфейс (containersip)? - можно его унаследовать (inherit), полностью разобраться (не всегда возможно по предоставленной документации) в его работе, а затем слегка изменить код или вовсе отказаться от него написав собственный. Если лицензия требует от Вашего кода такого же открытого использования, как для исходной программы - обычно эмоционально управляемый программист стесняется показать миру "грязное" или "неудобное" решение. Нарушение же требований лицензионного соглашения обычно регулируется механизмом нарушения прав и законов ("насильственными" внешними действиями), потому что лицензия это юридический документ.
 
----

  *)  здесь и сейчас; лат. hic et nunc — характеристика отношения субъекта и пространства-времени. 
       
      http://ru.wikipedia.org/wiki/Здесь_и_теперь
      
  **) шутка основана на том, что полоть грядки вручную - работа весьма энергоемкая.
