前言
得益于計算機的發明及高速發展,21世紀是充滿智能、科技、便捷的世紀。無人駕駛、人工智能、物聯網,這些概念已耳熟能詳,而它們背后則是利用編程實現的復雜邏輯。作為新時代的我們,生活已經和“編程“密不可分了,例如常見的C、C++、Python、Java等編程語言。Vector公司與時俱進,在CANape這款強大的測量和標定工具里,采用專門的編程語言——CASL(Calculation and Scripting Language),方便汽車工程師進行數據分析和開發。今天我們就來聊聊這位強大又低調的選手,并和它做個朋友!
CASL的語法與C編程語言非常相似(但也有不同處:CANape不使用指針),允許開發人員集成自己的C代碼或Simulink模型。所以說,大家在使用之前基礎的C語言編程知識還是要掌握的~為了方便使用,CANape提供了智能感知輸入、代碼塊和各種內置函數組。
圖1智能感知輸入
在CASL中,主要運用函數和腳本,來解決各種不同的任務。從簡單的計算,例如,添加信號,直至CANape的自動化。
(Tips: CASL與編程語言CAPL可不一樣哦,后者是在CANoe和CANalvzer環境中使用的。CAPL是一種面向事件的編程語言,即程序節點用于指定事件,并在何時執行以及反應。而CASL是一種信號導向的語言。)
基本概念
1)What Are Functions
在測量過程中,函數被同步處理,主要用于實時測量或者對于加載測量文件的各種計算和應用。例如,函數可以是數學公式或程序代碼,其中變量代表信號或參數。
通常有在線和離線兩種使用場景。
▲Online applications(在實時測量過程中)
》測量虛擬信號計算
》允許對外接設備讀寫
▲Offline applications(訪問現有的測量文件)
》測量文件虛擬信號計算
》執行數據挖掘
圖2虛擬函數使用場景
下面我們來看看函數的語法結構:
圖3函數語法結構
當一個函數被調用時,參數可以被傳遞給函數。參數通常作為引用傳遞給函數,因此既可用于輸入,也可用于輸出。
除了通過參數傳遞從函數發出結果外,還可以使用返回控制結構(return也是關鍵字)的路徑。默認情況下,返回double類型的值,字段或向量(數組)不允許作為返回值。
CANape對自身預定義和用戶定義函數進行了區分,稱為庫函數和工程函數。
圖4函數分類
2)What Are Scripts
腳本是程序代碼的一部分,可在編輯器窗口中編寫,并在調用時順序處理。腳本用于自動化或控制CANape中的聯合活動,例如測量和其他系統相關序列的開始和停止,它獨立于測量運行。它們也可以用來調用在Microsoft Visual Studio或MATLAB/Simulink中生成的外部模型。
圖5腳本示例
此外,可以在CANape運行時,使用命令行選項控制腳本行為。
兩者區別:
1.流程優先級不同。腳本以較低進程優先級執行,相對于測量是異步運行的。另一方面,函數以高進程優先級執行,并與測量同步執行。與函數相比,腳本具有更廣泛的預定義函數組,如附加文件和腳本函數、Flash函數、診斷和數據挖掘函數。
2.與腳本不同,函數不能使用斷點進行調試,因為它們具有高優先級。不過我們可以使用以下命令在Write窗口中輸出調試信息Write()、Writef()、Print()或Printf()。
3.腳本不需要函數頭和函數體。程序代碼可以簡單地直接寫入編輯器,然后按編碼順序處理。
4.函數必須是函數編輯器導出格式(*.cne)或者是ASCII文本格式(*.txt);腳本必須為腳本格式(*.scr or *.cns).
5.函數可以被保存到工作目錄中的CANape.ini配置文件中,但腳本文件被保存為獨立文件。
說了這么多,我們如何編輯呢?
如何編輯
全局變量、函數、腳本均可在CANape的函數編輯器中創建、編輯和編譯。函數編輯器主要分為樹視圖、列表視圖、編輯器窗口、消息窗口,可以在CANape中直接打開。
圖6函數編輯器
變量類型:變量是特定類型值的占位符。變量可以在腳本和函數中聲明和定義,主要分為全局變量和局部變量。
全局變量是CANape配置中的所有函數和腳本都可以使用的特殊數據對象,局部變量僅在各自的函數或腳本中有效。
(Tips:全局變量是靜態的。它們在兩個測量之間以及加載項目之后保留它們的值。當保存配置或項目時,它們的當前值保存在參數文件中,并在加載項目時重新加載。)
參數總是作為通過引用傳遞給函數,可以使用具有相同作用var和double前綴來修飾。
圖7相同作用前綴
關于數據類型就不做贅述了,大家自行百度啦。
接下來重點介紹一些實用小技巧:
使用頻率較多的簡單語句:
>測量過程開始/停止:Start();Stop();
>測量文件信號導入:FILE1.CCPsim.ampl;
>測量和標定:x = CCPsim.ampl;
CCPsim.ampl = x;
>發送報文:CAN1.SendMessage(0x1a1,0xff,0x7f);
>延時(等待)3秒:Sleep(3000);
>測量緩存區或文件中對象信號值的數量:sizeof();
圖8數量獲取
>所選對象特定的測量值進行讀寫訪問:mbuffer[ ];(常與sizeof結合使用)
圖9讀寫特定值
>輸出:print(); write();
圖10常見輸出格式
可以從一個函數中調用另一個函數:
圖11函數調用函數
從一個腳本中調用另一個函數:
圖12腳本調用函數
從一個腳本中調用另一個腳本:
圖13腳本調用腳本
正確終止函數和腳本:
如果參數達到了某個值,則可以使用控制結構cancel來終止函數或腳本。如果在函數中使用了cancel命令,該函數將在沒有返回值的情況下終止。如果在子函數或腳本中使用了cancel命令,則腳本將立即終止。
例如下圖,如果在調用的對話框中選擇[Yes](返回值為0),腳本將終止。
圖14終止腳本
全局變量初始化:
可以在腳本運行時調用,以每次自動初始化全局變量的值。
圖15初始化腳本
以上可能是一些常見的例子,由于編程語句體量龐大,工程師們需要根據功能需求來選擇語句。在CANape中右鍵可以導入自動的庫函數,根據功能分類,對于不熟悉語句,鼠標懸停后按F1,可以彈出help文檔,其中會顯示使用例子。
圖16庫函數
圖17萬能help文檔
在我們編寫程序前,我們需要考慮以下5個步驟:
1.需要用程序的主要任務2.決定如何以及何時執行程序3.開發合適的代碼4.編譯5.測試。
編程世界很大,謹此拋磚引玉。小編領進門,修行還是看個人。
古人云,工欲善其事,必先利其器;北匯信息作為Vector中國的合作伙伴,始終專注于汽車電子領域的新技術和新產品,為整車廠和零部件企業提供完整的研發、測試解決方案,為工程師在汽車領域提供“趁手裝備“!
發布評論請先 登錄
相關推薦
評論