Speichern von Daten in SCL

Karlson

Level-1
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe SPS-Freunde,

seit einer Woche beschäftige ich mich mit SCL. Ich würde gerne mit SCL daten mit schreiben (trend anzeige). Es handelt sich um eine Einführung in SCL Laborbeschreibung).

Eine Symbol-Tabelle wurde schon eingefügt. Die Werte die mitgeschrieben werden sind:
Analog_IN_1 EW 520 INT
Analog_IN_2 EW 526 INT
Analog_IN_3 EW 522 INT
Analog_IN_4 EW 524 INT

Analog_OUT_1 AW 514 INT
Analog_OUT_2 AW 512 INT

Nach langer suche habe ich heraus gefunden das der Trend über OPC oder über DB ablaufen kann. Ich würde gerne die DB-Variante wählen. Es sei denn einer von euch hat ein externes Programm zur Datenerfassung ;)

Die komplette Programmierung läuft in einem OB. Inzwischen bin ich soweit das die Berechnung in dem OB funktioniert und der DB auch erstellt wird. Jedoch werden keine Werte mitgeschrieben. Momentan sind der SCL-Code verkürzt wie folgt aus:

###########################################
DATA_BLOCK DB1
STRUCT
Analog_IN_1:INT;
Analog_IN_2:INT;
Analog_IN_3:INT;
Analog_IN_4:INT;

Analog_OUT_1 AW:INT;
Analog_OUT_2 AW:INT;

END_STRUCT
BEGIN
END_DATA_BLOCK

ORGANIZATION_BLOCK OB1
CONST
...
...
...
END_CONST
VAR_TEMP
....
...
...
END_VAR

BEGIN

Analog_OUT_1:=......;
Analog_OUT_2:=......;

END_ORGANIZATION_BLOCK


###################################

Wie kann ich die beiden Analogen OUTPUTS und vier Analogen INPUTS speichern? Mitschreiben?

Vielen Dank im Voraus
 
Normale weise wird das nicht in OB1 gemacht, die werte alle 1 DB oder jeder wert eigenes DB ?
Welche zeit span solte das geschrieben werden ?

Wenn DB "voll" ist wieder nach anfang ?

Jeder takt ist es met relative sprung möglich nach der nachte DB adresse zu springen



Schreibtakt
Berechnung DB adress oder erhöhen
Test DB adress zu gross > rucksetzen oder stop ?
Laden Int wert
Schreiben nach DB
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für die schnelle Antwort.
Die Berechnung der Analogen Ein und Ausgänge ist nicht komplex daher dachte ich kann ich es auch in einem OB schreiben.

Der OB1 wird alle 1000ms aufgerufen und es sollen um die 500 Werte aufgeschrieben werden. Mir geht es eigentlich um die Code wie ich es formuliere das Werte in einen DB geschrieben werden.
 
Der OB1 wird alle 1000ms aufgerufen
Hmm.. von welcher Steuerung schreibst Du hier? :confused:
Dein Rest klingt ja nach Siemens S7, doch OB1 alle 1000ms? Das ist bei Siemens normal nicht möglich bzw. absolut unsinnig. Der OB1 wird zyklisch so oft wie möglich aufgerufen (von mindest-Zykluslängen abgesehen). Typische Aufrufintervalle liegen bei 2ms bis 100ms.
Wenn Du zeitgesteuerte Aufrufe brauchst, dann mußt Du bei S7 die Weckalarm-OBs OB30 bis OB38 benutzen (Achtung: nicht jede CPU unterstützt alle OB, OB35 ist aber eigentlich immer möglich, siehe Deine HW Konfig). Oder mit Timern, Taktmerkern oder Systemzeit Dir eigene Schreib-Event-Impulse erzeugen.

Egal wie kurz Dein Programmcode werden wird, ich würde ihn auf keinen Fall in einem OB schreiben sondern in einem FC oder FB.
Ein OB1 in SCL ist für mich das absolut unmöglichste, was ich mir vorstellen kann. Sowas würde ich bei Lieferanten niemals durchgehen lassen.

Analog-Ausgänge können nur mitgeschrieben werden, wenn die Kanaladressen im Prozessabbild liegen (also Lesen über AW..., Lesen PAW... ist nicht möglich).

Mir geht es eigentlich um die Code wie ich es formuliere das Werte in einen DB geschrieben werden.
Dafür werden sich sicher noch SCL-Spezialisten melden. Die Forumssuche sollte auch jede Menge Beispiele für Deine Aufgabe ausspucken.

Harald
 
