2014-09-22 21 views
6

OK, ich habe mich eine Weile mit diesem Problem herumgeschlagen. Was ist der beste Weg, die Folgendes zu erreichen:Müssen Signalnamen, die von Bibliotheksverbindungen kommen, eindeutig sein?

enter image description here

wo Reaction Wheel 1-4 sind Links zu dem gleichen Block in einer Bibliothek. Wenn die Speed Counter, Speed Direction und Current Signale an die endgültige Busausgang hinzugefügt werden, wie gezeigt, MATLAB (Recht) beschwert:

Warning: Signale 9, 10, 11, 12 Bus Creator Eingabe 'myAwesomeModel Namen haben dupliziert 'Strom'. Diese werden eindeutig gemacht durch Anhängen von "(Signal #)" an die Signale innerhalb der resultierenden Bus. Bitte aktualisieren Sie die Beschriftungen der Signale so, dass sie alle eindeutig sind.

Bis jetzt habe ich eine "Lösung" wie diese habe mit:

enter image description here

das heißt, legen Sie eine Größe-1-Mux/Gewinn-of-1/other-Dummy-Block In der Mitte können die Signale in etwas Einzigartiges umbenannt werden. Allerdings glaube ich wirklich, dass The MathWorks über einen besseren Weg nachgedacht hat ...

Was ist der "richtige" Weg, Bussignale so zu konstruieren? Es fühlt sich eher wie ich eine bestimmte Design/Architektur anzunehmen geschoben bin zu werden, aber was genau das ist, entzieht sich mir für den Moment ...

+0

nur die Frage zu verstehen, Sie suchen nach einer Alternative, die Signale zu benennen? Sie könnten eine benutzerdefinierte Busauswahl erstellen, ein Subsystem mit einer Maske, in der Sie die Anzahl der Eingaben auswählen und ihnen Namen geben können. Wie klingt das? Ich denke, es gibt wirklich keinen Weg um Dummys, man kann sie einfach hübscher aussehen lassen ... – thewaywewalk

+0

Eine andere Option wäre das Umgruppieren, einfach die Busse "RW1", "RW2" erstellen ... und einen Strom zuweisen. Sie hätten dann den Namen 'RW1.Current',' RW2.Current' ... – thewaywewalk

+0

@thewaywewalk: Im obigen Beispiel gibt jedes 'RW'-Modell seinen eigenen Bus (' Data Output') aus. Von jedem dieser Busse wähle ich nur 3 Signale aus (die Signalnamen, die in den Busselektoren angezeigt werden, sind in der Tat "RW1.Current" und ähnlich, wie Sie sagen). Wenn Sie solche Signale jedoch erneut in einem neuen Bus gruppieren wollen, beschwert sich MATLAB über identische Signalnamen, entweder am Buseingang (mit einzelnen Buswählern wie in der Abbildung mit einem Buserzeuger verbunden) oder am Busausgang (Wenn Sie 'RW1-4' direkt an einen Bus-Ersteller anschließen und" Ausgabe als Bus "überprüfen, sehe ich keinen Weg ohne Dummies ... –

Antwort

1

Es war für mich eine ziemliche Herausforderung, aber sieht aus wie ich es irgendwie aussortiert . Matlab R2007a hier. Ich mache das Beispiel mit einem bereits fertiggestellten Subsystem mit seinen Eingängen, Ausgängen, ...

1- Fügen Sie in den Blockeigenschaften dem Baustein eine Variable hinzu. Dies wird durchgeführt, um den Block und seine "Geschwister" unter dem System zu identifizieren. MY_SUBSYSTEM für dieses Beispiel.

2- Blockeigenschaften erneut. Fügen Sie den folgenden Code-Schnipsel in CopyFcn Rückruf:

%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- In _INDEX_OF_PORT_TO_BE_RENAMED_ sollten Sie den Port Signalindex setzen (ab 1), die Sie für jede Kopie des Blocks umbenannt werden sollen. Für einen einzelnen Ausgabeblock sollte dies 1 sein. BASENAME_HERE sollte der Port-Basisname sein, in diesem Fall "Current" für Sie.

4- Fügen Sie den Block der gewünschten Bibliothek hinzu und löschen Sie die Instanz, die Sie zum Erstellen dieses Beispiels verwendet haben. Von da an sollte der Outport beim Hinzufügen aus der Bibliothek oder beim Kopieren eines vorhandenen Blocks Current1, Current2, Current3 usw. benennen. Beachten Sie, dass Sie eine Konvention oder Formatierung anwenden können.

Hoffe, das hilft. Es hat für mich funktioniert, zögere nicht zu fragen/zu kritisieren!

Hinweis: Natürlich, da das Modell wächst, kann diese Methode Computer anspruchsvoll wie find_system eine Schleife durch das gesamte Modell haben wird, sieht jedoch wie eine gute Abhilfe für mich in kleinen und mittleren Systemen.

+0

Danke :) Ich mag gute hack, aber Sie müssen zugeben, dass dies einfach nicht sein kann, was die Mathworks denkt, ist der beste Weg, um Ihre Systeme zu entwerfen ... + 1 obwohl für die Mühe, und das Lächeln auf meinem Gesicht. –

+0

Nun, es ist nur ein einfacher Namenskonvention-Hack, ich nehme an, dass mein Mangel an tiefer Erfahrung mit großer Modellreferenzierung und weiterer moderner Technologie jenseits von R2007a mich davon abhält, weitere Fallstricke zu sehen ... :-) – Manex

1

Schließen Sie einen Bus Selector an jeden Datenausgang an. Wählen Sie die gewünschten Signale und stellen Sie "Ausgabe als Bus" ein. Verbinden Sie dann alle Bus Selectors mit einem Bus Creator.

simulink model

+0

Wie in den Kommentaren besprochen funktioniert nicht: Sie fügen immer noch nicht eindeutige Signalnamen in einen einzelnen Bus ein. Im besten Fall wird das Problem nur außerhalb dieses Subsystems verschoben (was wohl noch schlimmer ist). –

+0

Erzeugt einen strukturierten Bus mit Signalnamen wie 'rw1.current', die Namen sind eindeutig. – Daniel

+2

OK, lassen Sie mich das umformulieren: Sie haben Recht, das funktioniert, aber nur auf dieser Ebene. Wenn Sie diesen Ausgangsbus jedoch an einen anderen Bus-Selector anschließen, wählen Sie "rw1.speed" und "rw2.speed" aus den Signalen und wählen Sie die Option "Als Bus ausgeben". Die Struktur wird nicht auf den neuen Bus und Sie übertragen Bekommen Sie die Warnung. Das obige Modell ist klein, meine "echten" Modelle sind riesig, und die Anzahl der Signale rechtfertigt die zweite Option "Ausgabe als Bus". Daher hat es wirklich meine Vorliebe, wirklich eindeutige Namen zu haben, ohne * irgendein * Risiko, Konflikte zu benennen. –