TIA Flankenmerker aus DB-Baustein funktionieren nicht

spirit

Level-1
Beiträge
961
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes Forum,

habe ein Problem in der Art, dass wenn ich Merker aus einem DB als Flankenmerker benutze, diese nicht funktionieren.

Unbenannt.JPG


Verwende ich stattdessen Merker aus der Standard-Variablentabelle, so klappt alles!

Mach ich da etwas falsch in den Einstellungen? :confused:
 
Also ich kenne TIA nicht. Was ist ein Merker in einem DB? Das wird doch auch nur ein normales Datenbit sein, also ein DBX y.z.
Was meinst Du mit Flankenmerker? Den Flankenhilfsmerker oder die eigentliche Flanke?
Was genau funktioniert nicht? Gibts einen Code?
Den DB beschreibst Du ja sicher nicht anderswo?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich kenne TIA nicht. Was ist ein Merker in einem DB? Das wird doch auch nur ein normales Datenbit sein, also ein DBX y.z.
Was meinst Du mit Flankenmerker? Den Flankenhilfsmerker oder die eigentliche Flanke?
Was genau funktioniert nicht? Gibts einen Code?
Den DB beschreibst Du ja sicher nicht anderswo?

Hi borromeus,

also der Flankenmerker wird sicher an keiner weiteren Stelle verwendet.

Beispiel:

Code:
 U     "Sicherheit_Ein"
 FP    "DB_Merker".M10[0]
 S      "Ausgang"


Dieser Code funktioniert nicht (Ausgang wird nicht gesetzt).


Wenn ich aber anstattt "DB_Merker".M10[0] z.B. einen Merker aus der Standard-Variablentabelle verwende, dann ist alles ok!

Code:
 U     "Sicherheit_Ein"
 FP    M30.0
 S     "Ausgang"
 
Zeigt die CPU irgendeinen Fehler an?

Denn der Code ist in Ordnung. Da kann es also noch sein, dass der DB nicht geladen ist (dann müsste ein Fehler anstehen), Dass irgendein Pointer draufzeigt (sonst würdest es in der Referenz sehen).

mfG René
 
Zeigt die CPU irgendeinen Fehler an?

Denn der Code ist in Ordnung. Da kann es also noch sein, dass der DB nicht geladen ist (dann müsste ein Fehler anstehen), Dass irgendein Pointer draufzeigt (sonst würdest es in der Referenz sehen).

mfG René

Nein, CPU zeigt keinerlei Fehler an!

Eigentlich alles ok - und doch nicht ... :p


Dachte evtl. dass am DB irgendwas eingestellt werden muss; ist aber nicht so, oder?
 
nö das funktioniert bei der 300er genauso.

mfG René



Danke René,

dachte nur, weil man z.B. beim Einsatz der 300er auch keinen "optimierten Bausteinzugriff" auswählen kann.


Dann bin ich mit meiner Weisheit mal wieder am Ende ... muss halt Merker aus der Tabelle nehmen. Trotzdem sehr seltsam.
 
ich habe für sowas mal den Begriff "fliegende Bits" geprägt.

Funktionen, die mit Merker wunderbar funktionieren, aber mit DB-Variablen nicht.

Soweit ich das damals nachverfolgen konnte war aber eine etwas unsaubere Programmierung schuld, oder wenn man es anders ausdrücken möchte "unglückliche Konstellationen".
In meinem Fall hatte ich - glaube ich - einen FB gebaut und darin eine eigentlich funktionierende FC aufgerufen - aber da lief dann was mit der Adressierung falsch.

den Code der FC direkt im FB funktionierte dann mit DB-Variablen - die Adressübergabe zwischen FB/FC entfällt ja auch. Hätte man sicher auch anders lösen können...
 
Code:
 U     "Sicherheit_Ein"
 FP    "DB_Merker".M10[0]
 S      "Ausgang"


Dieser Code funktioniert nicht (Ausgang wird nicht gesetzt).
Der Code selber ist völlig in Ordnung und muß funktionieren.
Wenn nicht:
- was steht vor dem U ? Fehlt vielleicht eine VKE-Abgrenzung?
- ist der DB online vorhanden und groß genug?
- wird die Flankenmerker-Variable woanders überschrieben? indirekt/per Pointer oder per Adress-Überlappung (z.B. schreiben auf DBx.DBW10 überschreibt auch DBx.DBX11.0)
- wird "Ausgang" irgendwo rückgesetzt oder überschrieben?

Erzeuge mal einen völlig neuen DB und schreibe direkt in den OB1:
Code:
SET   //vorsichtshalber VKE-Abgrenzung

U     "Sicherheit_Ein"
FP    "DB_Neu".boolvar
S     M30.1

U     "Sicherheit_Ein"
FP    "DB_Neu".M10[0]
S     M30.2

Harald
 
Hi Harald,

gibt es eine logische Erklärung warum es bei einem Merker ohne VKE-Abgrenzung geht und bei dem DB nicht.
Habe es im Simulator getestet und mit Abgrenzung kann der Ausgang gesetzt werden und ohne passiert nichts.

Wenn ein Merker genutzt wird spielt es keine Rolle ob VKE da ist oder nicht. (Bausteinoptimierung ist auch egal)

Eine Interessante Variante gibt es noch wenn vor dem Flankenmerker Netzwerk ein weiteres Netzwerk ist in dem ein Eingang auf 1 abgefragt wird geht es mit dem Merker DB auch wieder.

Gruß Thomas :confused:

Geht nicht.pngGeht1.jpgGeht2.jpg
 
