Auswahlkriterium Betriebsstunden

Zuviel Werbung?
-> Hier kostenlos registrieren
rs-plc-aa schrieb:
Die lokalen Variablen kenne ich bei FC´s nicht - nur bei FB´s unter "STAT" (Instanz-DB).

Oder meinst du damit die "Temp" bei der FC ?
Genau die. Heißen sie bei Siemens sonst anders?
Außerdem enthält mein Code noch ein paar T MB 22, TMB 23, TMW0, die nur zur Kontrolle drin waren, weil ich nicht sicher war, welchen Schleifendurchlauf ich beimBeobacten sehe. Kannst du rausschmeißen.
 
Hallo,


@ Zottel:


Ich habe nun die FC erstellt, kriege sie aber nicht ans laufen (Übersetzen ist aber fehlerfrei).

Desweiteren habe ich nicht erkennen können wie der Rückgabewert auszuwerten ist.

Könntest du hierzu freundlicherweise vielleicht noch ein paar Zeilen schreiben ?
 
Ich habe nun die FC erstellt, kriege sie aber nicht ans laufen (Übersetzen ist aber fehlerfrei).
Was heißt das, nicht laufen? geht die SPS in Stop?

Sie erwartet, daß es einen DB20 gibt, der 7 DBD mit den Betriebsstunden beginnend mit DBD0 enthält. Ferner braucht es einen DB10, der mindestens sieben DBBs enthält. Mit INIT_INDEX=TRUE werden diese mit 0,1,2,3,4,5,6 beschrieben.
Desweiteren habe ich nicht erkennen können wie der Rückgabewert auszuwerten ist.
Es gibt keinen Rückgabewert. Nach dem Aufruf des FC liegen im DB10 die Zahlen 0-6 in einer solchen Reihenfolge, daß sie die Rangfolge der Einträge im DB20 wiederspiegeln.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

@Zottel:

Ja - die CPU geht in Stop. (OB1 beim Versuch die FC 16 zu starten...)


Die DB´s sind vorhanden - auch der Inhalt passt.


Ich versuche es gleich noch mal, vielleicht kann ich noch was detaillierteres rausfinden...
 
Hallo,

@Zottel:

an dieser Stelle bleibt er stehen:

L DBD [#dix2]


Der Diagnosepuffer sagt:

Ereignis 2 von 13: Ereignis-ID 16# 4562
STOP durch Programmierfehler (OB nicht geladen oder nicht möglich, bzw. kein FRB vorhanden )
Unterbrechungstelle im Anwenderprogramm: Zyklisches Programm (OB 1)
Prioritätsklasse: 1
FC-Nummer: 16
Bausteinadresse: 218
Bisheriger Betriebszustand: RUN
Angeforderter Betriebszustand: STOP (intern)
interner Fehler, kommendes Ereignis
15:51:26:616 25.11.04


Ereignis 3 von 13: Ereignis-ID 16# 2522
Bereichslängenfehler beim Lesen
Global -DB, Doppelwortzugriff, Zugriffsadresse: 8
FC-Nummer: 16
Bausteinadresse: 218
Angeforderter OB: Programmierfehler-OB (OB 121)
Prioritätsklasse: 1
interner Fehler, kommendes Ereignis
15:51:26:616 25.11.04


...


Bereichslängenfehler beim Lesen ?
 
So, ich habe meine Code noch einmal angesehen. Einen Fehler habe ich korrigiert. Er stört aber nur, wenn du als indexDB eine andere Nummer als 10 angibst.
Ansonsten solltest du kontrollieren:
1. Wird die Zykluszeit ueberschritten?
2. Gibst du beim Aufruf des FC16 im OB1 andere Parameter an, als ich gepostet habe?
3. Im FC16, beginnend mit der letzten, mal die Rücksprungbefehle (SPP Mxxx) auskommentieren. Der Baustein sortiert dann natürlich nicht mehr vollständig! Aber vielleicht läuft er durch.
Falls das "hilft", welche Rücksprünge bringen die CPU zum Absturz?

Nebenbei: Welche CPU nutzt du?
 
Wie hast du den Baustein übernommen? Copy& paste? oder abgetippt?

wenn im folgenden AUF -Befehl #IDBN stat #DDBN stünde, sollte das genau den Fehler geben:

Code:
       AUF   DB [#DDBN] 
 
       L     DBD [#dix1] 
       L     DBD [#dix2] 
       >D
[/code]
 
Hallo,

ich habe mich vorgetastet und habe auf "Zyklusweise" umgestellt.

Der erste Zyklus (OB100) geht - weil leer, der erste OB1 Zyklus steht sofort.

Ich habe einen Screenshot angefertigt.

Der Pfeil zeigt auf eine Multiplikation die fehlschlägt.
 

Anhänge

  • abbildung_1.doc
    106,5 KB · Aufrufe: 43
Zuviel Werbung?
-> Hier kostenlos registrieren
Und das ist in Ordnung. wenn dix2= 0 ist, meint DBD[dix2] das DBD0.
Wenn dix2= 32 ist, meint DBD[dix2] das DBD4 (32bit hinter dem Anfang von DBD0).
PS: Bitte keine doc-Dateien! Habe kein Microsoft!
 
Hallo,

ok - schlag` mich...

Im Projekt von mir ist der Index DB20, und der Stunden DB10

--> also genau umgekehrt wie bei dir...

Irgendwie war das am Anfang mal so - na ja.


Soll heißen:

Das Projekt welches du gepostet hast läuft (wie bei dir ja auch...).


=============================================

So und nun habe ich einen Index DB mit einer sortierten Reihenfolge der Betriebsmittel.


Da mir diese Programmierweise nicht geläufig ist, frage ich nun (zwangsläufig) weiter...


Beispiel:

Es läuft im Moment kein BM.

Nun kommen 2 zeitgleiche Anforderungen.

Es sollen jetzt die 2 BM´s mit den wenigsten Stunden gestartet werden - sofern diese betriebsbereit sind.

wenn eines oder beide nicht betriebsbereit ist/sind soll automatisch das nächste genommen werden.


Betriebsbereitschaft:

- wenn keine Störung ansteht UND wenn der Schlüsselschalter auf "Automatik" steht.


Sollte die Überprüfung ob betriebsbereit besser nachher stattfinden ?
 
Ich würde die Betiebsbereitschaft nachher testen.
Das ist jetzt kein getesteter Code, nur das Prinzip:

Du brauchst z.B. 2 Betriebsmittel.
Diese Information kopierts du in irgendeine Variable. Ich sag´ mal MB88.
Du gehtst die Liste in DB10 durch, beginnend mit 0. Wo du bist, merkst du dir z.B. in MB89.
Du liest aus DB10.DBB[0], daß das BM mit den wenigsten Stunden die Nummer 4 hat.
Du zählst MB89 hoch, da du auf jeden fall als nächste BM das mit nächstwenigeren Stunden einzuschalten versuchst.
Nun prüfst du die Betriebsbereitschaft von Nummer 4.
JA: Ist es bereit so schaltest du es ein und verringert MB88 um 1. Es ist nun 2-1=1. Du mußt noch 1 BM einschalten.
NEIN: Ist es NICHT bereit so schaltest du es nicht ein und läßt MB88 wie es ist. Es ist immer noch 2. Du mußt also noch 2 BM einschalten.

Du liest aus DB10[1], daß das BM mit den nächstwenigsten Stunden die Nummer 1 hat.
Du zählst MB89 hoch, da du auf jeden fall als nächstes BM das mit nächstwenigeren Stunden einzuschalten versuchst.
Nun prüfst du die Betriebsbereitschaft von Nummer 1.
Ist es bereit so schaltest du es ein und verringert MB88 um 1.
Waren beide bereit, ist MB88 jetzt 0 und du bist fertig
Waren beide nicht bereit, ist MB88 immer noch 2 und es geht so weiter.

Hast du irgendwann eine 7 in MB89, so bist du hinter dem letzten Eintrag für ein BM. Du kannst die verbleibenden Anfordrungen nicht bedienen und löst eine Meldung oder einen Alarm aus, damit sich jemand darum kümmert.

Die gesamte Umsetzung dieser Sache läßt sich ohne indirekte Adressierung, Pointer oder Schleifen erledigen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
rs-plc-aa schrieb:
...
Im Projekt von mir ist der Index DB20, und der Stunden DB10
Ach ja: abgesehen von der nicht indizierten "AUF"-Anweisung, auf die ich hingewiesen habe, läuft der Code auch mit 10 oder sonstwas als Daten- und 20 (oder sonstwas) als Index-DB. Dazu sind die DB-Nummern als Parameter da.
 
Zottel schrieb:
Die gesamte Umsetzung dieser Sache läßt sich ohne indirekte Adressierung, Pointer oder Schleifen erledigen.
Auch das Sortieren wäre natürlich prinzipiell ohne das gegangen. Aber dann hättest du 21 ähnliche Codeblöcke mit verschiedenen Adressen. Und wenn du 9 statt 7 BMs hättest, müßtest du 15 weitere hinzufügen...
Sorry, habe die Knöpfe "edit" und "zitat" verwechselt.
 
Hallo,

@Zottel:

Riesen Dankeschön erstmal.


Na klar wäre das auch mit vertauschten Nummern der DB´s gegangen - aber wenn die Nummer vertauscht ist und der Aufruf nicht sieht´s schon wieder anders aus... (sche** Copy&Paste).

Nun ist es für mich umso motivierender aus dem Vorschlag selbst den Code zu erzeugen.

Aber ganz ehrlich ... Das mit den Schleifen hätte ich allein nicht hinbekommen.



Ich melde mich wieder wenn ich ein Stück geschafft habe.
 
Zurück
Oben