Fifo mit 4 Teile

tommylik

Level-2
Beiträge
115
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Habe einen Baustein der für 8 Teile geschrieben wurde. (FC97)
Er wurde nie fertig gestellt.
Dann bin ich auch der Meinung das die Parametrierung nicht richtig ist.
Die letzten 2 Teile wurde als Temporäre Variable angelegt.
Ich denke es müßen alle 8 Teile als Input Variable angelegt sein.
Das nächste Problem ist das die CPU in Stop geht.
Das Problem laut Fehler-Code 80B1 vom "RetVal".

Der FC96 ist für 4 Teile was mir persönlich lieber wäre.
Der Baustein funktioniert aber auch nicht.

Datenbausteine werden im RAM der CPU angelegt aber das wars dann auch schon.

Ist das so überhaupt möglich? Oder wäre nicht ein FB mit Instanzdatenbaustein besser.

Könnt ihr mir helfen dabei helfen wo der Fehler ist.

Mfg Tom
 

Anhänge

  • FC97.txt
    11,8 KB · Aufrufe: 44
  • FC96.txt
    6,6 KB · Aufrufe: 30
Was willst du schaffen?Das der Baustein in der CPU läuft oder soll der Baustein verbessert werden?
Wäre auch noch interessant was wo in dem DB abgelegt ist und was damit gemacht werden soll?
So ist das ganze ein undurchsichtiges Blatt!


Der FC 96 läuft zwar aber der ergibt irgendwie keinen sinn!!
Musste hier beim Aufruf Ceat_Db noch etwas hinzufügen und tzwar das Attrib!
Hast du den Baustein schon mal am laufen gehapt?

Mfg
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SCM,

Vielen Dank für deine Antwort.

Ich möchte das der Baustein in der CPU läuft wenn es ohne Verbesserung nicht geht soll es mir Recht sein.
Ich weiß nur das da vom Creat_DB Virtuelle DB's im RAM angelegt werden. Zum Daten hin und herschieben.
Das ganze sollte für 2 Roboter genutzt werden die einen Speicher mit 4 Türen haben.
Der eine legt ein und der andere nimmt wieder raus.

Ich selbst habe den Baustein nicht zum laufen bekommen, wie ich oben schon geschrieben hatte geht die CPU in STOP.
Die Orginalversion ist der FC97 aber ich habe nur 4 Teile für die Eingänge zur Verfügung.

Warum ergibt der FC96 keinen Sinn?
Dann müßte doch der FC97 auch keinen Sinn ergeben, er hat nur mehr Fächer zur Verfügung.

Mir wurde der Baustei zur verfügung gestellt damit ich einen Anfang habe.
Ich wollte mich nicht bloß stellenvor meinen Kollegen, aber ich habe nicht viel Ahnung von AWL.

Deswegen habe ich mich an Euch Profis gewendet.

Vielleicht ist es ja möglich den FC 97 so umzuschreiben das man ihn für 4, 6 oder 8 Teile verwendet.
Durch eine Eingang gibt man die Anzahl vor.
Die Plätze die nicht genutz werden könnte man mit einem Low Bit beschalten.

Vielen Dank noch mal für deine Hilfe

MFg Tom
 
Warum verwendest du nicht den FC90 (Word Shift Register) aus der Standard-Bibliothek?
Damit die CPU nicht stoppt, solltest du den OB121 (Programming Error) laden, ich lade aber immer auch OB82, OB85, OB86, OB87 und OB122.
 
Hallo,
also die CPU geht in den Stop weil kein Platz mehr für einen DB ist.
Du erzeugst permanent Datenbausteine in den Grenzen
LOW_LIMIT := W#16#A,
UP_LIMIT := W#16#50,
wenn die Grenze in diesem Fall DB 80 erreicht ist geht die CPU in den Stop .
Auch hier ist ein Unterschied zu dem FC96 zu erkennen ( von A bis F ).
Und überhaupt
Er wurde nie fertig gestellt.
was heißt das nun genau kann er was oder nicht ( weshalb sollte ich mir Gedanken über einen Baustein machen der nicht funktioniert ? ) dann programmiere doch lieber deinen eigenen FC der das der Anwendung entsprechende leistet.

Es ist extrem schwierig mit solchen Aussagen
Ich möchte das der Baustein in der CPU läuft wenn es ohne Verbesserung nicht geht soll es mir Recht sein.
Ich weiß nur das da vom Creat_DB Virtuelle DB's im RAM angelegt werden. Zum Daten hin und herschieben.
Das ganze sollte für 2 Roboter genutzt werden die einen Speicher mit 4 Türen haben.
Der eine legt ein und der andere nimmt wieder raus.


