2013-06-20 2 views
1

2 개의 영구 변수를 사용하는 함수가 있습니다. 함수 입력은 실제 시뮬 링크 블록의 경우 gcb입니다. 나는 다양한 블록에서 함수를 사용하고자하므로 블록 변수를 참조하는 이름으로 선언 된 영구 변수를 갖고 싶습니다.동적 영구 변수

function testBlock(blk) 
    blkName = get_param(blk, 'name') 
    persistent blkValues % this works for one block 
    % but I want something like this 
    persistent eval([blkName 'Values']) % doesn't work 
    ... 
end 
+1

블록에서 'UserData' 필드 사용을 고려 했습니까? 이것은 훨씬 더 강력한 솔루션이 될 것입니다. – macduff

+0

@macduff 그래서'set_param (gcb, 'UserData', [blkName 'Values'])'같은 것을해야할까요? –

답변

1

당신이하고 싶었던 모든 블록의 이름을 저장하는 경우, 예. 일부 데이터를 설명하는 이름을 원하는 경우에, 나는 구조가 같은 일 것이라고 생각합니다 :

data = struct([blkName 'Values'],[]); 
set_param(gcb,'UserData',data); 

그럼 당신은 당신이 사용하는 데이터를 얻을 때

ud = get_param(gcb,'UserData'); 
% ud.([blkName 'Values']) <- your data 

또는 전역 appdata 스토리지를 사용할 수 있습니다 :

setappdata(0,[blkName 'Values'],data); 

data = getappdata(0,[blkName 'Values']); 

또는 원하는 이름을 가진 변수를 만들 수 런타임에 기능을 다시 작성할 수 용 Yick, 그러나 나는 비슷한 일을 겪어 보았다. HTH! 그러나 나는 응용 프로그램을 완전히 이해하지 않을 수 있습니다, 편집 UserData

내가 대화 콜백 여러 번 사용했던 방법이다, 그래서 나는 그것이 작동 할 것이라고 확신합니다. 당신이 모델을로드 할 때마다 유지하기 위해 데이터가 필요한 경우 :-)

편집 는, 당신은 'on'UserDataPersistent 매개 변수를 설정해야합니다. 이것은 짜증나지만 당연히 모델이 닫히고 메모리에서 플러시 된 후 일어난 일을 잊어 버릴 지 여부를 선택하는 데 필요한 필수 기능입니다. 이것이 당신의 유스 케이스이기 때문에, m 스크립트의 persistent 변수는 Matlab이 종료 될 때 잊혀지기 때문에 작동하지 않습니다. Matlab 세션간에 지속되도록하려면 setpref과 같이 사용해야한다고 생각합니다.

+0

이것이 실제 기능과 함께 작동하는지 확신 할 수 없습니다. 스크립트가 마스크의 대화 콜백에 있기 때문에 영구 변수가 필요했습니다. 따라서 영속 변수는 함수 호출 사이의 값을 유지할 수 있습니다. –

+0

제안 된 솔루션을 사용했습니다. 나는'set_param (gcb, 'UseDataPersistent', 'on')'을 사용하는 것 외에는 선택의 여지가 없다는 것을 알았다. 사용하지 않으면 simulink 모델을 닫았다가 다시 열 때 UserData가 손실됩니다. 어쩌면 내가 아직도 잘못하고있는 것일 수 있습니다. –

+0

나는 그 생각을 해답을 수정 해 보겠습니다. – macduff

1

은 영구 데이터와 함께 작동하고 다른 목적으로 다른 위치에서 해당 기능을 재사용하는 것은 상호 배타적입니다. 둘 다 할 수는 없습니다. 데이터를 함수 외부에 놓아야합니다. 이를 행하는 몇 가지 방법은 a) 이미 제안 된 UserData 필드, b) 예를 들어, 매트 파일, 또는 c) 입력을 기반으로 검색 할 맵과 같은 컨테이너.