Model fails in openmodelica new frontend

65 Views Asked by At

the following model 'Checkimport1' simulates in openmodelica old frontend and not in new frontend

package DatabaseA
package Data//Database
 model DataStructure //properties
    parameter Integer A;
    parameter String B;
    parameter Real C;
    parameter Real D[3];
  end DataStructure;

  model Comp1//values for properties
    extends DataStructure(A = 1, B = "Comp1", C = 10, D={0.1,1,-1});
  end Comp1;
  model Comp2//values for properties
    extends DataStructure(A = 2, B = "Comp2", C = 20, D={0.2,2,-2});
  end Comp2;
  model Comp3//values for properties
    extends DataStructure(A = 3, B = "Comp3", C = 30, D={0.3,3,-3});
  end Comp3;
end Data;
  model Checkimport1
   import DatabaseA.Data.*;
   parameter Comp1 AB;
   parameter Comp3 AC;
   parameter DataStructure List[:] = {AB,AC};
  end Checkimport1;
  
end DatabaseA;

openmodelica 1.22.1 version. 'Checkimport1' simulates with old frontend and new frontend reports error

Component 'List' may not have a binding equation due to class specialization 'model'
2

There are 2 best solutions below

0
Hans Olsson On BEST ANSWER

The answer by @Prims is a good step, but it should be improved even further to be correct Modelica by also changing Comp1 and Comp3 to be record:

package DatabaseA
package Data
 record DataStructure //Changed from model to record
    parameter Integer A;
    parameter String B;
    parameter Real C;
    parameter Real D[3];
  end DataStructure;
  record Comp1
    extends DataStructure(A = 1, B = "Comp1", C = 10, D={0.1,1,-1});
  end Comp1;
  record Comp2
    extends DataStructure(A = 2, B = "Comp2", C = 20, D={0.2,2,-2});
  end Comp2;
  record Comp3
    extends DataStructure(A = 3, B = "Comp3", C = 30, D={0.3,3,-3});
  end Comp3;
end Data;
  model Checkimport1
   import DatabaseA.Data.*;
   parameter Comp1 AB;
   parameter Comp3 AC;
   parameter DataStructure List[:] = {AB,AC};
  end Checkimport1;
end DatabaseA;

The reason is that a model cannot be parameter (this also applies to DataStructure itself) https://specification.modelica.org/master/class-predefined-types-and-declarations.html#prefix-rules

Note that Comp2 inheriting from a record could technically be a model since it is not used - but I opted for consistency, https://specification.modelica.org/master/inheritance-modification-and-redeclaration.html#restrictions-on-the-kind-of-base-class

0
Prims On

The following code works both in old frontend and new frontend. Just change the DataStructure from model to record.

package DatabaseA
package Data
 record DataStructure //Changed from model to record
    parameter Integer A;
    parameter String B;
    parameter Real C;
    parameter Real D[3];
  end DataStructure;
  model Comp1
    extends DataStructure(A = 1, B = "Comp1", C = 10, D={0.1,1,-1});
  end Comp1;
  model Comp2
    extends DataStructure(A = 2, B = "Comp2", C = 20, D={0.2,2,-2});
  end Comp2;
  model Comp3
    extends DataStructure(A = 3, B = "Comp3", C = 30, D={0.3,3,-3});
  end Comp3;
end Data;
  model Checkimport1
   import DatabaseA.Data.*;
   parameter Comp1 AB;
   parameter Comp3 AC;
   parameter DataStructure List[:] = {AB,AC};
  end Checkimport1;
end DatabaseA;