1. 程式人生 > 實用技巧 >Simulink程式碼生成: Assignment模組及其程式碼

Simulink程式碼生成: Assignment模組及其程式碼

本文研究Assignment模組的用法和該模組生成的程式碼。

文章目錄

1 Simulink中的Assignment模組

最近在建模地時候遇到一種需求,在控制器執行的過程中需要更新某個Vector訊號中的某個元素。從C語言的角度去理解,就是將一個變數賦值給陣列中的某個元素。

博主研究後認為可以通過Assignment模組實現這個需求。Assignment有分配、指派的含義,在建模中這麼理解也是很貼切的。相對應的,從一個Vector訊號中提取某個元素可以用Selector模組,博主以前的部落格也寫過。

2 Assignment模組的模型和引數

本章會用Assignment模組建一個簡單的模型,來體會一下這個模組的用法。
1)在Simulink中拖出一個Assignment模組,並將其引數配置如下。注意不同的引數配置後,模組的外觀和埠會有所變化。
在這裡插入圖片描述
其中比較重要的引數及其含義如下:

  • Number of output dimensions設定為1,指的是需要修改的元素個數,而不是輸出訊號的元素個數。該引數設為幾,下面的視窗就有幾個序號需要分別配置;
  • Index mode設定為Zero-based,也就是索引從0開始;
  • Index Option設定為Index vector(port),表示索引號從外部埠輸入,對應的是模組中的Idx1_0;
  • Initialize output (Y)設為Specify size for each dimension in table,這樣上面會啟用Output Size
  • Output Size設為3,表示輸出訊號有三個元素;

2)給模組加上輸入輸出如下:
在這裡插入圖片描述

  • 輸入端U指的是需要分配的數值,這裡寫4;
  • 輸入端Idx1_0指的是輸出訊號的那個元素賦值,這裡的1代表第二個元素,因為上文配置了Zero-based;

3)模擬一下模型可以看到輸出的陣列是[0,4,0],也就是將第二個元素分配了4這個數值。
在這裡插入圖片描述

3 Assignment模組的程式碼

通過生成程式碼,可以更好的理解Assignment模組的機制,並且不同的引數對應的程式碼會是完全不同的含義。

1)將第2章的輸入輸出都替換成Inport或者Outport,然後Ctrl + D模擬以下,輸出port會自動繼承dimensions為3.
在這裡插入圖片描述
2)Ctrl + B生成程式碼如下
在這裡插入圖片描述
從step函式可以看出,In2是作為Out1的索引,In1賦值給Out1[In2]這個元素了,和模型的邏輯相符合。然後再去標頭檔案中可以看到Out1的型別定義,是三個元素的陣列。
在這裡插入圖片描述

4 Assignment模組的其他配置

4.1 Index mode配置

把Assignment模組的Index mode設定為One-based如下:
在這裡插入圖片描述
重新生成程式碼後,程式碼中的索引會多出一個減1的運算。
在這裡插入圖片描述
博主還是比較喜歡選擇Zero-based,因為和C語言的語法習慣比較符合。

4.2 Initialize output (Y)配置

這個配置會影響輸出陣列的初始化,博主認為會有很大差別。將Initialize output (Y)配置成預設的Initialize using input port 後,模組就會多出一個Y0的輸入埠。
在這裡插入圖片描述
將Y0初始值設為[0,0,0]表示陣列的Dimesion是3,以及初始值。
在這裡插入圖片描述
重新Ctrl + B生成程式碼如下:
在這裡插入圖片描述
可以看出,在step函式中會對Out1做一個0初始化操作。這樣的話,每個週期執行一次step函式就會清空陣列再給陣列賦值了,沒法保持以前的賦值。

所以在大多數情況下,應該是不會採用這種配置的。

5 總結

Assignment模組的使用方法比較簡單,也可以和迴圈子系統配合使用。

>>返回個人部落格總目錄