Aus WinCC heraus Zugriff auf Variablen vom Simatic Manager (zb. DBs)

tony90

Level-1
Beiträge
37
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus allerseits,
versuche schon seit längerem folgendes,ohne Erfolg :-( :-(

In WinCC will ich aus Kombinationsfelder den aktuellen Indexwert (selektiertes Feld) rauslesen und in einer SCL-Quelle verarbeiten. Wie realisiert man sowas ohne großen Aufwand? VBscript wär glaub ich zu aufwändig...
Wollte einfach über Dynamikdialog eine Variable verschalten, welche mir in einen DB dauernd was reinschreibt...
Hat da jmd Erfahrung mit?

Danke im Vorrraus.
 
Mit dem Kombinationsfeld bin ich mir grad nicht sicher...

Aber prinzipiell geht es so:

In SCL schreibst Du nen Baustein. Der Baustein hat Eingänge welche Bedien/Beobachtbar sind (Attribut S7_m_c := true). Diesen Baustein ziehst Du in nen CFC-Plan. Jetzt Plan übersetzen und in die SPS-Laden. Das war der SPS-Teil.
Der Visu Teil: OS-Übersetzen (dadurch werden die Eingangsvariablen aus dem SPS-Baustein in der Visu angelegt). Jetzt kannst in der Visu im Graphics Designer die Variablen verwenden. Mit dem Kombinationsfeld bin ich mir jetzt nicht sicher, müsste ich testen, aber jetzt ist Feierabend.

PS: Evtl. gibt's in der APL-Bibliothek auch einen Baustein der Deine gewünschte Aufgabe erfüllt.
In PCS7 ist zwar WinCC integriert, aber die Vorgehensweise unterscheidet sich doch grundlegend von der klassischen WinCC-Standalone-Projektierung. Falls Du darin nicht fit bist, würde ich erstmal mit den PCS7-Getting Started beginnen.
Welche Version nutzt Du, PCS7 8.0 SP0 Upd1 oder 8.0 SP1 Upd0 ?

Gruß.
 
Danke für schnelle Antwort.
Also ich habe mich schon öfters mit dem Getting Started beschäftigt,leider dort keine Information rauslesen können...
Ich benutze PCS7 8.0 SP0 Upd1.

Meine Frage ist, wie ich so ein Kombiniertes Feld nach dem aktuellen Index Abfrage und diesen auch über eine Variable Simatic zur Verfügung stelle.

Das heißt,Attribut S7_m_c := true in einem SCL-Code für einen Eingang oder Ausgang bedeutet, dass dieser auch im Variablenhaushalt sichtbar wird?
Hast du vil. ne Idee wie sowas Funktioniert?
Danke für deine Hilfe.
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    43,9 KB · Aufrufe: 30
Zuviel Werbung?
-> Hier kostenlos registrieren
Falls du nur 3 Einträge hast, könntest du aus der APL den Baustein OpDi03 verwenden. Dann hast du gleich alle Features wie Faceplate und Bedienberechtigungen inklusive.

Ansonsten musst du selber schreiben.

Einen ganz simplen Baustein der dir eine Integer-Variable automatisch im WinCC anlegt könnte so aussehen:

Code:
FUNCTION_BLOCK "KombinationsSollwert"
  { S7_m_c := 'true'; }
VAR_INPUT
  SP_Int { S7_visible := 'false'; S7_m_c := 'true' }: INT := 1; //Internal setpoint
END_VAR

VAR_OUTPUT
  SP_Out { S7_dynamic := 'true'; }: STRUCT     //Output Value
    Value : INT;                               //Value
    ST : BYTE  := 16#80;                       //Signal Status
  END_STRUCT;
END_VAR

BEGIN
  SP_Out.Value := SP_Int;
  SP_Out.ST := 16#80;
END_FUNCTION_BLOCK

Das Innenleben kannst du nach Bedarf ergänzen.

Die Variable mit dem Attribut S7_m_c := 'true' wird dir beim OS übersetzen in WinCC automatisch mit dem Namen der FB Instanz in CFC-Plan angelegt.
Nennst du die Instanz z.B. MEIN_SW1 dann heißt die Variable im WinCC MEIN_SW1.SP_Int.
Je nach Einstellung in der technologischen Hierarchie hast du bei evtl. noch etwas davor stehen.

Die anderen Attribute sind so wie sie auch bei den anderen Bausteinen der APL gesetzt sind:
Mit S7_visible := 'false' wird der OS-Parameter im CFC Plan unsichtbar geschaltet,
und mit S7_dynamic := 'true' wird erreicht dass beim Online-Status dieser Wert automatisch im CFC Plan angezeigt wird.

Wenn du dann deine OS übersetzt solltest du im WinCC Variablenhaushalt die Variable wiederfinden.

Zu deinem Kombinationsfeld in WinCC:
Im Kombinationsfeld stellst du für jeden Index den entsprechenden Text ein.
Dazu wählst du unter den Eigenschaften des Feldes "Schrift" an, und setzt dann erst den Index auf die gewünschte Nummer und stellst den zugehörigen Text ein.

Das Attribut "Sonstiges" -> "Selektiertes Feld" verknüpfst du mit deiner im WinCC angelegten Variable.

Wenn du das erste Feld auswählst erhältst du als Wert in der SPS den Wert 1, darum habe ich diesen auch als Startwert im FB angegeben.

PS:
Du bräuchtest nichtmal einen extra FB dafür, du könntest auch einen extra HMI-DB anlegen mit der Variable und dem zugehörigen Attribut dazu. Dann ist das Schema mit der technologischen Hierarchie jedoch dahin.
 
Zuletzt bearbeitet:
Super Thomas:D:D:D
Endlich komme ich dem Ziel näher!
Variablen sind jetzt im Haushalt angelegt.

Beim Übersetzen des CFC-Plans tritt aber noch das Problem auf, dass der Compiler neue DBs hinzufügt mit dem selben Inhalt, aber nur unter anderen Zahlen gespeichert. Sprich die DBs, die ich den FBs im OB zugewiesen habe, sind dann nicht mehr die aktuellen DBs, auf die der CFC guckt...
Kann man dem Compiler irgendwie mitteilen, bitte gucke in diese DBs?
Danke nochmals für die schnelle Antwort!!
 
Ich verstehe gerade nicht ganz was du meinst.
In CFC mit PCS7 musst du dich eigentlich um keine DB-Nummern mehr kümmern.

Wenn der FB übersetzt ist, kannst du diesen in einen Plan ziehen. Der CFC Editor erzeugt dann automatisch einen Instanz-DB mit einer Nummer die ihm gerade gefällt. Darauf hast du keinen Einfluss. Du kannst die lediglich im Eigenschaftsdialog im CFC Plan nachschauen welche Instanz-DB Nummer diese Instanz momentan hat. Beim OS übersetzen wird dann die Variable mit der Instanz-DB Nummer konsistent gehalten.
Wenn du eine FB-Instanz aus dem CFC Plan wieder löschst, wird beim Übersetzen auch der zugehörige Instanz-DB aus dem Bausteinordner gelöscht.

Ich wundere mich dass du schreibst, du hättest einem FB im OB einen DB zugewiesen. Das hört sich nicht wirklich nach CFC an was du da anstellst, denn dort verschiebt man CFC-Pläne in Ablaufgruppen, sprich in verschiedene OBs wie OB1 oder OB35.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
PCS7 programmiert man nur in CFC. Du schreibst Deine Bausteinaufrufe nicht nochmal in AWL/FUP in irgend einen OB. Ich Denke nicht, dass es in den Getting Starteds irgendwo so erklaert wird.
Also Bausteine in SCL schreiben und in CFC verschalten/aufrufen. So funktioniert PCS7. Du legst keinen einzigen OB und DB im Bausteinordner haendisch an.
Das ganze zeigt mal wieder: PCS7 bringt mWn sich nicht ordentlich im Selbststudium bei. Da verfällt fast jeder in die klassische Step7-Manier...
 
Ich programmiere die Bausteine mit SCL und will sie dann im CFC einsetzen...
Aber zum Testen benutze ich die OBS...

Ich will einen Funktionsaufruf in SCL erzeugen, wo mir gewisse Parameter übergeben werden. Und dazu brauch ich eben DBs...
z.B. Merker_Menge:=DB11.Menge;

Beim Übersetzen der CFC Pläne werden dann Instanzdbs erzeugt. Guckt der Baustein trotzdem noch auf DB11 in diesem Fall??
Sorry für die Frage, bin aber Einsteiger :)
 
Da wäre meine Empfehlung so ein Testprojekt für einzelne Bausteine klassisch in S7 aufzusetzen, also ohne CFC. Dann hast du aber nur einen reinen Bausteintest, ohne OS-Anbindung.

Wenn du Bausteine aus der APL außerhalb von PCS7/CFC verwenden willst musst du auch aufpassen, denn diese laufen dort nur mit viel Aufwand. Die meisten dieser Bausteine haben intern eine Prüfung in welchem OB sie laufen, um dann z.B. Initialisierungsroutinen zu durchlaufen. Passt das alles nicht zusammen, dann funktioniert irgendwas nicht und du weißt nicht wieso.

Genauso mit deinem Zugriff auf Absolutadressen. Wenn du etwas testen willst was später in CFC und auch mit der OS-Anbindung funktionieren soll, dann programmier es so wie es dort später verwendet wird. Und das bedeutet dass man nicht über SCL auf irgendwelche Instanz-DBs zugreift die der Verwaltung von CFC unterliegen.

Es gibt in CFC nur wenige Gründe um auf absolute DB-Adressen zuzugreifen, das sind:
- Schnittstellen DBs zu Fremd-HMI oder auch WinCCflexible
- Schnittstellen DBs zu anderen Stationen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich will einen Funktionsaufruf in SCL erzeugen, wo mir gewisse Parameter übergeben werden. Und dazu brauch ich eben DBs...
z.B. Merker_Menge:=DB11.Menge;

Vielleicht beschreibst Du im Allgemeinen mal, was Deine Anlage/Steuerung machen soll und im speziellen was Dein SCL-Baustein machen soll. Ich wird den Gedanken nicht los, dass Du etwas auf dem Holzweg bist, was PCS7 anbelangt.
In PCS7 schreibt man die (SCL-)Bausteine in aller Regel so, dass sie mehrfach verwendet werden können. Eine direkte Zuweisung in dem Baustein auf einen speziellen DB macht somit wenig Sinn. Merker_Menge wäre somit eigentlich ein Eingang des Bausteins, welchen Du dann in CFC mit DB11.Menge verschalten würdest. Aber wie Thomas schon sagte, verwendet man in PCS7 nur in Ausnahmefällen händisch angelegte DBs. Von daher würde ich den Sinn/Richtigkeit vom DB11 auch erstmal pauschal hinterfragen.
Wie gesagt, PCS7 ist nicht Step7/WinCC, auch wenn diese 2 Tools integriert sind, gelten in PCS7 andere Regeln.

Gruß.
 
Genauso mit deinem Zugriff auf Absolutadressen. Wenn du etwas testen willst was später in CFC und auch mit der OS-Anbindung funktionieren soll, dann programmier es so wie es dort später verwendet wird. Und das bedeutet dass man nicht über SCL auf irgendwelche Instanz-DBs zugreift die der Verwaltung von CFC unterliegen.

Kann sein das ich da wirklich auf nem Holzweg bin. Zum Verständnis:
Der SCL Code soll gewisse Parameter aus einem anderen SCL-geschriebenen FB aufrufen, wie z.B. Vorgang_beendet, Menge_vorhanden usw...
Ich habe einen Baustein(von mir aus FBX), den ich nur einmal im CFC als Ringpuffer einsetzen möchte. Sprich Anfragen werden gespeichert und der Reihe nach abgearbeitet. Das Abarbeiten geschieht in einem anderen FB. Wenn aktueller Index abgearbeitet wurde, soll der FBY dem FBX dies melden. Und dafür muss ich doch für Bausteinaufruf über DBs gehen?? Ich könnte die Parameter auch nach außen verschalten, wollte das aber proffesioneller lösen :-/.
 
Naja, ganz verstanden habe ichs nicht,
aber die Parameter aus dem anderen FB (Vorgang_beendet...) legst Du bei beiden FBs nach aussen (einmal Ausgang einmal Eingang) und verbindest sie im CFC, das wäre aus Sicht von PCS7 professionell :)

