Error bei s-Function in Simulink

Hallo zusammen,

bin nun seit Weihnachten dran mir einen eigenen Block in Simulink zu erstellen für meinen MAX6675 , doch leider komme ich nicht auf die Lösung des ganzen....

Hat vielleicht jmd Erfahrung mit s-Functions in Simulink und könnte mir helfen mit meinem Error (im Anhang)

Habe das auch im Simulink-Forum gepostet, dies ist für meine Thesis das ganze und mir rennt die Zeit davon ... , deshalb bitte ich um Nachsicht bezüglich Crossposting...

Gruß
Tobi

sfunc_MAX6675_v2_simulation_20180103_123157_Error.txt (15.6 KB)

Hi

Bitte packe auf alle Cross-Postings die Links zu den jeweils anderen Cross-Postings.
So kann sich jeder Helfende ein Bild machen, was schon gesagt wurde und das Rad wird nicht dutzende Male neu erfunden.

Werde gleich Mal Google anwerfen um mehr über 'Thesis' 'MAX6675' und 'Simulink' zu erfahren.

Lobenswert, daß Du mit offenen Karten spielst.

MfG

simulink_einfuhrung.pdf - gerade drüber gestolpert, denke, ist Dir wohl schon bekannt, vll. aber auch nicht :wink:
MAX6675 -> Thermo-Elemente, also Temperatur-Messungen
Thesis -> Weg zu höherem Bildungsabschluß

Wozu verheimlichen ... bringt eh nichts und da ich eure Hilfe brauch und ihr nicht meine momentan sag ich direkt was sache ist :slight_smile:

so der Link zum anderen Forum:

Simulinkforum

habe auch gleich mein Simulink-File (V2 ist meine bevorzugte Variante in diesem Ordner) dazugepackt.

Zu deiner PDF, ja die kenne ich nur finde ich die für meinen Fall selber nicht hilfreich.

Habe auch schon viel recherchiert und habe auch meine Pfade kontrolliert bezüglich der Support-Packages, diese waren auch an der richtigen Stelle. Im Textfile selber meckert er wegen der .h und der .cpp Datei,was dem Ding dort nicht passt verstehe ich leider nicht, denn dies sieht ebenfalls richtig aus mit meinen Augen...

MA6675.zip (462 KB)

Hehe

Nimm Mal folgende Zeile aus Deinem Code:
#include "max6675.cpp"

Wird so auch als Fehler gemeldet, Du bindest die Header-Datei (.h), ein, in Dieser wird selber bereits die .cpp eingebunden.
In der folgenden Zeile bindest Du selber die .cpp-Datei ein - und Das mag der Compiler nicht.

Dort die gemeldeten 'Orte':
s_func_MAX6675_wrapper.cpp:19:
s_func_MAX6675_wrapper.cpp:20:

MfG

postmaster-ino:
Hehe

Nimm Mal folgende Zeile aus Deinem Code:
#include "max6675.cpp"

Wird so auch als Fehler gemeldet, Du bindest die Header-Datei (.h), ein, in Dieser wird selber bereits die .cpp eingebunden.
In der folgenden Zeile bindest Du selber die .cpp-Datei ein - und Das mag der Compiler nicht.

Dort die gemeldeten 'Orte':
s_func_MAX6675_wrapper.cpp:19:
s_func_MAX6675_wrapper.cpp:20:

MfG

Moment ! ich probiere es gleich aus!

Edit:

die neue Fehlermeldung sieht ein bisschen besser aus, da sie kürzer erscheint^^

sfunc_MAX6675_v2_neu.txt (15.4 KB)

Hi

Jetzt bin ich aber außen vor - bei der Definition von Klassen bin ich überfragt, Da habe ich, bestenfalls, gefährliches Halb-Wissen.
'Meine' Klassen sind kopiert und dann ggf. etwas angepasst, verstanden noch lange nicht :confused:

MfG

So geht es mir ja auch... aber in den Klassen selber dürfte theoretisch nichts falsch sein... Habe diese grob überflogen und sie erscheinen mir richtig (bezüglich der Zeichensetzung)

Ich danke dir trotzdem für deine Mühe und Hilfe!


