S-Function 允許使用自定義C/C++函式作為傳遞函式,具有可移植性,也可以同樣利用MATLAB函式進行相同的運算,看開發者熟悉程度而定,


專案流程
- 由系統串口接收資料包,
- 通過S-Function自定義函式決議資料包,得到資料集合,
- 資料集合總線輸出,分為各部分資料進行可視化顯示,
串口接收
首先需要通過MPU6050資料手冊將其暫存器的各項輸出資料通過UART讀出,并將其處理為我們所需要的7項引數(加速度Accl. [X,Y,Z],角加速度Gyro. [X,Y,Z],溫度Temp),
但是這不是本文的重點,因此本文假設已經處理好了上述資料,并且以字符列印的形式通過串口穩定輸出,(通過Rasberry Pico PI預處理)如下:

我們需要配置串口接收引數:
COM口以用戶本機分配為準
Serial Configuration配置如圖

Serial Receive配置如圖

注意,由于是以字符char接收,因此選擇型別為uint8,Data Size設定緩沖區大小,此處設為128為例,同樣可以設定資料包頭和資料包尾,我們此處不做設定,
當然,在實際專案中會以更高效率的資料包傳輸,此處僅為示例作用,因此選用字符接收,
S-Function函式示例
從Library Browser中找到User-Defined functions(用戶自定義函式),在系統仿真中這部分是較為常用的,

選擇S-Function Builder,雙擊點開面板,由于是面板端編輯,直接面向物件,邏輯更清晰,但是限制也較多,

填寫函式名,選擇語言C++,即可Build編譯,(初次需要按提示安裝MinGW-w64方可編譯,且安裝目錄不能帶空格)

注意到,編輯器里面有三個子函式,分別封裝S-Function的起始方程,輸出方程和終止方程,在本實體中僅用到輸出的封裝,其他功能請自行學習瀏覽官方示例,
void xxx_Start_wrapper(void);
void xxx_Outputs_wrapper(const real_T *u0, real_T *y0);
void xxx_Terminate_wrapper(void);
注意到,輸入輸出引數都是以陣列指標的形式傳參的,帶const表示輸入引數,不可更改,不帶的即表示輸出引數,可更改,函式的目的是按次呼叫這三個子函式,
我們可以先除錯好C++程式再整合,
在本實體中,輸入引數為大小為128*1的字符陣列(uint8),輸出引數為包括三個引數的總線(Bus:gyroData),以結構體形式呼叫,
在自己工程檔案中定義頭檔案(structure.h),用于型別的轉換和結構體的定義等,這部分內容是為了便于程式能在本地除錯成功,而由于在Simulink中這部分內容已有定義,因此在Simulink的S-Function Builder中編譯的時候是需要將其之注釋掉的,
structure.h:
#ifndef _STRUCTURE_H
#define _STRUCTURE_H
typedef char uint8_T;
typedef short int16;
struct gyroData{
int16_t accl[3], gyro[3];
double temp;
};
#endif //_STRUCTURE_H
如果不注釋掉,在編譯時會由于變數型別沖突而編譯失敗,

在本地C++工程除錯成功,即可移植,

除錯成功后,將其移植至S-Function Builder中,
注意引數型別、維度都要一一匹配,需要用到的頭檔案和引入檔案也需要在include部分添加進來,

如果C++工程包含其他檔案,將工程檔案目錄添加至INC_PATH,注意檔案目錄最好不要含有空格,否則再次打開時可能會產生修正而出錯,

點擊編譯,提示ERROR: Bus object for output port 1 gyroData does not exist in workspace,即:總線未被添加至作業區導致編譯失敗,
手動添加的辦法,即打開MODELING中的Bus Editor選項進行添加,注意總線名稱Object Name以及元素名稱,以及其型別、維度,均設定匹配,當然,也有通過代碼區更方便添加的辦法請自動查閱相關檔案,

添加后請將其保存為.mat檔案方便日后直接將設定好的總線匯入,
如果沒有問題,會顯示S-Function編譯成功,

這時,我們可以用S-Function模塊直接填寫函式名,直接呼叫,模塊會自動產生相應數目的輸入輸出埠,可以供檢查,
(雖然S-Function Builder也可直接使用)

這樣,我們的S-Function就撰寫完成,
資料可視化
我們利用Bus Selector模塊進行對總線拆分,用Display模塊顯示文本(陣列),用Scope模塊進行示波器影像繪制,這些屬于基本操作,就不詳加敘述了,
這里提到一個除錯的方法,即先使用靜態文本(此處用了字串常量String Constant)進行除錯,確認S-Function功能無誤即可接入動態資料進行觀察,

最后
文章末尾,附上相關的工程檔案供參考,
bus_gyroData.matgyroData總線getGyroData___由S-Function生成的函式receive_test.slxc接收端Simulink作業區面板gyroDataProcess用于產生S-Function的C++檔案
請訪問我的Github URL以下載:https://github.com/Chiron19/Simulink
感謝閱讀!歡迎分享,
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/421659.html
標籤:其他
