I have been developing a Xcos simulation where I have a disturbance observer in discrete domain. My intention was to implement the observer itself as a Scilab function invoked in periodic manner from the scifunc_block_m block i.e. the block has an event port connected to the clock source. May I ask you for an advice how to properly handle the observer state. In other words I need to have some variables which values are persistent between the individual clock events.
I have noticed that the scifunc_block_m has some discrete state in the configuration dialog. Is it intended for such usage? If so, how can I access to the state in the function code? Thanks in advance for your answer.
I have decided to implement much more simple discrete system at the beginnig. I have attempted to implement the discrete first order low pass filter. So I have just defined the below given function in a separate .sci file
function [xnew, y1]=Digital_low_pass_filter(flag, x, u1, rpar, ipar)
disp("ARGS: " + string(argn(2)));
disp("FLAG: " + string(flag));
select flag
case 1 then
// system output update (occurs in every time step of the simulation)
disp("Flag value: 1");
y1 = x;
xnew = x;
case 2 then
// system dicrete state update (occurs only at discrete event)
disp("Flag value: 2");
T = rpar(1);
tau = rpar(2);
a = T/(T + tau);
b = 1 - a;
xnew = a*u1 + b*x;
y1 = [];
case 3 then
// continuous state update
y1 = [];
xnew = x;
case 4 then
// init
disp("Flag value: 4");
xnew = 0;
y1 = [];
case 5 then
// end of simulation
disp("Flag value: 5");
y1 = [];
xnew = x;
case 6 then
// derivative computation
disp("Flag value: 6");
y1 = [];
xnew = x;
case 9 then
// zero-crossing
disp("Flag value: 9");
y1 = [];
xnew = x;
else
// default
disp("Unexpected flag value.");
y1 = [];
xnew = x;
end
endfunction
Unfortunately the simulation crashes. The diagnostic printing in the Console window occurs: “ARGS: 5“ and a warning occurs at the scifunc_block_m right down corner. Namely there is “Wrong number of input arguments.Expected 3.“ written.
May I ask you for an advice how to implement this simple discrete system via the scifunc_block_m?
I think you are mixing up scifunc_block_m and generic_block3 (I recognize that generic_block3 is not sufficiently documented and misses examples). Maybe @davidcl can confirm ?
Hello, thank you for your reaction. I have placed the scifunc_block_m block from the User defined functions category into my simulation. Why do you think I have used the generic_block3?
has the argument list of functions used by the generic_block3 block. Inside a scifunc_block_m, if you call your function, there is no mecanism that would give you values to flag, x, u1, rpar, ipar (unless you pass actual arguments by defining them explicitely).