Sonst noch jmd der vllt sich mal einen Überblick hier verschaffen kann und mir auf die Sprünge ?

Also habe heute den ganzen Tag noch etwas rumprobiert und ein paar Dinge geändert...

erhalten noch die folgende Fehlermeldung (siehe Anhang).

weiß jemand noch Rat ?

Temp_V3_Error.txt (1.82 KB)

Die Fehlermeldung lesen und verstehen? Da steht ja drin, was Du machen sollst.
Wenn das nicht richtig ist, hast Du einen anderen prinzipiellen Fehler.

Gruß Tommy

Ich habe wahrscheinlich einen anderen prinzipiellen Fehler drin.... nur ich finde ihn einfach nicht -.-

habe in den Einstellungen gespielt, da die library in c++ und .h vorliegt habe ich versucht das ganze in c++ zu kompilieren, laut der Fehlermeldung oben ohne Erfolg...

gehe ich wieder auf das normale Setting, also auf C, spuckt er mir wieder die meisten Fehler der vorherigen Fehlermeldung aus...

Wahrscheinlich sitzt das Problem vor dem Bildschirm(ich), aber ich sehe nicht was falsch sein könnte leider

Ich kenne Simulink nicht. Da gibt es doch bestimmt ein Handbuch dazu oder nicht?

Gruß Tommy

Also meines Wissens nach habe ich nichts explizites dazu gefunden in schriftlicher Form. Mein Wissen rührt durch selbstversuche, Foren (Matlab, Arduino, Simulink), Youtube Videos wie das hierVideo (ist eines von ca. 3-5 Videos dazu auf Youtube)

Wie ich eine S-Function aubauen soll ist mir dadurch klar mittlerweile (libraries einbinden, Zuweisung der Ports, einfügen des auszuführenden Codes im Output-Header usw.), ich bin nicht jmd der schnell aufgibt, aber es kann nicht sein dass das so kompliziert ist wenn ich den Videos glauben darf/kann/soll...

Also nach mehrfachem "rumpfuschen" am Code in der S-Function, bin ich zu dem Schluss gekommen es mit einem anderen Programm zu versuchen , da ich denke SImulink/Matlab kann es nicht verarbeiten, da er die libraries vom MAX6675 nicht in den Support-Packages enthalten sind.

#define NOP __asm__ __volatile__ ("nop\n\t")

#include <SPI.h>

const byte MAX1_CS = 24;  // CS pin 24
const byte MAX2_CS = 25;
const byte MAX3_CS = 26;
                          // SO  pin 50 Mega 2560
                          // CLK pin 52 Mega 2560
                        
void setup() {
  
  Serial.begin(9600);
  
  //SPI.setBitOrder(MSBFIRST);
  //SPI.setClockDivider(SPI_CLOCK_DIV8);  // wären 2 MHz SPI Takt
  //SPI.setDataMode(SPI_MODE0);           // DataMode 0
  SPI.begin();
  
  pinMode(53, OUTPUT);                    // wegen SPI Funktion notwendig
    
  digitalWrite(MAX1_CS, HIGH);  // CS High Pegel
//  digitalWrite(MAX2_CS, HIGH);  
//  digitalWrite(MAX3_CS, HIGH);    

  pinMode(MAX1_CS, OUTPUT);     // CS Pin Ausgang
//  pinMode(MAX2_CS, OUTPUT);    
//  pinMode(MAX3_CS, OUTPUT);      
}


void loop()
{
  
  Serial.println(MAX_6675(MAX1_CS),2);
//  Serial.println(MAX_6675(MAX2_CS),2);
//  Serial.println(MAX_6675(MAX3_CS),2);
    
  delay(2000);                          // typisch sind 220ms erforderlich

}

float MAX_6675(int CS)
{
  unsigned int KTemp = 0;
  float Celius = 0;
  digitalWrite(CS, LOW);
  NOP;                                  // delay 62.5ns on a 16MHz AtMega, 100ns erforderlich
  NOP;
  byte MSB = SPI.transfer(0);           // höherwertiges Byte einlesen, D15 ... D8
  byte LSB = SPI.transfer(0);           // niederwertiges Byte einlesen, D7 ... D0
  digitalWrite(CS, HIGH);
  KTemp = MSB << 8;  
  KTemp = KTemp | LSB;
  KTemp = KTemp >> 3;
  Celius = (float) (KTemp * 0.25);
  return Celius;
}

