как дела. Я весь день пытаюсь сделать следующее: я разрабатываю ПИД-регулятор и в зависимости от того, сколько данных я хочу проанализировать, я показываю только один график или четыре графика на одном рисунке (этот последний множественный график сделан с подзаголовком ).
Все расчеты и графики выполняются в одной функции с вариантами функций в зависимости от того, что я хочу видеть, у меня есть несколько кнопок и текстовых вводов в приложении, которое я кодирую, и я знаю схему PID, а простые или множественные графики работающий; моя текущая программа заключается в том, что дескриптор осей назначается локальным переменным внутри функции, и, конечно, эти переменные уничтожаются, когда программа выходит из функции.
Более подробное объяснение проблемы следующее: если я выбираю несколько графиков, а затем хочу один график, то я не знаю, как удалить четыре оси, чтобы очистить фигуру, не закрывая ее, поэтому, когда я хочу активировать простой plot, то программа стирает только один из четырех графиков и печатает простой график поверх оставшихся трех, в то время как оставшиеся три подграфика остаются видимыми. Ниже приведен фрагмент кода, который вызывает у меня проблемы:
grafico=sistem_graf;
disp(grafico);
if(isdef('aa')==%T);
scf(aa);
delete(get("current_axes"));
disp("aa");
end
if(isdef('bb')==%T);
scf(bb);
delete(get("current_axes"));
disp("bb");
end
if(isdef('cc')==%T);
scf(cc);
delete(get("current_axes"));
disp("cc");
end
if(isdef('dd')==%T);
scf(dd);
delete(get("current_axes"));
disp("dd");
end
select ventana
case 0
tipoG=0;
plot2d(T,graffta);
xtitle('Ω(S)/R(S): Respuesta al escalón (Sistema original)','t [s]','Vel [rpm]');
legend(['Original';'C/control P';'C/Control PI';'C/Control PID']);
aa=get("current_axes");
aa.axes_bounds = [1/3 0 2/3 1];
case 1
tipoG=1;
// delete(get("current_axes"));
plot(T,[graffta;sist_P_ZN;sist_PI_ZN;sist_PID_ZN]);
xtitle('Ω(S)/R(S): Respuesta al escalón','t [s]','Vel [rpm]');
legend(['Original';'C/control P';'C/Control PI';'C/Control PID']);
aa=get("current_axes");
aa.axes_bounds=[1/3 0 2/3 1];
case 2
tipoG=2;
//delete(get("current_axes"));
subplot(421);
plot(T,[graffta;sist_P_ZN;sist_PI_ZN;sist_PID_ZN]);
xtitle('Ω(S)/R(S): Respuesta al escalón','t [s]','Vel [rpm]');
legend(['Original';'C/control P';'C/Control PI';'C/Control PID']);
aa=get("current_axes");
aa.axes_bounds=[1/3,0,1/3,1/2]
subplot(422);
plot2d(T,(kt*kp/(j*la))*(1/(afta*bfta))*(1+(1/(afta-bfta))*(bfta*exp(-afta*T)-afta*exp(-bfta*T))));
xtitle('Ω(t)','t [s]','Vel [rpm]');
bb=get("current_axes");
bb.axes_bounds=[2/3,0,1/3,1/2];
subplot(423);
plot2d(T,(kt/(j*la))*(1/(afta*bfta))*((1/(afta-bfta))*(bfta*afta*exp(-bfta*T)-afta*bfta*exp(-afta*T))));
xtitle('Variación de velocidad angular dΩ/dt','t [s]','Ac. [rpm/s^2]');
cc=get("current_axes");
cc.axes_bounds=[1/3,1/2,1/3,1/2];
subplot(424);
plot(T,[sist_P_ZN;sist_PI_ZN;sist_PID_ZN]);
xtitle('Controladores','t [s]','Vel [rpm]');
legend(['C/control P';'C/Control PI';'C/Control PID']);
dd=get("current_axes");
dd.axes_bounds=[2/3,1/2,1/3,1/2];
end
четыре if(isdef(variable_name)) никогда не работают, потому что, когда программа входит в функции, эти переменные еще не существуют, они создаются после графиков с подзаголовком.
Если графические свойства отображаются из меню «Правка» рисунка, тогда отображаются все дочерние оси, но если я попытаюсь получить оси, например,
a=get(sistem_graf.Axes(1))
затем отображается консольный дисплей, в котором говорится, что свойство Axes не существует, поэтому я не знаю, как решить проблему.
Пожалуйста помоги!
Заранее спасибо.
Обновление от 06.03.2021:
Я нашел способ, чтобы поведение, которое мне нужно, работало на 90%, оно терпит неудачу только тогда, когда я перехожу от подробного сюжета к простому сюжету (стирает один график), но в обратном направлении он работает нормально, я изменил весь код перед выбором ventana на следующее
if(imps(1) ~= -1)
if(size(imps) == 1)
sca(imps(1));
disp(imps(1));
delete(get("current_axes"));
elseif(size(imps) > 1)
sca(imps(1));
delete(get("current_axes"));
sca(imps(2));
delete(get("current_axes"));
sca(imps(3));
delete(get("current_axes"));
sca(imps(4));
delete(get("current_axes"));
end
end
и заполнил массив, содержимое которого представляет собой все оси, построенные в последний раз, когда функция была вызвана, этот массив возвращается из функции в глобальную переменную, и, наконец, эта глобальная переменная передается функции при следующем вызове и присваивается локальной переменной имп.
Я думаю, что это какое-то сумасшествие, но, видимо, scilab не внедрил подход к статической переменной.