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

DYNAMICALLY_SIZED PortWidth funktioniert nicht (mehr)

 

Andre R.
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 07.02.11
Wohnort: ---
Version: R13
     Beitrag Verfasst am: 07.02.2011, 13:54     Titel: DYNAMICALLY_SIZED PortWidth funktioniert nicht (mehr)
  Antworten mit Zitat      
Hallo Forum,

ich habe hier ein kleines Problem:

Das Makro(?) "DYNAMICALLY_SIZED" in der Funktion "ssSetInputPortWidth" funktioniert von einer S-Funktion zur anderen nicht mehr.

Angefangen habe ich mir der S-Funktion "telegramm_recv": Diese hat 2 Eingangsports, wobei der erste Port die Breite "1" hat und der zweite Port eine beliebige Breite aufweisen kann/soll. Die Funktion funktioniert tadellos.

Aus dieser S-Funktion habe ich die S-Funktion "telegramm_latenz" entwickelt: Sie hat nur einen Port, und dieser ist auch beliebig breit belegbar.

Lasse ich dass Simulink-Modell nun laufen, erhalte ich eine Fehlermeldung:
Zitat:
Error in port widths or dimensions. Invalid dimension has been specified for input port 1 of block 'endausfuehrung/latenz'
Zitat:
Error in port widths or dimensions. Output port 1 of block 'endausfuehrung/X-Plane' is a one dimensional vector with 512 elements

Gebe ich die Port-Weite vordefiniert an (hier 512), läuft auch diese S-Funktion ohne Probleme.
Wähle ich bei einer "DYNAMICALLY_SIZED"-Port-Weite ein Eingangssignal, was der Ausgangs-Port-Weite (hier 32) entspricht, so läuft es auch ohne Probleme.
Wie wirkt sich die Ausgangs-Port-Weite auf die Eingangs-Port-Weite aus ??
Habe ich bei der Initialisierung des Blockes irgendwelche Einstellungen vergessen oder falsch eingestellt ?


Zitat:
#define S_FUNCTION_NAME telegramm_recv
#define S_FUNCTION_LEVEL 2

#include "simstruc.h"
#include "math.h"

/// ========== Function: mdlInitializeSizes ==========
static void mdlInitializeSizes(SimStruct *S) {
ssSetNumSFcnParams(S, 0);
if(ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
return;
}

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

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

ssSetNumSampleTimes(S, 1);

ssSetOptions(S,
SS_OPTION_WORKS_WITH_CODE_REUSE |
SS_OPTION_EXCEPTION_FREE_CODE |
SS_OPTION_USE_TLC_WITH_ACCELERATOR);
}


Zitat:
#define S_FUNCTION_NAME telegramm_latenz
#define S_FUNCTION_LEVEL 2

#include "simstruc.h"
#include "math.h"

/// ========== Function: mdlInitializeSizes ==========
static void mdlInitializeSizes(SimStruct *S) {
ssSetNumSFcnParams(S, 0);
if(ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
return;
}

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

if(!ssSetNumOutputPorts(S, 1)) return;
ssSetOutputPortWidth(S, 0, 32);

ssSetNumSampleTimes(S, 1);

ssSetOptions(S,
SS_OPTION_WORKS_WITH_CODE_REUSE |
SS_OPTION_EXCEPTION_FREE_CODE |
SS_OPTION_USE_TLC_WITH_ACCELERATOR);
}


Gruss André Smile

maltab_simulink_problem.jpg
 Beschreibung:
Sollte Lycos mal wieder spinnen, und kein Bild zu sehen sein ...

Download
 Dateiname:  maltab_simulink_problem.jpg
 Dateigröße:  75.19 KB
 Heruntergeladen:  804 mal
Private Nachricht senden Benutzer-Profile anzeigen


SimRookie
Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 07.01.10
Wohnort: ---
Version: R2007b
     Beitrag Verfasst am: 08.02.2011, 08:46     Titel:
  Antworten mit Zitat      
Hallo Andre,

leider sehe ich bei dir keine mdlSetInputPortWidth(), mdlSetOutputPortWidth() und mdlSetDefaultPort..() Funktionen. Sobald du ein Port als DYNAMICALLY_SIZED deklarierst müssen diese Funktionen benutzt werden. Dies kannst Du in der Hilfe von Matlab unter Write C Mex S-function oder so ähnlich nachlesen oder hier in Forum. Am besten aber schaue Dir die dyn_size.c S-Funktion aus den Examples von Simulink an.

Hoffe ich konnte Dir ein bisschen helfen.

Viel Erfolg und Gruß

SimRookie
Private Nachricht senden Benutzer-Profile anzeigen
 
Andre R.
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 07.02.11
Wohnort: ---
Version: R13
     Beitrag Verfasst am: 10.02.2011, 01:13     Titel: soweit erledigt!
  Antworten mit Zitat      
Hallo
Problem ist soweit erledigt:

Code:
static void mdlInitializeSizes(SimStruct *S) {
    ssSetNumSFcnParams(S, 0);
    if(ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
        return;
    }
    if(!ssSetNumInputPorts(S, 1)) return;
    ssSetInputPortWidth(S, 0, DYNAMICALLY_SIZED);
    ssSetInputPortDirectFeedThrough(S, 0, 1);

    if(!ssSetNumOutputPorts(S, 1)) return;
    ssSetOutputPortWidth(S, 0, 32);

    ssSetNumSampleTimes(S, 1);

    ssSetOptions(S,
                 SS_OPTION_WORKS_WITH_CODE_REUSE |
                 SS_OPTION_EXCEPTION_FREE_CODE |
                 SS_OPTION_USE_TLC_WITH_ACCELERATOR);
}


#if defined(MATLAB_MEX_FILE)

#define MDL_SET_INPUT_PORT_WIDTH

static void mdlSetInputPortWidth(SimStruct *S, int_T port, int_T inputPortWidth) {
    if (inputPortWidth % 32 != 0) {
        ssSetErrorStatus(S,"\nError: Input width must be a multiple of 32 !\nFehler: Eingangsport-Breite muss ein Vielfaches von 32 sein !");
        return;
    }
    ssSetInputPortWidth(S,port,inputPortWidth);
}

#define MDL_SET_OUTPUT_PORT_WIDTH

static void mdlSetOutputPortWidth(SimStruct *S, int_T port, int_T outputPortWidth) {
    ssSetOutputPortWidth(S,port,32);
}

#define MDL_SET_WORK_WIDTHS

static void mdlSetWorkWidths(SimStruct *S) {
    ssSetNumRWork(S, ssGetOutputPortWidth(S,0));
}

#endif

Aber das wäre die der Code für die S-Funktion "telegramm_latenz" :
Nur ein Eingangsport, und dieser ist DYNAMICALLY_SIZED.

Wie sähe der Code für die S-Funktion "telegramm_recv" aus ? Also einer S-Funktion mit 2 Eingangsports: einem mit festgelegter Breite und einem mit DYNAMICALLY_SIZED.

Oder genauer: Die Funktionen mdlSetIn/OutputPortWidth() nutzen ja garnicht die Durchnummerierung der Ports 0,1,2,... sondern hier wurde einfach nur "port" geschrieben...

mdlSetInputPortWidth : ssSetInputPortWidth(S,port,inputPortWidth);
mdlSetOutPortWidth : ssSetOutputPortWidth(S,port,32);

Auch die Fehlerabfrage "inputPortWidth" erfolgt ohne Angabe der Port Nummer! Wie sage ich ihm, dass nur der zweite Port DYNAMICALLY_SIZED ist ??

Nur rein interessehalber Smile
Gruß André
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.