function structure = SS_eqn(name,Bond_number,Bonds,Direction,cr,args, ...
structure,filenum);
disp("SS_eqn");
name,Bond_number,Bonds,Direction
## Set up globals to count the component inputs and outputs. This relies on
## the named SS (the ports) being in the correct order. Using globals here
## avoids changing the common argument list for all _eqn files for something
## which is only used for named SS components.
global local_u_index
global local_y_index
global at_top_level
## SS_eqn - equations for SS component
##
## #######################################
## ###### Model Transformation Tools #####
## ######################################
##
## Matlab function SS_eqn
## structure = SS_eqn(name,bond_number,bonds,direction,cr,args, ...
## structure,filenum);
## Copyright (c) P.J. Gawthrop, 1996.
## ###############################################################
## ### Version control history
## ###############################################################
## ### $Id$
## ### $Log$
## ### Revision 1.26 2004/08/29 13:11:21 geraint
## ### Writes MTTyz vector in the same format as MTTx and MTTy: MTTyz($d,1)
## ##
## ### Revision 1.25 2003/01/07 18:09:21 geraint
## ### More informative error message.
## ##
## ### Revision 1.24 1999/10/22 02:20:32 peterg
## ### Changed error handleing of number of attributes >2
## ##
## ### Revision 1.23 1998/12/03 16:46:16 peterg
## ### Deblanked attributes so that zero attribute works.
## ##
## ### Revision 1.22 1998/07/28 19:05:46 peterg
## ### Fixed a few bugs.
## ##
## ### Revision 1.21 1998/07/28 14:21:31 peterg
## ### Vector SS ports.
## ##
## ### Revision 1.20 1998/07/08 14:42:52 peterg
## ### Removed the annoying info message - it causes problems with big
## ### systems
## ##
## ### Revision 1.19 1998/07/08 11:33:54 peterg
## ### Replace mtt_info by mtt_error when appropriate
## ##
## ### Revision 1.18 1998/07/08 11:30:45 peterg
## ### Removed second (fileID) argument from mtt_info
## ##
## ### Revision 1.17 1998/07/04 07:15:44 peterg
## ### Back under RCS
## ##
## ### Revision 1.16 1998/04/11 19:07:16 peterg
## ### Now do named ports as ordinary ports iff at top level.
## ### --- not yet complete, need to pass necesssary info though to this
## ### function
## ##
## ### Revision 1.15 1997/12/16 19:16:07 peterg
## ### Added unknown input to the effort part.
## ##
## ### Revision 1.14 1997/12/16 18:25:19 peterg
## ### Added unknown_input attribure to flow -- effort still needs doing
## ##
## ### Revision 1.13 1997/09/18 13:15:15 peterg
## ### Fixed incorrect error message flagging inappropriate flow outputs
## ### -- used to give the effort rather than the flow in the error message.
## ##
## ### Revision 1.12 1997/08/26 07:51:30 peterg
## ### Now counts the local input and outputs by order of appearence rather
## ### than by port number - it therfore handles ports with bicausality correctely.
## ##
## ### Revision 1.11 1997/05/09 08:21:07 peterg
## ### Explicit computation of port number -- avoids str2num
## ##
## ### Revision 1.10 1997/03/22 17:13:03 peterg
## ### Fixed bug for port nos. > 1 digit!
## ##
## ### Revision 1.9 1997/03/22 15:50:59 peterg
## ### Changed #1.0f to %d format.
## ##
## ### Revision 1.8 1996/12/10 16:52:29 peterg
## ### Detect null string using strcmp, not length.
## ### Put filnum argument to mtt_info.
## ##
## ### Revision 1.7 1996/12/07 17:17:40 peterg
## ### Added some ;
## ##
## ### Revision 1.6 1996/12/05 09:49:09 peterg
## ### Explicit computation of port number from string.
## ##
## ### Revision 1.5 1996/12/04 21:27:53 peterg
## ### Replaced str2num by sprintf
## ##
## ### Revision 1.4 1996/08/18 20:06:21 peter
## ### Included zero outputs.
## ##
## ### Revision 1.3 1996/08/09 14:08:04 peter
## ### Empty effort and flow attributes replaced by 'external'.
## ##
## ### Revision 1.2 1996/08/08 16:38:19 peter
## ### Changed to filenumer type of fprintf
## ##
## ### Revision 1.1 1996/08/08 16:19:08 peter
## ### Initial revision
## ##
## ###############################################################
## The string 'cr' contains the effort attributes;
## 'arg' contains the flow attributes.
## external indicates an external variable
## internal indicates an internal variable
## anything else is the name of a constant.
## Blank is taken to be external
## If its a numbered port:
## cr contains 'MTT_port'
## arg contains port number
if (strcmp(cr,"SS")) # Then its the standard file
a = split(args,",")
[N,M]=size(a);
if (N~=2) # Must have 2 arguments
mtt_error(sprintf("SS should have 2 args not %i", N));
endif
effort_attribute = deblank(a(1,:));
flow_attribute = deblank(a(2,:));
else # Old style file
effort_attribute = cr;
flow_attribute = args;
endif
## Default attributes
if strcmp(effort_attribute,"")
effort_attribute = "external";
endif
if strcmp(flow_attribute,"")
flow_attribute = "external";
endif
inputs = structure(3);
outputs = structure(4);
zero_outputs = structure(5);
unknown_inputs = structure(6);
n_bonds = length(Bond_number) # Multi port?
for i=1:n_bonds # Loop over all the bonds
bond_number = Bond_number(i);
bonds = Bonds(i,:);
direction = Direction(i,:);
Named_Port = name(1)=="[";
if Named_Port
sname = name(2:length(name)); #Strip the []
else
sname = name;
endif
if Named_Port&&~at_top_level # It's a named port
## Effort
if bonds(1,1)==-1 # Source
local_u_index = local_u_index + 1
fprintf(filenum, "%s := %s_MTTu%d;\n", ...
varname(sname, bond_number,1), sname, local_u_index);
else # Sensor
local_y_index = local_y_index + 1
fprintf(filenum, "%s_MTTy%d := %s;\n", ...
sname, local_y_index, varname(sname, bond_number,1));
endif
## Flow
if bonds(1,2)==1 # Source
local_u_index = local_u_index + 1
fprintf(filenum, "%s := %s_MTTu%d;\n", ...
varname(sname, bond_number,-1), sname, local_u_index);
else # Sensor
local_y_index = local_y_index + 1
fprintf(filenum, "%s_MTTy%d := %s;\n", ...
sname, local_y_index, varname(sname, bond_number,-1));
endif
else # Now do SS which are not ports
## Effort
if strcmp(effort_attribute, "external")
if bonds(1,1)==-1 # Source
inputs = inputs+1;
fprintf(filenum, "%s := MTTu(%d,1);\n", ...
varname(sname, bond_number,1),inputs);
else # Sensor
outputs = outputs+1;
fprintf(filenum, "MTTy(%d,1) := %s;\n", ...
outputs, varname(sname, bond_number,1));
endif
elseif strcmp(effort_attribute, "unknown") # Unknown input
unknown_inputs = unknown_inputs + 1;
fprintf(filenum, "%s := MTTUi%d;\n", ...
varname(sname, bond_number,1), unknown_inputs);
elseif strcmp(effort_attribute, "internal")
## Do nothing
else
if bonds(1,1)==-1 # Named or unknown source
fprintf(filenum, "%s := %s;\n", ...
varname(sname, bond_number,1), effort_attribute);
else # Sensor
if strcmp(effort_attribute, "zero") #Zero output
zero_outputs = zero_outputs + 1;
fprintf(filenum, "MTTyz(%d,1) := %s;\n", ...
zero_outputs, varname(sname, bond_number,1));
else
mtt_error([effort_attribute, " not appropriate for an output (", name, ")"]);
endif
endif
endif
## Flow
if strcmp(flow_attribute, "external")
if bonds(1,2)==1 # Source
inputs = inputs+1
fprintf(filenum, "%s := MTTu(%d,1);\n", varname(sname, bond_number,-1),inputs);
else # Sensor
outputs = outputs+1
fprintf(filenum, "MTTy(%d,1) := %s;\n", outputs, ...
varname(sname, bond_number,-1));
endif
elseif strcmp(flow_attribute, "unknown") # Unknown input
unknown_inputs = unknown_inputs + 1
fprintf(filenum, "%s := MTTUi%d;\n", ...
varname(sname, bond_number,-1), unknown_inputs);
elseif strcmp(flow_attribute, "internal")
## Do nothing
else # Named constant
if bonds(1,2)==1 # Source
fprintf(filenum, "%s := %s;\n", ...
varname(sname, bond_number,-1), flow_attribute);
else # Sensor
if strcmp(flow_attribute, "zero") #Zero output
zero_outputs = zero_outputs + 1
fprintf(filenum, "MTTyz(%d,1) := %s;\n", ...
zero_outputs, varname(sname, bond_number,-1));
else
mtt_error([flow_attribute, " not appropriate for an output (", name, ")"]);
endif
endif
endif
endif
structure(3) = inputs;
structure(4) = outputs;
structure(5) = zero_outputs;
structure(6) = unknown_inputs;
endfor
endfunction