WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Fortrandateien in Simulink

 

christian_2
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.10.2013, 11:26     Titel: Fortrandateien in Simulink
  Antworten mit Zitat      
Hallo zusammen,

den ganzen Vormittag probiere ich nun schon, eine einfache Fortrandatei als s-Funktion in Simulink einzubinden.
Die prinzipielle Vorgehensweise ist mir bewusst, mit c-Dateien habe ich keine Probleme.

Was habe ich gemacht?

1. Fortrancompiler einbinden:

Code:

mex -setup
Please choose your compiler for building external interface (MEX) files:
 
Would you like mex to locate installed compilers [y]/n?
 
Select a compiler:
[1] Compaq Visual Fortran version 6.1 in C:\Programme\VisualStudio 6
[2] Lcc C version 2.4.1 in C:\PROGRA~3\MA424F~1\sys\lcc
[3] Microsoft Visual C/C++ version 6.0 in C:\Programme\VisualStudio 6
 
[0] None
 
Compiler: 1
 
Please verify your choices:
 
Compiler: Compaq Visual Fortran 6.1
Location: C:\Programme\VisualStudio 6
 
Are these correct?([y]/n):
 
***************************************************************************
  Warning: The Compaq Visual Fortran 6.1 compiler is being phased out and  
           will not be supported in a future release.  
           For a list of currently supported compilers see:  
           http://www.mathworks.com/support/tech-notes/1600/1601.html
***************************************************************************
 
Trying to update options file: C:\Documents and Settings\u30ck\Application Data\MathWorks\MATLAB\R2006b\mexopts.bat
From template:              C:\PROGRA~3\MA424F~1\bin\win32\mexopts\cvf61opts.bat
 
Done . . .
 


So, wie ich das verstehe, scheint das funktioniert zu haben, oder?


2. Quelldatei compilieren

Code:

>>
>> mex -c Fortranquellcode_for.f
>>
 



Nachdem hier keine Fehlermeldung erscheint und im aktuellen Verzeichnis eine Datei Fortranquellcode_for.obj erzeugt wird, gehe ich davon aus, dass die Fortrandatei korrekt compiliert wurde.

Die Fortrandatei ist übrigens eine Beispieldatei aus Matlab:


Zitat:

C
C File: SFUN_TIMESTWO_FOR.F
C
C Abstract:
C A sample Level 1 FORTRAN representation of a
C timestwo S-function.
C
C The basic mex command for this example is:
C
C >> mex sfun_timestwo_for.f simulink.f
C
C Copyright 1990-2002 The MathWorks, Inc.
C
C $Revision: 1.4 $
C
C=====================================================
C Function: SIZES
C
C Abstract:
C Set the size vector.
C
C SIZES returns a vector which determines model
C characteristics. This vector contains the
C sizes of the state vector and other
C parameters. More precisely,
C SIZE(1) number of continuous states
C SIZE(2) number of discrete states
C SIZE(3) number of outputs
C SIZE(4) number of inputs
C SIZE(5) number of discontinuous roots in
C the system
C SIZE(6) set to 1 if the system has direct
C feedthrough of its inputs,
C otherwise 0
C
C=====================================================
C
SUBROUTINE SIZES(SIZE)
C .. Array arguments ..
INTEGER*4 SIZE(*)
C .. Parameters ..
INTEGER*4 NSIZES
PARAMETER (NSIZES=6)

SIZE(1) = 0
SIZE(2) = 0
SIZE(3) = 1
SIZE(4) = 1
SIZE(5) = 0
SIZE(6) = 1

RETURN
END

C
C=====================================================
C
C Function: OUTPUT
C
C Abstract:
C Perform output calculations for continuous
C signals.
C
C=====================================================
C .. Parameters ..
SUBROUTINE OUTPUT(T, X, U, Y)
REAL*8 T
REAL*8 X(*), U(*), Y(*)

Y(1) = U(1) * 2.0

RETURN
END

C
C=====================================================
C
C Stubs for unused functions.
C
C=====================================================

SUBROUTINE INITCOND(X0)
REAL*8 X0(*)
C --- Nothing to do.
RETURN
END

SUBROUTINE DERIVS(T, X, U, DX)
REAL*8 T, X(*), U(*), DX(*)
C --- Nothing to do.
RETURN
END

SUBROUTINE DSTATES(T, X, U, XNEW)
REAL*8 T, X(*), U(*), XNEW(*)
C --- Nothing to do.
RETURN
END

SUBROUTINE DOUTPUT(T, X, U, Y)
REAL*8 T, X(*), U(*), Y(*)
C --- Nothing to do.
RETURN
END

SUBROUTINE TSAMPL(T, X, U, TS, OFFSET)
REAL*8 T,TS,OFFSET,X(*),U(*)
C --- Nothing to do.
RETURN
END

SUBROUTINE SINGUL(T, X, U, SING)
REAL*8 T, X(*), U(*), SING(*)
C --- Nothing to do.
RETURN
END




So, wenn ich aber die mex32-Datei erzeugen will, erhalte ich folgende Fehlermeldung:

Code:

>> mex Fortranquellcode_for.f
   Bibliothek C:\temp\mex_F14F216B-EF47-4034-0BB6-DED5A8121B5A\templib.lib und Objekt C:\temp\mex_F14F216B-EF47-4034-0BB6-DED5A8121B5A\templib.exp wird erstellt
templib.exp : error LNK2001: Nichtaufgeloestes externes Symbol _MEXFUNCTION@16
Fortranquellcode_for.mexw32 : fatal error LNK1120: 1 unaufgeloeste externe Verweise
 
  C:\PROGRA~3\MA424F~1\BIN\MEX.PL: Error: Link of 'Fortranquellcode_for.mexw32' failed.
 
