TwinCAT 3.1 PLC-Main - Eingänge schreiben

Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe in TwinCAT 3.1 ein PLC-Programm angelegt und möchte nun im MAIN(PRG) ein kleines Programm schreiben.

Habe dazu Variablen (Input, Output, Merker usw. angelegt) und eine Logik programmiert.

Mein Problem ist, dass ich teilweise Eingänge beschreiben muss. Ich hatte vor einem Jahr ebenso ein Programm und dabei hat alles super funktioniert. Wenn ich jetzt aber im Programm Eingänge beschreiben will kommt beim Compilieren immer die Fehlermeldung "...no valid assignment target".
Ich muss Eingänge beschreiben, wohl ich diese später mit der passenden klemme verlinken muss und Ausgänge dabei eben nicht passen.

Kann es sein das etwas geändert wurde, sodass dies nicht mehr geht? Gibt es irgendeine Möglichkeit, dass zu machen? ich mein mit rechter Maustaste ist es mir ja auch möglich Eingänge zu forcen.

Falls ihr weitere Infos braucht einfach schreiben ;)

Grüße
Chris
 
Zeig Dein Machwerk doch mal her, dann kann Dir vermutlich besser geholfen werden, speziell wo Du die Eingänge und Ausgänge deklariert hast die dann auf die Hardware gemappt werden sollen.
 
Zuletzt bearbeitet:
So, jetzt ist mir Dein Problem auch klar geworden.
Das geht nicht (mehr), das kannst Du aber mit einem Trick trotzdem machen, allerdings solltest Du das Folgende in einem extra Test PRG oder FB ausführen, damit das Programm nicht verändert werden muss.
Du ermittelst mit ADR die Adressen der Eingangsvariablen die Du via Programm setzen möchtest und schreibst die Adressen in Pointer vom Typ der Variable. Bei der Gelegenheit, wie MasterOhh schon schrieb, warum möchtest Du das extra über ein Programm machen, was spricht dagegen die entsprechenden Variablen einfach zu setzen? Forchen brauchst Du sie gar nicht, da sie ja nicht von echter Hardware überschrieben werden. Anschließend schreibst Du den gewünschten Wert an den dereferenzierten Pointer, fertig.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine schnelle Antwort, konnte sie leider nur halb nachvollziehen da ich mich im TwinCAT selbst nicht so gut auskenne.

Wie würde das Programm aussehen wenn ich z.B die Klemme mit dem Eingang 244.0 und 244.1 setzen wollen würde?

Ich muss das machen, weil ich nach dem Build des PLC-Programmes, die Ein- und Ausgänge mit der entsprechenden Klemme linken muss. Mir ist nicht bekannt wie ich das anders lösen könnte?
 
Erstmal, was meinst Du mit 244.0 und 244.1? Vermutlich die Adressen der physikalischen Eingänge, in TwinCAT interessieren die tatsächlichen Adressen der IOs nicht und man hat (meine ich) auf diese direkt auch keinen Zugriff. Du deklarierst eine Variable mit %I* als Eingang und mit %Q* als Ausgang. Nachdem das Programm einmal übersetzt wurde kann man diese Variablen dann den physikalischen Ein- und Ausgängen zuordnen.
Hier mal ein kurzes Beispiel. Es besteht aus einem PRG (MAIN) und zwei FBs (FB_IO und FB_Test).
Der FB_IO enthält die Eingänge die durch FB_Test beeinflusst werden sollen und sieht so aus:
Code:
FUNCTION_BLOCK FB_IO
VAR
    xIN_Test01 AT %I* : BOOL;
    xIN_Test02 AT %I* : BOOL;
    xIN_Test03 AT %I* : BOOL;
    xIN_Test04 AT %I* : BOOL;
    xOUT_Test01 AT %Q* : BOOL;
END_VAR

xOUT_Test01 := xIN_Test01 AND NOT xIN_Test02 AND NOT xIN_Test03 AND xIN_Test04;
Im FB_Test werden die Adressen der Variablen ermittelt und diese mit Werten beschrieben. Der FB sieht wie folgt aus:
Code:
FUNCTION_BLOCK FB_Test
VAR
    ptxTest01 : POINTER TO BOOL;
    ptxTest02 : POINTER TO BOOL;
    ptxTest03 : POINTER TO BOOL;
    ptxTest04 : POINTER TO BOOL;
    xTest01 : BOOL;
    xTest02 : BOOL;
    xTest03 : BOOL;
    xTest04 : BOOL;
END_VAR

ptxTest01 := ADR(MAIN.fbIO.xIN_Test01);
ptxTest02 := ADR(MAIN.fbIO.xIN_Test02);
ptxTest03 := ADR(MAIN.fbIO.xIN_Test03);
ptxTest04 := ADR(MAIN.fbIO.xIN_Test04);

ptxTest01^ := xTest01;
ptxTest02^ := xTest02;
ptxTest03^ := xTest03;
ptxTest04^ := xTest04;
Im Programm MAIN werden diese beiden instanziert und aufgerufen, was wie folgt aussieht:
Code:
PROGRAM MAIN
VAR
    fbIO : FB_IO;
    fbTest : FB_Test;
END_VAR

fbTest();
fbIO();
Ich hoffe das macht es etwas klarer für Dich. Das ganze funktioniert natürlich auch für andere Variablentypen, dann müssen entsprechend andere Pointer genommen werden..
 
Zuletzt bearbeitet:
Zunächst ein Tipp am Rande, es wird Dir nicht schneller geholfen, wenn Du mehrmals nach Hilfe rufst, einmal reicht völlig.
Die Fehlermeldung sollte doch eigentlich aussagekräftig genug sein. Der physikalische Ausgang ist mehreren Variablen zugeordnet und das mag TwinCAT gar nicht.
 
Zurück
Oben