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

Simulieren in echtzeit bzw langsam simulieren

 

Kai8585

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2011, 09:27     Titel: Simulieren in echtzeit bzw langsam simulieren
  Antworten mit Zitat      
Wie kann ich eine Simulation zum Testen von Funktion auf ganz langsam stellen? Bzw. ich will Funktionen während einer laufenden simulation Testen jedoch hat meine simulation immer viel zu schnell durch simuliert wie bremse ich eine simulation? Wichtig ist ich will eine simulation die läuft und ich über die workspace werte ändern kann um gewisse änderungen wärend einer dimulation zu überprüfen?


Phate
Forum-Guru

Forum-Guru



Beiträge: 283
Anmeldedatum: 09.11.09
Wohnort: Stuttgart
Version: R2008b
     Beitrag Verfasst am: 23.09.2011, 10:30     Titel:
  Antworten mit Zitat      
Hi,

Während einer Simulation Werte zu ändern geht meines Wissens nach nicht. Du musst die Simulation pausieren, dann mithilfe von dem Befeh
Code:
die Werte ändern und dann weitersimulieren. Alternativ kannst du je nach Entscheidungskriterien mithilfe der Logcblöcke andere Berechnungen durchführen.

Die erste Frage hab ich nicht ganz verstanden. Diese bitte nochmal genauer/verständlicher formulieren.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
theShining
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 15.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2011, 10:54     Titel:
  Antworten mit Zitat      
Du hast verschiedene Möglichkeiten:

Den Wert zu ändern geht z.B über (wie mein vorredner schon gesagt hat):
set_param('Model/Zylinder2','area_B',3.1);

über den Befehl getparam kannst du auch aktuelle Werte auslesen und auch auflisten lassen, welche variablen du alles ändern kannst ('value' ist son standart ding, oder auch 'gain'..da kommt es ganz auf den verwendeten bausteine an).

Diese Änderung funktioniert auch während der simulation...du kannst die simulationszeit auch auf "inf" stellen..dann hast du viel zeit zum ändern...wenn dir das reichen sollte.

Eine nicht schöne Funktion (bitte kein kommentar dazu Wink) zum "verlangsamen" der Simulation, bei Bedarf auf eine Art Soft-Real-Time findet du hier:

Code:

/*
 * File : timestw.c
 * Abstract:
 *       An example C-file S-function for multiplying an input by 2,
 *       y  = 4*u
 *
 * Real-Time Workshop note:
 *   This file can be used as is (noninlined) with the Real-Time Workshop
 *   C rapid prototyping targets, or it can be inlined using the Target
 *   Language Compiler technology and used with any target. See
 *     matlabroot/toolbox/simulink/blocks/tlc_c/timestw.tlc  
 *   the TLC code to inline the S-function.
 *
 * See simulink/src/sfuntmpl_doc.c
 *
 * Copyright 1990-2009 The MathWorks, Inc.
 * $Revision: 1.1.6.2 $
 */


#define S_FUNCTION_NAME  timestw
#define S_FUNCTION_LEVEL 2

#include "simstruc.h"
#include "time.h"
#include "windows.h"

/*================*
 * Build checking *
 *================*/


/* Function: mdlInitializeSizes ===============================================
 * Abstract:
 *   Setup sizes of the various vectors.
 */
static void mdlInitializeSizes(SimStruct *S)
{
    ssSetNumSFcnParams(S, 0);
    if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
        return; /* Parameter mismatch will be reported by Simulink */
    }

    if (!ssSetNumInputPorts(S, 1)) return;
    ssSetInputPortWidth(S, 0, DYNAMICALLY_SIZED);
    ssSetInputPortDirectFeedThrough(S, 0, 1);

    if (!ssSetNumOutputPorts(S, 2)) return;
   // ssSetOutputPortWidth(S, 0, DYNAMICALLY_SIZED);
   // ssSetOutputPortWidth(S, 1, DYNAMICALLY_SIZED);
   
    ssSetOutputPortWidth(S, 0, 1);
    ssSetOutputPortWidth(S, 1, 1);
  //  ssSetOutputPortWidth(S, 2, DYNAMICALLY_SIZED);

    ssSetNumSampleTimes(S, 1);

    /* specify the sim state compliance to be same as a built-in block */
    ssSetSimStateCompliance(S, USE_DEFAULT_SIM_STATE);

    /* Take care when specifying exception free code - see sfuntmpl_doc.c */
    ssSetOptions(S,
                 SS_OPTION_EXCEPTION_FREE_CODE |
                 SS_OPTION_USE_TLC_WITH_ACCELERATOR);
}

