überprüfung

A

Anonymous

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

wie kann ich ein datenword auf den inhalt überprüfen?
bis jetzt kenne ich diesen befehl nur für diese überprüfung:

L W#16#5555
UW W#16#5555


wie kann ich nun ein datenwort überprüfen? mit diesem befehl zeigt mir der compiler immer einen fehler an:

L DW#16#55555555
UDW DW#16#55555555
 
nimm einfach

L DW#16#55555555
UD DW#16#55555555

UDW gilt nur für vergleiche mit einer konstanten.
ud gilt für vergleiche zwischen akku1 und akku2

grüße aus berlin von
lutz
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wie kann ich diesen transferbefehl nach und abfragen?

L DW#16#55555555
T AD 0
U AD 0
S M 40.3


wenn ich diese befehle schreibe erkennt sie der compiler als nicht richtig.
was mache ich falsch?
 
U ist eine Binärverknüpfung. Wenn diese erfüllt ist, dann wird der Merker gesetzt. Das geht allerdings nur mit Bool-Variablen, was AD 0 ja nicht ist.

Siemens-Hilfe:

Format

Code:
U <Bit> 

Operand	Datentyp	Speicherbereich
<Bit>	BOOL	E, A, M, L, D, T, Z
Beschreibung          

U fragt das adressierte Bit auf den Signalzustand "1" ab und führt eine UND-Verknüpfung des Abfrageergebnisses mit dem VKE durch.

Mit der Operation UND können Sie auch direkt das Statuswort abfragen. Verwenden Sie hierzu die folgenden Operanden: ==0, <>0, >0, <0, >=0, <=0, OV, OS, UO, BIE.

Wann genau willst du denn den Merker 40.3 setzen?
 
ich will abfragen ob der gesendete wert auch wirlklich anliegt, darum habe ich zur bestätigung einen merker der dann auf einem display ein feld ansteuert.


L DW#16#55555555 // hier wird er geladen
T AD 0 // dann übergeben
U AD 0 // hier sollte dann eine überprüfung stattfinden ob der wert wirklich anliegt und dann den merker setzen
S M 40.3
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wenn du einen transfer machst kannst du sicher sein, dass der dann auch anliegt. ist also nicht nötig

ansonsten macht man das über vergleicher.
l dw#16#55555555
l md 10
==D
= M40.3
 
wieso lädt man dann hier einen md10, bei meinem test muss ich nur denn wert denn ich auf das AD 0 Transferiert habe überprüfen? gibt es nicht eine direkte überprüfung für das AD 0?
 
Nein, MD10 war nur ein Beispiel, dort müßte deine Vergleichszahl drinstehen. Aber wie gesagt, ein Transferbefehl wird immer ausgeführt. Wenn du das AD0 nicht anderswo wieder überschreibst, dann kannst du dich darauf verlassen, daß der neue Wert drinsteht. Das Prozessabbild wird natürlich erst am Ende des Programmablaufs entsprechend geschrieben und die Leds (oder was imme an AD0 hängt) leuchten erst dann auf.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
neuerr schrieb:
wieso lädt man dann hier einen md10, bei meinem test muss ich nur denn wert denn ich auf das AD 0 Transferiert habe überprüfen? gibt es nicht eine direkte überprüfung für das AD 0?
Es ginge auch folgende Sequenz:
Code:
l dw#16#55555555 
t ad 0
l ad 0 
==D 
= M40.3
nur: die SPS überträgt am Zyklusende die Werte des PAA auf die Ausgänge (die sollen wohl geprüft werden) und alle Zugriffe auf das PAA liefern immer den zuletzt geschriebenen Wert zurück. Eine Prüfung wird somit immer wahr ergeben.
Ein Einlesen der physikalischen (zu prüfenden) Ausgänge (L PAD 0) ist nicht zulässig. Wenn der Zustand wichtig ist, bleibt als Lösung z.B. Drahtbrücken auf Eingänge. Der Vergleich darf dann allerdings erst im nächsten Zyklus erfolgen (nach dem Schreiben der Ausgänge und Einlesen der Eingönge).
 
Genau das ist meine aufgabe, ich steuere 32 ausgänge LED's an die dann über drahtbrücken mit den eingangs led verbunden sind. wie muss ich das im programm schreiben sodass ich weiss, ob meine werte auch an den eingangs Led anliegen?
 
Code:
      CLR   
      =     M     42.3
      L     MD     0
      L     DW#16#55555555
      <>D   
      SPB   no                          //ausgang nicht zugewiesen, daher keine prüfung
      L     ED     0                    //rückführung ad0
      ==D   
      =     M     42.3                  //alles ok
no:   NOP   0

      L     0
      UN    E      0.0                  //led testen
      SPB   no1
      L     DW#16#55555555
no1:  T     AD     0
      T     MD     0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
mit diesem programm teste ich im fehlerfall ja nur ein eingang. wie kann ich dann alle eingänge überprüfen?

ich muss einfach den wert abfragen. in meinem fall L DW#16#AAAAAAAA
und L DW#16#55555555. Die ausgänge sind immer mit einer drahtbrücke auf die eingänge geschleift. wie muss ich hier das programm anpassen sodass ich weiss wenn am ausgang ein wert anliegt, dass dieser auch am eingang ankommt.

es wurde etwas über einen Zyklus gesagt, wie ist das gemeint kann ich demfall den transfer und die abfrage nicht im gleichen baustein machen?

gruss neuerr
 
