dss-extensions / dss-extensions/dss_matlab

class of property Solution.Mode is not double as with COM-Interface

Abierto
#21 1 comentario 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
MATLAB
Estrellas
12
Forks
2
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

Hi Paulo. It is Janis again. (We're aso talking in the DSS Discussion Forum.)

I had just this small error switching from COM to altDSS. I think it is easy to fix.

After this here is some - hopefully excecutably - code which should print

```
=== DSS Interface: COM ===

original Solution properties: Mode = 0 ModeID = Snap
class for Solve Mode = double

Trying to set ModeID to
Error setting Mode ID
Invoke Error: Incorrect number of arguments

Error in Issue_Solution_Mode_difference (line 57)
Solution_I.ModeID = ModeID;
Solution properties: Mode = 0 ModeID = Snap

Trying to set Mode to <2>
Solution properties: Mode = 2 ModeID = Yearly

Trying to set original solve Mode <0>
Solution properties: Mode = 0 ModeID = Snap

=== DSS Interface: altDSS ===

original Solution properties: Mode = 0 ModeID = Snap
class for Solve Mode = DSS_MATLAB.SolveModes

Trying to set ModeID to
Solution properties: Mode = 0 ModeID = Snap

Trying to set Mode to <2>
Solution properties: Mode = 2 ModeID = Yearly

Trying to set original solve Mode <0>
Error using calllib
Array must be numeric or logical.

Error in DSS_MATLAB.ISolution/set.Mode (line 434)
calllib(obj.libname, 'ctx_Solution_Set_Mode', obj.dssctx, Value);

Error in Issue_Solution_Mode_difference (line 81)
Solution_I.Mode = Mode_original;
Solution properties: Mode = 2 ModeID = Yearly

Trying to set original solve Mode <0> with type conversion to double
Solution properties: Mode = 0 ModeID = Snap
```

```matlab
commands = {
'Clear'
'set defaultbasefreq=50' % 50 Hz
'New Circuit.ckt Angle=0 Mvasc3=1e7 basekv=0.4 bus1=n1 frequency=50 phases=3 pu=1.0 x1r1=10'
'New Linecode.nayy4x120 C0=365.9 C1=797.3 R0=1.02 R1=0.255 X0=0.292 X1=0.08 NormAmps=245.0 units=km'
'New Line.l1 bus1=n1 bus2=n2 length=0.3 linecode=nayy4x120'
'solve mode=snap'
'solve algorithm=newton'
'Set Maxiter=75'
};

for phase = 1:3
commands{end+1} = sprintf('New Load.rl_1_ph%1$d bus1=n2.%1$d phases=1 kv=0.4 kW=0 kvar=0', phase); %#ok
end

for interface = {'COM', 'altDSS'}

current_dir = pwd;
switch interface{1}
case 'COM'
DSS_I = actxserver('OpenDSSEngine.DSS');
case 'altDSS'
DSS_I = DSS_MATLAB.IDSS;
end
cd(current_dir)
fprintf(1, '\n\n=== DSS Interface: %s ===\n\n', interface{1})

Text_I = DSS_I.Text;
Circuit_I = DSS_I.ActiveCircuit;
Solution_I = Circuit_I.Solution;

for c = reshape2rowVec(commands)
Text_I.Command = c{1};
end

Text_I.command = 'set voltagebases=0.4';
Text_I.command = 'calcvoltagebases';
Solution_I.Solve;

fprintf(1, 'original Solution properties: Mode = %d ModeID = %s\n', Solution_I.Mode, Solution_I.ModeID)

Mode_original = Solution_I.Mode;

fprintf(1, 'class for Solve Mode = %s\n', class(Mode_original))

%%

ModeID = 'yearly';

fprintf(1, '\nTrying to set ModeID to <%s>\n', ModeID)

try
Solution_I.ModeID = ModeID;
catch err
fprintf(2, 'Error setting Mode ID\n%s\n', err.getReport)
end

fprintf(1, 'Solution properties: Mode = %d ModeID = %s\n', Solution_I.Mode, Solution_I.ModeID)

%%
Mode = 2;

fprintf(1, '\nTrying to set Mode to <%d>\n', Mode)

try
Solution_I.Mode = Mode;
catch err
fprintf(2, '%s\n', err.getReport)
end

fprintf(1, 'Solution properties: Mode = %d ModeID = %s\n', Solution_I.Mode, Solution_I.ModeID)

%%
fprintf(1, '\nTrying to set original solve Mode <%d>\n', Mode_original)

try
Solution_I.Mode = Mode_original;
catch err
fprintf(2, '%s\n', err.getReport)
fprintf(1, 'Solution properties: Mode = %d ModeID = %s\n', Solution_I.Mode, Solution_I.ModeID)

fprintf(1, '\nTrying to set original solve Mode <%d> with type conversion to double\n', Mode_original)

Solution_I.Mode = double(Mode_original);

end

fprintf(1, 'Solution properties: Mode = %d ModeID = %s\n', Solution_I.Mode, Solution_I.ModeID)

end

```

I experienced these 2 differences.

### 1

With COM numerical Solution ModeID is read-only. It errors when trying to set. with DSS_Matlab setting is possible without error but it does not set it. I would suggest to make the property in `ISolution.m` read-only by:

``` matlab
properties (SetAccess = private)
ModeID
end
```

### 2
Solution_I.Mode returns double with COM.

Solution_I.Mode returns enumeration or sth with DSS_Matlab.

When trying to set Mode again with this datatype there is an error.

That could be fixed in the `ISolution.m` class itself by casting to double:

``` matlab
function result = get.Mode(obj)
% Set present solution mode (by a text code - see DSS Help)
result = double(DSS_MATLAB.SolveModes(calllib(obj.libname, 'ctx_Solution_Get_Mode', obj.dssctx)));
obj.CheckForError();
end
```

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.