Bei der Hardware handelt es sich um eine414-3 CPU.
Die Abtastzeit des OB1 wurde nicht elegant über die Mindestzykluszeit der CPU eingestellt. Die Berechnung der Werte soll jede Sekunde durchgeführt werden.

Wenn ich nur wüsste wie ich die Struktur aufbaue um es sauber zu programmieren. Leider bin ich Neuling auf diesem Gebiet.
Wenn ich die Funktion in einen FB oder FC erstellen wird dieser nicht bearbeitet.

Wie ich es verstanden habe muss ich einen OB- generieren und aus diesem die FCs oder FBs aufrufen. Jedoch kenne ich nicht den Befehl.

Könnte mir jemand wie eine ordentliche Programmierung aussieht? Die Suchfunktion hat mir sehr gute Ansätze geliefert jedoch weiß ich nicht wie so ein komplettes Programm aussehen soll.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du müsstest erstmal definieren wie deine Datenerfassung aussehen soll.

Sollen Messwerte über einen längeren Zeitraum in der SPS gespeichert werden?
Wird ein Zeitstempel wann der Messwert erfasst wurde benötigt?
Wer und wie soll aus den Daten ein Trenddiagramm erstellt werden, externes Programm, Panel mit Visualisierung?
 
Wie ich es verstanden habe muss ich einen OB- generieren und aus diesem die FCs oder FBs aufrufen. Jedoch kenne ich nicht den Befehl.

Könnte mir jemand wie eine ordentliche Programmierung aussieht?
Also mein SCL-Editor hat eine umfangreiche Programmhilfe, wo z.B. auch der Aufruf von Funktionen erklärt wird.
Aufruf von Funktionen (FC)
Der Aufruf einer Funktion erfolgt unter Angabe des Funktionsnamens (FC-, SFC-BEZEICHNUNG oder BEZEICHNER), sowie der Parameterliste. Der Funktionsname, der den Rückgabewert bezeichnet, kann absolut oder symbolisch angegeben werden:

Code:
FC31 (X1:=5, Q1:=Quersumme) ;  // Absolut
ABSTAND (X1:=5, Q1:=Quersumme) ;  // Symbolisch
Nach dem Aufruf stehen die Ergebnisse der Funktion als Rückgabewert oder als Ausgangs- und Durchgangsparameter (Aktualparameter) zur Verfügung.

Den Aufruf aller Hilfen hat Siemens im Menüpunkt "Hilfe" versteckt ... ;) Sehr empfehlen würde ich Dir den Punkt Hilfe > Erste Schritte. Dies bringt Dich zu "Willkommen beim Einsteigerbeispiel "Messwerterfassung"". Dieses Beispiel beinhaltet eigentlich alles, was Du für Deine Aufgabe brauchst, inklusive indirekter Adressierung eines Umlaufpuffers. Das lies Dir mal durch ... Für den Schreibtakt würde ich eine Flanke eines Taktmerkers nehmen (siehe CPU-Konfigurations-Hilfe in HW Konfig).

Normalerweise sind bei jeder SCL-Installation auch PDF-Handbücher "S7-SCL - Erste Schritte" und "S7-SCL für S7-300 und S7-400 - Handbuch" dabei, die man über Start > SIMATIC > Dokumentationen > ... finden kann.

Harald
 
Danke Harald, für den Tipp die Handbücher habe ich auch schon gefunden ;) jedoch ist mir nicht ganz klar wie ich die in einem OB Aufrufe... Mit dem FC gebe ich dir recht das steht als beispiel gut beschrieben. jedoch nicht wie ich die Werte in ein DB schreibe.
 
Siehe SCL-Hilfe > Index > Datenbausteine > Übersicht der Datenbausteine
-> Absoluter Zugriff auf Datenbausteine
-> Strukturierter Zugriff auf Datenbausteine
-> Indizierter Zugriff auf Datenbausteine

Ein Beispiel für strukturierter Zugriff:
Code:
DATA_BLOCK DB1
STRUCT
  Analog_IN_1:INT;
  Analog_IN_2:INT;
  Analog_IN_3:INT;
  Analog_IN_4:INT;

  Analog_OUT_1:INT;
  Analog_OUT_2:INT;
END_STRUCT
BEGIN
END_DATA_BLOCK

FUNCTION FC1 : VOID
VAR_INPUT
  Wert1 : INT ;
END_VAR

  DB1.Analog_IN_1 := Wert1;

END_FUNCTION

Harald
 
