Сделать имена сигналов, поступающие из библиотечных ссылок, уникальными?

Хорошо, я боролся с этим некоторое время. Каков наилучший способ выполнить следующее:

введите здесь описание изображения

где Reaction Wheel 1-4 — ссылки на один и тот же блок в библиотеке. Когда сигналы Speed Counter, Speed Direction и Current добавляются к конечному выходу шины, как показано, MATLAB (справедливо) жалуется:

Предупреждение: сигналы 9, 10, 11, 12, поступающие в Bus Creator 'myAwesomeModel', имеют повторяющиеся имена 'Current'. Их делают уникальными, добавляя «(сигнал №)» к сигналам в результирующей шине. Пожалуйста, обновите метки сигналов, чтобы все они были уникальными.

До сих пор я использовал такое «решение»:

введите здесь описание изображения

то есть поместите блок size-1-mux/gain-of-1/other-dummy посередине, чтобы сигналы можно было переименовать во что-то уникальное. Однако мне очень хочется верить, что The MathWorks придумала лучший способ сделать это...

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


person Rody Oldenhuis    schedule 22.09.2014    source источник
comment
просто чтобы понять вопрос, вы ищете альтернативу переименованию сигналов? Вы можете создать собственный селектор шины, подсистему с маской, где вы можете выбрать количество входов и дать им имена. Как это звучит? Я думаю, что нет никакого способа обойти пустышки, вы можете просто сделать их красивее...   -  person thewaywewalk    schedule 22.09.2014
comment
Другим вариантом будет перегруппировка, просто создайте шины RW1, RW2... и назначьте ток. Тогда бы они имели имя RW1.Current, RW2.Current...   -  person thewaywewalk    schedule 22.09.2014
comment
@thewaywewalk: в приведенном выше примере каждая модель RW выводит свою собственную шину (Data Output). Из каждой из этих шин я выбираю только 3 сигнала (поэтому имена сигналов, показанные в селекторах шин, действительно RW1.Current и похожи, как вы говорите). Однако, если вы хотите снова сгруппировать такие сигналы в новую шину, MATLAB жалуется на идентичные имена сигналов либо на входе шины (с отдельными селекторами шин, подключенными к создателю шины, как на рисунке), либо на выходе шины ( если вы подключите RW1-4 напрямую к создателю шины и проверите вывод как шину, я не вижу способа обойти это без манекенов...   -  person Rody Oldenhuis    schedule 22.09.2014
comment
Согласен, выхода нет. Это даже становится уродливее, если вы хотите отобразить system">динамическое количество сигналов в области видимости. Но, кажется, вы не собираетесь этого делать? Так что, если это постоянное количество портов, просто создайте подсистему со всеми своими манекенами и больше не думайте об этом;)   -  person thewaywewalk    schedule 22.09.2014
comment
Относительно этого предложения: если вы подключите RW1-4 напрямую к создателю шины и проверите выход как шину. У создателя шины нет опции, вы, вероятно, схватили селектор шины. Попробуйте это с создателем автобуса.   -  person Daniel    schedule 04.11.2014
comment
@ Даниэль, да, небрежный комментарий, извините за это. Смотрите мой комментарий к вашему ответу.   -  person Rody Oldenhuis    schedule 04.11.2014
comment
Сегодня я столкнулся с той же проблемой. Ваш вопрос прекрасно отражает проблему. Вы уже нашли лучший обходной путь/решение?   -  person mmumboss    schedule 16.02.2016
comment
@mmumboss нет, к сожалению, нет. Я все еще делаю это уродливым способом, изображенным выше, и просто прячу его в виртуальной подсистеме.   -  person Rody Oldenhuis    schedule 16.02.2016


Ответы (2)


Это было довольно сложно для меня, но, похоже, я с этим справился. Matlab R2007a здесь. Сделаю пример с уже готовой подсистемой, с ее входами, выходами,...

1- В свойствах блока добавьте тег к блоку. Это будет сделано для идентификации блока и его «братьев» в системе. MY_SUBSYSTEM для этого примера.

2- Снова заблокируйте свойства. Добавьте следующий фрагмент в обратный вызов CopyFcn:

%Find total amount of copies of the block in system

len = length(find_system(gcs,'Tag','MY_SUBSYSTEM'));

%Get handle of the block copied/added and name the desired signal accordingly   

v = get_param(gcb,'PortHandles');                                     
set(v.Outport(_INDEX_OF_PORT_TO_BE_RENAMED_),'SignalNameFromLabel',['BASENAME_HERE' num2str(len)]);

3- В _INDEX_OF_PORT_TO_BE_RENAMED_ вы должны указать индекс сигнала порта (начиная с 1), который вы хотите переименовать для каждой копии блока. Для одного выходного блока это должно быть 1. BASENAME_HERE должно быть базовым именем порта, в данном случае «Текущий» для вас.

4- Добавьте блок в нужную библиотеку и удалите экземпляр, который вы использовали для создания этого примера. С этого момента, когда вы добавляете из библиотеки или копируете существующий блок, выходной порт должен называться Current1, Current2, Current3 и т. д. Обратите внимание, что вы можете применить любое соглашение или форматирование.

Надеюсь это поможет. Это сработало для меня, не стесняйтесь спрашивать/критиковать!

Примечание. Очевидно, что по мере роста модели этот метод может быть требовательным к компьютеру, поскольку find_system придется перебирать всю модель в цикле, однако мне кажется, что это хороший обходной путь в системах малого и среднего размера.

person Manex    schedule 30.10.2014
comment
Спасибо :) Мне нравится хороший хак, но вы должны признать, что это просто не может быть тем, что Mathworks считает лучшим способом проектирования ваших систем ... +1, хотя за усилия и улыбку на моем лице. - person Rody Oldenhuis; 04.11.2014
comment
Что ж, это просто хак с простым соглашением об именах, я полагаю, что отсутствие у меня глубокого опыта работы с большими моделями и дополнительными современными технологиями, помимо R2007a, не позволяет мне видеть дальнейшие подводные камни... :-) - person Manex; 04.11.2014

Подключите селектор шины к каждому выходу данных. Выберите нужные сигналы и установите «Выход как шина». Затем подключите все селекторы шин к создателю шины.

модель Simulink

person Daniel    schedule 31.10.2014
comment
Как обсуждалось в комментариях, это не работает: вы по-прежнему помещаете неуникальные имена сигналов в одну шину. В лучшем случае это только отложит проблему где-то за пределами этой подсистемы (что, возможно, даже хуже). - person Rody Oldenhuis; 04.11.2014
comment
Он создает структурированную шину с именами сигналов, такими как rw1.current, имена уникальны. - person Daniel; 04.11.2014
comment
Хорошо, позвольте мне перефразировать: вы правы, это работает, но только на этом уровне. Однако, когда вы подключаете эту выходную шину к другому селектору шины, выбираете rw1.speed и rw2.speed из сигналов и выбираете опцию Output as bus, структура не переносится на новую шину, и вы получаете предупреждение. Модель выше маленькая, мои реальные модели огромны, и количество сигналов действительно оправдывает второй вариант Output as bus. Поэтому я действительно предпочитаю иметь действительно уникальные имена без какого-либо риска конфликтов имен. - person Rody Oldenhuis; 04.11.2014