die SPI-Bibliotheken sind in den Support-Packages enthalten, deshalb versuche ich es damit nun.

Müsste dann eigentlich funktionieren wenn ich die Teile des Codes in die richtigen "Writer" des S-Function-Blocks einfüge oder?

Weiß jemand was die Zeile unrecognized command line option '-mmcu=atmega2560' mir sagen will?

erhalte noch diese Fehlermeldung, weiß aber nicht so recht etwas damit anzufangen...

TEMP_SPI_build_20180108_141024.txt (4.6 KB)

Steht doch dort: Er kann mit -mmcu=atmega2560 nichts anfangen.

Wären Deine Fragen in Foren zu Deinen Simulationsversuchen nicht besser aufgehoben? Hier kennt doch wohl keiner die Simulatoren.

Gruß Tommy

Das ist wenigstens ein aktives Forum hier deshalb habe/hatte ich die größten Hoffnungen hier im Simulink forum ist nicht wirklich viel los ...

TW1993:
Das ist wenigstens ein aktives Forum hier deshalb habe/hatte ich die größten Hoffnungen hier im Simulink forum ist nicht wirklich viel los ...

Liegt wohl auch daran, weil kaum einer damit arbeitet.
Lerne C++ und mit der IDE umzugehen, und du wirst viel Freude haben.

Also ich kriege das Programm jetzt mittlerweile auf das Board !!!!!
aber ich kriege keinen Wert raus wenn ich mir das ganze im Scope in Simulink anschaue...

Die Temperatur dümpelt bei 0°C rum anstatt bei Zimmertemperatur ....

es kommt auch keine Fehlermeldung mehr, deshalb ist es für mich unverständlich das ich 0°C angezeigt bekomme...

Hat da jemand vielleicht einen Tipp?

TW1993:
...
Die Temperatur dümpelt bei 0°C rum anstatt bei Zimmertemperatur ....

es kommt auch keine Fehlermeldung mehr, deshalb ist es für mich unverständlich das ich 0°C angezeigt bekomme...

Hat da jemand vielleicht einen Tipp?

Ja, du hast es falsch programmiert oder dein Aufbau ist falsch.

Mach es in einem "lesbaren" Sketch und poste den hier. Dann können dir viele helfen.
Dein "Samurei-Dings" kennt hier keiner.

Mein Arduino-Code:

#include "max6675.h"
//SPI-Pins
int thermoDO = 50;
int thermoCLK = 52;

// CS-Pins
int MAX1_CS = 24;
//int MAX2_CS = 25;
//int MAX3_CS = 26;
//int MAX4_CS = 27;
//int MAX5_CS = 28;
//int MAX6_CS = 29;
//int MAX7_CS = 30;
//int MAX8_CS = 31;
//int MAX9_CS = 32;
//int MAX10_CS = 33;
//int MAX11_CS = 34;
//int MAX12_CS = 35;

MAX6675 thermocouple1(52, 24, 50);
//MAX6675 thermocouple2(thermoCLK, MAX2_CS, thermoDO);
//MAX6675 thermocouple3(thermoCLK, MAX3_CS, thermoDO);
//MAX6675 thermocouple4(thermoCLK, MAX4_CS, thermoDO);
//MAX6675 thermocouple5(thermoCLK, MAX5_CS, thermoDO);
//MAX6675 thermocouple6(thermoCLK, MAX6_CS, thermoDO);
//MAX6675 thermocouple7(thermoCLK, MAX7_CS, thermoDO);
//MAX6675 thermocouple8(thermoCLK, MAX8_CS, thermoDO);
//MAX6675 thermocouple9(thermoCLK, MAX9_CS, thermoDO);
//MAX6675 thermocouple10(thermoCLK, MAX10_CS, thermoDO);
//MAX6675 thermocouple11(thermoCLK, MAX11_CS, thermoDO);
//MAX6675 thermocouple12(thermoCLK, MAX12_CS, thermoDO);

