2014-10-01 17 views
2

這是Matlab/Simulink R2007a。強制總線創建者只接受來自總線對象的信號

我在總線編輯器中創建了一個名爲「FOOBUS」的總線,它包含三個元素,比如說「FOO1,FOO2,FOO3」。

給定子系統的輸入端口被強制接受-only-「FOO」型總線。該子系統保存在一個庫中,以及一個定義了「FOO」Simulink.Bus對象的MAT文件。

現在,當涉及到子系統與其他模塊集成:

我 - 如何可以強制總線造物主對我表明,包括FOO的元素?問題是,當構建FOO總線對象時(通常使用配置爲輸出FOO總線對象的總線創建器來組成它),我看不到應該包含FOO總線對象的信號,並且不得不在子系統中潛水(或在總線編輯器中)查看它具有哪些元素,然後在Bus Creator對話框中手寫它們。

-Any other proposal?其目標是具有清晰的接口定義,可以非常簡單地調用接口定義,而不是在Bus Creator塊中手動重寫它們。

謝謝。

新增

只是爲了澄清,我所求,主要是無需手動添加的項目(如總線造物主建議AFAIK)創建子系統輸入總線。

回答R2007a @MohsenNosratinia的答案提供了基礎(原答案不會在R2007A工作的樣子arrayfun不接受BusElements。我用普通數組的方式作爲一種解決方法。

function addSignalsToBusCreator(busDef) 
busEls = busDef.Elements; 
sigString = ' '; 
for i = 1 : length(busEls) 
    sigString = [sigString busDef.Elements(i).Name ',']; 
end 
set_param(gcb, 'Inputs', sigString(1:end-1)); 
end 
+0

你能告訴你的模型? – kkuilla 2014-10-01 13:54:29

+0

我不允許發佈該模型,對不起。但它主要是一個輸入接受「FOO」總線類型(其元素在Simulink.Bus對象中定義良好)的子系統。我不想手動輸入總線的元素(在總線創建器對話框中)以創建「FOO」類型的總線。 – Manex 2014-10-01 14:07:42

+2

我想你會發現很難得到有用的答案,恐怕。我相信你可以用虛擬數據/對象創建[mcve](http://stackoverflow.com/help/mcve)。 – kkuilla 2014-10-01 14:15:11

回答

3

你需要做的是編程的Simulink不提供一種方式,GUI來完成此 您可以創建這樣的函數:。

function addSignalsToBusCreator(busDef) 
elemNames = arrayfun(@(x) x.Name, busDef.Elements, 'uni', 0); 
sigString = sprintf('''%s'',', elemNames{:}); 
set_param(gcb, 'Inputs', sigString(1:end-1)); 
end 

並添加總線創建者的模型後,選擇它,並與總線定義

>> addSignalsToBusCreator(FOO) 

整個訣竅是在公交車上創塊的'Inputs'參數運行此功能。它可能需要兩種不同類型的值。如果它是一個包含數字5的字符串,則它會將其解釋爲您選擇了具有5個輸入的'Inherit bus signal names from input signals'選項。但是,如果它包含一個用逗號分隔的單引號名稱的字符串,它會將其解釋爲您選擇了'Require input signal names to match signals below'。在你的例子中,字符串將是'FOO1','FOO2','FOO3'

我已經在R2011b測試了這個。

+0

這在R2007a中不起作用,因爲arrayfun不接受BusElements,但是它爲解決方案奠定了基礎(見問題),謝謝! – Manex 2014-10-02 05:40:12

0

,才能在Matlab的R2007a上班修改@ MohsenNosratinia的解決方案:

function addSignalsToBusCreator(busDef) 
busEls = busDef.Elements; 
sigString = ' '; 
for i = 1 : length(busEls) 
    sigString = [sigString busDef.Elements(i).Name ',']; 
end 
set_param(gcb, 'Inputs', sigString(1:end-1)); 
end