我有一個來自客戶的現有 Simulink 模型,該模型使用函式呼叫語意作為 Stateflow 圖上的事件觸發器等。對于我們目前的目的,我需要能夠在函式呼叫觸發發生時生成一個簡單的輸出脈沖,例如:
- 在函式呼叫觸發器處,我們將輸出設定為值 1
- 經過一段固定的時間(例如 1 毫秒)后,輸出值設定為 0。然后每當函式呼叫觸發下一次發生時,都會重復此操作。我嘗試按如下方式設定狀態流程圖:

盡管這確實會產生一個脈沖,但從高狀態到低狀態的轉換僅在 E 事件發生時發生,而不是在初始 E 事件發生后 1 毫秒發生。也就是說,很明顯圖表將在 E 函式呼叫事件之間休眠。E 事件相隔大約 200 毫秒,并且“y”的每個脈沖也具有相同的寬度——當 y=1 時我希望它只有 1 毫秒寬。有沒有辦法改變圖表設定,使其保持清醒,直到從高位回到低位的轉變發生?或者我可以使用函式呼叫子系統而不是 Stateflow 圖來實作相同的行為嗎?任何一個對我來說都很好。
(整個模型使用變數求解器,因為生成函式呼叫脈沖的模塊需要它。)
編輯:頂級模型將是這樣的,盡管生成函式呼叫的塊更復雜,并且不只是以規則的采樣時間間隔生成函式呼叫。

uj5u.com熱心網友回復:
看起來您正在將該事件用作圖表的啟用觸發器,這意味著僅在啟用觸發器時才評估圖表。這意味著圖表輸出每個觸發器僅更新一次,從而給出您的問題。
相反,一種方法是將事件源轉換為布爾信號,這是模型的全速率,即 kHz 以捕獲 1ms 樣本,然后使用檢測到的該信號的增加作為“正常”(不是啟用的觸發器) 變數為您的狀態流。
這是一個最小的模型

在這種情況下,我故意從事件中驅動一個啟用的子系統,如下所示,它會創建布爾信號。請注意,您需要將輸出埠的“禁用時輸出”屬性設定為“重置”,以便它在事件觸發之間翻轉回 0。否則你有同樣的問題。

“檢測增加”模塊位于標準 Simulink 庫中,并將我們的布林值(持續事件的頻率)轉換為上升沿上的單個樣本。E根據信號的外觀,您可能不需要它,在我的情況下,它是必需的,因為E來自信號生成器脈沖。
現在圖表有一個簡單的布爾輸入,這對于事件觸發器上的一個樣本是正確的。我們可以實作一個與您的圖表非常相似的圖表:

顯然,您可以更改after持續時間以滿足您的需要。
uj5u.com熱心網友回復:
因此,經過一些實驗,這里有一個似乎對我有用的解決方案。
圖表:

這存在于以下子系統中:

FunctionCall 輸入來自生成偶爾函式呼叫的客戶塊。1ms 函式呼叫的采樣時間為 0.001。這些分別作為 E 和 M1 復用到圖表的輸入事件。
在圖表中,函式呼叫 E 將從低狀態轉換到高狀態并設定 y=1;然后,在 M1 事件的 2 個實體之后,我們轉換回低電平并設定 y=0。
我需要等待 M1 的 2 個實體,而不僅僅是將轉換作為 M1,這似乎很奇怪——但考慮到 E 和 M1 將同時發生(通常,E 處于微秒邊界),沒有after(2, M1)過渡,我可以通過使用除錯斷點和步進看到狀態轉換,但它們都發生在同一時間步,因此脈沖寬度為 0 時間。
通過上面的圖表,我可以看到(通過 y 值的范圍)我得到了 y 個寬度為 1ms 的脈沖,它們與 E 同時開始。
如果有人有更好的解決方案,也請隨時提交!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/440857.html
