Forum: Mikrocontroller und Digitale Elektronik Unterschied C / AWL


von Alexander M. (a_lexander)


Lesenswert?

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
int main()
2
{
3
    int merker = 0;
4
    int zaehler = 0;
5
    int lampe;
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

: Bearbeitet durch User
von Hurra (Gast)


Lesenswert?

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.

von Curby23523 N. (Gast)


Lesenswert?

Nebenbei lässt sich dein C-Code noch immens verbessern. Ich würde es so 
machen:
1
int main()
2
{
3
    int zaehler = 0;
4
    int lampe;
5
6
    while(1)
7
    {
8
      lampe = zaehler < 5 ? 0 : 1;
9
      if(++zaehler > 9)
10
        zaehler = 0;
11
    }
12
}

von moep (Gast)


Lesenswert?

Nils H. schrieb:
> Nebenbei lässt sich dein C-Code noch immens verbessern.

besser != "alles immer in der kurzmöglichsten Form schreiben"

von Curby23523 N. (Gast)


Lesenswert?

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.
1
int main()
2
{
3
    int zaehler = 0;
4
    int lampe = 0;
5
6
    while(1){
7
      if(zaehler < 5)
8
        lampe = 0;
9
      else
10
        lampe = 1;    
11
12
      if(++zaehler > 9)
13
        zaehler = 0;
14
    }
15
}

von Fred R. (Firma: www.ramser-elektro.at/shop) (fred_ram)


Lesenswert?

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

: Bearbeitet durch User
von Fred R. (Firma: www.ramser-elektro.at/shop) (fred_ram)


Angehängte Dateien:

Lesenswert?

SCL würde anders aussehen.

(Siehe Anhang)

von nicht"Gast" (Gast)


Lesenswert?

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 :)
1
void main(void){
2
  static int zaehler, lampe;
3
  
4
  while (1) {
5
    lampe = zaehler >= 5;
6
    zaehler = (zaehler+1) % 10;
7
  }
8
}

von Peter II (Gast)


Lesenswert?

nicht"Gast" schrieb:
> nebenbei, das ist zu kurz und unnötig :)

das static kann man sich auch noch sparen

von nicht"Gast" (Gast)


Lesenswert?

Peter II schrieb:
> das static kann man sich auch noch sparen

nein, dann sind die nicht initialisiert.

von nicht"Gast" (Gast)


Lesenswert?

na gut, wenn man in der ersten Runde dammit leben kann, dass lampe 
irgend einen Zustand hat, kann man das static auch noch weglassen.

von Peter II (Gast)


Lesenswert?

nicht"Gast" schrieb:
> nein, dann sind die nicht initialisiert.

man könnte sie einfach global, also vor main schreiben.

von Martin K. (maart)


Lesenswert?

Es geht hier nicht um "wer hat den kürzesten".

von Alexander M. (a_lexander)


Lesenswert?

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 ;)

von Eric B. (beric)


Lesenswert?

Wenn man den Zähler nicht bis 10 sondern bis 8 zählen lässt, wird's noch 
besser:
1
void main(void){
2
  int zaehler, lampe;
3
4
  while (1) {
5
    lampe   = (zaehler >> 2);
6
    zaehler = (zaehler + 1) & 0x07;
7
  }
8
}

von Fred R. (Firma: www.ramser-elektro.at/shop) (fred_ram)


Lesenswert?

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.

von Alexander M. (a_lexander)


Lesenswert?

Vielen Dank für die Hilfe :)

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.