# CoDeSys 2.3, versuche einen Merker zu setzen, bitte um Hilfe



## Nico1 (4 Mai 2013)

Hallo Zusammen,
ich versuche in meinem Programm einen Merker zu installieren, leider bisher ohne Erfolg.
Hier die Beschreibung:
Ich habe ein Programm erstellt und dazu einige Funktionsbausteine die während des Verlaufs aufgerufen werden sollen.
Das Programm habe ich in FUP erstellt und die einzelnen Funktionsblöcke in der AS.
Im ersten Funktionsblock habe eine Ausgangsgröße generiert. Dieses Signal soll mittels Merker das Startsignal für einen späteren Funktionsblock sein.
Kann mir bitte von Euch jemand helfen? Wenn ich mein Problem genauer schildern lasst es mich gerne wissen?
Vielen Dank,
Nico


----------



## Wu Fu (4 Mai 2013)

Hallo Nico,

wenn ich Dich richig verstehe willst du eine Variable von einem Programm in ein anderes übergeben.
Deklariere die Variable als Global (VAR_Global) und schon kannst du die Variable in allen Unterprogrammen verwenden.

Schöne Grüße
Daniel


----------



## Nico1 (5 Mai 2013)

Hallo Daniel,
vielen Dank für die schnelle Auskunft, das hört sich gut an.
Sobald ich es geschafft habe in den Onlinemodus meines Programms zu gelangen werde ich es ausprobieren.
Bis dahin vielen Dank,
Nico


----------



## kelvin1000 (13 Mai 2013)

Nico1 schrieb:


> Hallo Daniel,
> vielen Dank für die schnelle Auskunft, das hört sich gut an.
> Sobald ich es geschafft habe in den Onlinemodus meines Programms zu gelangen werde ich es ausprobieren.
> Bis dahin vielen Dank,
> Nico



Hallo!

So wie sich das liest, muss auch Nico eine die Hausarbeit zu Automatisierungstechnik schreiben 

Ich habe das selbe Problem mit den Merkern.
Wir sollen wohl den Merker auch als Merker deklarieren (in der Form Merker1 AT %MX0.0).
Leider ist hierzu die Hilfe von Codesys etwas spärlich.

Fragen:
WO deklariere ich den Merker (globale Variablen?)?
Muss der Merker in den Funktionsblöcken dann nochmal definiert werden?
Wie greife ich innerhalb eines Funktionsblocks in AS auf den Merker zu?

Setzen des Merkers mit dem Qualifier "S" hat bei mir nicht funktioniert.

Aktionen die ausprobiert wurden (also Schritt....Qualifier....Aktion)
Merker1
%MX

Danke schon im Voraus für die Hilfe...

Kelvin

PS: Info an Nico: In den Onlinemodus kommst du, wenn du "Simulation" anklickst


----------



## kelvin1000 (14 Mai 2013)

Hallo!

Nico ist wohl auch gerade dabei die Hausarbeit zu Automatisierungstechnik zu schreiben 

Ich habe das gleiche Problem mit dem Merker, komme jedoch nicht weiter.

Wo deklariere ich denn diesen Merker in Codesys? In den globalen Variablen, oder im Hauptprogramm?

Die Deklaration hätte ich wie folgt gelöst:

Merker1 AT %MX0.1:BOOL;

Wenn ich das in den globalen Variablen mache, wird der Merker jedoch nicht gesetzt (Aufruf aus einem AS Funktionsblock).
Wenn ich die Deklaration im Hauptprogramm eingebe, ist der Merker jedoch nicht global.
Alle Versuche das dann mit Input und Output Variablen zu übergeben scheiterten....

Wäre Klasse, wenn ihr mich/uns über die Funktion und Deklaration von Merkern aufklären könnten 

Danke und Grüße!

Kelvin


----------



## Nico1 (2 Juli 2013)

