SPS AWL Fehler?

xxxyyyx

Level-1
Beiträge
20
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
die rechte AWL soll die linke Tabelle ergeben.
Meiner Meinung nach fehlt da ein U.
Sonst weiß ich ja garnicht, wie ich den Ausdruck in der Klammer mit dem darüber stehenden verknüpfen soll.
20180520_114629.jpg
Was meint Ihr?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
Diese Schreibweise gibt's nicht:

U    E1.0
(ON  M1.0
O    M2.0)
=    A1.0

diese wäre richtig:
 
U    E1.0
U( 
ON   M1.0
O    M2.0
) 
=    A1.0

oder ohne Klammern:
 
ON   M1.0
O    M2.0
U    E1.0
=    A1.0

Laut Deiner Tabelle wäre am einfachsten:

U E1.0
= A1.0

dann brauchst Du weder M1.0 noch M2.0 noch E2.0 ;o)

Gruss, Heinileini
 
Und bei den Merkern denkst Du zu kompliziert. Es gibt eine Bedingung bei der M1.0 TRUE ist und M2.0 FALSE, bei allen anderen ist es umgekehrt. Wenn Du diese Bedingung in AWL schreibst weist Du das VKE M1.0 zu und das invertierte VKE M2.0

Von irgendwas mit Internetzugang gesendet
 
Danke für eure Verbesserungstipps.

Aufgabe ist es aber nur die Tabelle an Hand der rechten AWL auszufüllen.

Wie Heinileini bestätigt hat, hat die gedrucke AWL aber einen Fehler, richtig müsste es so heißen wie rechts daneben geschrieben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht noch eine andere Frage:
Code:
Laut Deiner Tabelle wäre am einfachsten:

U E1.0
= A1.0

Warum benötige ich das U vor dem E1?
Muss ich das schreiben, oder kann ich auch schreiben:
E1.0
=A1.0
 
Für eine "ErstVerknüpfung" benutzt man die gleiche Schreibweise wie für die folgenden Verknüpfungen.
Hat für den Interpreter/Compiler den Vorteil, das er nicht so viele verschiedene OP-Codes unterscheiden muss.
Es gab mal S5-CPUs, bei denen musste die ErstVerknüpfung immer U oder UN lauten, egal, ob's im Rahmen einer UND- oder ODER-Verknüpfung stand.
O bzw. ON konnte man zwar schreiben … und sich dann einen Wolf suchen, warum die CPU "falsch" gerechnet hat.
Bei heutigen CPUs kann man also bei der ErstVerknüpfung U oder O oder X schreiben, wenn das Bit nicht negiert werden soll oder UN oder ON oder XN, wenn das Bit negiert werden soll.
Ganz egal, die ErstVerknüpfung bildet nur das VKE. Erst die nächste Verknüpfung sagt, ob über UND oder ODER oder XOR verknüpft wird.

PS:
Je mehr verschiedene OP-Codes es gibt, desto lääänger werden die OP-Codes. Darum gibt es auch Befehle, die 1 oder 2 oder 3 Worte belegen. Es soll nicht mehr Speicher mit unnötig langen BefehlsCodes verschwendet werden. Du weisst doch: Wir müssen sparen, koste es, was es wolle!!! ;o)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
So ist es!
Nur E1.0 wäre nur der Operand, mit dem etwas gemacht werden soll. Da fehlt noch der Operator (U, O, X, UN, ON, XN), der sagt, was damit gemacht werden soll.
Man könnte für die ErstVerknüpfung eine spezielle Codierung ausgucken, aber tut es nicht, sondern benutzt die "üblichen" Operatoren, die aber nichts aussagen über UND oder ODER oder XOR, sondern lediglich, ob das Bit negiert wird (mit N) bzw. nicht negiert wird (ohne N).
 
Zuletzt bearbeitet:
Hätte noch eine kleine Frage :) : Wie ist das mit der Stärke der Verknüpfungen?

Code:
UA 1.1
UNE 1.2
O
UNA 1.1
UE 1.2
SA 2.1

Gleich wie?:
O(
UA 1.1
UNE 1.2
)
O(
UNA 1.1
UE 1.2
)
SA 2.1

oder?
UA 1.1
U(
ONE 1.2
ONA 1.1
)
UE 1.2
SA 2.1
 
