This mailing list (or a GitHub issue) is still my preferred way to respond to 
these sorts of questions, but for some reason I saw and responded first 
here<https://www.mathworks.com/matlabcentral/fileexchange/72085-matpower?tab=discussions#discussions_2528347>
 this time.

    Ray


On Sep 25, 2023, at 1:42 AM, keir steegstra <[email protected]> wrote:

Hi all,

Background:
I am working on a project that involves simulating a system using MATPOWER's 
MOST function. The system consists of a single bus with a PV generator, a load, 
and a battery storage. The objective is to optimize the operation of the 
battery based on the PV generation profile and the load.

System Configuration:
In my case setup, the distributed load is represented as a generator with 
negative power values. To enforce a strict demand, I've set the Pg, PMAX, and 
PMIN parameters of this "load generator" to be equal. This ensures that the 
load demand remains constant and is not subjected to optimization. I am running 
dcopf model:

mpopt = mpoption(mpopt, 'model', 'DC');
mpopt = mpoption(mpopt, 'opf.dc.solver', 'MIPS');
mpopt = mpoption(mpopt, 'most.solver', 'DEFAULT');

Problem:
I've encountered a peculiar issue with the MOST optimization. Whenever I set 
the PV generation (`PVg`) to be less than half of the load (`0.5*load`), the 
optimization fails, and many of the variables from 'most.results' are missing. 
This happens despite the battery storage and discharge rate being set high 
enough to provide the excess power being demanded. This behavior persists 
regardless of the specific values I use for the load and PVg. The error is 
consistent: as long as PVg is less than half of the load, the error occurs. 
Specifically, the error I receive is:

------------------------------------------------
Unrecognized field name "Rrp".
Error in most_summary (line 62)
    Rup = mdo.results.Rrp;
------------------------------------------------

Furthermore, I've observed that the error does not occur when the PV generation 
is equal to or greater than half of the load. I suspect it might be related to 
some constraint that prevents the battery generation from exceeding the PV 
generation, but I haven't been able to pinpoint the exact cause.

Question:
Has anyone encountered a similar issue or can provide insights into why this 
might be happening? Are there specific constraints or parameters in MOST that 
could be causing this behavior? Any guidance or suggestions would be greatly 
appreciated.

Thank you in advance for your assistance!

I have pasted my code below:

  1.  Main program
  2.  Case_file
  3.  PV generation profile funtion ("wind" just refers to "PV". Couldnt be 
bothered changing all of the native functions from "wind" to "solar")
  4.  storage data function