Der SCL Code soll gewisse Parameter aus einem anderen SCL-geschriebenen FB aufrufen, wie z.B. Vorgang_beendet, Menge_vorhanden usw...
Schnittstellen zwischen Bausteinen sind die Ein- und Ausgänge, nicht irgendwelche DBs. Du kannst ja auch nicht beeinflussen, welche DB-Nummer der CFC vergibt.

Ansonsten hört sich das aber auch nach Schrittketten an, dafür nimmt man in PCS7 SFC (Sequentiell Function Chart)

Weiterhin kann man auch überlegen, verschiedene Dinge direkt im CFC zu programmieren und nicht in nem FB.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok,dass heißt die Schnittstelle realisiere ich mit Verschaltung auf Eingang und Ausgang.

Letztendlich werde ich wahrscheinlich SFC benutzen müssen, was ich aber überhaupt net mag...Deswegen Versuche ich ja erst den Weg über CFC zu gehen. :D
Zum Testen des ganzen ist S7 mit OB aber ziehmlich legitim oder??

Tausendmal Dank für die Hilfe an
Thomas_v2.1 und ducati!
 
Zum Testen des ganzen ist S7 mit OB aber ziehmlich legitim oder??

Naja, dass musst Du wissen. Ich bin der Meinung gerade beim Testen gehen in CFC viele Dinge einfacher. Außerdem ne Testumgebung die anders funktioniert als später macht wenig Sinn?
Zum Thema SFC: das funktioniert in Kombination mit CFC, Du setzt mit dem SFC bestimmte Bausteineingänge im CFC auf bestimmte Werte.