Die beiden ersten sind gleich. Die Klammern werden erst interessant, wenn Du mehr als 1 Klammer-Ebene verwendest.
X A 1.1
X E 1.2
SA 2.1
könnte man stattdessen schreiben, weil das Ergebnis 1 ist, wenn beide "Eingänge" der Verknüpfung unterschiedlich sind.

Bei der dritten Variante muss ich ja schon überlegen, was die macht.
(/E1.2 + /A1.1) * E1.2 * A1.1
Da kommt immer 0 heraus!!! Wenn E1.2 und A1.1 1 sind, liefert die ODER-Verknüpfung eine 0.
stellt also eine andere Verknüpfung dar … eine ziemlich nutzlose.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie wäre es hier?


Code:
OE 1.1
OE 1.2
U
OE 1.3
OE 1.4

Würde das heißen:
(E1.1 oder E1.2) und (E1.3 oder E1.4)

d.h. es würde dem hier entsprechen:
Code:
U(
OE 1.1
OE 1.2
)
U(
OE1.3
OE 1.4
)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was wäre dann:

Code:
OE 1.0
UE 1.1
UE 1.2
OE 1.3

Die ersten drei Zeilen würden ja bedeuten E1.0 und E1.1 und 1.2.
Würde das dann bedeuten:
1. Entweder müssen alle drei Eingänge 1.0, 1.1, 1.2 oder Eingang 1.3 auf high sein
2. Oder geht das auch nicht und ich müsste anstelle dessen für die in 1. beschriebene Funktion schreiben:
Code:
O(
OE1.0      --oder muss hier dann ein UE stehen?
UE1.1
UE1.2
)
OE1.3
 
OE 1.0
UE 1.1
UE 1.2
OE 1.3

ist identisch mit

UE 1.0 <===<<< bei der "ErstVerknüpfung" ist es heutzutage "wurscht", aber weniger verwirrend liest sich U E 1.0
UE 1.1
UE 1.2
OE 1.3

Die Schreibweise mit Klammern ist auch OK, aber hier nicht nötig.
Das Ergebnis der UND-Verknüpfungen wird über ODER mit E 1.3 verknüpft, weil die Befehle von oben nach unten abgearbeitet werden, solange man nicht durch Klammern oder das alleinstehende O (ohne Operand) etwas anderes bewirkt.
Ist also "Geschmackssache".
 
Zuletzt bearbeitet:
… 1. Entweder müssen alle drei Eingänge 1.0, 1.1, 1.2 oder Eingang 1.3 auf high sein …
Das habe ich ja glatt überlesen:
Entweder-Oder ist etwas anderes als Oder!!! … und beschreibt nicht das, was Du in AWL formuliert hast.
Oder, auch Inklusiv-Oder genannt:
A B | C
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1
Entweder-Oder, auch Exklusiv-Oder bzw. Antivalenz bzw. XOR genannt:
A B | C
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 0

PS:
"inklusiv": schliesst den Fall ein, dass alle Eingänge 1-Signal haben.
"exklusiv": schliesst den Fall aus, dass alle Eingänge 1-Signal haben, insofern das Ergebnis nicht 1 sondern 0 ist.

PPS:
UND-, ODER-, NAND- sowie NOR-Verknüpfungen sind auch mit mehr als zwei Eingängen "harmlos" bzw. eindeutig.
Bei XOR bzw. XNOR (Äquivalenz) finde ich, sollte man genau definieren, was man meint, wenn man mehr als zwei Eingänge über XOR bzw. XNOR verknüpfen will! Missverständnisse sind sonst vorprogrammiert!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das habe ich ja glatt überlesen:

Und ich habe mich falsch ausgedrückt. Ich meinte das ganz normale Oder (also auch beide können 1 sein).
-----------------------------------------------

So ganz klar scheint mir das mit der Auswertelogik noch nicht zu sein.
Wie geht die SPS denn beim Auserten vor?

Habe folgendes gelesen:
- Bei gleichen Operanden erfolgt die Verrechnung von oben nach unten
Bsp:
Code:
UE 1.0
UE 1.1
UE 1.2
Würde bedeuten, dass zunächst E1.0 und E1.1 miteinander verrechnet werden. Das Ergebnis wird dann mit E1.2 verrechnet.

- Wenn keine Klammern gesetzt sind, haben U Vorrang vor O
Bsp.:
Code:
OE 1.0
UE 1.1
UE 1.2
Würde bedeuten, dass erst E1.1 und E1.2 verrechnet werden. Das Ergebnis daraus wird dann mit E1.0 verrechnet.

