Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 8 von 8

Thema: C++ in AWL

  1. #1
    Anonymous Gast

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo!
    Ich hoffe ihr habt die Ostertage alle gut überstanden und euch mit Freuden wieder in die Arbeit gestürzt.

    Leider hab ich wieder ein Problem.
    Ich sollte versuchen auf der S7 ein Totzeitglied zu programmieren. Da ich mich mit AWL 0,0% auskenne hab ich erstmal was ganz primitives in C++ programmiert. was aufm PC auch so lief, dass es den Zweck erfüllt.
    Jetzt ist nur das Problem, dass ich es irgendwie in die S7 kriegen muss.

    Hab leider auch nicht mehr die Zeit mich groß in AWL einzuarbeiten, da ich erst gestern die Aufgabe bekommen habe und es (wenn möglich) heute fertig sein muss.

    Hier ist mal der Code:

    cin >> Totzeit;
    cin >> Takt;
    x=Totzeit/Takt;
    float *Temp; Es reicht auch ein ARRAY mit fester Größe!
    Temp=new float[x]; Denke nicht, das ein dynamisches ARRAY mit
    For(i=0;i<x;++i) AWL geht,oder?
    {
    Temp[i]=0;
    }

    while(Abbruchbedingung)
    {
    cin >> y; y=Eingangswert des Bausteins
    cout << Temp[x-1];
    for(i=x-1=;x>=1;x--)
    {
    Temp[i]=Temp[i-1];
    }
    Temp{0}=y;
    Sleep(Takt);
    }
    delete Temp;

    Also wie gesagt, ich hab keine Ahnung wie sowas zu programmieren ist. Wäre toll, wenn jemand von euch ne Idee hätte oder mir sagen kann auf welcher Seite es vielleicht einen Schnelleinstig für AWL gibt. Insbesondere die Schleifen wären wichtig.


    Ist vielleicht ein bischen viel, aber ich danke euch trotzdem schonmal im Vorraus für eure Hilfe.

    Gruß Muffi
    Zitieren Zitieren Gelöst: C++ in AWL  

  2. "Sprechen wir über S7 (AUF DB5) oder S5 (A DB5)?
    Die in- (und out-, inout-)Variablen sprichst du über ihren Namen an, mit einem Gleichheitszeichen davor:
    L =meineInVariable"


  3. #2
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von Muffi
    Hier ist mal der Code:

    cin >> Totzeit;
    cin >> Takt;
    AWL (und SPS) kennen kein I/O von Dateien. Diese Werte mußt du fest vorgeben.
    x=Totzeit/Takt;
    Diese Berechnung kannst du einmal beim Anlauf, oder, wenn beides feststeht, auch mit dem Taschenrechner machen und fest vorgeben.
    float *Temp; Es reicht auch ein ARRAY mit fester Größe!
    Temp=new float[x]; Denke nicht, das ein dynamisches ARRAY mit AWL geht,oder?
    Nein, wie du schon vermutest, nein. Da aber dein x wohl fest steht, legst du statt dessen einmalig einen Datenbaustein mit der benötigten Anzahl von REALs an.
    For(i=0;i<x;++i) AWL geht,oder?
    {
    Temp[i]=0;
    }
    Die Nullen gibst du dem Datenbaustein als "Anfangswerte" mit. 0 ist eh die Voreinstellung.
    while(Abbruchbedingung)
    {
    Diese while Schleife wirst du in AWL nicht machen. Eine SPS führt in jedem Zyklus wieder das Programm aus, so als ob da stünde:
    while(Zustand!=STOP)
    {
    OB100();
    }
    Du programierst dann den Inhalt des OB100, der wiederum andere Bausteine/Funktionen aufrufen kann.
    cin >> y; y=Eingangswert des Bausteins
    Wie gesagt: AWL (und SPS) kennen kein I/O von Dateien. Den Wert des Signals bekommst du typischerweise von einem Analogeingang.
    cout << Temp[x-1];
    Statt Werte zur Kontrolle zu drucken, nutzt du die Funktion "Beobachten" des Programmiergeräts.
    for(i=x-1=;x>=1;x--)
    {
    Temp[i]=Temp[i-1];
    }
    Temp{0}=y;
    Sleep(Takt);
    Die for Schleife kannst du mit der LOOP-Anweisung so ähnlich machen. Eine indirekte Adressierung geht auch. Ist aber zu lang, es hier zu erklären. Siehe Hilfe zu Step7. Da deine Länge aber feststeht, kannst du statt der Schleife auch:
    Temp[10]=Temp[9];
    Temp[9]=Temp[8];
    u.s.w. benutzen. Das sieht in AWL dann so aus:

    A DB 5 //wenn DB5 der Datenbaustein ist, der deine Temps enthält.
    //
    // ab jetzt arbeitet die SPS bei allen Operationen mit Datenworten mit diesem DB
    // bis du mit AUF DBx einen anderen wählst.
    //
    L DBD40 //ein DBD ist 4 Byte lang, da geht ein REAL rein
    T DBD36 //ein DBD ist 4 Byte lang, da geht ein REAL rein
    L DBD36 //ein DBD ist 4 Byte lang, da geht ein REAL rein
    T DBD32 //ein DBD ist 4 Byte lang, da geht ein REAL rein
    u.s.w.

    Ein "sleep" gibt es nicht. Wenn du den Code im OB100 ablaufen läßt, wird er einmal pro Zyklus ausgeführt. Dadurch ist deine Totzeit von der Zykluszeit abhängig. Diese kann variieren, insbesondere wenn bedingte Anweisungen ausgeführt werden. Mit +/- 10% mußt du immer rechnen.
    Wenn dir das zu ungenau ist: Du kannst (auf den S7-3xx, die 4xx kennen mehrere solche OBs) einen OB35 programmieren. Dieser wird in einem programmierbaren Zeitraster (z.B. alle 10ms, alle 100ms aufgerufen).

    Wenn du Takt=Totzeit machst und diese Zeit für das Aufrufintervall des OB35 angibst, ist dein temp-array eh nur ein Element lang.
    delete Temp;
    Der Speicher im DB entspricht eher globalen Variablen. Es gibt zwar die Möglichkeiten, DBs zur Laufzeit anzulegen, aber laß dir sagen, daß das eine absolute Ausnahme ist. Im übrigen würde ich auch in C nicht denselben Speicher jedesmal allozieren, mit 0 füllen und wieder freigeben, wenn ich wüßte, daß ich ihn immer wieder brauche.
    Zitieren Zitieren Re: C++ in AWL  

  4. #3
    Anonymous Gast

    Standard

    Hey, vielen Dank für die Hilfe!

    Aber wenn ich im Editor für den FB A DB5 eingebe, dann wird es rot markiert, obwohl ich im Projekt den DB5 angelegt habe.
    Auch werden die Eingangswerte für den Baustein im OB35, welcher den FB auch aufruft erzeugt und sollen nicht über den Analogeingang eingelesen werden. Deshalb hatte ich mir im Deklarationsteil des FB 2 in Variablen erzeugt. Wie kann ich die denn im FB ansprechen?

    Gruß Muffi
    Zitieren Zitieren Dankeschön  

  5. #4
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Sprechen wir über S7 (AUF DB5) oder S5 (A DB5)?
    Die in- (und out-, inout-)Variablen sprichst du über ihren Namen an, mit einem Gleichheitszeichen davor:
    L =meineInVariable

  6. #5
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    @Zottel

    OB100 ???, meinst du OB1 ?

    OB100 wird nur einmalig beim Start der SPS durchlaufen.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  7. #6
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von Ralle
    @Zottel

    OB100 ???, meinst du OB1 ?

    OB100 wird nur einmalig beim Start der SPS durchlaufen.
    Ja, klar meinte ich OB1. Sorry.

  8. #7
    Anonymous Gast

    Standard

    Ja, war für S7!
    Sorry, hätte das besser erwänen sollen.
    Jetzt klappts auch mit den Variablen. Ist aber ein # und kein =
    Werde jetzt mal ein bißchen rumtüfteln. Bei Fragen melde ich mich einfach ganz dreist bei euch.

    Vielen Dank soweit

    Gruß Muffi

  9. #8
    Registriert seit
    20.10.2004
    Beiträge
    650
    Danke
    5
    Erhielt 26 Danke für 26 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    hallöchen

    hier mal eine kleine awl quelle für dein problemchen
    Angehängte Dateien Angehängte Dateien

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •