7.4 Registering the Callbacks
As seen in the fixed zonal reserve example, adding a single extension to the standard OPF
formulation is often best accomplished by a set of callback functions. A typical use case
might be to run a given case with and without the reserve requirements active, so a simple
method for enabling and disabling the whole set of callbacks as a single unit is
needed.
The recommended method is to define all of the callbacks in a single file containing a
“toggle” function that registers or removes all of the callbacks depending on
whether the value of the second argument is 'on' or 'off'. The state of the
registration of any callbacks is stored directly in the mpc struct. In our example, the
toggle_reserves.m file contains the toggle_reserves function as well as the five callback
functions.
function mpc = toggle_reserves(mpc, on_off) %TOGGLE_RESERVES Enable, disable or check status of fixed reserve requirements. % MPC = TOGGLE_RESERVES(MPC, 'on') % MPC = TOGGLE_RESERVES(MPC, 'off') % T_F = TOGGLE_RESERVES(MPC, 'status') if strcmp(upper(on_off), 'ON') % <code to check for required 'reserves' fields in mpc> %% add callback functions mpc = add_userfcn(mpc, 'ext2int', @userfcn_reserves_ext2int); mpc = add_userfcn(mpc, 'formulation', @userfcn_reserves_formulation); mpc = add_userfcn(mpc, 'int2ext', @userfcn_reserves_int2ext); mpc = add_userfcn(mpc, 'printpf', @userfcn_reserves_printpf); mpc = add_userfcn(mpc, 'savecase', @userfcn_reserves_savecase); mpc.userfcn.status.dcline = 1; elseif strcmp(upper(on_off), 'OFF') mpc = remove_userfcn(mpc, 'savecase', @userfcn_reserves_savecase); mpc = remove_userfcn(mpc, 'printpf', @userfcn_reserves_printpf); mpc = remove_userfcn(mpc, 'int2ext', @userfcn_reserves_int2ext); mpc = remove_userfcn(mpc, 'formulation', @userfcn_reserves_formulation); mpc = remove_userfcn(mpc, 'ext2int', @userfcn_reserves_ext2int); mpc.userfcn.status.dcline = 0; elseif strcmp(upper(on_off), 'STATUS') if isfield(mpc, 'userfcn') && isfield(mpc.userfcn, 'status') && ... isfield(mpc.userfcn.status, 'dcline') mpc = mpc.userfcn.status.dcline; else mpc = 0; end else error('toggle_dcline: 2nd argument must be ''on'', ''off'' or ''status'''); end
Running a case that includes the fixed reserves requirements is as simple as loading the
case, turning on reserves and running it.
mpc = loadcase('t_case30_userfcns'); mpc = toggle_reserves(mpc, 'on'); results = runopf(mpc);