Vielen Dank für die schnellen und präzisen Antworten. Jetzt hätte ich noch zwei Fragen. Wie kann ich die Zeit einstellen wann ein FC/FB aufgerufen wird und wie kann ich aus konstanten eine neue konstante berechnen? Werden die konstanten für die Berechnung im OB definiert oder im FC? Könntet Ihr mir bitte noch für die zwei Fragen ein Beispiel zeigen? Vielen Dank nochmal Ihr seit mir eine riesengroße Hilfe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Leider habe ich im Handbuch nichts gefunden wie man aus 2 konstanten eine neue konstante kreiert. Ich bin für jeden Ratschlag damit die Programmierung ordentlich aussieht sehr dankbar :)

was ich bis jetzt gemacht habe:

Code:
DATA_BLOCK DB1
STRUCT
a:REAL :=2.0;                  
b:REAL := 2.5; 
END_STRUCT
BEGIN
END_DATA_BLOCK

FUNCTION ab: REAL
VAR_TEMP
a:REAL;
b:REAL;
END_VAR
a:=DB1.a;
b:=DB1.b;
ab:=a+b;     
END_FUNCTION
/////////////////////////////////////////////////////////////////
ORGANIZATION_BLOCK OB1

VAR_TEMP
    info : ARRAY[0..19] OF BYTE;
    a:REAL;
END_VAR
BEGIN

a:=ab();

END_ORGANIZATION_BLOCK

Die Berechnung Funktioniert :) Vielen Dank für euren Tipps. Jedoch stellt sich noch die Frage wie kriege ich es eingestellt das a im OB nur einmal berechnet wird?
 
Zuletzt bearbeitet:
Der Tip wurde ja schon gegeben.
Deklariere das Taktmerkerbyte in den Eigenschaften der SPS.
Um den Aufruf nur 1x zu machen benötigst Du noch eine Flankenauswertung.
In SCL gibt es keinen fertigen "Baustein" dafür, wie in AWL,KOP,FUP.

Flankenauswertung in SCL:

Code:
//Flankenauswertung Taktsignal
FP_Takt := "Takt" AND NOT HM_Takt;
HM_Takt := "Takt";
 
Leider habe ich im Handbuch nichts gefunden wie man aus 2 konstanten eine neue konstante kreiert.
Wozu brauchst Du Deine "Konstanten"? :confused: Kannst Du die Frage präzisieren?
Konstanten kannst Du direkt in Berechnungen einsetzen, z.B.: Ergebnis := (a * 3 + b) / 100 ;
"Konstanten", welche zur Programmlaufzeit berechnet werden, sind keine Konstanten, sondern gewöhnliche Variablen.

wie kriege ich es eingestellt das a im OB nur einmal berechnet wird?
Wozu? Das macht der CPU nichts aus, a in jedem Zyklus neu zu berechnen. Dann läßt sich der Code sogar besser beobachten.

Wenn es denn unbedingt nur einmal sein muß (wenn z.B. die Werte zur Berechnung in nur einen Zyklus gültig sind), dann gibt es da viele Möglichkeiten: Du kannst Dir ein Signal erzeugen, was nur 1 Zyklus lang aktiv ist, z.B. mit einer Flankenauswertung und die Berechnung dann nur bei aktivem Signal ausführen. Oder mit einem Hilfsmerker Dir merken, daß Du die Berechnung schon einmal ausgeführt hast und den Du vor einer Berechnung löschst. Oder einen Hilfsmerker benutzen, der die Berechnung anfordert und nach der Berechnung gelöscht wird. Oder ...

Dir ist sicherlich klar, daß Du den Wert in a erst verwenden kannst, nachdem Du a einen Wert zugewiesen hast. (Du willst bestimmt nicht mit zufälligen Werten rechnen.) Weil Du a als VAR_TEMP deklariert hast, MUSST Du a aber in genau dem Zyklus berechnen, in dem a verwendet werden soll. Das Ergebnis älterer Berechnungen ist ungültig, weil "vergessen". VAR_TEMP haben kein Gedächtnis von einem zum nächsten Zyklus. Der Wert in temporären Variablen vor einer Zuweisung ist als zufällig bzw. unbestimmt zu betrachten.
Soll sich a Werte für länger als den aktuellen Zyklus merken, dann muß a eine statische Variable sein (Merker oder Datenbaustein-Variable).


Bis wann mußt Du denn Deine Datenspeicherung fertig haben? Mußt Du es unbedingt selbst und in SCL programmieren? Mit Deinen SCL- und SPS-Kenntnissen könnte das noch eine ganze Weile dauern bis zum fertigen Programm. ;)

