Step 7 Pointer (kein ANY) in SCL FC verwenden

serverfreak95

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend Zusammen,

Ich bin dabei einen Baustein zu entwerfen der eine Überwachungsfunktion erfüllt und deshalb immer wieder aufgerufen werden soll.
Geschrieben werden soll dieser, laut Auftraggeber in SCL.

Die Daten für diesen FC (und den jeweiligen aufruf) liegen in dem jeweiligen Daten-DB von den anderen FCs / FBs.

Auf diesen Datenbereich (ca 10 Bytes des Typ BOOL) würde ich gerne über einen Pointer zugreifen.

Jetzt würde ich nur gerne wissen, wie ich diesen Pointer in meinem FC verarbeiten / verwenden muss um die einzelnen Bits aus diesem Datenbereich in dem Überwachungsprogramm verarbeiten zu können.


mfg

Mark
 
Hmm, Deine Aufgabe klingt so, als ob sie auch völlig easy ganz ohne Pointer lösbar wäre. Warum soll es so umständlich gelöst werden?
Zweitens geht modernes Programmdesign zu vollsymbolischen Lösungen ohne ineffiziente und undurchsichtige Pointerei. Wozu dann noch so einen Dinosaurier-Baustein entwickeln, der später nicht auf moderne CPUs konvertiert werden kann?
Und drittens wäre noch zu klären, ob Deine Ziel-CPU und die Step7-Version solche indirekte Adressierung überhaupt zulässt bzw. wie die genau realisierbar wäre.
Vielleicht gibst Du uns noch ein paar mehr Informationen?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, eigentlich hast du recht. Nur ist so, dass es einen so ähnlichen Baustein mit diesem Aufbau schon in AWL gibt. Dieser soll nun für das neue Projekt zum einen in SCL geschrieben werden und zum anderen die Funktion um ein zwei Sachen erweitert werden. Der Baustein soll in SCL sein, weil auch der Rest des Programms in SCL geschrieben werden soll.

Die Vorgabe mit dem Aufbau mit Pointer kommt vom Auftraggeber, da die ihren Standard behalten wollen, wie auch in den anderen Projekten.

Die Daten die in den Bereich des Pointers geschrieben werden und vom dem FC bearbeitet werden sollen, werden auch noch an anderen Stellen abgefragt.

Wir arbeiten mit einer CPU 319F und Step 7 V13

In dem AWL FC gibt es die Zeile : S DBX [AR1,P#8.0] so ähnlich würde ich es auch gerne in SCL machen bzw. halt so wie es möglich ist.

Mark
 
Hallo,
jetzt haben wir da natürlich ein "kleines Problem".
Erstmal kann SCL mit Pointer und eigentlich auch mit ANY nicht so schrecklich viel anfangen. Einen ANY kann man natürlich mit AT (zumindestens bei S7-Classic) noch auflösen um daraus eine indirekte Adressierung zu bilden - bei einem Pointer bekämst du ja bestenfalls nur eine Start-Adresse - was hättest du davon ? Du müßtest jetzt ja nun davon ausgehen, dass die übergebene Adresse sinnvoll zu deinem Baustein passt und gnadenlos den Speicher dahinter einlesen. Für so etwas wäre dann eine Struktur (UDT) oder ein Array eigentlich der bessere Ansatz.

Was soll denn da überhaupt so ganz genau passieren ?

Gruß
Larry
 
Also folgendes soll geschehen bzw. ist bisher mit dem AWL Baustein geschehen:

Der Baustein ist dafür da die Bewegungs- und Überschneidungszeiten von Zylindern zu Überwachen. Die Daten werden in einem UDT abgelegt. Der UDT-Bereich wird über einen DB aufgerufen und der Pointer zeigt dann immer auf den Beginn des jeweiligen Bereiches. Die Daten aus dem UDT werden dann noch an nen paar anderen Stellen abgefragt. Unter anderem auch für das HMI. Das ganze ist ein Standard den der Auftraggeber auch für alle restlichen Anlagen verwendet hat.
Bislang ist der Baustein halt nur in AWL geschrieben und soll jetzt noch um ein paar Funktionen erweitert werden und dann halt in SCL geschrieben sein.

Oder gibt es vielleicht eine andere möglichkeit wie ich einem FC einen Speicherbereich in einem DB / UDT bei dem Aufruf zuweisen kann?

Mark


Aufruf des AWL-FC mit beschaltung:

FC_Beweg.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn die Daten in einer UDT vorliegen, wäre es sinnvoll diese UDT auch als Parameter dem Baustein zu übergeben.
Dann lassen sich auch Daten an der UDT verändern, und der Baustein zur Auswertung funktioniert später immer noch (wenn er dann auch neu übersetzt wurde).
 
Ja das klingt auch nach ner guten Idee.

Wie müss ich das denn dann in meinem scl fc anwenden und wie kann ich auf die einzelnen Bits in dem UDT zugreifen? Wenn ich den FC dann aufrufe, wie gebe den UDT an den Eingang weiter?
 
Wahrscheinlich genauso wie du es jetzt auch hast.

Mal angenommen dein "DB_TRA_L1".Hubeinheit.Ueberwachung ist vom Typ UDT_Antrieb. Dann kannst du bei deinem FC einen Parameter z.B "Antriebsdaten" vom Typ UDT_Antrieb anlegen, und dann wie vor die Daten mit dem Symbol übergeben. Im Baustein kannst du dann auch mit den Symbolen des UDT arbeiten (falls du das noch nicht gemacht hast). Die Variablentypen beim AUfruf müssen dann aber zusammenpassen, das überprüft der Compiler. D.h. du kannst dann keine Daten von Typ z.B. UDT_Ventil übergeben wie das bei einem unspezifizierten Pointer möglich gewesen wäre.
Die Daten werden bei Typ UDT auch als Zeiger übergeben, also kann sich der Auftraggeber eigentlich nicht beschweren ;-)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich jetzt meinen SCL Baustein habe, erstelle bei dem als Input ne Variable typ UDT. Wie muss ich dann weiter verfahren um im SCL Baustein die einzelnen Bits aus meinem UDT bearbeiten zu können?
Ich habe bis mit Pointern und UDTs recht wenig gearbeitet. Hat vielleicht einer mal nen Beipsiel?
 
Zurück
Oben