How to recognize Stateflow blocks using Simulink API (get_param)?
이전 댓글 표시
In older Matlab/simulink version it was possible to detect a Stateflow block using Simulink get_param(...) command for example for a SF block:
>> get_param(gcb, 'BlockType')
ans =
SubSystem
>> get_param(gcb, 'MaskType')
ans =
Stateflow
So a Stateflow block could be detected by queering the BlockType = 'SubSystem' and MaskType = 'Stateflow'. But since the introduction of the new Simulink Editor (R2012b) the 'MaskType' parameter for s Stateflow block is empty (''). How can I recognize SF blocks using Simulink API get_param(...) command?
Thanks.
Regards, Wojtek
채택된 답변
추가 답변 (3개)
John Harris
2017년 12월 14일
To expand on Wojtek's solution and hopefully help out others who may be looking for this answer, SFBlockType is a parameter that seems to be present on SubSystems at least as far back as R2013a.
Values for 'SFBlockType' that I have found are:
- 'Chart' (stateflow charts)
- 'MATLAB Function' (MATLAB Functions)
- 'NONE' (plain subsystems)
Note non sub-system blocks don't have this parameter, so if a non-subsystem block is selected
get_param(gcb,'SFBlockType')
returns an error. Consider using a strcmp as a safety catch,
isAChart = strcmp(get_param(gcb,'SFBlockType'),'Chart');
Cheers!
댓글 수: 2
Oleg Makosiy
2018년 11월 21일
I wish i knew this years ago! thanks
Sanjeev Kumar
2022년 4월 28일
Thats great John!! Now I got the charts from our model. I want to set it's parameter like "Action Language" to C by set_param command but it doesn't recognize these parameters. Kindly help on it.
Sebastian already pointed out the most stable - if awkward - way, using the stateflow api search methods, though you have to be careful to search the library if a stateflow block resides there and is only linked into your system.
There is another way only using the simulink api, as you required. Using find_system(gcb ,'MaskType', 'Stateflow') still finds the block, even though get_param will yield an empty MaskType on the very same. Seems to be some kind of backwards compatibility programmed into find_system, that is still working up to 2016b. Also awkward, but pure Simulink-API.
As Embedded Matlab blocks are technically integrated as Stateflow blocks into Simulink, these will be matched by find_system(... 'Stateflow') as well. So if you need to distinguish the different kinds of Stateflow embedments into Simulink, there is no way around Stateflow API.
Jamie Wardlaw
2018년 10월 3일
So some years on I came back to this, the solution in 2018b that I am using is
%find stateflow charts
sf_charts = find_system(sysName,'MaskType','Stateflow');
Seems to work well.
카테고리
도움말 센터 및 File Exchange에서 Programmatic Model Editing에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!