Es wäre ganz gut, wenn Du Deine Aufgabe mal genauer erklärst und die Fragen aus den Beiträgen #6 und #2 beantwortest. Dann könnten wir Dir helfen bei der Entscheidung, ob ein fertiges externes Programm vielleicht ausreichend wäre oder ob Du das Mitschreiben unbedingt in der CPU machen mußt und wie das Programm dann aussehen müsste. Normalerweise fängt man erst dann an zu programmieren, wenn die Aufgabenstellung und der Lösungsweg klar sind.

Schönen Sonntag.

Harald


PS:
Beispielprojekt: Wie kann ich in S7-SCL einen Flankenmerker programmieren?
Wobei niemand wirklich einen selbstgeschriebenen Baustein für eine Flankenerkennung nutzt, womöglich noch einen FB. Sowas macht man direkt im Code, siehe Beitrag #13
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank nochmal für eure Tatkräftige Unterstützung.

Es geht genau um eine Prädikate Regelung.
Die Regelung wurde mit Matlab und einer Messdatenerfassungskarte Problemlos realisiert, jedoch ist dies nicht Industrie tauglich ;). Daher auch SCL und mein erster Ansatz alles in den OB zu programmieren. Die Regelung in einem einzelnen OB funktioniert auch (auch wenn die Programmierung nicht schön ist). Jedoch muss ich die Werte die ich ausgebe/einlese loggen um auch grafisch zu sehen das die Regelung läuft.
 
...jedoch ist dies nicht Industrie tauglich ;).

sorry, hier nochmal der Hinweis auf die Hilfe und die Handbücher. Falls Du wirklich einen "industrietauglichen" Reglerbaustein entwickeln willst, wirst Du Dich erstmal mit den Grundlagen der SPS-Programmierung befassen müssen. Irgendeinen theoretischen Regelalgorithmus aus Matlab in SCL umzusetzen macht es noch lang nicht industrietauglich!
Ausserdem sind für den praktischen Einsatz noch ne Menge zusätzlicher Dinge einzubauen, die mit dem eigentlichen Regelalgorithmus nix zu tun haben, Bedienmöglichkeit aus der Visu, Hand/Automatikumschaltung, Nachführung im Handbetrieb und und und... Da mal am besten jemanden fragen der "industrietaugliche" Praxiserfahrung hat, sonst wirds wie so oft ne schöne aber nie eingesetzte Uni-Praktikumsarbeit...

Das Loggen von Daten macht man üblicherweise nicht in der SPS sondern in ner externen Leittechniksoftware (z.B. WinCC...) da heisst es dann Trend oder Archiv.

Gruß und noch schönen Sonntag.
 
Hallo ducati, vielen Dank für deinen Tipp aber mir ist schon bewusst das ich damit nicht in die industrie gehen kann. Jedoch wäre es trotzdem schön zu wissen wie man die Daten loggen kann abgesehen von WinCC und co. Die Auflage die mir gemacht wurde ist, ist S7 mit der Begründung das der großteil der Industrie S7 und nicht PCS7 benutzt. Von daher denke ich mal falls die aussage richtig ist das es bestimmt paar nette Tools gibt um Daten zu erfassen, auch für nicht industrie Regelungen :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Auflage die mir gemacht wurde ist, ist S7 mit der Begründung das der großteil der Industrie S7 und nicht PCS7 benutzt. Von daher denke ich mal falls die aussage richtig ist das es bestimmt paar nette Tools gibt um Daten zu erfassen, auch für nicht industrie Regelungen :)

Die zwei Sätze verstehe ich inhaltlich nicht. Was hat das Ganze mit PCS7 ja/nein zu tun?

Ansonsten wurde Dir ja hier schon erklärt, wie Du Daten in der SPS speichern kannst.
Nur bist Du in der Speichermenge sehr begrenzt und ausserdem wird das in der Praxis so nicht gemacht (nicht zum loggen von Messwerten).

...
 
Ich bin noch etwas durch den Wind... Es hat nichts mit PCS7 zu tun. Ich dachte für einen kleinen Augenblick das WinCC mit PCS7 zusammen hängt.
 
Die zwei Sätze verstehe ich inhaltlich nicht. Was hat das Ganze mit PCS7 ja/nein zu tun?

Ansonsten wurde Dir ja hier schon erklärt, wie Du Daten in der SPS speichern kannst.
Nur bist Du in der Speichermenge sehr begrenzt und ausserdem wird das in der Praxis so nicht gemacht (nicht zum loggen von Messwerten).

...

So geht es mir auch.
Was und welche Werte willst du warum und wie loggen?

Hilfreich für uns und auch für dich wäre ein sinnvolle Beschreibung der Aufgabenstellung.
Wenn dies geklärt ist, dann kann man auch ein Lösungsweg gesucht und gefunden werden.


bike
 
Zurück
Oben