??? Error using ==> mex
Unable to complete successfully.

>>
 



Ich weiß nicht weiter, weil ich nicht weiß, wo der Fehler liegt. Im Quellcode doch wohl nicht, weil der wurde ja mitgeliefert. Der Compiler wurde ja angeblich auch richtig eingerichtet. Ich hätte ja darauf getippt, dass er beim Linken z.B. eine Headerdatei nicht findet. Aber wenn man sich den Quellcode ansieht, dann gibt es in diesem Beispiel keine Headerdateien. Auch 'MEXFUNCTION' ist in der Quelldatei nicht enthalten.


Deshalb meine Fragen:
1. Was genau bedeutet eigentlich 'Nichtaufgeloestes externes Symbol'? Von welchem Symbol ist hier die Rede? ... man will ja nicht dumm sterben.
2. Was stört Matlab, warum funktioniert die Geschichte nicht?

Vielen Dank schon mal im Voraus für jede Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen


knilumis_baltaM
Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 20.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.10.2013, 13:31     Titel:
  Antworten mit Zitat      
Das Beispiel konnte kompiliert werden, aber beim Linken tritt ein Fehler auf. Im Beispiel steht
Code:
mex sfun_timestwo_for.f simulink.f

hast du das auch so gemacht?
Private Nachricht senden Benutzer-Profile anzeigen
 
christian_2
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.10.2013, 13:38     Titel:
  Antworten mit Zitat      
Hallo und Danke für Deine Antwort.

Nein, ich habe es nicht, wie im Beispiel gemacht, weil ich alles 'selbst' machen wollte.

Folgendes habe ich gemacht:

1. Texteditor geöffnet
2. Neue Datei erstellt (Dateiname: Fortranquellcode_for.F)
3. Quelltext aus der Matlab-Beispieldatei über die Zwischenablage eingefügt und Datei gespeichert.
4. In Matlab den Befehl

Code:

mex Fortranquellcode_for.f
 


eingegeben.


Worauf zielt Deine Frage ab?

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
knilumis_baltaM
Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 20.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.10.2013, 13:39     Titel:
  Antworten mit Zitat      
Weil vielleicht die Datei simulink.f das Symbol enthält, welches du benötigst?!
Private Nachricht senden Benutzer-Profile anzeigen
 
christian_2
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.10.2013, 13:41     Titel:
  Antworten mit Zitat      
... ok, ich probiere es gleich noch einmal aus...
Private Nachricht senden Benutzer-Profile anzeigen
 
christian_2
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.10.2013, 13:56     Titel:
  Antworten mit Zitat      
also, hat immer noch nicht geklappt.

Was habe ich gemacht?

1. Simulink Library Browser geöfnnet
2. Simulink -> User Defined Functions -> S-Function Examples -> Fortran S-function -> Times two
3. Dieses Modell habe ich in ein anderes Verzeichnis kopiert
4. Quelldatei 'sfun_timestwo_for' habe ich in 'c:\PROGRA~3\Matlab_2006b\simulink\src\' gefunden
5. Quelldatei ebenfalls ins Arbeitsverzeichnis kopiert (also in das Verzeichnis, wo das Modell liegt)
6. in Matlab den Befehl

Code:
mex sfun_timestwo_for.F


ausgeführt. Ich erhalte die Fehlermeldung:

Code:
>> mex sfun_timestwo_for.F
   Bibliothek C:\temp\mex_CEC671F7-5983-43B3-D0AF-37DA20678F1E\templib.lib und Objekt C:\temp\mex_CEC671F7-5983-43B3-D0AF-37DA20678F1E\templib.exp wird erstellt
templib.exp : error LNK2001: Nichtaufgeloestes externes Symbol _MEXFUNCTION@16
sfun_timestwo_for.mexw32 : fatal error LNK1120: 1 unaufgeloeste externe Verweise
 
  C:\PROGRA~3\MA424F~1\BIN\MEX.PL: Error: Link of 'sfun_timestwo_for.mexw32' failed.
 
??? Error using ==> mex
Unable to complete successfully.

>>


Diese Vorgehensweise hat mit c-Dateien immer zum Ziel geführt. Allerdings habe ich da auch den Matlab Compiler verwendet (ich glaube lcc hieß der)
Private Nachricht senden Benutzer-Profile anzeigen
 
knilumis_baltaM
Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 20.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.10.2013, 14:00     Titel:
  Antworten mit Zitat      
Ja und.... hast du jetzt mein Vorschlag gemacht oder nicht?
Code:

C The basic mex command for this example is:
C
C >> mex sfun_timestwo_for.f simulink.f
 
Private Nachricht senden Benutzer-Profile anzeigen
 
christian_2
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.10.2013, 14:13     Titel:
  Antworten mit Zitat      
Hallo,

ich hatte nicht begriffen, worauf Du hinaus wolltest. Insofern ist die Antwort Nein, ich hatte das nicht gemacht.

Ich habe mir zwar nahezu die gesamte Hilfe durchgelesen und im Internet stundenlang gesucht, aber die Kommentare im Quelltext nie genau angesehen.


Ich habe es jetzt einfach so gemacht, wie Du geschrieben hast. Und es hat funktioniert. Dann habe ich mir überlegt, woher Du weißt, dass man diese zwei Dateien angeben muss.
Beim Quelltext bin ich bisher immer gleich runter bis zu den Fortran-Befehlen.
OK, war mir eine Lehre, mir auch zukünftig die Kommentare im Quelltext durchzulesen.

Jedenfalls tausend Dank für Deine Hilfe! Ich hätte wahrscheinlich mehrere Tage gebraucht, den Fehler zu finden!

Viele Grüße

Christian
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.