Текущий раздел:

Описания RDS

Описание пользователя

Глава 3. Использование стандартных модулей автокомпиляции

§3.6. Принципы создания автокомпилируемых моделей блоков

§3.6.2. Работа со статическими переменными блока

§3.6.2.8. Использование выходов с управляющими переменными

# Описание пользователя

## Глава 3. Использование стандартных модулей автокомпиляции

### §3.6. Принципы создания автокомпилируемых моделей блоков

#### §3.6.2. Работа со статическими переменными блока

##### §3.6.2.8. Использование выходов с управляющими переменными

Описывается использование управляющих переменных, которые позволяют либо запретить передачу по связям значения конкретного выхода блока, либо активировать только связь, подключенную к конкретному элементу выхода-массива.

В §3.6.2.6 описывается использование второй сигнальной переменной блока (выхода «Ready») для запрещения срабатывания всех связей, подключенных к выходам блока в конце такта расчета. Перед выполнением реакции модели на такт расчета RDS присваивает этой переменной единицу, поэтому, если в модели не предпринять никаких действий, значения всех выходов блока будут переданы по связям на входы блоков, соединенных с ним. Если модель запишет в эту переменную ноль, данные передаваться не будут. Обычно модель блока запрещает работу выходных связей в тех случаях, когда значения на выходах блока не изменились, и нет смысла передавать их дальше, запуская тем самым модели соединенных блоков и зря тратя процессорное время.

Управление сигналом «Ready» позволяет запретить работу только всем выходным связям одновременно – это не всегда удобно. RDS позволяет разрешать и запрещать выходные связи индивидуально. Это может оказаться полезным при при создании различных блоков-выключателей и демультиплексоров, управляющих передачей данных со входа на один или несколько выходов. В §3.6.2.3 рассматривался простой демультиплексор – в нем значение, поступавшее на вход, передавалось на выход с номером, определяемым дополнительным целым входом. Однако, в том блоке все равно срабатывали все выходные связи – это не мешало его работе, потому что «неактивные» выходы просто еще раз передавали по связям свои старые значения. Тем не менее, это приводило к напрасному срабатыванию моделей во всех цепочках подключенных к этим выходам блоков и лишней трате процессорного времени. Далее мы исправим модель так, чтобы в конце такта расчета срабатывала только связь, подключенная к выходу с нужным номером.

Чтобы разрешать и запрещать передачу данных отдельного выхода блока, необходимо ввести в его структуру переменных дополнительную логическую или целую переменную и связать с ней выход, задав для него тип «выход/логическая» вместо «выход» и указав имя этой дополнительной переменной. Если выход связан с логической переменной, то связи, подключенные к нему, будут передавать данные только в том случае, если связанная логическая переменная будет иметь значение 1. Разумеется, сигнал «Ready» также должен быть равен единице, иначе ни одна выходная связь блока не сработает независимо от значений управляющих логических переменных отдельных его выходов. Если выход блока является массивом, можно связать его с целой дополнительной переменной – в этом случае будет разрешена работа связей, подключенных ко всему массиву как к одной сложной переменной и к элементу массива с номером, определяемым этой целой переменной. Связи, подсоединенные к элементам массива с номерами, отличными от значения целой связанной переменной, будут отключены.

Для иллюстрации управления отдельными связями создадим блок-переключатель, который будет выдавать свой вещественных вход «x» на выход «y0», если целый вход «N» будет равен 0, на выход «y1», если «N» будет равен 1, и на оба выхода одновременно для любого другого значения «N» (подобная модель рассматривается в §2.5.8 руководства программиста). Для управления выходом «y0» введем внутреннюю логическую переменную «L0», для управления «y1» – «L1». Блок будет иметь следующую структуру переменных:

Имя | Тип | Вход/выход | Пуск | Начальное значение
--- | --- | --- | --- | ---
Start | Сигнал | Вход | ✓ | 1
Ready | Сигнал | Выход |  | 0
x | double | Вход | ✓ | 0
N | int | Вход | ✓ | 0
L0 | Логический | Внутренняя |  | 0
L1 | Логический | Внутренняя |  | 0
y0 | double | Выход/логический «L0» |  | 0
y1 | double | Выход/логический «L1» |  | 0