Oder für kleinere Schrittketten nen mehrfach verwendbaren Schrittkettenbaustein schreiben. Ist ganz übersichtlich und auch in CFC ohne PCS7 verwendbar.

Viel Erfolg.:sm24:
 
Zum Verständnis würde ich aber trotzdem wissen, wie es möglich ist, auf DBs in CFC zuzugreifen.
Wieder am Beispiel Merker_Menge.

Wenn ich den Baustein FBy aufrufe im FBx heißt der Code ja: Merker_Menge:=DBy.Merker_Menge;
Funktioniert das so?

Werde wahrscheinlich nicht drumherum kommen, DBs einzubinden in FBs.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Zum Verständnis würde ich aber trotzdem wissen, wie es möglich ist, auf DBs in CFC zuzugreifen.
Wieder am Beispiel Merker_Menge..

Der DB sollte in der Symboltabelle vorhanden sein. Einen FB in CFC ziehen. Dann rechte Maus auf den Eingang des FB -> Verschaltung zu Operand. fertig.

Das funktioniert aber nicht mit IDBs, da deren vom CFC vergebene Nummer sich ändern kann, ausserdem sehr sehr sehr schlechter Programmierstil !

Wenn ich den Baustein FBy aufrufe im FBx heißt der Code ja: Merker_Menge:=DBy.Merker_Menge;
Funktioniert das so?

