Hallo Zusammen,
Der anschließende in C geschriebene Code zählt die Variable zaehler bis
5 hoch und setzt dann die Variable lampe auf 1, zählt wieder bis 5 und
setzt die Variable lampe anschließend auf 0, das soll ein "Blinklicht"
in C simulieren.
So weit, so gut...
1
intmain()
2
{
3
intmerker=0;
4
intzaehler=0;
5
intlampe;
6
7
while(1)
8
{
9
if(merker==0&&zaehler<5)
10
{
11
lampe=1;
12
zaehler++;
13
}
14
if(zaehler==5&&merker==0)
15
{
16
zaehler=0;
17
merker=1;
18
}
19
if(merker==1&&zaehler<5)
20
{
21
lampe=0;
22
zaehler++;
23
}
24
if(merker==1&&zaehler==5)
25
{
26
zaehler=0;
27
merker=0;
28
}
29
}
30
}
Jetzt zum AWL-Code:
1
UN M 0.0 // merker == 0?
2
UN T 1 // zaehler < 2 Sek?
3
L S5T#2S
4
SE T 1
5
S M 0.1 // setze lampe = 1
6
7
UN M 0.0 // merker == 0?
8
U T 1 // lampe == 2 Sek?
9
S M 0.0 // setze merker == 1
10
R T 1 // rücksetze T1
11
12
U M 0.0
13
UN T 1
14
L S5T#2S
15
SE T 1
16
R M 0.1 // lampe = 0
17
18
U M 0.0
19
U T 1
20
R T 1
21
R M 0.0
So, nun zum Problem.. C-Code funktioniert, AWL-Code nicht, obwohl ich es
fast identisch kopiert hab. Bsp.
1
if(a ==1 && b == 1)
2
3
-->
4
5
AWL: U a
6
U b
Vielleicht erbarmt sich ja einer mit mir und kann mir in ein paar Fragen
weiterhelfen.
1. Wie ähnlich sind sich AWL und C?
2. Wer in C programmieren kann, kann auch AWL programmieren?
3. Gibt es ähnliche Konstrukte aus der C-Sprache (auch von der Denkweise
der Programmierung, mir scheinen die beiden Programmiersprachen nämlich
komplett unterschiedlich :D ), die ich auch "1 zu 1" in AWL übernehmen
kann --> ähnlich Copy&Paste
--> alles sehr pauschale Fragen :P ...
4. zu guter Letzt, warum funktioniert der Code, den ich gepostet hab, in
AWL nicht und in C schon.
Gruß, von einem AWL-Laie ;)
--
Mit den Tags für die Sourcecodeformatierung wirds gleich lesbarer,
nicht?
-rufus
Josef J. schrieb:> 1. Wie ähnlich sind sich AWL und C?
Wenig ähnlich. AWL ist eine Sprache die sich vom Aufbau her am ehesten
an Assembler anlehnt. Drum hat das auch wenig mit C zu tun.
Entsprechend schwierig ist das für Leute, die Hochsprachen gewohnt sind.
Aber:
I der IEC61131-3 wurde das berücksichtigt. Es gibt ja noch Structured
Text (das ist so wie Pascal), das deutlich leichter verständlich ist,
und mit dem man richtig strukturiert programmieren kann.
Nicht zuletzt unterstützen einige Hersteller auch ANSI-C. Daher würde
ich dir gleich empfehlen: Wenn du den Einstieg in das Thema machst,
fange gleich mit Structured Text oder C an.
Bei meinem ehemaligen Arbeitgeber (ein SPS-Hersteller) gab es eine große
Applikationsabteilung. Die haben größtenteils mit C gearbeitet.
moep schrieb:> Nils H. schrieb:>> Nebenbei lässt sich dein C-Code noch immens verbessern.>> besser != "alles immer in der kurzmöglichsten Form schreiben"
Na dann gerne auch so - macht aber das selbe mit drei Zeilen mehr Code.
Was von beiden ist jetzt übersichtlicher..?
Aber die vielen If-Abfragen mit zusätzlicher Steuervariabe kann man sich
sparen.
Josef J. schrieb:> UN M 0.0 // merker == 0?> UN T 1 // zaehler < 2 Sek?> L S5T#2S> SE T 1> S M 0.1 // setze lampe = 1
Da hackt es schon.
Du lädst den Timer 2 mal.
Du brauchst 2 Timer für Lauf und Pausenzeit.
UN M 0.0
UN T 2
L S5T#2S
SE T 1
U T 1
L S5T#2S
SE T 2
SET
U T 1
= M 0.1
Josef J. schrieb:> 3. Gibt es ähnliche Konstrukte aus der C-Sprache (auch von der Denkweise> der Programmierung, mir scheinen die beiden Programmiersprachen nämlich> komplett unterschiedlich :D ), die ich auch "1 zu 1" in AWL übernehmen> kann --> ähnlich Copy&Paste> --> alles sehr pauschale Fragen :P ...
SCL ist ähnlich Pascal.
Du kannst das ganze aber auch mit Zählerschleifen machen:
(Jetzt nur mal der Zähler)
UN M 100.1
L S5T#1S
SE T 300
U T 300
= M 100.1 //Sekundepuls
U M 100.1
SPBN KEI1
L MW 400 // Dein Zähler
L 1
+I
T MW 400
KEI1: NOP 0
moep schrieb:> besser != "alles immer in der kurzmöglichsten Form schreiben"
Na ja,
bei Nils Code kann man sofort erkennen, was wann passiert.
Beim Code vom TE muss man erst mal in Gedanken alle Zustände durchgehen
und schauen, welche Bedingung jetzt erfüllt ist.
In diesem Fall ist das tatsächlich der bessere Code.
nebenbei, das ist zu kurz und unnötig :)
Guten Morgen und vielen Dank für die schnellen Antworten
Hurra schrieb:> Josef J. schrieb:>> 1. Wie ähnlich sind sich AWL und C?>> Wenig ähnlich. AWL ist eine Sprache die sich vom Aufbau her am ehesten> an Assembler anlehnt. Drum hat das auch wenig mit C zu tun.> Entsprechend schwierig ist das für Leute, die Hochsprachen gewohnt sind.>> Aber:> I der IEC61131-3 wurde das berücksichtigt. Es gibt ja noch Structured> Text (das ist so wie Pascal), das deutlich leichter verständlich ist,> und mit dem man richtig strukturiert programmieren kann.>> Nicht zuletzt unterstützen einige Hersteller auch ANSI-C. Daher würde> ich dir gleich empfehlen: Wenn du den Einstieg in das Thema machst,> fange gleich mit Structured Text oder C an.>> Bei meinem ehemaligen Arbeitgeber (ein SPS-Hersteller) gab es eine große> Applikationsabteilung. Die haben größtenteils mit C gearbeitet.
Wenn in der SPS-Programmierung unter anderem SC verwendet wird, dann
muss es doch da einen Zusammenhang geben, wie ich diesen in AWL anzeigen
lassen kann und umgekehrt.
FUP lässt sich ja auch z.B. in AWL abändern.
Nils H. schrieb:> Nebenbei lässt sich dein C-Code noch immens verbessern. Ich würde> es so> machen:> int main()> {> int zaehler = 0;> int lampe;>> while(1)> {> lampe = zaehler < 5 ? 0 : 1;> if(++zaehler > 9)> zaehler = 0;> }> }
Geb ich dir recht :) aber mir geht es auch eher um den dazu
identischsten AWL-Code.
Fred R. schrieb:> SCL würde anders aussehen.>> (Siehe Anhang)
Das sieht mir halt schon sehr viel vertrauter aus :P.., jedoch würde ich
gern auch mal AWL verstehen..
Ich hab schon ein bisschen das Internet durchstöbert und auch deine
Lösung bereits gelesen mit den 2 Timer, jedoch ist mir unklar, warum das
so wie in meinem AWL-Code nicht mit Einem geht.
Das wäre dann auch gleich meine 1. Frage, auch wenn die sehr allgemein
ist..
Zu meinen weiteren Fragen:
--> noch viel allgemeiner :D..
2. Wie ist eure "Denkweise", wenn ihr in AWL programmiert. Also dieser
Code in C ist ja in wenigen Minuten programmiert, wobei das von AWL
schon eine Menge Denkleistung voraussetzt, wie geht es euch da?
Sind das in AWL "Konstrukte", die ihr schon häufig so benötigt habt und
dann einfach so schnell runterschreibt. Ähnlich bei C z.B. der doppelten
for-Schleife für ein zweidimensionales Array, da denkt man auch nicht
speziell nach, ob das so funktioniert, weil es eben funktioniert ;)
3. Überlegt ihr euch zuvor die Netzwerke, die ihr programmiert, oder
kommt das dann mit dem programmieren
4. (vielleicht ne sehr blöde Frage) Wann benütze ich Zuweisungen und
wann S/R, sowas gibt es doch in C speziell gar nicht?
5. Wenn ich Ausgänge schalten will, macht ihr die Zuweisung der Ausgänge
immer am Ende vom Programm und nur 1x, und dann meistens mit den
Merkern, die man zuvor gesetzt hat, oder erfolgt die Zuweisung in
mehreren verschiedenen Netzwerken und die letzte Zuweisung gewinnt halt
dann?
Danke gleich mal ;)
Josef J. schrieb:> Ich hab schon ein bisschen das Internet durchstöbert und auch deine> Lösung bereits gelesen mit den 2 Timer, jedoch ist mir unklar, warum das> so wie in meinem AWL-Code nicht mit Einem geht.> Das wäre dann auch gleich meine 1. Frage, auch wenn die sehr allgemein> ist..Fred R. schrieb:> UN M 100.1> L S5T#1S> SE T 300> U T 300> = M 100.1 //Sekundepuls>> U M 100.1> SPBN KEI1> L MW 400 // Dein Zähler> L 1> +I> T MW 400> KEI1: NOP 0
Da wird nur einer verwendet. Dieser zählt die Variable MW 400 hoch.
Danach machst du nurnoch die Auswertung.
L MW400 // 2 Sekunden aus
L 0
<= I
R M4.5 //Lampe
L MW400 2 Sekunden ein
L 2
>= I
S M4.5 //Lampe
L MW400 // 1 Intervall vorbei.Setze alles zurück.
L 4
>= I
R M4.5 //Lampe
L 0
T MW400
Das mit dem Timer macht man normal gar nicht.
In einem OB mit gewisser Ausführungszeit wird ein Merker gesetzt (in TIA
PORTAL KEINE MERKER MEHR VERWENDEN !!!)
Am Ende des OB1 wird dieser zurückgesetzt.
Das ist dann dein Impulsmerker.
Danach nur noch:
U M 100.1 //Impulsmerker
SPBN KEI1
L MW 400 // Dein Zähler
L 1
+I
T MW 400
KEI1: NOP 0
SCL ist eine eigene Sprache, welche nicht umschaltbar ist!
Das gleiche gilt für CFC unter PCS7.