gibt es eine logische Erklärung warum es bei einem Merker ohne VKE-Abgrenzung geht und bei dem DB nicht.
Gibt es nicht, denn es macht keinen Unterschied. Es darf keinen Unterschied machen, ob ein Merker oder ein DB-Bit benutzt wird.

Wenn ein Merker genutzt wird spielt es keine Rolle ob VKE da ist oder nicht. (Bausteinoptimierung ist auch egal)
Das glaube ich nicht. Teste nochmal richtig. Oder kannst Du uns das irgendwie zeigen?
Oder missverstehst Du das was? Ein VKE ist immer vorhanden, es hat immer den Wert 0 oder 1. Eine VKE-Abgrenzung ist eine Anweisung, nach der eine komplett neue Verknüpfung begonnen wird ohne Rücksicht auf das bisher vorhandene VKE und eventuell offene Klammer-Ebenen. (daher "Abgrenzung" oder "Begrenzung")

Dein erstes Beispiel geht nicht, weil das nicht abgegrenzte VKE vom Netzwerk davor (vom "Tag_3") gerade 0 ist. Wenn es 1 ist dann funktioniert das FP (Dein zweites Bild). Dein drittes Beispiel funktioniert, weil Du nach dem nicht abgerenzten Netzwerk davor ein SET hast. (CLR würde genauso gehen)

VKE-Abgrenzung erreicht man normalerweise automatisch durch ein =/S/R oder durch einen VKE-abhängigen Sprung SPB/SPBN/SPBB/SPBNB. Man kann auch an beliebiger Stelle ein SET oder CLR einfügen. (ganz genau: alle Anweisungen welche das Statusbit /ER auf 0 setzen, siehe Step7 Hilfe)
Fehlerhafte VKE-Abgrenzung erhält man meistens, wenn in einem vorhandenen Programm "zum Test" VKE-begrenzende Anweisungen auskommentiert werden. Oder wenn man mit einem nicht VKE-abhängigen Sprung (SPA/SPZ/SPM/SPP/...) in eine Verknüpfung springt.
Code:
U "Tag_1"
U "Tag_2"
[COLOR="#FF0000"]//= %Q0.0  //(zum Test) auskommentiert, damit Q0.0 nicht schaltet :-)
           //dadurch geht jetzt die Verknüpfung in die nächste Verknüpfung mit ein! =:([/COLOR]
U "Tag_3"
U "Tag_4"
= %Q0.1

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es kommt ja noch besser:

Wenn ich bei folgendem Code

Code:
      LAR1  P#0.0

      AUF   "DB_Meldung"

      L DBD [ AR1 , P#0.0 ]
      L DBD [ AR1 , P#4.0 ]
      OD
      L DBD [ AR1 , P#8.0 ]
      OD
      L DBD [ AR1 , P#12.0 ]
      OD
      U <>0
      =     "Störung"

      U     "Anlage_Ein"
 [COLOR=#ff0000]     FP   "DB_Merker".M10[5][/COLOR]
      O
      U     "Quittierung"
      SPBN  Ende

      L     0
      T DBD [ AR1 , P#0.0 ]
      T DBD [ AR1 , P#4.0 ]
      T DBD [ AR1 , P#8.0 ]
      T DBD [ AR1 , P#12.0 ]

Ende: NOP 0

einen Flankenmerker aus dem DB benütze, dann geht die CPU auf Störung und meldet einen Bereichslängenfehler.

Weitere Hinweise zum Ereignis: Prüfen Sie, ob der DB außerhalb der Operandengrenzen der verwendeten CPU liegt ... :confused:
 
Es kommt ja noch besser:

Wenn ich bei folgendem Code

Code:
      LAR1  P#0.0

      AUF   "DB_Meldung" [COLOR=#008000]// Hier öffnest du den DB für die AR bearbeitung[/COLOR]

      L DBD [ AR1 , P#0.0 ]
      L DBD [ AR1 , P#4.0 ]
      OD
      L DBD [ AR1 , P#8.0 ]
      OD
      L DBD [ AR1 , P#12.0 ]
      OD
      U <>0
      =     "Störung"

      U     "Anlage_Ein"
 [COLOR=#ff0000]     FP   "DB_Merker".M10[5] [/COLOR][COLOR=#008000]// hier öffnest du einen weiteren DB. Der geöffnete wird ersetzt[/COLOR][COLOR=#ff0000][/COLOR]
      O
      U     "Quittierung"
      SPBN  Ende

      L     0
      T DBD [ AR1 , P#0.0 ][COLOR=#008000] // Jetzt wird auf den DB "DB_Merker" geschrieben. Ist dieser so lang?[/COLOR]
      T DBD [ AR1 , P#4.0 ]
      T DBD [ AR1 , P#8.0 ]
      T DBD [ AR1 , P#12.0 ]


Ende: NOP 0

einen Flankenmerker aus dem DB benütze, dann geht die CPU auf Störung und meldet einen Bereichslängenfehler.

Weitere Hinweise zum Ereignis: Prüfen Sie, ob der DB außerhalb der Operandengrenzen der verwendeten CPU liegt ... :confused:

In AWL musst du gut aufpassen was du tust wenn du mit Pointern arbeitest, Du bist alleine für Adressregister und Adressräume verantwortlich (Wann du welchen DB offen hast). Da nimmt dir SCL einiges an Arbeit ab.

mfG René
 
... einen Flankenmerker aus dem DB benütze, dann geht die CPU auf Störung und meldet einen Bereichslängenfehler.
Funktioniert das ganze mit einem Merker? Scheint auf den ersten Blick, als wäre der DB_Meldung zu kurz.

EDIT: Unsinn geschrieben. Es ist langsam zu warm zum denken.
 
Zurück
Oben