I want to hand data from a struct in my MATLAB workspace to an S-function.
To do this I created a bus. The code is compiled without any errors.
When I start the Simulation I get the following error message:
Invalid
structure-format variable specified as workspace input in
'untitled/From Workspace'. If the input signal is a bus signal, the
variable must be a structure of MATLAB timeseries objects. Otherwise,
the variable must include 'time' and 'signals' field, and the
'signals' field must be a structure with a 'values' fields.
In my opinion a timeseries object does not make sense, since the values are all constant.
Is there another way to import a MATLAB struct in my S-function?
FYI: I am using the S-Function Builder, since I do not have any experience in C.
Related
I am using simulink to simulate my network. In my network, each element (Node) is represented as fuzzy inference system (FIS). Each FIS has a set of inputs and one output, the output from this FIS will be an input to another FIS to participate in calculation of the value to the other element.
each node is represented via FIS, and all the nodes(FIS’s)are connected with each other.
I connect them all in simulink and they work fine, but I need to set a specific initial value for each element to start the simulation.
However, i used the Model explore in Simulink – Model work space to set for each FIS the initial value but unfortunately now I have an error that related for each FIS in my model. This is a copy of error for each FIS:
” Error in ‘MyNetowrk / NODE1/Animation1
while executing MATLAB S-function ‘animrule’, flag = 0 (initialize), at start of simulation.
Caused by:
Struct contents reference from a non-struct array object.”
Can anyone suggest to me how the S function should be look like?
I have a 2D matrix/array in my model, as shown in image. I need to be able to index/access it randomly and pass it as a signal. How do I do this?
I can't use From File block, because the storage is forced to be double and too large for my embedded design.
It doesn't appear I can use From Workspace block...because this array is defined in my model as SoundArray.
This seem like it should be SO SIMPLE, but I just can’t figure it out. The only way I can think of doing it is in custom C code…which I don’t want to do.
Thanks
Array Definition and Model At Bottom
A matlab Function block (formerly EML-block) can pick up model workspace data if it is in "Parameter" scope and you define a Parameter input in the Function block. You could then use other inputs for controlling the random access, then return the desired position as a signal output from the Matlab function block.
function y = fcn(i,j,soundArray)
y = soundArray(i,j);
(Where soundArray is defined as a Parameter, and i and j are Inputs)
Edit:
Or define a Data Store Memory (add definition block). Then put a Data Store Read block for that memory which is routed to a selector block with 2 dimensions and "starting index (port)" for both those dimensions.
I believe you can use Model Workspace data to initialize the Data Store Memory, but I don't think that Model Workspace data is "live" during simulation.
When I'm trying load data, from Matlab to Simulink, I get this error:
Error using TSFPnew (line 191)
Invalid matrix-format variable specified as workspace input in 'modelTSFP/From Workspace5'. The matrix
must have two dimensions and at least two columns. Complex signals of any data type and non-double
real signals must be in structure format. The first column must contain time values and the remaining
columns the data values. Matrix values cannot be Inf or NaN.
I have very simple model (I know, it be easier to do this computation on Matlab, but this is only fragment of my model):
All data have these same dimension 1x144:
Why I can't just load it to the Simulink space?
The error message is pretty self-explanatory: the data in the From Workspace block represents a time dependent variable so if you are using an array, the first column of the array must be the time values and the second (or more) columns the corresponding data points. Check the documentation for more details. Your data appears to be only vectors, where is the corresponding time data for your values?
If you want a parameter (that doesn't vary with time), then don't use a From Workspace block, use a Constant block instead.
I've been doing a lot of research over the last few hours and I can't seem to figure out how to get and set a value to an Inport box. I have a simple model that has one inport and one outport and they are connected to each other. I want to set the inport value to 2 and run my simulation and see if my outport got set correctly. I read that you can't use set_param to set that value but you have to use sim(), but I'm not having any luck with that. So if anyone know how to look at the data in the inport box and/or how to set it, I'd appreciate it. Thanks!
Lucas
Ports in and out in Simulink don't work as you think. They are needed when you create subsystem - your own Simulink block, than you'll have your in and out ports.
But when you just want a make some model, and pass some data in it, and get results to Matlab, then you need To workspace and From workspace blocks. Some variable-name is assigned in their options, so you can set input data from your .m file and get results in matlab variables.
Block From workspace takes matrix variable, but if you want to pass just a number, you can use block Const and fill it value with a variable name.
Here is a screenshot, an example of in, out, to workspace and const blocks:
Here in example, I have input parameter x (block const), subsystem Gain5 and output parameter y (block To workspace). Inside the subsystem I use in and out blocks to get and return values.
I'm trying to parameterize one of my Simulink models, so that I will have a gain in the model whose value is equal to an element of a MATLAB workspace vector indexed by the model parameter. That is, I want to define a model argument WheelIndex and have a gain inside the model with a value AxelLoads(WheelIndex).
When I do it exactly as I've described above, I get "vector indices must be real and positive integers" error. When I change the model argument to AxelLoad(To be used directly in the gain component) and assign its value to be AxelLoads(1)(for the first wheel) I get:
Error in 'Overview/Wheel1'. Parameter '18000.0, 15000.0, 17000.0,
21000.0' setting: "18000.0, 15000.0, 17000.0, 21000.0" cannot be evaluated.
I've also tried importing the vector as a constant block into the model, and use a selector block parameterized by the WheelIndex argument to direct the right element to a multiplication block (thereby making an ugly gain block), but then Simulink complains that I'm trying to use a model argument to define an "un-tunable value".
I just want to somehow define the parameters in the MATLAB workspace to be used in each model instance, so that I can, say, calculate the total weight by adding the loads on each wheel. Simulink seems to block all workarounds I've been trying.
Thanks
Could you use a lookup table to obtain AxelLoads vs. WheelIndex?
The easiest way is if I just came over? :P
Perhaps this explaination of tunable parameters helps a little?