Можно ли совершить какое-то время ошибку или пока нет ошибки Matlab - PullRequest
2 голосов
/ 16 апреля 2019

В моем скрипте matlab я анализирую текстовый файл с определенной структурой тегов и создаю Simulink Block для каждого найденного мной специального тега. Простой пример, у меня есть это:

[Link]
  Link_Name : On/Off 
  Link_ID : _sZfSkku9Eemg_bhrv2HEbw

[Link] 
  Link_Name : On/Off
  Link_ID : _qsYbsVeeEemna8dVWPKMTw

Вы можете видеть, что это не один и тот же объект, но они имеют одинаковые имена, и поэтому, когда в Matlab я создаю Simulink-блок для каждой найденной ссылки, у меня появляется ошибка "can't create a new On/Off Block" что-то в этом роде.

Итак, я вставил идентификатор в описание блока и, если он такой же, я просто обновляю имя в случае, если пользователь изменил имя в текстовом файле: set_param(gcb,'Name', link_NameValue);

Если это не так, я создаю новый блок:

add_block('simulink/Ports & Subsystems/In1',[component_NameValue '/' link_NameValue], 'MakeNameUnique', 'on');

Проблема в 'MakeNameUnique', 'on', он создаст бесконечность блока, если я запустил свой скрипт много раз и с set_param у меня ошибка The name 'On_Off' already exists

Итак, я хотел бы сделать цикл while следующим образом:

while error "can't create a new block"  
    add a "x" at the end of the name of the new block
end
or
while error "The name 'On_Off' already exists"
    add a "x" at the end of the name of the existing block 
end

Так что даже если у меня есть 4 [Link] с именем On / Off, он создаст On / Off, On / Offx, On / Offxx, On / Offxxx или с номером в конце, если это возможно.

Спасибо за помощь! Я пытался объяснить как можно короче.

1 Ответ

3 голосов
/ 16 апреля 2019

Вам следует провести тест с использованием метода try, catch. Как вы не дали нам MCVE, так что я могу дать вам только непроверенный код:

i=0
While i==0
    i=1 %An assumption that code will pass
    try
        sim('ModelName', ParamStruct);
    catch SimErr
        i=0
        %change some parameters in your model below
        %add a "x" at the end of the name of the new block or whatever you need
    end
end

Так что в основном - если ошибки нет, i останется измененным на 1 и будет тормозить цикл. Если произойдет ошибка - она ​​также изменит обратно i на 0, чтобы цикл продолжался. В операторе catch вы можете передать некоторые изменения в вашу модель, чтобы попробовать ее с новыми параметрами итеративно, пока она не пройдет.

...