Verfasst am: 21.04.2010, 13:59
Titel: Sfunction memory Problem
Hallo Zusammen,
ich habe ein Programm in c++ geschrieben, welches mittels RS232 Nachrichten an ein Gerät schickt. Das ganze habe ich in einer S-Function gepackt. Das erstelle Simulink Block funktioniert nur ein Mal und dann stürzt Matlab mit folgender Fehlermeldung ab:
Zitat:
Assertion failed: Forced Assertion at line 714 of file ".\memmgr\mem32aligned.cpp". Corrupted memory block found
Das hat anscheinend mit der Speicherbelegung zu tun. Kann vielleicht mir jemand helfen und einen Blick auf den Code werfen?
#include "simstruc.h"
using namespace std;
//constructor
Connx::Connx(){
hCom=INVALID_HANDLE_VALUE;
DataSent=0;
}
// Verbindung aufbauen
void Connx::OpenPort(char* port){
hCom = CreateFileA( port,
GENERIC_READ | GENERIC_WRITE,
0, // comm devices must be opened w/exclusive-access
NULL, // no security attributes
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
0, // not overlapped I/O
NULL // hTemplate must be NULLfor comm devices
);
if(hCom == INVALID_HANDLE_VALUE){
// Handle the error.
// ssSetErrorStatus(S,"Error encountered due to ...");
//ssPrintf("Die Verbindung konnte nicht aufgebaut werden.");
}else{
//ssPrintf("Verbunden.");
delete port;
} }
// Function: mdlInitializeSizes ===============================================
// Abstract:
// The sizes information is used by Simulink to determine the S-function
// block's characteristics (number of inputs, outputs, states, etc.).
static void mdlInitializeSizes(SimStruct *S) {
// 1 Parameter
ssSetNumSFcnParams(S, 1);
// Parameter mismatch will be reported by Simulink
if(ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)){ return;
}
// Function: mdlInitializeSampleTimes =========================================
// Abstract:
// This functionis used to specify the sample time(s)for your
// S-function. You must register the same number of sample times as
// specified in ssSetNumSampleTimes.
static void mdlInitializeSampleTimes(SimStruct *S) {
ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME);
ssSetOffsetTime(S, 0, 0.0);
ssSetModelReferenceSampleTimeDefaultInheritance(S);
}
// Function: mdlStart =======================================================
// Abstract:
// This functionis called once at start of model execution. If you
// have states that should be initialized once, this is the place
// to do it.
#define MDL_START
static void mdlStart(SimStruct *S) {
char_T* str;
mxGetString(Serial_PARAM(S),str,5);
myConnection.OpenPort(str);
myConnection.SetPort();
delete str;
}
// Function: mdlOutputs =======================================================
// Abstract:
// In this function, you compute the outputs of your S-function
// block. Generally outputs are placed in the output vector, ssGetY(S).
static void mdlOutputs(SimStruct *S, int_T tid) { if(myConnection.getDataSent() == 0 && myConnection.getHandle() == 1){
ssPrintf("inside");
InputRealPtrsType u = ssGetInputPortRealSignalPtrs(S,0); // Temperatur
InputRealPtrsType u1 = ssGetInputPortRealSignalPtrs(S,1); // Temp Rampe
InputRealPtrsType u2 = ssGetInputPortRealSignalPtrs(S,2); // Ventilator
InputRealPtrsType u3 = ssGetInputPortRealSignalPtrs(S,3); // Steckdose
InputRealPtrsType u4 = ssGetInputPortRealSignalPtrs(S,4); // Uhrkontakt
real_T *y = ssGetOutputPortRealSignal(S, 0);
double mySWert=myDaten.TSollwert(*u[0]);
char sollwert = (char)mySWert;
char temprampe=(char)*u1[0];
char ventilator=(char)*u2[0];
char steckdose=(char)*u3[0];
char uhrkontakt=(char)*u4[0];
int sw = (int)mySWert;
int dt = (int)*u1[0];
int vt = (int)*u2[0];
int sd = (int)*u3[0];
int uk = (int)*u4[0];
int pruefsumme=(1+128+0+255+sw+0+dt+50+0+1+50+vt+sd+uk)% 256; char psumme=char(pruefsumme);
unsigned char buf[18]={2,1,128,psumme,0,255,sollwert,0,temprampe,50,0,1,50,ventilator,steckdose,uhrkontakt,16,3};
//unsigned char buf[20]={2,1,128,108,0,0,16,16,0,16,16,50,0,1,50,100,1,1,16,3};
HANDLE myHCom=myConnection.getCom();
ULONG writtenBytes;
BOOL handleWrite=WriteFile(myHCom,buf,sizeof(buf),&writtenBytes,NULL);
//myConnection.Write2Serial(buf);
myConnection.setDataSent(1);
}else{
ssPrintf("ein Fehler ist aufgetreten");
}
}
// Function: mdlTerminate =====================================================
// Abstract:
// In this function, you should perform any actions that are necessary
// at the termination of a simulation. For example, ifmemory was
// allocated in mdlStart, this is the place to free it.
static void mdlTerminate(SimStruct *S) {
myConnection.CloseConnx();
myConnection.~Connx();
myDaten.~DatenOp();
}
// Required S-function trailer
#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
//////////////////////////////////////////////
//////////////////////////////////////////////
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.