HP Forums
[7820 FW]Custom Bode APP doesn't work anymore on emulator ? ["1/2 SOLVED"] - Printable Version

+- HP Forums (https://www.hpmuseum.org/forum)
+-- Forum: HP Calculators (and very old HP Computers) (/forum-3.html)
+--- Forum: HP Prime (/forum-5.html)
+--- Thread: [7820 FW]Custom Bode APP doesn't work anymore on emulator ? ["1/2 SOLVED"] (/thread-3834.html)



[7820 FW]Custom Bode APP doesn't work anymore on emulator ? ["1/2 SOLVED"] - dg1969 - 05-14-2015 11:16 AM

edit with some comments on the code and the attachment file first forgot...
---
Hi,

Few time ago I wrote an basic custom App for BODE plot based on FUNCTION APP... On the physical prime [FW7820] no problem, everything works like before. But on the new emulator ( new FW 7820 ) the plot view seem to be dead, unresponsive... I can't use these app on emulator...

If someone have an idea... and time to look at...

I know my code is perhaps not readable (french language inside I know is not a good idea for worldwide exchange :o).

Usage is very basic: Place your transfert function (in term of X) in symb view. Transfer functions must be write without float numbers. F1(X)=1/(1+0.2*X) doesn't works... but F1(X)=1/(1+1/2*X)^2 is ok...

In SYMB view you can place 1 to 10 transfer functions in term of 'X', example:
Code:

Code:
F1(X)=(1+2*X)/(1+2*X+1/10*X^2)^2*e^(-2*X)

Actually the exponential term must be at the end of the expression (see the example above) not very powerful but it do the job to model a pure delay.

Then press PLOT to choose step response (here occur the problem on emulator) , Bode module or Bode phase (x axis is in term of LOG10(pulsation)) . There is no automatic scale.

You have to escape from plot view (pressing num or symb again) if you want to choose another plot...


If you find some time I would like to learn and improve my practice through constructive criticism ... Thanks ;o)

In attach file you will find the binary version of the app...
here is the code:
Code:

copie_les_fonctions(); //copy transfert func from SYMB view to liste_fonctions
replace_les_fonctions(); //copy transfert func from liste_fonctions to SYMB view
place_les_modules(); //copy magnitude expressions from liste_modules to SYMB
place_les_phases(); //copy phase expressions from liste_phases to SYMB
place_les_rep_temp(); //copy step resp expressions from liste_rep_temp to SYMB
calcule_modules(); // expressions magnitudes calculation
calcule_phases(); // calc phases expressions
calcule_rep_temp(); // calc step response expressions
Symb();

export liste_fonctions:=MAKELIST(0,X,1,10); //copy of transfert func
export liste_modules:={}; // magnitude expr when calculated are there
export liste_phases:={}; // phase expr are save here
export liste_rep_temp:={}; // step resp expr are here
recalc_module:=MAKELIST(1,X,1,10); // flag are set to 1 if recompute is need for magnitude
recalc_phase:=MAKELIST(1,X,1,10); // flag if phase recompute
recalc_temp:=MAKELIST(1,X,1,10); // flag if step resp need to be recompute
modif:=0; // if the user come on symb view these flag tell that some modifications may occur on transfert expr

copie_les_fonctions()
begin
  local k;
  for k from 1 to 10 do
    if ISCHECK(k MOD 10) then
      if EVAL(EXPR("F"+k MOD 10)≠liste_fonctions(k)) then
        IFERR liste_fonctions(k):=EXPR("F"+k MOD 10) then MSGBOX("Erreur de copie sur F"+k MOD 10) end;
        recalc_module(k):=1;
        recalc_phase(k):=1;
        recalc_temp(k):=1; 
      end; 
    end;
  end;
  modif:=0;
end;

replace_les_fonctions()
begin
  local k;
  for k from 1 to length(liste_fonctions) do
    if ISCHECK(k MOD 10) then  
      expr("F"+k MOD 10+":=liste_fonctions("+k+")");
    end;
  end;
end;

place_les_modules()
begin
  local k;
  for k from 1 to length(liste_modules) do
     if ISCHECK(k MOD 10) then 
       expr("F"+k MOD 10+":=liste_modules("+k+")");
     end;
  end;
end;

place_les_phases()
begin
  local k;
  for k from 1 to length(liste_phases) do
     if ISCHECK(k MOD 10) then
       expr("F"+k MOD 10+":=liste_phases("+k+")");
     end;
  end;
end;

place_les_rep_temp()
begin
  local k;
  for k from 1 to length(liste_rep_temp) do
     if ISCHECK(k MOD 10) then
       expr("F"+k MOD 10+":=liste_rep_temp("+k+")");
     end;
  end;
end;

calcule_modules()
begin
  local k;
    for k from 1 to length(liste_fonctions) do
       if ISCHECK(k MOD 10) AND recalc_module(k) then
         liste_modules(k):=20*LOG(ABS(subst(liste_fonctions(k),'X','i*ALOG(X)')));
         recalc_module(k):=0; 
       end;
    end;
end;

