Indirekte Adressierung bei Codesys/TwinCat

Zuviel Werbung?
-> Hier kostenlos registrieren
Ich sehe den Fehler nicht direkt und es ist auch unvollständig.

Der Fehler lag nur darin, dass ich aussen nur "True" und "False" dran hatte und mir das meine Force-Befehle verhagelt hat. Nachdem ich Variablen an den Baustein parametriert hatte, und diese geforced habe, funktionierte es problemlos.
 
Bei TwinCat gehen IN_OUT auch bei FCs, oder worauf bezieht sich diese Beschränkung?

Ich habe es nun extra noch mal getestet. Du hast recht auch CoDeSys/TwinCAT unterstützen beim einem FC VAR_IN_OUT. Ich vermute mal das dies nicht schon immer so war wenn man bei einem FC nämlich einen Bereich VAR_OUTPUT hinzufügt kommt bei CoDeSys diese Meldung:

Fehler 3820: TEST (4): 'VAR_OUTPUT' und 'VAR_IN_OUT' ist in Funktionen nicht erlaubt.

Diese Fehlermeldung muss ich mir wohl verinnerlicht haben ;o)
 

Anhänge

  • IN_OUT.jpg
    IN_OUT.jpg
    19,4 KB · Aufrufe: 16
Zuviel Werbung?
-> Hier kostenlos registrieren
Neues Problem:

Wenn ich folgendes ausführe bekomme ich einen "Page Fault" und das Programm steigt aus.

WAS kann das sein?

Funktion ist wie folgt:

Ich habe einen Baustein, welcher, in diesem Fall, eine Lampe steuert.
Darüber hinaus 2 eigentlich identische, welche in Abhängigkeit von externen Bedingungen die Bits in einem mit Scene_Nr bzw. Switch_Nr bezeichneten Element des Array In_Scenes bzw. In_Switches setzen oder Rücksetzen.

Der folgende Code stammt aus dem Baustein, welcher die Lampe steuert. Ziel ist, dass der Baustein seine Daten aus eben jenem Array bezieht, dessen "Steuerungsbaustein" gerade über das Steuerbit 0 eingeschaltet ist.

Ziel ist, für eine Lampe über die Visualisierung im laufenden Betrieb den ansteuernden Schalter sowie die Lichtszene, zu welcher die Lampe gehört, einstellen zu können. Die jeweils aktuelle Befehlsquelle, also z.b. In_Scene[5].Steuerbit[1] oder In_Switch[2].Steuerbit[1] soll dann die Steuerung übernehmen.

Es wäre prinipiell zwar möglich, den kompletten Code im Baustein 2 mal zu schreiben mit unterschiedlichen Parametern, das wäre aber suboptimal.

Der hier abgedruckte Code ist NUR ein Auszug, die ersten 21 Zeilen des Bausteins plus Variablendeklarationen.

Code:
VAR_INPUT
    Scene_Nr: INT := 0;
    In_Scenes: ARRAY[1..10] OF Scene_Data;

    Switch_Nr: INT := 0;
    In_Switches: ARRAY[1..10] OF Scene_Data;

END_VAR

VAR
    Active_Date: POINTER TO ARRAY[0..10] OF Scene_Data;
    Active_Nr: INT;
END_VAR
Code:
IF In_Scenes[Scene_Nr].Statusbits[0] = FALSE AND In_Switches[Switch_Nr].Statusbits[0] = TRUE THEN

    Active_Date := ADR(In_Switches);
    Active_Nr := Switch_Nr;

ELSIF In_Scenes[Scene_Nr].Statusbits[0] = TRUE AND In_Switches[Switch_Nr].Statusbits[0] = FALSE THEN

    Active_Date := ADR(In_Scenes);
    Active_Nr := Scene_Nr;

ELSE

    Active_Date := ADR(In_Switches);
    Active_Nr := Switch_Nr;

END_IF

IF Active_Date^[Active_Nr].Statusbits[0] = FALSE THEN                            (*Zustand Szene deaktiviert*)

    (*Status := 1;*)
    RETURN;

...
 
Zuletzt bearbeitet:
Deine Arrays beginnen mal bei 1 und ein andermal bei 0.

Im Code Greifst Du bei einem Array das bei 1 beginnt auf die Zelle 0 zu. Das nimmt Dir das Teil einfach übel.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da ich mal vermute das es nur ein Codefragment ist, kann meine Vermutung zutreffen.
Diese Variablendeklaration:
Code:
    Scene_Nr: INT := 0;
    In_Scenes: ARRAY[1..10] OF Scene_Data;

Beißt sich mit dem Code:
Code:
    IF In_Scenes[Scene_Nr].Statusbits[0] = FALSE THEN

Wenn Du Scenes_Nr nicht größer 0 und kleiner-gleich 10 hast geht der Aufruf schief.
 
Nene, keine Sorge,

den Fall In_Scenes = 0 decke ich in einem anderen Baustein ab und der resultiert in einem Return aus der zugehörigen schleife nachdem ein Statuswort gesetzt wurde, dass den Zustand bemeckert.

Nach der Korrektur der Array-Definitionen läufts jetzt.

ABER

Wenn ich 1 mal zwischen Schalter und Szene gewechselt habe tut das Programm nix mehr...da muss ich wohl nochmal suchen...aber nicht mehr heute xD
 
Zurück
Oben