C++ in AWL

A

Anonymous

Guest
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=0;
}

while(Abbruchbedingung)
{
cin >> y; y=Eingangswert des Bausteins
cout << Temp[x-1];
for(i=x-1=;x>=1;x--)
{
Temp=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
 
Muffi schrieb:
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.
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=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=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.
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dankeschön

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
 
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
 
@Zottel

OB100 ???, meinst du OB1 ?

OB100 wird nur einmalig beim Start der SPS durchlaufen.
 
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
 
hallöchen

hier mal eine kleine awl quelle für dein problemchen
 

Anhänge

  • 00000001.zip
    1,3 KB · Aufrufe: 22
Zurück
Oben