gruß Thomas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So seh ich das auch!Mach doch einen Baustein der deinen Vorstellungen entspricht!
Der FC96 läuft wie gesagt bei mir! Jedoch ist der ganze Baustein meiner Meinung nach nicht besonders übersichtlich bzw. gut aufgebaut das ist jedoch ansichtsache!!


Laut deiner Beschreibung was der Baustein können muss ist es doch nicht schwer!Der Roboter der einlegt kann nur einlegen wenn das fach leer ist oder?
Der Robotor der etwas raus nimmt kann das nur wenn etwas drinnen ist?

Also brauchst du ja nur zu wissen wo der Roboter steht damit du weißt welchen Fach du die Information geben musst das eingelegert bzw. ausgelagert wurde!

Was willst du sonst noch so wissen?Wo als letztes eingetragen bzw. ausgetragen wurde?

Mfg
 
Sfc22 - create_db

Hallo,

der FC96 läuft bei mir nur zusammen mit dem OB121, weil er fehlerhaft ist.
Der SFC 22 darf nur einmal aufgerufen werden, um die DB's zu erzeugen. Beim nächsten Zyklus sind die DB's ja vorhanden und
der SFC 22 erzeugt die Fehlermeldung 80B1 ( siehe auch Beschreibung SFC22 ).

" 80B1 Es ist keine DB-Nummer frei. "
"DB_NUMBER OUTPUT WORD E, A, M, D, L Die Datenbausteinnummer ist die Nummer des erstellten Datenbausteins.
Im Fehlerfall (Bit 15 von RET_VAL wurde gesetzt) wird in DB_NUMBER
der Wert 0 eingetragen. "

L #DB_No // #DB_No ist jetzt = 0
L 0
>I
CLR
SAVE
BEB // Der Baustein wird nicht beendet
AUF DB [#DB_No] // Aufruf des "DB 0", den es in der S7 nicht gibt !!! :confused:

Gruß Kalle
 
Hallo nochmal,

was das Datenbausteinhandling angeht könntest du zunächst prüfen ob vorhanden, und wenn nicht erzeugen z.B.:
Code:
     U     #erster_Zyklus              //im ersten Zyklus muß die kleinste DB Nummer geschrieben werden
      SPBN  nore                        //Aussprung bei VKE 0
      L     W#16#A                      //Anfangs DB Adresse einrichten
      T     #Datenbausteinnummer        //in Statische Variable kopieren
      SET                               //VKE auf 1 setzen
      S     #Hilfsmerkerarray[0]        //Hilfsmerker setzen
nore: NOP   0                           //Sprungziel bei nicht erster Zyklus
   
   U     #Hilfsmerkerarray[0]        //Bedingung ob Hilfsmerker noch gesetzt ( DB Adresse < W#16#50 )
      SPBN  C001                        //Sprungziel
      CALL  "TEST_DB"                   //Aufruf der Systemfunktion
       DB_NUMBER :=#Datenbausteinnummer
       RET_VAL   :=#RET_Val_DB_Test
       DB_LENGTH :=#DB_Length
       WRITE_PROT:=#Protected
  
    L     #RET_Val_DB_Test            //Auswerten des Fehlercodes
      L     W#16#80B1                   //DB nicht vorhanden
      ==I                               // vergleich auf "DB nicht vorhanden"
      SPBN  ohne                        //Sprungziel wenn DB vorhanden
   
   CALL  "CREAT_DB"                  //Aufruf Systemfunktion erzeuge DB
       LOW_LIMIT:=#Datenbausteinnummer
       UP_LIMIT :=#Datenbausteinnummer
       COUNT    :=W#16#38
       RET_VAL  :=#Ret_Val_DB_Cre
       DB_NUMBER:=#DB_Number

ohne: NOP   0                           //Sprungziel wenn DB vorhanden
      L     #Datenbausteinnummer        //Laden der  DB Nummer
      L     #DB_Number                     //vergleich ob gerade erzeugt
      ==i
      R     #Hilfsmerkerarray[0]        //DB´s erzeugt weiter im Programm
      BEB

 L     #Datenbausteinnummer        //Laden der  DB Nummer
l 1
+I                                //für laufende Nummer
      T     #Datenbausteinnummer        //neue DB Nummer
      L     W#16#50                     //lade w#16#50 für Bausteinanzahl Obergrenze
      >I                                //vergleich auf größer
    hier kommt die Reaktion wenn die DB Obergrenze überschritten ist
dann sollte wenigstens mal die CPU im Run bleiben, und du weißt welcher DB relevant ist die Nummer
wäre dann DB_Number.
Ich denke du mußt wirklich nen FB dafür nehmen
 
Zurück
Oben