1)% Main program to run DCOPF for no line connection.
clear all;
close all;
"
OutmailID: 127791098, List: 'matpower-l', MemberID: 82861091
SCRIPT: "set up options verbose = 3; mpopt = mpoption('verbose', verbose); 
mpopt = mpoption(mpopt, 'out.all', 1); % Print all results mpopt = 
mpoption(mpopt, 'model', 'DC'); mpopt = mpoption(mpopt, 'opf.dc.solver', 
'MIPS'); mpopt = mpoption(mpopt, 'most.solver', 'DEFAULT'); mpopt = 
mpoption(mpopt, 'out.lim.all', 2); mpopt = mpoption(mpopt, 'out.force', 1); 
mpopt = mpoption(mpopt, 'out.suppress_detail', 0); mpopt = mpoption(mpopt, 
'most.security_constraints', 0);"
TCL MERGE ERROR ( 09/27/2023 15:36:27 ): "wrong # args: should be "set varName 
?newValue?" Load case study
casefile = 'casefarm_noline';
mpc = loadcase(casefile);
"
OutmailID: 127791098, List: 'matpower-l', MemberID: 82861091
SCRIPT: "XGEN data xgd_table.colnames = {     'CommitKey', ...         
'CommitSched', ... }; xgd_table.data = [     2   1; ]; xgd = 
loadxgendata(xgd_table, mpc);"
TCL MERGE ERROR ( 09/27/2023 15:36:27 ): "invalid command name "XGEN" -----  + 
Solar  -----
% bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin Pc1 Pc2 Qc1min Qc1max Qc2min 
Qc2max ramp_agc ramp_10 ramp_30 ramp_q apf
wind.gen = [
1 0 0 50 -50 1 1 1 46 -2 0 0 0 0 0 0 20 20 20 0 0; % Keep ramp_10 & ramp_30 
large toensure initial demand deifned in profile can be fully supplied
];
% generator cost data
wind.gencost = [
2 0 0 2 1 0; % PV Load
];
% xGenData
wind.xgd_table.colnames = {
'CommitKey', 'CommitSched'
};
wind.xgd_table.data = [
2 1;
];
[iwind, mpc, xgd] = addwind(wind, mpc, xgd);
profiles = getprofiles('wind_profile_farm_noline', iwind);
nt = size(profiles(1).values, 1);  % number of periods
"
OutmailID: 127791098, List: 'matpower-l', MemberID: 82861091
SCRIPT: "-----  + storage  ----- % mpopt = mpoption(mpopt, 
'most.storage.cyclic', 0); [iess, mpc, xgd, sd] = 
addstorage('storage_farm_noline', mpc, xgd);"
TCL MERGE ERROR ( 09/27/2023 15:36:27 ): "invalid command name "-----" 
simulation
mdi = loadmd(mpc, nt, xgd, sd, [], profiles);
mdo = most(mdi, mpopt); % Run simulation
ms = most_summary(mdo); % print Summary of results
2)
function mpc = casefarm_noline
"
OutmailID: 127791098, List: 'matpower-l', MemberID: 82861091
SCRIPT: "MATPOWER Case Format : Version 2 mpc.version = '2';"
TCL MERGE ERROR ( 09/27/2023 15:36:27 ): "invalid command name "MATPOWER"-----  
Power Flow Data  ----- system MVA base
mpc.baseMVA = 1;
baseKV = 22;
baseMVA = mpc.baseMVA;
"
OutmailID: 127791098, List: 'matpower-l', MemberID: 82861091
SCRIPT: "bus data % bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin 
mpc.bus = [ 1 3 0 0 0 0 1 1 0 baseKV 1 1.1 0.9; ];"
TCL MERGE ERROR ( 09/27/2023 15:36:27 ): "invalid command name "1" generator 
data
Pmax = -40; % convert kw value to MW
Pmax = Pmax / 1000; % convert kw value to MW
Pmin = Pmax;
%bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin Pc1 Pc2 Qc1min Qc1max Qc2min 
Qc2max ramp_agc ramp_10 ramp_30 ramp_q apf
mpc.gen = [
1 Pmax 0 50 -50 1 1 1 Pmax Pmin 0 0 0 0 0 0 0 60 60 0 0; % load. Keep 
PMAX=Pmin, so it acts as a strictly defined Pd.
];
"
OutmailID: 127791098, List: 'matpower-l', MemberID: 82861091
SCRIPT: "branch data (none for single bus) mpc.branch = [];"
TCL MERGE ERROR ( 09/27/2023 15:36:27 ): "invalid command name "branch"-----  
OPF Data  ----- generator cost data
mpc.gencost = [
2 0 0 2 1 0; % Slack Load
];
function windprofile = wind_profile_farm_noline
%WIND_PROFILE_FARM_NOLINE  Example wind profile data
"
OutmailID: 127791098, List: 'matpower-l', MemberID: 82861091
SCRIPT: "define constants [GEN_BUS, PG, QG, QMAX, QMIN, VG, MBASE, GEN_STATUS, 
PMAX, PMIN, ...     MU_PMAX, MU_PMIN, MU_QMAX, MU_QMIN, PC1, PC2, QC1MIN, 
QC1MAX, ...     QC2MIN, QC2MAX, RAMP_AGC, RAMP_10, RAMP_30, RAMP_Q, APF] = 
idx_gen; [CT_LABEL, CT_PROB, CT_TABLE, CT_TBUS, CT_TGEN, CT_TBRCH, CT_TAREABUS, 
...     CT_TAREAGEN, CT_TAREABRCH, CT_ROW, CT_COL, CT_CHGTYPE, CT_REP, ...     
CT_REL, CT_ADD, CT_NEWVAL, CT_TLOAD, CT_TAREALOAD, CT_LOAD_ALL_PQ, ...     
CT_LOAD_FIX_PQ, CT_LOAD_DIS_PQ, CT_LOAD_ALL_P, CT_LOAD_FIX_P, ...     
CT_LOAD_DIS_P, CT_TGENCOST, CT_TAREAGENCOST, CT_MODCOST_F, ...     
CT_MODCOST_X] = idx_ct; %------- Values are in MW -------- windprofile = 
struct( ...     'type', 'mpcData', ...     'table', CT_TGEN, ...     'rows', 0, 
...     'col', PMAX, ...     'chgtype', CT_REP, ...     'values', [] ); 
windprofile.values(:, :, 1) = [     550;     450;     300;     19; % If load = 
20kw and i set this to 19kw, then the dcopf wont converge on 4th time period    
 ]/1000; % /1000 to convert kW values to MW function storage = 
storage_farm_noline(mpc)"
TCL MERGE ERROR ( 09/27/2023 15:36:27 ): "invalid command name "GEN_BUS,"-----  
storage  -----
ecap = 15; % energy capacity (MWh)
pcap = ecap*0.25; % power capacity (MW). Max charge/discharge rate
scost = 1; % cost/value of initial/residual stored energy
SOC_IC = 0.5*ecap; % initial storage
"
OutmailID: 127791098, List: 'matpower-l', MemberID: 82861091
SCRIPT: "generator data % bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin Pc1 Pc2 
Qc1min Qc1max Qc2min Qc2max ramp_agc ramp_10 ramp_30 ramp_q apf storage.gen = [ 
1 0 0 0 0 1 1 1 pcap -pcap 0 0 0 0 0 0 0 20 20 0 0; ]; % 4th and 3rd last 
columns specify the charge/discharge rate"
TCL MERGE ERROR ( 09/27/2023 15:36:27 ): "invalid command name "1"-----  OPF 
Data  ----- generator cost data
% 1 startup shutdown n x1 y1 ... xn yn
% 2 startup shutdown n c(n-1) ... c0
storage.gencost = [
2 0 0 2 1 0;
];
"
OutmailID: 127791098, List: 'matpower-l', MemberID: 82861091
SCRIPT: "xGenData storage.xgd_table.colnames = { 'CommitKey', ... 
'CommitSched', ... }; storage.xgd_table.data = [ 2 1; ];"
TCL MERGE ERROR ( 09/27/2023 15:36:27 ): "invalid command name "xGenData" 
StorageData
storage.sd_table.OutEff = 1;
storage.sd_table.InEff = 1;
storage.sd_table.LossFactor = 0;
storage.sd_table.rho = 1;
storage.sd_table.colnames = {
'InitialStorage', ... % MWh
'InitialStorageLowerBound', ...
'InitialStorageUpperBound', ...
   'InitialStorageCost', ...
       'TerminalStoragePrice', ...
           'MinStorageLevel', ... % MWh
           'MaxStorageLevel', ... % MWh
               'OutEff', ...
               'InEff', ...
               'LossFactor', ...
                'rho', ...
};
Eff = 1; % battery efficiency (typically between 0.85 to 0.95)
storage.sd_table.data = [
 SOC_IC 7 ecap    scost scost 0 ecap Eff Eff 0 1;
];

Reply via email to