//SS_OPTION_WORKS_WITH_CODE_REUSE |
/* Function: mdlInitializeSampleTimes =========================================
 * Abstract:
 *    Specifiy that we inherit our sample time from the driving block.
 */
static void mdlInitializeSampleTimes(SimStruct *S)
{
   // ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME);
    ssSetSampleTime(S, 0, 0.002);
    ssSetOffsetTime(S, 0, 0.0);
    ssSetModelReferenceSampleTimeDefaultInheritance(S);
}


/* Function: mdlOutputs =======================================================
 * Abstract:
 *    y = 2*u
 */
static void mdlOutputs(SimStruct *S, int_T tid)
{
   
 
    int_T             timer;
    InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0);
    real_T            *y_act = ssGetOutputPortRealSignal(S,0);
    real_T            *y_dt  = ssGetOutputPortRealSignal(S,1);
    int_T             width = ssGetInputPortWidth(S,0);
    real_T            dt;
    real_T            time_act;
    real_T            time_old;


//Aktuelle Zeit
   time_act=(real_T)clock()/CLOCKS_PER_SEC;
//Alte Zeit
   time_old = (real_T)*y_act;
//Differenz gleich Aktuell - Altwert
   dt=time_act - time_old;
   


//Sleep feste Zeit zur CPU Auslastung
timer=(int_T)(((0.0015-dt)*1000)-1);
if (timer<0){timer=0;}
   _sleep(timer);
   
//Aktuelle Zeit
time_act=(real_T)clock()/CLOCKS_PER_SEC;
//Differenz gleich Aktuell - Altwert
dt=time_act - time_old;

while (dt<0.0015){
   time_act=(real_T)clock()/CLOCKS_PER_SEC;
   dt=time_act - time_old;}
 
//Zur "schöneren" Ausgabe  - Plausibilätsbetrachtung
  if (dt>4.0){dt=0.002;}

 //Ausgabe Aktualwert und Differenz  
*y_act=time_act;
*y_dt=dt;

}


/* Function: mdlTerminate =====================================================
 * Abstract:
 *    No termination needed, but we are required to have this routine.
 */
static void mdlTerminate(SimStruct *S)
{
}



#ifdef  MATLAB_MEX_FILE    /* Is this file being compiled as a MEX-file? */
#include "simulink.c"      /* MEX-file interface mechanism */
#else
#include "cg_sfun.h"       /* Code generation registration function */
#endif

 



..als ich das gebaut habe, hatte ich weder Ahnung von mex-files, noch bin ich sehr gut in C++...orientiert hatte ich mich damals an der funktion timestwo von mathworks (daher der name)...

als bemerkung: ich hatte eine feste Simulationszeitgröße von 2ms genommen und diese wollte ich gerne annähern. durch Änderung der Zeitwerte kannst du natürlich alles schneller oder langsamer machen..


Du musst diesen Code einfach in deine funktion.c schreiben und diese dann per "mex funktion.c" umwandeln lassen..danach kannst du sie in simulink integrieren...

Wenn das die Richtung ist, die du gehen magst..können wir gerne weiter drüber reden (...und das c-File ein wenig optimieren Razz)
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.09.2011, 11:32     Titel:
  Antworten mit Zitat      
Solltest du allerdings Parameter in einer Übertragungsfunktion ändern wollen, z.B. die Dämpfung eines Systems in einem Transfer Fct Block, geht das nicht während der Simulation mit get_param. Hier musst du dir dann eine S-Function schreiben.
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.