FB-Aufruf in einen FB funktioniert auch über die Versorgung der Ein/Ausgänge... Was Du hier machst:

Code:
Merker_Menge:=DBy.Merker_Menge;

ist kein Aufruf eines FB sonders einfach das einlesen eines Wertes aus dem DB. Und wenn der DB ein IDB ist, dann ist das auch ganz ganz ganz schlechter Programmierstil...

Ich glaube Du hast Dich etwas verrannt...

Versuche Deine 2 FBs so zu programmieren, dass sie unabhängig voneinander funktionieren könnten. DB-Zugriffe in den FBs versuche zu vermeiden. Alle externen Daten, welche die FBs benötigen versuche über Ein/Ausgänge der FBs zu verschalten (Merker_Menge). Dieses Verschalten machst Du dann im CFC. Einfach die Eingänge des FBx (Merker_Menge) mit den Ausgängen des FBy (Merker_Menge) verbinden, ohne noch nen DB dazwischen...
 
Ich kann Dir nur nochmal dringend raten, Dich mit den GettingStarteds sowie Ausbildungsunterlagen von PCS7 zu befassen. Oder am besten nen PCS7 Kurs zu machen. Sonst rennst Du noch ewig in die falsche Richtung. Weiterhin habe ich das Gefühl, dass Du das InstanzDB Konzept von Step7 auch nicht richtig verstanden hast... Dazu gibt's auch Dokus...

Das Ganze probierst Du dann erstmal mit einfachen FBs, wie dem von Thomas weiter oben geposteten. Davon verschaltest Du mal ein par in CFC und testest das... irgendwann kommt dann schon der Aha-Effekt...

Gruß.
 
Zurück
Oben