Hi and thanks for helping me. I've understood your solution and now i'm using just the Arduino Target blocks. Now I've a problem with a S-Funtion that seems to be very similar to this:
I've followed the steps adding the function and instructions about the SetInputPortDimensions but now i've a new problem with the arguments of the added function. I copy the code for explaining it better:
function sserialsb(block)
%SSERIALSB Underlying S-Function for the ICT Serial Send block.
%SSERIALSB(BLOCK) is the underlying S-Function for the ICT Serial Send
% block.
% SS 10/15/07
% Copyright 2007-2010 The MathWorks, Inc.
% $Revision: 1.1.6.5 $
% The setup method is used to setup the basic attributes of the
% S-function such as ports, parameters, etc. Do not add any other
% calls to the main body of the function.
setup(block);
%endfunction
%% Function: setup
===================================================
% Set up the S-function block's basic characteristics such as:
% - Input ports
% - Dialog parameters
% - Options
%
function setup(block)
block.RegBlockMethod('SetInputPortDimensions', @SetInpPortDims);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
block.NumInputPorts = 1;
block.NumDialogPrms = 6;
block.DialogPrmsTunable = {'Nontunable', 'Nontunable',
'Nontunable', ...
'Nontunable', 'Nontunable', 'Nontunable'};
block.SampleTimes = [-1 0];
block.SetPreCompInpPortInfoToDynamic;
for idx = 1:block.NumInputPorts,
block.InputPort(idx).Complexity = 0;
block.InputPort(idx).DirectFeedthrough = true;
end
block.SetAccelRunOnTLC(false);
block.SetSimViewingDevice(true);
block.AllowSignalsWithMoreThan2D = true;
block.RegBlockMethod('Start', @Start);
Functionality : Called to generate block outputs in
simulation step
block.RegBlockMethod('Outputs', @Outputs);
Functionality : Called at the end of simulation for cleanup
block.RegBlockMethod('Terminate', @Terminate);
%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%*ADDED*
function SetInpPortDims(block, idx, di)
block.InputPort(idx).Dimensions = di;
block.OutputPort(1).Dimensions = di/2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Start - Set up the environment by creating objects, initializing data.
function Start(block)
errorStrings = instrumentslgate('privateinstrumentslstring',
'errorStrings');
blockName = get_param(block.BlockHandle, 'Name');
if strcmpi(block.DialogPrm(2).Data, errorStrings.SelectPortString)
error(errorStrings.InvalidSerialPortID, ...
errorStrings.InvalidSerialPort, blockName);
end
if (block.SampleTimes(1) == 0)
error(errorStrings.InvalidInheritedSampleTimeID, ...
errorStrings.InvalidInheritedSampleTime, blockName);
end
configBlk = find_system(bdroot, 'FollowLinks', 'on', ...
'MaskType','Serial Configuration', ...
'ComPort', block.DialogPrm(2).Data);
if (isempty(configBlk))
error(errorStrings.NoSCBlocksID, ...
errorStrings.NoSCBlocks, ...
block.DialogPrm(2).Data, block.DialogPrm(2).Data);
end
configBlkUserData = get_param(configBlk{1}, 'UserData');
if isfield(configBlkUserData, 'zzzSimulinkSerialObject')
serialObj = configBlkUserData.zzzSimulinkSerialObject;
configBlkUserData.zzzReferenceSendInstance =
configBlkUserData.zzzReferenceSendInstance+1;
set_param(configBlk{1}, 'UserData', configBlkUserData);
else
configBlockHandle = get_param(configBlk{1}, 'Handle');
serialObj = eval(get_param(configBlockHandle, 'ObjConstructor'));
configBlkUserData.zzzSimulinkSerialObject = serialObj;
configBlkUserData.zzzReferenceReceiveInstance = 0;
configBlkUserData.zzzReferenceSendInstance = 1;
set(configBlockHandle, 'UserData', configBlkUserData);
set(serialObj, 'BaudRate', str2double(get_param(configBlockHandle, 'BaudRate')), ...
'DataBits', str2double(get_param(configBlockHandle, 'DataBits')), ...
'Parity', get_param(configBlockHandle, 'Parity'), ...
'StopBits', str2double(get_param(configBlockHandle, 'StopBits')), ...
'FlowControl', get_param(configBlockHandle, 'FlowControl'), ...
'Timeout', str2double(get_param(configBlockHandle, 'Timeout')), ...
'ByteOrder', get_param(configBlockHandle, 'ByteOrder'));
end
if (configBlkUserData.zzzReferenceSendInstance>1)
error(errorStrings.MultipleSSBlocksID, ...
errorStrings.MultipleSSBlocks, ...
block.DialogPrm(2).Data, block.DialogPrm(2).Data);
end
times
reqdBufferSize = 100*block.InputPort(1).DataStorageSize;
if ( reqdBufferSize > get(serialObj, 'OutputBufferSize') )
fclose(serialObj);
set(serialObj, 'OutputBufferSize', reqdBufferSize);
fopen(serialObj);
end
sendBlkUserData = get_param(block.BlockHandle, 'UserData');
sendBlkUserData.zzzSimulinkSerialObject = serialObj;
[header terminator] = instrumentslgate('privateslextractheaderandterminator', ...
block.DialogPrm(4).Data, ...
block.DialogPrm(5).Data);
sendBlkUserData.zzzSimulinkSerialHeader = header;
sendBlkUserData.zzzSimulinkSerialTerminator = terminator;
set_param(block.BlockHandle, 'UserData', sendBlkUserData);
dataType = block.InputPort(1).DataTypeID;
if (dataType < 0 || dataType > 7)
error (errorStrings.InvalidDataTypeID, ...
errorStrings.InvalidDataType, blockName);
end
%endfunction
%% Outputs - Generate block outputs at every timestep.
function Outputs(block)
userData = get_param(block.BlockHandle, 'UserData');
serialObj = userData.zzzSimulinkSerialObject;
header = userData.zzzSimulinkSerialHeader;
terminator = userData.zzzSimulinkSerialTerminator;
data = block.InputPort(1).Data(:)';
convertedData = typecast(data, 'uint8');
data = [header convertedData terminator];
if strcmpi(block.DialogPrm(6).Data, 'on')
fwrite(serialObj, data, 'uint8');
else
% Blocking mode off.
while (get(serialObj, 'BytesToOutput') ~= 0)
pause(0.01);
end
fwrite(serialObj, data, 'uint8', 'async');
end
%endfunction Outputs
%% Terminate - Clean up
function Terminate(block)
userData = get_param(block.BlockHandle, 'UserData');
if isfield(userData, 'zzzSimulinkSerialObject')
serialObj = userData.zzzSimulinkSerialObject;
if isa(serialObj, 'serial') && isvalid(serialObj)
while ~(strcmpi(get(serialObj, 'TransferStatus'), 'idle'))
pause(0.01);
end
end
end
userData = [];
set(block.BlockHandle, 'UserData', userData);
%endfunction
I wrote ADDED to the two part of code I've added in and I don't know if I've done it well or positioned in the right place. The error I get is:
1)Error evaluating registered method 'SetInputPortDimensions' of MATLAB S-Function 'sserialsb' in 'provaprovahost/Serial Send'.
2)Invalid output port index specified for 'provaprovahost/Serial Send'. This block has no output ports
3)Error in port widths or dimensions. Output port 1 of 'provaprovahost/Constant' is a one dimensional vector with 1 elements.
Thank you for the help in advance.
VZ