Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Komplexer Parameter bei Funktionsaufruf Kategorie: Programmierung (von Thomas - 2.09.2006 21:06)
Als Antwort auf Re: Komplexer Parameter bei Funktionsaufruf von André H. - 2.09.2006 15:26

> Hallo Thomas,
>
> Wie sieht genau die Definition des eigenen Datentyps aus, und
> wie groÃ? ist das Array definiert ?


type typSwitch
{
     // dies ist die Beschreibung der einzelnen Input! Schalter
     byte bInputPort;              // PortNummer für den Input
     byte bCountOfOutputs;         // wieviele Outputports wollen wir schalten?
     typSwitchAddress arSwitchAddress[dcl.COUNT_SWITCH_PER_INPUT]; // Liste der Adressen
     string strDescription;        // Beschreibung des Ports
     byte bolSpecial;
}

type typSwitchModule
{
     // dies ist die Datenstruktur für die I/O Module
     byte bInputAdr;               // Input Adresse
     byte bOutputAdr;              // Output Adresse
     byte bOutputValue;            // Wie sieht der Startwert für den Output aus?
     byte bInputValue;             // Aktueller Input
     /* Nun kommt die Taster Maske, da einige Ports auch von Schaltern
        belegt werden, wollen wir diese ausblenden. Jeder Port welcher ein Taster
        ist, wird mit einer 1 in der Maske repräsentiert */

     byte bValueButtonAndMask;
     byte bAktiv;                  // Ist das Modul aktiv?
     string strLocation;           // Lokation des Moduls
     typSwitch arSwitch[dcl.COUNT_PORTS]; // Liste der Schalter
}

Das Array arSwitch ist 8 Elemente groÃ?.
Das Array arSwitchModule ist 4 Elemente groÃ?.


> Es gibt zwar ein kleines Problem mit der Parameterübergabe
> von Strings aus zusammengesetzten Datentypen, aber ich denke, das hat
> hiermit nichts zu tun.
>
> Auch ein Stackproblem kann ich ausschlieÃ?en, da in einem solchen Fall
> das Programm bei einem Overflow oder Underflow abbrechen würde
> und eine entsprechende Meldung an der Host-LED ausgegeben wird.
>
> Aber noch ein paar Fragen:
> Wird aus anderen Threads auf den PCF8574 zugegriffen ?
Ja aber ohne ein eigene Capture. Es ist doch in pcf drin?
> Kannst Du genau sagen, da� das Hängenbleiben beim Aufruf von pcf.in() passiert?
> (ggf. temporär Debuggingausgaben in der Funktion pcf.in() am Anfang und vor dem Return einfügen.)
Ich denke ja, werde ich aber auch in pcf.in direkt einmal loggen.
> Da Du eine eigene Platine verwendest, benutzt Du die Ports P1H.0-.3 ?
> Wenn nicht, hast Du Pull-Up-Widerstände angebracht ?
Ja sollten drin sein (Modul ist nicht von mir gebaut)
> Ansonsten kann es durch Störungen zu einer Programmverlangsamung kommen.
> (Es reicht oft eine Leuchtstoffröhre, oder auch Funkenbildung bei Schaltern.)
Das könnte es natürlich sein. Eigentlich ist der I2C Bus soweit es geht von solchen Quellen entfernt
und mit CAT5 Kabel gebaut (ca. 20m). Hhmm vieleicht die Module und das Schalten der Relais in
den Modulen. Eventuell ist ja hier was nicht korrekt...
> Hast Du irgendwelche rekursiven Aufrufe in Deinem Programm ?
> (Funktionen, die sich selbst aufrufen)
Nein.
>
>
> Noch ein kleiner Tip für Deine Funktion:
> Statt
> bInput1 = (not pcf.in (data.arSwitchModule[bIndex].bInputAdr))
>              and (not data.arSwitchModule[bIndex].bValueButtonAndMask);

> kannst Du einfach auch
> bInput1 = pcf.in (data.arSwitchModule[bIndex].bInputAdr)
>              nor data.arSwitchModule[bIndex].bValueButtonAndMask;

> schreiben.
Stimmt, Danke für den Tip.
>  
> > Meine Frage ist nun: Macht es Sinn den Aufruf pcf.in (data.arSwitchModule[bIndex].bInputAdr)
> > besser so zu formulieren:
> > bHilf = data.arSwitchModule[bIndex].bInputAdr;
> > pcf.in(bHilf);

>
> Prinzipiell darf es hier kein Unterschied geben.
>
> > Denn ein ähnliches Problem trat beim Setzen des Ports mit pcf.set auf und hier hat dies geholfen.
>
> Kannst Du das kurz schildern?

Folgendes funktioniert, d.h. der Port wechselt.

     if (data.arRaum[i].bControl==1)
     {
       bModul = data.arRaum[i].bSwitchModule;
       bAdress = data.arRaum[i].bOutputPort;
       if (data.arRaum[i].bAction==1)
       {
          /* Ok, wir sollen den Raum heizen. Also holen wir uns die Adresse
             des Heizungsaktor, den aktuellen Wert. Wenn dieser gerade aus
             ist (255) dann toggeln wir den Port */

          b = pcf.get(bModul,bAdress);
          if ((b==255))
             if (pcf.toggle(bModul,bAdress)==0)
                com.Log("HZ_Control err Toggle",bAdress);
       }
     }


Wobei folgendes nicht funktioniert. Der Rückgabewert von pcf.toggle ist ungleich null und nichts passiert.

     if (data.arRaum[i].bControl==1)
     {
       if (data.arRaum[i].bAction==1)
       {
          /* Ok, wir sollen den Raum heizen. Also holen wir uns die Adresse
             des Heizungsaktor, den aktuellen Wert. Wenn dieser gerade aus
             ist (255) dann toggeln wir den Port */

          b = pcf.get(data.arRaum[i].bSwitchModule,data.arRaum[i].bOutputPort);
          if ((b==255))
             if (pcf.toggle(data.arRaum[i].bSwitchModule,data.arRaum[i].bOutputPort)==0)
                com.Log("heizung.HZ_Control #ERROR# Problem to toggle Port",data.arRaum[i].bOutputPort);
       }
     }

Hinweis: Bei der letzten hatte ich auch noch den Fehler, dass der String länger als 30 Zeichen war. Hatte aber
beim Fehler keine Ã?nderung gemacht.

>
> MfG André H.
>

Viele Grü�e Thomas


    Antwort schreiben


Antworten:

Re: Komplexer Parameter bei Funktionsaufruf (von Guido - 11.09.2006 17:24)