Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Problem mit SMC_OutQueue

FrankG
2008-08-22
2008-08-27
  • FrankG - 2008-08-22

    Hallo,

    ich habe ein Problem mit dem Umgang der Funktionen SMC_AppendObj, SMC_DeleteObj und SMC_GetObj auf eine eigene SMC_OutQueue.

    Wenn ich eine eigene OutQueue folgendermaßen deklariert und initialisiert habe:

    VAR_GLOBAL

    pLocalGeoInfo : POINTER TO SMC_GEOINFO;

    MyMemory : ARRAY[0..19] OF SMC_GEOINFO;

    MyQueue : SMC_OUTQUEUE := (nSize := 0,

    nReadPos:=0,

    nWritePos := 0,

    bFull:=FALSE,

    bEndOfList:=TRUE,

    byGenerator:=255,

    strProgramName:='MyCNC');

    bInitMyQueue : BOOL := FALSE;

    pbErg : POINTER TO BOOL;

    END_VAR

    (innerhalb meines Programmes):

    IF NOT(bInitQueue) THEN

    ( Initialisierung von MyQueue )

    MyQueue.pbyBuffer:= ADR(MyMemory);

    MyQueue.nSize := SIZEOF(MyMemory);

    bInitQueue := TRUE;

    ELSE

    ( MyQueue kann verwendet werden, ist initialisiert )

    END_IF

    ... kann ich genau einmal erfolgreich ein SMC_AppendObj() auf diese Queue anwenden, danach bei einem weiteren Aufruf erhalte ich über den Rückgabewert (Pointer to BOOL) eine Fehlermeldung (pLocalGeoInfo ist dabei ein Pointer auf ein GeoInfo-Objekt aus einer anderen Queue):

    pbErg := SMC_AppendObj(ADR(MyQueue), pLocalGeoInfo);

    laut Debugger -> "pErg^ := INVALID: 16#02 "

    Es scheint, dass der Pointer to Bool ab dem zweiten Aufruf von SMC_AppendObj einen illegalen Pointer zurückliefert.

    Was mache ich falsch?

     
  • Hilmar Panzer - 2008-08-27

    Hallo,

    ich denke Sie machen grundsätzlich alles richitg, außer, dass SMC_AppendObj keinen POINTER TO BOOL zurückliefert, sondern ein POINTER TO SMC_GEOINFO. Dieser Zeiger ist entweder 0 (Fehler) oder zeigt auf das angehängte Objekt (siehe Doku). Was aus dem Code nicht hervorgeht ist, wie Sie pLocalGeoInfo belegen. Dieser Zeiger sollte natürlich auf ein gültiges GeoInfo-Objekt zeigen. Vielleicht ist es besser, anstelle des Zeigers ein echtes Objekt anzulegen, und das zu übergeben:

    LocalGeoInfo: SMC_GeoInfo;

    pResult: POINTER TO SMC_GeoInfo;

    pResult := SMC_AppendObj(ADR(MyQueue), ADR(LocalGeoInfo));

     
  • FrankG - 2008-08-27

    Dann empfehle ich eine Änderung Ihrer Online-Hilfe. Hier steht es im Text tatsächlich korrekt, allerdings in der Funktionsdeklaration falsch.

    Zitat aus der Codesys-Hilfe:

    Zitat:
    POINTER TO BOOL SMC_APPENDOBJ(POQ: POINTER TO SMC_OUTQUEUE, PGI: POINTER TO SMC_GEOINFO)
    Diese Funktion hängt ans Ende der Liste bei POQ das GEOINFO-Objekt, das bei PGI steht, sofern OQ richtig initialisiert und nicht schon vollständig belegt ist. Im Erfolgsfall ist der Rückgabewert ein Zeiger auf das neue Listen-Element, ansonsten 0.

    Vielen Dank für Ihre Hilfe, nun weiß ich, was falsch gelaufen ist und kann es korregieren.

    Den Pointer pLocalGeoInfo hatte ich natürlich zuvor mit SMC_GetObj() aus einer bestehenden Queue erhalten in meinem Beispiel. Ich hatte es nur nicht vollständig beschrieben in meinem ersten Post, da es für mich nicht so relevant war.

    Ich hätte da noch eine Frage. Wie prüfe ich einen Zeiger auf 0 oder Gültigkeit ab (z.B. in ST)? Ich hatte hierzu bereits einmal folgendes Konstrukt erstellt, was allerdings nicht korrekt funktioniert hatte:

    pLocalGeoInfo := SMC_GetObj(ADR(MyQueue), 0);

    IF NOT(pLocalGeoInfo = 0) THEN

    ( soll ausgeführt werden, wenn von SMC_GetObj() ein gültiger Pointer zurückgeliefert wird)

    END_IF

    Leider ist die IF-Bedingung immer TRUE, in jedem Fall. Ich kann die Negierung sogar entfernen und die IF-Bedingung war immer noch erfüllt. Habe ich hier einen Denkfehler begangen?

     

Log in to post a comment.