Создадим новый блок с автокомпилируемой моделью, зададим для него запуск по сигналу и введем в его модель указанную выше структуру переменных. На вкладке «модель» в правой части окна редактора введем следующий текст:

      y0=y1=x; // Копирование входа в оба выхода
      switch(N)
        { case 0: // N==0 – разрешить y0 через L0
            L0=1; L1=0; break;
          case 1: // N==1 – разрешить y1 через L1
            L0=0; L1=1; break;
          default: // Разрешить обе связи
            L0=L1=1;
        }

В этой модели мы сразу копируем вход x и в y0, и в y1. Если бы мы не управляли выходными связями индивидуально, это привело бы к тому, что, независимо от N, блок передавал бы значение входа на оба выхода. Однако, далее, в операторе switch, в зависимости от значения N, мы присваиваем единицу или ноль управляющим логическим переменным L0 и L1. При нулевом N единица будет только в L0 – работа связи, отходящей от y0, будет разрешена, а от y1 – запрещена. При N==1 единица будет только в L1 – будет разрешена только связь от y1. При любом другом значении N (метка default в операторе switch) и L0, и L1 получат значение 1, что разрешит обе выходных связи.

Рис. 386. Проверка переключателя

Для тестирования модели соберем схему, изображенную на рис. 386. Запустив расчет и изменяя значение в поле ввода, подключенном к «x», можно наблюдать появление этого же значения на индикаторе, подключенном к выходу, соответствующему значению «N». При этом, если остановить расчет, открыть окно параметров блока и просмотреть текущие значения его переменных на вкладке «переменные» (рис. 387), можно заметить, что, несмотря на то, что значения на индикаторах разные, значения обоих выходов блока одинаковые. Значение одного из выходов не передается в индикатор по связи из-за нулевого значения связанной с этим выходом управляющей переменной.

Рис. 387. Текущие значения переменных блока-переключателя

Вернемся теперь к описанной в §3.6.2.3 модели демультиплексора и соберем с его использованием новую схему, изображенную на рис. 388. Она отличается от старой схемы с рис. 374 тем, что каждая связь, идущая от выхода блока к индикатору, теперь разветвляется, и вторая ее ветвь подключается к сигнальному входу счета «C» стандартного счетчика сигналов. В RDS к сигнальным входам можно подключать связи не только сигнального типа: в этом случае входу будет присваиваться единица при срабатывании связи, какое бы значение при этом по ней ни передавалось.

Рис. 388. Новая схема тестирования демультиплексора

Запустив расчет и изменяя значение в поле ввода, подключенном к входу «x» демультиплексора, можно будет видеть, что срабатывает не только счетчик, подключенный к связи, отходящей от выхода блока с нужным номером, но и некоторые другие. Например, на рис. 388, несмотря на то, что N==1, при изменении значения в поле ввода «x» будет увеличиваться значение не только на счетчике, подключенном к выходу «Y[1]», но и на счетчике, подключенном к «Y[0]». Значение счетчика, подключенного к «Y[2]» изменяться не будет только по той причине, что в нашей модели мы изменяем размер выходного массива «Y» только при необходимости, и пока «N» не окажется большим или равным двум, элемент массива «Y[2]» просто не будет существовать, а, значит, и связь от этого элемента сработать не сможет. Мы наблюдаем вполне ожидаемую картину: независимо от того, что происходит внутри блока и в какой именно элемент массива он записывает значение своего входа, срабатывают все выходные связи этого блока.

Теперь изменим структуру переменных блока, связав его выход «Y» с целой управляющей переменной «N» (несмотря на то, что переменная целая, роль переменной «Y» в выпадающем списке все равно будет называться «выход/логический»):

Имя | Тип | Вход/выход | Пуск | Начальное значение
--- | --- | --- | --- | ---
Start | Сигнал | Вход | ✓ | 1
Ready | Сигнал | Выход |  | 0
x | double | Вход | ✓ | 0
N | int | Вход | ✓ | 0
Y | Массив double | Выход/логический «N» |  | [ ] 0

Других изменений в модель блока вносить не нужно, и программа на вкладке «модель» редактора останется той же самой. Мы просто сделали вход «N» управляющей целой переменной для выходного массива «Y», и теперь из всех связей, подключенных к элементам «Y», будет срабатывать только та, которая отходит от элемента с номером, равным текущему значению «N». Теперь при запуске расчета и изменении значения в поле ввода «x» считать будет только один единственный счетчик – связи, подключенные к остальным, срабатывать не будут.