- Du meintest wenn ein O alleinesteht, dann wird das am Ende ausgeführt
Bsp:
Code:
UE 1.0
UE 1.1
O
UE 1.2
UE 1.3
Würde bedeuten, dass erst E1.0 und E1.1 verrechent werden. Dann werden E1.2 und E1.3 miteinadner verrechnet. Dann werden die Ergebnisse der vorherigen 2 Verrechnungen miteinander verrechnet.

- Das was in Klammern steht wird zuerst berechnet. D.h. je weiter Verschachtelt ein Ausdruck seht, deso früher wird er verrechnet
Bsp:
Code:
U(
OE 1.0
OE 1.1
O(
UE 1.4
UE 1.5
)
)
U(
OE 1.2
OE 1.3
)
Würde bedeuten:
1. E 1.4 wird mit E 1.5 verrechnet.
2. E 1.0 wird mit E 1.1 verrechnet.
3. Das Ergebnis von 2 wird mit dem Ergebnis von 1 verrechnet.
4. E1.2 wird mit E 1.3 verrechnet.
5. Das Ergebnis von 3 wird mit dem Ergebnis von 4 verrechnet.


Jetzt hoffe ich, dass meine Überlegungen so passen :)

P.S. Danke übrigens für deine bisherige Unterstützung
 
Zuletzt bearbeitet:
Es wird immer von oben nach unten berechnet aBär, wenn "O-mit-ohne-Operand" bzw. Klammern "dazwischenfunken", dann wird das VKE (VerknüpfungsErgebnis) auf einem Stack (LiFo) geparkt und mit einer "getürkten" ErstVerknüpfung weitergerechnet bzw. es wird ein im Stack geparktes VKE mit dem "eigentlichen" VKE verknüpft.
Klingt kompliziert und muss man nicht wirklich verstehen - Hauptsache, die CPU macht es richtig ;o)
Richtig gut zu lesen ist ein AWL-Programm für meinen Geschmack nicht, wenn "zuviel" von Klammern Gebrauch gemacht wird. Das kann zum Glück aber die CPU sehr zuverlässig.

Du schreibst "Wenn keine Klammern gesetzt sind, haben U Vorrang vor O" … oh nein!!! Eben nicht. Genau das ist wahrscheinlich ein Bisschen gewöhnungsbedürftig.

Du schreibst "Das was in Klammern steht wird zuerst berechnet. D.h. je weiter Verschachtelt ein Ausdruck seht, desto früher wird er verrechnet".
Nicht wirklich. Das wird über einen VKE-Stack geregelt - wie oben angedeutet - aber im Endeffekt ist die Wirkung genau so, wie man es erwartet.

Das darfst Du als "BlackBox" betrachten, deren "Innereien" man nicht kennen muss.
Aber Du scheinst an diesem Thema sehr interessiert ... dann könntest Du Dir eine eigene "BlackBox" überlegen … nur so, als kleine TüftelAufgabe.
Frohes Gelingen ;o)

Gruss, Heinileini

PS:
Was ich beschrieben habe, gilt mit Sicherheit für eine Abarbeitung des AWL-Programms per Interpreter.
Ob und inwieweit heute bzw. zukünftig ein AWL-Programm per Compiler verwurstet wird, kann ich Dir nicht verraten. Dann wäre es schon denkbar, zuerst das am tiefsten Geschachtelte zu berechnen … (?) … und auch, eine Berechnung abzubrechen, sobald klar ist, dass die restlichen Terme das Ergebnis nicht mehr verändern können.
 
Zuletzt bearbeitet:
Ok.

Es ist mir igendwie noch nicht ganz klar, wie ich eine Ausdruck ohne Klammern und mit mehreren verschiedenen Operatoren deuten soll.
z.B.
Code:
UE 1.0
UE 1.1
UE 1.2
=A 1.1
-->Wenn alle Eingänge True sind, ist der Ausgang Ture sonst False
Code:
OE 1.0
UE 1.1
UE 1.2
=A 1.1  
--> genau gleich wie erstes Beispiel, das der Operand des ersten Verknüpfungs-Ausdruckes nicht berücksichtigt wird
Code:
UE 1.0
UE 1.1
OE 1.2
OE 1.3
= A 1.1
--> ich habe keine Ahnung was dabei nun herauskommt :/
 
Zurück
Oben