Using Arduino libraries for S-function in Simulink

6 views (last 30 days)
I have been trying to implement an S-function block in my Simulink model to control multiple magnetometers through an I2C multiplexer. The board I am using is an Arduino Due. I keep running into issues that seem to be related to the compatibility of Arduino code and Matlab code. The code that I am using to build my S-function block works perfectly in Arduino IDE, but seems to have issues in Simulink. I have the support package for Arduino and in this S-function I have included the wire and Mag3110 libraries. Below is the error I am getting.
In file included from ../Mag_wrapper.cpp:25:0:
../SparkFun_MAG3110.cpp:80:23: error: variable or field 'readMag' declared void
void MAG3110::readMag(int16* x, int16* y, int16* z){
^
../SparkFun_MAG3110.cpp:80:23: error: 'int16' was not declared in this scope
../SparkFun_MAG3110.cpp:80:30: error: 'x' was not declared in this scope
void MAG3110::readMag(int16* x, int16* y, int16* z){
^
../SparkFun_MAG3110.cpp:80:33: error: 'int16' was not declared in this scope
void MAG3110::readMag(int16* x, int16* y, int16* z){
^
../SparkFun_MAG3110.cpp:80:40: error: 'y' was not declared in this scope
void MAG3110::readMag(int16* x, int16* y, int16* z){
^
../SparkFun_MAG3110.cpp:80:43: error: 'int16' was not declared in this scope
void MAG3110::readMag(int16* x, int16* y, int16* z){
^
../SparkFun_MAG3110.cpp:80:50: error: 'z' was not declared in this scope
void MAG3110::readMag(int16* x, int16* y, int16* z){
^
../Mag_wrapper.cpp:30:2: error: 'int16' does not name a type
int16 x, y, z;
^
../Mag_wrapper.cpp:31:11: error: 'int y1' redeclared as different kind of symbol
int x1, y1, z1;
^
In file included from ../Mag_wrapper.cpp:17:0:
c:\programdata\matlab\supportpackages\r2017a\3p.instrset\arduinoide.instrset\idepkgs\packages\arduino\tools\arm-none-eabi-gcc\4.8.3-2014q1\arm-none-eabi\include\math.h:469:15: error: previous declaration of 'double y1(double)'
extern double y1 _PARAMS((double));
^
../Mag_wrapper.cpp: In function 'void Mag_Outputs_wrapper(uint8_T*, uint8_T*, uint8_T*, const real_T*)':
../Mag_wrapper.cpp:77:16: error: 'tcaselect' was not declared in this scope
tcaselect(1);
^
../Mag_wrapper.cpp:78:27: error: no matching function for call to 'MAG3110::readMag(uint8_T**, uint8_T**, uint8_T**)'
mag.readMag(&x, &y, &z);
^
../Mag_wrapper.cpp:78:27: note: candidate is:
In file included from ../Mag_wrapper.cpp:24:0:
../SparkFun_MAG3110.h:134:8: note: void MAG3110::readMag(int*, int*, int*)
void readMag(int* x, int* y, int* z);
^
../SparkFun_MAG3110.h:134:8: note: no known conversion for argument 1 from 'uint8_T** {aka unsigned char**}' to 'int*'
../Mag_wrapper.cpp:80:8: error: invalid conversion from 'uint8_T* {aka unsigned char*}' to 'int' [-fpermissive]
x1 = x;
^
../Mag_wrapper.cpp:81:8: error: assignment of function 'double y1(double)'
y1 = y;
^
../Mag_wrapper.cpp:81:8: error: cannot convert 'uint8_T* {aka unsigned char*}' to 'double(double)' in assignment
../Mag_wrapper.cpp:82:8: error: invalid conversion from 'uint8_T* {aka unsigned char*}' to 'int' [-fpermissive]
z1 = z;
^
../Mag_wrapper.cpp:89:16: error: 'tcaselect' was not declared in this scope
tcaselect(3);
^
../Mag_wrapper.cpp:90:28: error: no matching function for call to 'MAG3110::readMag(uint8_T**, uint8_T**, uint8_T**)'
mag1.readMag(&x, &y, &z);
^
../Mag_wrapper.cpp:90:28: note: candidate is:
In file included from ../Mag_wrapper.cpp:24:0:
../SparkFun_MAG3110.h:134:8: note: void MAG3110::readMag(int*, int*, int*)
void readMag(int* x, int* y, int* z);
^
../SparkFun_MAG3110.h:134:8: note: no known conversion for argument 1 from 'uint8_T** {aka unsigned char**}' to 'int*'
../Mag_wrapper.cpp:93:8: error: invalid conversion from 'uint8_T* {aka unsigned char*}' to 'int' [-fpermissive]
x2 = x;
^
../Mag_wrapper.cpp:94:8: error: invalid conversion from 'uint8_T* {aka unsigned char*}' to 'int' [-fpermissive]
y2 = y;
^
../Mag_wrapper.cpp:95:8: error: invalid conversion from 'uint8_T* {aka unsigned char*}' to 'int' [-fpermissive]
z2 = z;
^
../Mag_wrapper.cpp:102:16: error: 'tcaselect' was not declared in this scope
tcaselect(7);
^
../Mag_wrapper.cpp:103:28: error: no matching function for call to 'MAG3110::readMag(uint8_T**, uint8_T**, uint8_T**)'
mag2.readMag(&x, &y, &z);
^
../Mag_wrapper.cpp:103:28: note: candidate is:
In file included from ../Mag_wrapper.cpp:24:0:
../SparkFun_MAG3110.h:134:8: note: void MAG3110::readMag(int*, int*, int*)
void readMag(int* x, int* y, int* z);
^
../SparkFun_MAG3110.h:134:8: note: no known conversion for argument 1 from 'uint8_T** {aka unsigned char**}' to 'int*'
../Mag_wrapper.cpp:105:8: error: invalid conversion from 'uint8_T* {aka unsigned char*}' to 'int' [-fpermissive]
x3 = x;
^
../Mag_wrapper.cpp:106:8: error: invalid conversion from 'uint8_T* {aka unsigned char*}' to 'int' [-fpermissive]
y3 = y;
^
../Mag_wrapper.cpp:107:8: error: invalid conversion from 'uint8_T* {aka unsigned char*}' to 'int' [-fpermissive]
z3 = z;
^
../Mag_wrapper.cpp: In function 'void Mag_Update_wrapper(uint8_T*, uint8_T*, uint8_T*, real_T*)':
../Mag_wrapper.cpp:132:29: error: a function-definition is not allowed here before '{' token
void tcaselect(uint8_t i) {
^
../Mag_wrapper.cpp:142:1: error: expected '}' at end of input
}
^
gmake: *** [Mag_wrapper.o] Error 1
### Creating HTML report file mag_test_codegen_rpt.html
### Build procedure for model: 'mag_test' aborted due to an error.
Error(s) encountered while building "mag_test":
### Failed to generate all binary outputs.
  2 Comments
Gergo Igneczi
Gergo Igneczi on 24 Feb 2019
Hi,
Did you manage to find a solution for this? I am running into the same porblems, although all headers and C files are in the same folder as my S-FUNCTION.
Thanks
David Selorm
David Selorm on 25 Oct 2019
Did you prefix the void statements in the wrapper.cpp file with extern 'C'? I think you should try that in the editor if you haven't done that yet

Sign in to comment.

Answers (2)

Shashank
Shashank on 16 Aug 2017
Hi Sarah,
This might be a good starting point for your application:
- Shashank

Michael Goebel
Michael Goebel on 29 Jun 2020
Did anyone find a way to solve this?
i'm having the same problem.
i'm trying to define a function within the s-function output part.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!