Verfasst am: 07.02.2011, 13:54
Titel: DYNAMICALLY_SIZED PortWidth funktioniert nicht (mehr)
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 ?
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.
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);
}
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...
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
Gruß André
Einstellungen und Berechtigungen
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
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.