Flanke Positiv im OB35

godi

Level-1
Beiträge
1.460
Reaktionspunkte
185
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Habe im OB 35 eine Flankenauswertung Programmiert bei der ich den SFC20 BLKMOV aufrufe. Im Simulator funktioniert das ohne Probleme aber auf ner CPU 315 werden die Werte öfters als einmal kopiert. Kann das am OB35 liegen? Der ist auf 100ms eingestellt. Die Flanke wird von einem Bit aus einem Datenbaustein, das von einem OP7 gesetzt wird, gebildet.

Hier noch der Code:
Code:
      U     DB1.DBX   42.0
      FP    #HM_FP_Senderoehre1
      SPBN  m01
      L     11
      T     #DB_Nummer
      SPA   m10
 
m01:  U     DB1.DBX   42.1
      FP    #HM_FP_Senderoehre2
      SPBN  m02
      L     12
      T     #DB_Nummer
      SPA   m10
 
m02:  U     DB1.DBX   42.2
      FP    #HM_FP_Senderoehre3
      SPBN  m03
      L     13
      T     #DB_Nummer
      SPA   m10
 
m03:  U     DB1.DBX   42.3
      FP    #HM_FP_Senderoehre4
      SPBN  end
      L     14
      T     #DB_Nummer
 
m10:  L     P##Datum_Uhrzeit
      LAR1  
      L     DB1.DBD   78
      T     D [AR1,P#0.0]
      L     DB1.DBB   82
      T     B [AR1,P#4.0]
 
      AUF   DB [#DB_Nummer]
      L     P##Datum_Uhrzeit
      LAR1  
      L     D [AR1,P#0.0]
      T     DBD   14
      L     B [AR1,P#4.0]
      T     DBB   18
 
      L     P##Pointer1
      LAR1  
      L     B#16#10
      T     LB [AR1,P#0.0]
      L     B#16#2
      T     LB [AR1,P#1.0]
      L     578
      T     LW [AR1,P#2.0]
      L     #DB_Nummer
      T     LW [AR1,P#4.0]
      L     P#DBX 0.0
      T     LD [AR1,P#6.0]
 
      L     P##Pointer2
      LAR1  
      L     B#16#10
      T     LB [AR1,P#0.0]
      L     B#16#2
      T     LB [AR1,P#1.0]
      L     578
      T     LW [AR1,P#2.0]
      L     #DB_Nummer
      T     LW [AR1,P#4.0]
      L     P#DBX 20.0
      T     LD [AR1,P#6.0]
 
      CALL  SFC   20
       SRCBLK :=#Pointer1
       RET_VAL:=#Fehlercode_BLKMOV
       DSTBLK :=#Pointer2
 
      AUF   DB [#DB_Nummer]
      L     0
      T     DBD    0
      T     DBD    4
      T     DBD    8
      T     DBD   12
      T     DBW   16
      T     DBB   18
 
      AUF   DB [#DB_Nummer]
      L     P##Datum_Uhrzeit
      LAR1  
      L     D [AR1,P#0.0]
      T     DBD    8
      L     B [AR1,P#4.0]
      T     DBB   12
end:  NOP   0
Die HM_FP_Senderoehre... sind als STAT deklariert.

Theoretisch gesehen dürfte das ja nur bei der Positiven Flanke bearbeitet werden, oder sehe ich da was falsch?

Hat jemand ne Idee warum die Werte öfters kopiert werden?
 
Zuletzt bearbeitet:
sieht so aus, als hättest du temp-lokalvariablen zur Flankenspeicherung benutzt. Das klappt dann nicht, da im Zyklus des AUfrufs des OB35
erneut eine positive Flanke erkannt wird (obwohl keine da ist).
Der Tastendruck am OP7 dauert länger als die Aufrufzyklen des OB35.

Mach einfach mal statische Merker aus den Flankenmerkern.
Sollte dann klappen....


Cu, nairolf
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sollte eigentlich so gehen. Wer setzt denn die Startbits zurück, die SPS oder das OP7? Hier würde ich mal zuerst nachgraben.
 
Mahlzeit!

@nairolf
sieht so aus, als hättest du temp-lokalvariablen zur Flankenspeicherung benutzt.
Nein, wie oben schon beschrieben sind die Hilfsbits (HM_FP_Senderoehre1 bis 4) der Flanken als STAT deklariert.
Kann es sein das der Instanz DB zu groß ist? Die Adressen für die Flanken fängt bei 394.0 an.
Wie lange darf maximal ein Instanz DB sein?

@Ralle
Die Startbits werden direkt vom OP7 gesetzt solange die zugehörige Funktionstaste getrückt ist. Also rückgesetzt werden sie wenn die Taste losgelassen wird.

mfg godi
 
@godi

Ich würde zuerst versuchen die Startbits vom OP zu entkoppeln, so daß mal klar ist, daß es nichts mit dem OP zu tun hat. Also mal die Startbits ändern und mit einem Merker, oder per "Variablen beobachten" setzen und rücksetzen. Mit OP's hatte ich wirklich schon die dollsten Effekte.
 
@Harald

Er wird wohl einen FB mit zugehörigen DB aufrufen, sonst könnte er keine statischen Variablen nutzen ;) . Hätt er dazuschreiben können, stimmt.
So einen FB für eine Servoansteuerung hab ich schon im OB35 genutzt und es funktionierte problemlos.
 
Ja hab ich vergessen zum dazuschreiben das das Programm in einem FB steht und der im OB 35 aufgerufen wird.

@Ralle
Komme erst Morgen wieder zu der Anlage und da werde ich die Startbits in einem Baustein der im OB1 aufgerufen wird entkoppeln.

Andere Bits die vom OP7 kommen und von denen ich eine Flanke bilde machen keine Probleme. Stehen allerdings auch alle im OB1.
Irgendwie ist das ganze schon komisch. :confused:
Und das alles bei meinem ersten Projekt. :???:

Schönen Dank mal an alle.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen!

Habe Die Startbits auf Merker die von Variable Steuern gesetzt werden ausgetauscht und die Hilfsbits auf Merker geändert. Funktioniert aber trotzdem noch nicht. Im OB1 habe ich es auch Probiert. Auch kein Erfolg.

Hat sonst noch jemand ne Idee?

Bräuchte nur bei jeder positiven Flanke die Werte um 20 Bytes in den jeweiligen DB nach unten schieben.

mfg Godi
 
Hallo,
wenn du nur bei einer Flanke schieben willst, wofür dann der OB 35?
Wie ist das eigentlich, wenn man eine Flanke zeitgetriggert abarbeitet und die Startbedingung der Flanke noch ein 1-Signal führt? Merkt sich das die CPU vom letzten Durchlauf oder wird das Flankenbit wieder neu erkannt? Ich wüßte jetzt nicht wirklich eine genaue Antwort ohne es praktisch probiert zu haben.
Gruß Andre
 
In Step5 gabs keine Flankenmerker, da wurden die mit 2 Merkern programmiert

U E...
UN M2
= M1

U E...
= M2

M1 ist genau einen Zyklus lang 1, bringt also die positive Flanke.
Das Problem wäre, wenn zwischen dem 1. und 2. OB35-Durchlauf ein Signalwechsel eintritt, bekommt man den evt. nicht mit.
Auch zum Abschalten des Merkers nach E... = 0 braucht es einen OB35-Durchlauf !
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Es muss nicht umbedingt im OB35 sein aber weil es zu dem FB passt den ich im OB35 aufrufen muss. Aber es funktioniert im OB 1 auch nicht.
Und die ANY Pointer passen? Vielleicht hab ich da irgendwo einen Fehler.
 
Hallo godi,

vielleicht liegt der Fehler in Protool? Hast du für jedes Bit eine eigen Variable angelgt, oder greifst du auf ein WORD+Bitnummer zu? Bei letzteren war mal irgendwas bei OPs.

Gruß, Onkel
 
Kann natürlich sein (ziemlich wahrscheinlich) daß du dir die Flankenmerker (sind ja statische Variablen) über einen falschen Pointer wieder überbügelst.

Test: Flankenmerker mal direkt irgendwelche unbebutzten Merker und keine stat.Variablen nutzen.

Hast du am Anfang des FB AR1 und AR2 in eine Temp gerettet und am Ende wieder zurückgeladen, ist auf jeden Fall empfehlenswert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe jetzt das Wenigste nachvollzogen, aber wenn du die Flanke darum im OB35 auswertest, damit nachfolgende Programmteile, die aus dem OB35 aufgerufen werden, andere Daten bekommen, versuchs mal so:
1. Flankenauswertung im OB1, so wie bei denen wo es funktioniert,
2. Dort "Auftragsmerker" setzen
3. Im OB35 bei gesetztem "Auftragsmerker" kopieren und Auftragsmerker löschen
 
Hab mal alles durchprobiert. Es lag nicht an der Flanke sondern am Any Pointer für den SFC 20. :???: Da sich der Bereich von den 2 Pointern überschnitten hat. Jetzt habe ich einen DB gleicher größe angelegt wo zuerst die Daten hinüber kopiert werden und dann um +20Byte wieder zurückkopiert werden.

Laut Siemenshilfe fängt der SFC 20 ja mit dem höchsten Byte vom ersten Pointer an und kopiert das in das höchste vom zweiten Pointer. Somit müsste ja möglich sein das ich den ersten Pointer bei Bit 0.0 anfängt und der zweite Pointer bei Bit 20.0 anfängt. Wenn dann beide zb. 500Byte lang sind dann kopiert der SFC20 ja das 500Byte in das 520 Byte. Oder verstehe ich da was falsch?:confused:

mfg godi
 
Zurück
Oben