Hallo Kelvin,
bitte entschuldige meine späte Reaktion. Die Klausur in Unternehmensführung hatte die letzten Tage Prio 1.
Es ist nicht nötig die Variable global zu deklarieren. Das ist nur notwendig wenn du Variablen programmübergreifend nutzt.
Eine Deklaration im Hauptprogramm reicht somit aus.
Bei mir wird in der Aufgabenstellung auch von einem Merker gesprochen aber diesen habe ich nicht als solchen programmiert.
Der Merker stellt ehr ein paar Bedingungen dar die nach der Zeit erfüllt werden müssen.
Um was geht es grob bei Dir in der Aufgabenstellung zur Steuerungstechnik?
LG Nico


----------



## Majestic_1987 (15 Juli 2013)

Also erstmal: Es stellt sich die Frage, ob im Rahmen der Aufgabe tatsächlich ein Merker (= Variable im Merkerbereich der Steuerung) benutzt werden muss oder ob hier einfach ein S7-Veteran eine CoDeSys-Aufgabe stellen wollte. 

Sollte es sich um einen Merker handeln müssen (warum auch immer, i.d.R. gibt es keine Notwendigkeit, Variablen als Merker zu deklarieren...und wenn die besteht, weiß man es), so ist die genannte Definition/Deklaration schon richtig so.

Es ist erstmal auch völlig irrelevant, wo der Merker deklariert wird. In FB's sollte man's vermeiden, weil dann erstens jede Instanz auf den selben Speicherbereich zugreift und es generell unsauber ist, auf Variablen von "außerhalb" des aktuellen Bausteins zuzugreifen. In FC's gilt der zweite Punkt ebenso. Folglich bleiben die Programme und die globalen Variablenlisten.

Wie schon erwähnt wurde, reicht die Deklaration innerhalb des aufrufenden Programms aus.

Ist die Variable (ich nenne sie bewusst nicht "Merker", weil das für mich ein Speicherbereich ist, und ich sehe hier keinen Sinn, das Ding auf ne Adresse zu packen) global deklariert, kann man THEORETISCH aus dem FB direkt drauf schreiben oder daraus lesen. Sollte man aber - wie gesagt - bleiben lassen.
Ist die Variable innerhalb des aufrufenden Programms deklariert, so wird der FB sie nicht "sehen" können. Legt man sie nun lokal im FB nochmal an, so ist das einfach eine lokale Variable, die zufällig den selben Namen trägt, wie eine lokale Variable des aufrufenden Programms. Der Wert innerhalb des FB ist also nicht der selbe, wie in der Variable außen.

Folgendes sollte funktionieren:

1. Anlegen der Variablen bMerker1 innerhalb des aufrufenden Programms:

```
VAR
   bMerker1: BOOL; (* Die Variable *)
END_VAR
```

2. Deklaration einer schreib- wie lesbaren Variablen im FB:

```
VAR_IN_OUT
  IObMerker: BOOL; (* In/Out für das Verändern von bMerker1 *)
END_VAR
```

3. Beim Aufruf des FB die Var. bMerker1 übergeben:

```
fbInstanzA(IObMerker := bMerker1);
```

4. Im AS mit dem Qualifier S oder R (ich empfehle, IEC-Schritte zu verwenden) die Variable IObMerker manipulieren. Die Änderung wird dann - durch die Verwendung von VAR_IN_OUT - direkt auf die übergebene Variable angewendet. Ist quasi eine Übergabe per Referenz.

BY THE WAY: Sollte mal der Zugriff auf eine globale Variable aus einem FB/FC heraus nötig sein, so sollte dieser nur auf KONSTANTEN erfolgen. Diese sollte man dann (eigentlich) gemäß der IEC mittels VAR_EXTERNAL im FB nochmals deklarieren. Ausnahmen von dieser Regel sollte man sich gut überlegen, denn wirklich sauber ist dieser Zugriff unter Umgehung des Bausteininterfaces sicher nicht. Ich verweise hierzu auf meine Signatur...


----------

