使用文本文件来编辑Stateflow的代码

支持State和EMFunction(MatlabFunction)

打开Simulink

 

先运行脚本转json

Sf_StateflowToJson.m

rtw = sfroot;
chw = rtw.find('-isa', 'Stateflow.Chart');
staw = chw.find('-isa', 'Stateflow.State');
mfunw = chw.find('-isa', 'Stateflow.EMFunction');
dstruct = struct('Path', '', 'Name', '', 'Type', '', 'Label', '');
staw_len = length(staw);
mfunw_len = length(mfunw);
dwrite = dstruct(ones(staw_len + mfunw_len, 1));
pos = int32(0);
for i = 1 : staw_len
    stanw = staw(i);
    n = pos + i;
    mulLabel = strsplit(stanw.Label, '\n');
    dwrite(n).Path = stanw.Path;
    dwrite(n).Name = stanw.Name;
    for k = 1 : length(mulLabel)
        dwrite(n).Label{k} = char(mulLabel(k));
    end
    dwrite(n).Type = 'State';
    % fprintf('\n\npath:%s\n%s', stanw.Path, stanw.Label);
end
pos = pos + length(staw);
for i = 1 : mfunw_len
    mfunnw = mfunw(i);
    n = pos + i;
    mulLabel = strsplit(mfunnw.Script, '\n');
    dwrite(n).Path = mfunnw.Path;
    dwrite(n).Name = mfunnw.Name;
    for k = 1 : length(mulLabel)
        dwrite(n).Label{k} = char(mulLabel(k));
    end
    dwrite(n).Type = 'EMFunction';
    % fprintf('\n\npath:%s\n%s', stanw.Path, stanw.Label);
end
jsw = jsonencode(dwrite, 'PrettyPrint', true);
fw = fopen('StateFlowToJson.json', 'w+', 'b', 'GB2312');
fwrite(fw, jsw, "char")
fclose(fw);
​

得到下图json文本

 

使用替换或正则修改state内代码

再运行json转脚本

Sf_JsonToStateflow.m

fr = fopen('StateFlowToJson.json', 'r+', 'b', 'GB2312');
jsr = fread(fr, '*char')';
fclose(fr);
rtr = sfroot;
chr = rtr.find('-isa', 'Stateflow.Chart');
star = chr.find('-isa', 'Stateflow.State');
mfunw = chw.find('-isa', 'Stateflow.EMFunction');
dread = jsondecode(jsr);
for j = 1 : length(dread)
    drn = dread(j);
    switch(drn.Type)
        case 'State'
            for i = 1 : length(star)
                stanr = star(i);
                pathcmp = strcmp(stanr.Path, drn.Path);
                namecmp = strcmp(stanr.Name, drn.Name);
                if(pathcmp && namecmp)
                    sjdrn = strjoin(drn.Label, '\n');
                    labelcmp = strcmp(stanr.Label, sjdrn);
                    if(~labelcmp)
                        stanr.Label = sjdrn;
                        fprintf('\n');
                        fprintf('\n--------------------------------------');
                        fprintf('\nPath:%s', stanr.Path);
                        fprintf('\nLabel:%s', stanr.Label);
                        break;
                    end
                end
            end
        case 'EMFunction'
            for i = 1 : length(mfunw)
                mfunnr = mfunw(i);
                pathcmp = strcmp(mfunnr.Path, drn.Path);
                namecmp = strcmp(mfunnr.Name, drn.Name);
                if(pathcmp && namecmp)
                    sjdrn = strjoin(drn.Label, '\n');
                    labelcmp = strcmp(mfunnr.Script, sjdrn);
                    if(~labelcmp)
                        mfunnr.Script = sjdrn;
                        fprintf('\n');
                        fprintf('\n--------------------------------------');
                        fprintf('\nPath:%s', mfunnr.Path);
                        fprintf('\nScript:%s', mfunnr.Script);
                        break;
                    end
                end
            end
    end
end
​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Stateflow是MathWorks公司的一个工具,用于建模和仿真不确定性动力系统。Stateflow代码优化是指对Stateflow模型中的代码进行改进和调整,以提高模型的性能和效率。 Stateflow代码优化主要包括以下几个方面: 1. 精简代码:通过对代码进行精简和优化,消除不必要的冗余代码,减少不必要的计算和判断,以提高代码的执行效率。 2. 减少状态转换和模型复杂度:Stateflow模型中的状态转换和模型复杂度越高,代码执行性能就会越低。优化时可以考虑通过合并或优化状态转换来减少状态的数量,简化模型结构和逻辑。 3. 提高触发条件:在Stateflow模型中,触发条件的复杂度和效率对代码执行速度有重要影响。优化时可以考虑合理设计和调整触发条件,使其尽可能简单明了,避免复杂的判断。 4. 使用并行状态和超级步骤:Stateflow支持并行状态和超级步骤的设计,可以将部分任务并行处理,提高代码执行效率。在优化时可以考虑合理使用并行状态和超级步骤,提高代码的并发性。 5. 考虑硬件和编译器的特性:在进行Stateflow代码优化时,还要考虑目标硬件平台的特性和编译器的优化能力。可以根据目标平台对代码进行针对性的优化,提高代码的执行效率。 总之,Stateflow代码优化消除的目标是提高代码的执行效率、减少计算和判断的时间,使Stateflow模型能够更快速、更高效地执行。通过合理设计和调整模型结构、精简代码、合理使用并行状态等方法,可以有效地优化Stateflow代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值