Использование Synchro-блоков
Мы уже видели, что не все блоки модели Scicos должны активизироваться. Мы также знаем, что модель может иметь два независимых источника активации, управляющих разными блоками. Другая ситуация возникает, когда активация необходима во многих точках схемы.
Когда два блока активизированы одним источником активации (например одним генератором событий), мы говорим, что они синхронизированы. В этом случае, у них одинаковые времена активации, и если выход каждого подключен к входу другого, то компилятор знает, что блоки исполняются в правильном порядке. Два блока, активизированные двумя независимыми часами в одно и то же время не синхронизированы. Даже при том, что у этих часов одинаковые параметры. Дело в том, что они могут быть активизированы симулятором в любом порядке.
С другой стороны, два активирующих сигнала могут быть синхронными, но не быть одновременными. Например, моменты одной активация могут быть подмножеством моментов другой активации (активация с кратными частотами). В этом случае, часть событий, сформированных тактовым генератором с более высокой частотой, одновременна с событиями низкочастотного тактового генератора. Но и в этом случае оба сигнала (с высокой и низкой частотами) должны быть порождены одним генератором, иначе они будут не синхронны. Т.е. необходимо убедиться, что низкочастотная активация получена из высокочастотной.
Рассмотрим еще один пример. Здесь блок синхронизации маршрутизирует события, поступившие на входной порт активации между выходными портами активизации. Выбор выходного порта активации зависит от величины сигнала на основном входе блока.
«If-then-else» направляет поступающий сигнал активизации (в этом случае он поступает с часов) на один из своих выходных портов активизации. Если входной сигнал (то есть выходной сигнал блока random generator), положительный, сигнал активации от часов поступает в первый выходной порт активизации, в противном случае – во второй. Генератор шума формирует случайную последовательность. Параметры блока определяют статистические свойства случайной переменной. Блок генератора прямоугольных волн выдает свой сигнал на выход, изменяя свое внутреннее состояние в момент активации.
Выберем опцию Gaussian для шумового генератора. Модифицируем параметры MScope, чтобы получать 3 входа.
Результат для периода часов 2 с показан ниже.
Создадим новую схему. Рассмотрим теперь цикл событий с условием, например счетчик, который останавливается при нулевом результате. Здесь есть специфические проблемы.
Компилятор выдает сообщение: algebraic loop. Эта модель неприемлема. Проблема здесь в том, что для решения, на какой порт If-then-else-блок должен направлять поступающее активационное событие, нам нужно знать величину выхода 1/z-блока. Но этот выход зависит от поступления события (или не поступления) из If-then-else-блока. Возникает неопределенность, которая называется алгебраический цикл (algebraic loop).
Может показаться, что 1/z-блок – это просто в некотором отношении блок задержки и он должен прервать цикл. Но это не так. Причина - в том, что функции 1/z-блока реализуются следующим образом.
Структура 1/z-блока
Из схемы видно, что когда 1/z-блок активизирован, содержимое памяти подается на выход, а затем входной сигнал копируется в память. Таким образом, нет непосредственной связи входом и выходом, а есть между входным сигналом активизации и выходом. Но для того, чтобы прервать цикл, нам нужно иметь выход MEMORY доступным за пределами блока. Это не возможно в данном блоке. Поэтому в Scicos есть специфический блок Mem (в палитре Others), который позволяет это сделать. Создадим новую схему.
Эта схема успешно проходит компиляцию.
Если мы в начале запишем в блок Mem положительное число, то при каждом такте часов активации эта величина уменьшается на единицу пока не станет равна нулю. При этом сигналы часов переключаются в неподключенный выходной порт активизации синхронизатора. Счетчик останавливается.
Запустим модель.
В Mem записано 10. Работа продолжается до конечного времени моделирования. Можно остановить моделирование, когда достигнут ноль, соединением порта else с блоком Stop (палитра Event).
Что такое Event Clock?
Может показаться, что Event Clock (часы активации) не являются основным блоком Scicos. Event Clock являются существенным элементом любой модели Scicos. Это скомпилированный суперблок. Во многих отношениях он подобен основному блоку, вот почему для него используется термин блок или блок Scicos.
Выходной сигнал активации блока Synchro не задержан по времени. Но блок Baisc в Scicos может генерировать задержанные события. Это та особенность, которая использована в Event Clock.
Создадим следующую схему. Блок Delay (или точнее говоря, event delay block) находится в палитре Events.
Блок Delay имеет два параметра. Первый определяет задержку между поступающим и исходящим событием, второй – время начала генерации событий. Если это время отрицательно, то блок первоначально не генерирует событие. Это означает, что в этой ситуации модель остается замороженной во времени. Во многих ситуациях установка времени начала генерации не нужна.
Установим параметры блока Delay (delay = 1 и initial firing time = 5) и запустим модель. Видно, что зацикленный блок задержки ведет себя как an Event Clock.
Теперь создадим блок из полученных часов. Для этого сформируем следующую схему.
Эта схема не может быть запущена. Она не является моделью Scicos, это скорее, внутренность суперблока. Наша задача преобразование этой схемы в блок, то есть компиляция суперблока.
Сохраним его как функцию сопряжения (Interfacing или GUI – графического интерфейса пользователя) под именем myclk.
Это можно сделать, используя команду Save as Interfacing function в меню File.
Каждый блок в Scicos имеет функцию сопряжения (или графического интерфейса пользователя). Эта функция Scilab определяет все свойства блока (размер, цвет, параметры, интерфейс пользавателя, начальные условия и т.д.) и имя вычислительной функции, которая определяет математические свойства блока (например, вычисляет выходной сигнал по входному сигналу). Вычислительная функция обычно пишется на C или Fortran’е для обеспечения вычислительной эффективности, но может также быть записана в Scilab. Связывающая функция является всегда функцией Scilab.
Сохранение схемы в форме связывающей функции, ассоциирует ее с блоком, который должен включать схему. Количество входов и выходов блока определяется количеством входных выходных портов на схеме (как основных, так и активационных) и т.п.
Загрузим новый блок в пустое окно. Воспользуемся кнопкой Add new block меню Edit.
Это созданные часы события. Параметры скомпилированного суперблока просто объединение всех параметров блоков в пределах этого суперблока. При компиляции суперблока, связывающая функция сгенерирована таким образом, что когда блок щелчком мыши открыт для установки (open/set), параметры блоков в пределах суперблока могут быть установлены один за другим. В некоторых случаях это не удобно. Для того, чтобы модифицировать интерфейс пользователя, Interfacing function может быть отредактирована вручную.