Code:
      L     DW#16#55555555
      UN    E      0.1                  //auswahl
      SPB   no2
      L     DW#16#AAAAAAAA
no2:  T     #ausgang                    // hier steht also 55555555 bzw AAAAAAAA

      CLR   
      =     M     42.3
      L     MD     0
      L     #ausgang
      <>D   
      SPB   no                          //ausgang nicht zugewiesen, daher keine prüfung
      L     ED     0                    //rückführung ad0
      ==D   
      =     M     42.3                  //alles ok
no:   NOP   0

      L     0
      UN    E      0.0                  //led testen
      SPB   no1
      L     #ausgang
no1:  T     AD     0
      T     MD     0

das mit dem zyklus ist bereits berücksichtigt. deshalb erfolgt der vergleich mit dem ed 'vor' der zuweisung.
 
ich habe nun ein zykluszeit problem. die simatic sagt ich soll einen ob80
einfügen. wie muss man das machen oder ist es irgendwie möglich die zykluszeit zu verlängern?
 
der baugruppenzustand gibt an, dass die eingestellte zykluazeit 150ms und die aktuelle 300ms. zusätzlich heisst es das ein OB80 eingefügt werden soll. gibt es im simatic manager kein ort beidem man die zykluszeit "manuell" einstellen kann.
 
den ob80 einfach erstellen und nichts reinschreiben.

aber wenn du so lange zykluszeiten hast, dann ist das entweder ein mordsprogramm oder du hast was extrem schlecht programmiert.
bei einer zykluszeit von 300ms kann man schon spürbar die prozessverzögerung (z.b. einen tastendruck) merken.

in der ganzen firma habe ich ein programm mit einer zykluszeit von 200ms aber das ist auch nur eine 135u 943 (keine b). (eine b klappte leider nicht da die mit der positionierungsbaugruppe nicht klar kam. :-( ).
das war aber auch schon ein ziemlich aufwendiges prog.

als maximale reaktionszeit musst du 2 zyklen nehmen.
z.b.
ob1 ist am anfang und hat das pea eingelesen. jetzt wird ein taster gedrückt. dieser taster weist ganz am ende des programms einen ausgang zu. der ob1 muss also fast 2 mal durchlaufen werden um den a zuzuweisen. das sind dann 600ms.
absolut nicht akzeptabel. imho

was hast du für eine cpu?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich bring mal mein programmcode viellicht wirds dann ein wenig verständlicher, der compiler gibt mir immer ein SF-Fehler

L 10
NEXT: T MW 10
NOP 0

L DW#16#55555555
T AD 0
L S5T#10MS
SE T 5
U T 5
L PED 0
==D
SPBN f001
SPA t002


f001: L 0 //vorbelegen mit nicht aktiv

U A 0.0
UN E 0.0
SPB m005
SPA m006
m005: L 2 //fehler
NOP 0
T "Eingang".InputA0
T "Ausgang".OutputA0


m006: T "Eingang".InputA0
T "Ausgang".OutputA0



L 0 //vorbelegen mit nicht aktiv

U A 0.2
UN E 0.2
SPB m007
SPA m008
m007: L 2 //fehler
NOP 0
T "Eingang".InputA2
T "Ausgang".OutputA2

m008: T "Eingang".InputA2
T "Ausgang".OutputA2



t002: NOP 0
L S5T#1S
SE T 6
U T 6
NOP 0



L DW#16#AAAAAAAA
T AD 0
L S5T#10MS
SE T 5
U T 5
L PED 0
==D
SPBN f002
SPA t003


f002: L 0 //vorbelegen mit nicht aktiv

U A 0.1
UN E 0.1
SPB m037
SPA m038
m037: L 2 //fehler
NOP 0
T "Eingang".InputA1
T "Ausgang".OutputA1


m038: T "Eingang".InputA1
T "Ausgang".OutputA1



L 0 //vorbelegen mit nicht aktiv

U A 0.3
UN E 0.3
SPB m039
SPA m040
m039: L 2 //fehler
NOP 0
T "Eingang".InputA3
T "Ausgang".OutputA3


m040: T "Eingang".InputA3
T "Ausgang".OutputA3


t003: NOP 0

LOOP NEXT
 
kein wunder, das du auf solche zykluszeiten kommst. du durchläufst 10 mal die schleife in der immer wieder 2 zeiten laufen. das allein ergibt schon 200ms.

wie ich dir letztens aber schon in der email geschrieben habe, ist dieser ansatz für einen led-tester nicht gut.
von dem beispiel was ich dir mitgesendet habe scheinst du dir nichts von angenommen zu haben.
aber fummel ruhig weiter. irgendwann wirst du das schon irgendwie hinkriegen. :lol:
ich erinnere an meinen satz: wenn man merkt, dass....... :wink:

und auch hierzu habe ich dir schon was geschrieben.

  • U A 0.0
    UN E 0.0
    SPB m005
    SPA m006
    m005: L 2 //fehler
    NOP 0
    T "Eingang".InputA0 // <-- völlig überflüssig
    T "Ausgang".OutputA0 // <-- völlig überflüssig

    m006: T "Eingang".InputA0
    T "Ausgang".OutputA0
 
doch deine hilfe habe ich schon genutzt aber in einem anderen testfall.

aber ich brache ja diese transferbefehle, denn wenn ein fehler am eingang anliegt muss genau dieser auch auf dem display erscheinen. darum brauche ich pro ein/ausgang eine eigene auswertung, oder wie hast du das gemeint??
 
Zurück
Oben