calcule_phases()
BEGIN
local k,j,r,retard;
local f, a,num,denomi,cnum,cdenom,phi;
  for k from 1 to length(liste_fonctions) do
     if ISCHECK(k MOD 10) AND recalc_phase(k) then
       f:=replace(string(liste_fonctions(k)),"X","x");
       r:=instring(f,"e");
       if r then
                retard:=right(f,size(f)-1-r);
                f:=left(f,r-2);
       end;       
       a:=CAS.froot(f,"x");
       num:=string(CAS.numer(f));
       denomi:=string(CAS.denom(f));
       cnum:=CAS.lcoeff(num,"x");
       cdenom:=CAS.lcoeff(denomi,"x");
       phi:=string(ARG(cnum/cdenom)); 
       FOR j FROM 1 TO length(a) STEP 2 DO
           IF RE(a(j))<>0 THEN 
                phi:=phi+"+"+a(j+1)+"*ATAN(("+IM(a(j))+"-X)/("+RE(a(j))+"))";
           ELSE IF a(j)==0 THEN
                    phi:=phi+"+"+a(j+1)+"*90";
                ELSE phi:=phi+"+"+a(j+1)+"*90*SIGN(X-"+IM(a(j))+")";
                END;   
           END; //fin IF
       END; //fin FOR j
     if r then phi:=phi+"+"+replace(retard,"x","X") end;
     phi:="'"+replace(phi,"X","ALOG(X)")+"'";
    liste_phases(k):=EXPR(phi);
    recalc_phase(k):=0;
   end; //fin if ischek
 end; //fin for k

END;

calcule_rep_temp()
begin
   local f, k;
     for k from 1 to length(liste_fonctions) do
        if ISCHECK(k MOD 10) AND recalc_temp(k) then
          f:=REPLACE(STRING(liste_fonctions(k)),"X","x");
          f:=f+"*1/x,x,x";
          f:="'("+REPLACE(STRING(CAS.ilaplace(f)),"x","X")+")*PIECEWISE(X<0,0,X≥0,1)'";
          IF instring(f,"ilaplace") 
            THEN MSGBOX("Problème avec F"+k MOD 10); CONTINUE;
            ELSE liste_rep_temp(k):=EXPR(f);
          END;
          recalc_temp(k):=0;
        end;
     end;
end;


Symb()
begin
  modif:=1;
  replace_les_fonctions;
  STARTVIEW(0,1);
end;

Plot()
begin
  local choix;
  if modif then copie_les_fonctions end;
  CHOOSE(choix,"Choisissez un type de tracé",{"Module","phase","réponse indicielle"});
  CASE
   IF choix==1 THEN calcule_modules; place_les_modules;Ytick:=20 END;
   IF choix==2 THEN calcule_phases; place_les_phases;Ytick:=45 END;
   IF choix==3 THEN calcule_rep_temp; place_les_rep_temp; Xmin:=−0.2 END;
   //DEFAULT
  END;
  STARTVIEW(1,1);
end;

START()
begin
 replace_les_fonctions;
 STARTVIEW(0,1);
end;



RE: [7820 FW]Custom Bode APP doesn't work anymore on emulator ? - dg1969 - 05-14-2015 11:32 AM

Something else look strange to me...

In my code four lists variables are not defined with the EXPORT command so why can I see them on VARs>>App>>Bode>>(6)Program>>
liste_fonctions (ok)
liste_modules (ok)
liste_phases (ok)
liste_rep_temp (ok)
recalc_module (!)
recalc_phase (!)
recalc_temp (!)
modif (!)

In fact if I place one of these four on the home command line to see there content i have a syntax error...


RE: [7820 FW]Custom Bode APP doesn't work anymore on emulator ? - dg1969 - 05-14-2015 02:35 PM

Ok I don't actually understand where is the problem but sure the new firmware is not the faulty. These custom App without any change in the code now works also in the emulator... There are subtleties that I do not control when I copy the app from real prime to emulator inside CK.
Just after the transfert, the primary function input in SYMB view seems posed problem, but after a few tries everything works fine.
Sorry for the waste of time...

I still don't understand why non exported variables are visible in the VARs space...

Here is the last APP with new icon :o)


RE: [7820 FW]Custom Bode APP doesn't work anymore on emulator ? ["1/2 SOLVED"] - dg1969 - 05-15-2015 04:29 PM

Here you can see some examples on pictures...

1) custom App icon;
2) The Symb view to place the continious time transfert functions (use X in place of s);
3) The choose box show up when you press PLOT key;
4) and 5) Bode magnitude and phase;
6) step response (but with other transfert func because the F1 show in the sym view example fail with iLaplace command.)


RE: [7820 FW]Custom Bode APP doesn't work anymore on emulator ? ["1/2 SOLVED"] - dg1969 - 05-15-2015 04:32 PM

... and 6) example of step time response...


RE: [7820 FW]Custom Bode APP doesn't work anymore on emulator ? ["1/2 SOLVED"] - Tim Wessman - 05-15-2015 04:56 PM

(05-14-2015 02:35 PM)dg1969 Wrote:  I still don't understand why non exported variables are visible in the VARs space...

Yeah, that seems strange too. From a program file this doesn't happen, but does seem to do so on the app variable list. It appears in the vars->app->app_name->program list, but doesn't seem to actually be useable as a variable at least.

I've put it on the investigation list to get looked at.


RE: [7820 FW]Custom Bode APP doesn't work anymore on emulator ? ["1/2 SOLVED"] - dg1969 - 05-15-2015 05:04 PM

(05-15-2015 04:56 PM)Tim Wessman Wrote:  Yeah, that seems strange too. From a program file this doesn't happen, but does seem to do so on the app variable list. It appears in the vars->app->app_name->program list, but doesn't seem to actually be useable as a variable at least.

I've put it on the investigation list to get looked at.

Thank you for taking the time to look. Thank's to HP team for this new firmware. Great job !