//int vccPin = 3;
//int gndPin = 2;
  
void setup() {
  Serial.begin(9600);
  // use Arduino pins 
//  pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH);
//  pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW);
  
  Serial.println("MAX6675 test");
  // wait for MAX chip to stabilize
  delay(500);
}

void loop() {
  // basic readout test, just print the current temp
//  
   Serial.print("C1 = "); 
   Serial.println(thermocouple1.readCelsius());
//   Serial.print("C2 = "); 
//   Serial.println(thermocouple2.readCelsius());
//   Serial.print("C3 = "); 
//   Serial.println(thermocouple3.readCelsius());
//   Serial.print("C4 = "); 
//   Serial.println(thermocouple4.readCelsius());
//   Serial.print("C5= "); 
//   Serial.println(thermocouple5.readCelsius());
//   Serial.print("C6 = "); 
//   Serial.println(thermocouple6.readCelsius());
//   Serial.print("C7 = "); 
//   Serial.println(thermocouple7.readCelsius());
//   Serial.print("C8 = "); 
//   Serial.println(thermocouple8.readCelsius());
//   Serial.print("C9 = "); 
//   Serial.println(thermocouple9.readCelsius());
//   Serial.print("C10 = "); 
//   Serial.println(thermocouple10.readCelsius());
//   Serial.print("C11 = "); 
//   Serial.println(thermocouple11.readCelsius());
//   Serial.print("C12 = "); 
//   Serial.println(thermocouple12.readCelsius());
//   

// 
   delay(1000);
}

Matlab-Code (erstmal für einen MAX6675):

/*
 * Include Files
 *
 */
#if defined(MATLAB_MEX_FILE)
#include "tmwtypes.h"
#include "simstruc_types.h"
#else
#include "rtwtypes.h"
#endif



/* %%%-SFUNWIZ_wrapper_includes_Changes_BEGIN --- EDIT HERE TO _END */
#include <math.h>

#ifndef MATLAB_MEX_FILE

#include <Arduino.h>
#include "max6675.cpp"


int CLK=52;
int CS=50;
int SO=24;

MAX6675 thermocouple (CLK,CS,SO);



#endif
/* %%%-SFUNWIZ_wrapper_includes_Changes_END --- EDIT HERE TO _BEGIN */
#define y_width 1
/*
 * Create external references here.  
 *
 */
/* %%%-SFUNWIZ_wrapper_externs_Changes_BEGIN --- EDIT HERE TO _END */
/* extern double func(double a); */
/* %%%-SFUNWIZ_wrapper_externs_Changes_END --- EDIT HERE TO _BEGIN */

/*
 * Output functions
 *
 */
extern "C" void T_6_1_Outputs_wrapper(real_T *Celsius,
			const real_T *xD,
			const int8_T *CS, const int_T p_width0,
			const int8_T *CLK, const int_T p_width1,
			const int8_T *SO, const int_T p_width2)
{
/* %%%-SFUNWIZ_wrapper_Outputs_Changes_BEGIN --- EDIT HERE TO _END */
if (xD[0] ==1)
{
    #ifndef MATLAB_MEX_FILE
    
    Celsius[0]=  thermocouple.readCelsius(); 
    
    #endif

}
/* %%%-SFUNWIZ_wrapper_Outputs_Changes_END --- EDIT HERE TO _BEGIN */
}

/*
 * Updates function
 *
 */
extern "C" void T_6_1_Update_wrapper(real_T *Celsius,
			real_T *xD,
			const int8_T *CS, const int_T p_width0,
			const int8_T *CLK, const int_T p_width1,
			const int8_T *SO, const int_T p_width2)
{
/* %%%-SFUNWIZ_wrapper_Update_Changes_BEGIN --- EDIT HERE TO _END */
if (xD[0]!=0)
{
#ifndef MATLAB_MEX_FILE

Serial.begin(9600);         
 
 xD[0]=1;
#endif
  
}
/* %%%-SFUNWIZ_wrapper_Update_Changes_END --- EDIT HERE TO _BEGIN */
}

Also wie gesagt der Code in der IDE funktioniert (!!!), hätte ihn halt nur gerne in Simulink auch am laufen