TIA SCL in einer Schleife Bitweise ein Byte abfragen

mnuesser

Level-1
Beiträge
1.022
Reaktionspunkte
165
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Zusammen,

ich muß ja, gezwungen durch meine Kunden, meine Programme in der Regel in FUP oder KOP
schreiben. Jetzt habe ich mal ein Problem, wo ich dachte da wäre die Verwendung von SCL ideal,
aber so einfach wie ich mir das dachte ist es wohl nicht.

Generell geht es darum:

Ich habe einen FB, welcher eine Konfiguration als DINT einliest, und diese Konfiguration mit einem Doppelwort
Eingänge vergleicht. Dabei muss aber über die Konfiguration nur die Eingänge ausgewertet werden die auch angewählt sind.

Das sieht in KOP dann so aus:

Sensorauswertung_einzeln.jpg

Ich habe das Netzwerk auch schon mal nach SCL umgesetzt.

Jetzt könnte ich das ganze natürlich noch 7 mal kopieren und wäre dann durch,
ich dachte eine Schleife wäre da aber sinnvoller. (Das ganze muss am Ende für 64 Eingänge gemacht werden, 7 ist jetzt nur zur Vereinfachung)


Sensorauswertung_schleife.jpg

Irgendwie war ich der Meinung ist könnte jetzt die #i an an meine Variablen packen, und spare mir das ganze getippe....
Funktioniert aber nicht. Hat jemand eine Idee was ich da jetzt machen müsste?
 
Zuerst mal Off-Topic ein paar Dinge zu Logik in SCL - weil hier brennt meiner Ansicht nach der HUT.

1. Boolsche Logik:
Code:
(A AND B) OR (NOT A)
// entspricht
(B OR (NOT A))

2. IF-Statements
In SCL IF-Statements (und das ist in allen Hochsprachen so) wird niemals auf = true oder = false abgefragt
Code:
//Böse:
IF (A = true) THEN
//Gut:
IF (A) THEN

//Böse:
IF (A = false) THEN
//Gut:
IF (NOT A) THEN

3. IF ... THEN ohne ELSE
Dies ist in KOP/FUP-Notation vergleichbar mit einer S-Verknüpfung.
Code:
IF (A AND B) OR (NOT A) THEN
  C := true;
END_IF;
endet mit darin, dass C immer true sein wird. Entweder initialisierst du den Speicher, wo C drinne steht mit 0, oder
a. du hängst ein ELSE an
Code:
IF (A AND B) OR (NOT A) THEN
  C := true;
ELSE
  C := false;
END_IF;
b. du machst eine echte Logik-Verknüpfung in SCL
Code:
C := (A AND B) OR (NOT A);
oder kürzer
Code:
C := B OR (NOT A);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was du eigentlich machen willst, lässt sich Problemlos Doppelwortweise oder Quadwortweise abbilden.

32 Eingänge am Stück

Deklaration:
Code:
Eingaenge : DWORD;
Konfiguration : DINT;
AuswertungKonf1 : DWORD;

Code:
Code:
AuswertungKonf1 := Eingaenge OR (NOT DINT_TO_DWORD(Konfiguration));


Alle 64 Eingänge

Deklaration:
Code:
Eingaenge : LWORD;
Konfiguration : LINT;
AuswertungKonf1 : LWORD;

Code:
Code:
AuswertungKonf1 := Eingaenge OR (NOT LINT_TO_LWORD(Konfiguration));


Diese Wortweise Logik ist obrigens mit KOP oder FUP auch kein Problem, man benötigt 2 Temp-Variablen.
 
Zuletzt bearbeitet:
Anhang anzeigen 44525
Irgendwie war ich der Meinung ist könnte jetzt die #i an an meine Variablen packen, und spare mir das ganze getippe....
Funktioniert aber nicht. Hat jemand eine Idee was ich da jetzt machen müsste?

Vergiss es, indizierter Slice-Zugriff geht nicht!
Du musst deine Variable vorher in ein Bool-Array umkopieren, dann kannst du mit Indizes arbeiten. Oben ist aber schon gezeigt wie es einfacher geht.
 
@Larry: eigentlich hat maxder2te es schon treffend beschrieben:

Vergiss es, indizierter Slice-Zugriff geht nicht!
Du musst deine Variable vorher in ein Bool-Array umkopieren, dann kannst du mit Indizes arbeiten. Oben ist aber schon gezeigt wie es einfacher geht.

Denn genau dass wollte ich machen ;), er hat ja sogar den Weg beschrieben den ich nehmen könnte, wenn ich trotzdem so arbeiten möchte.

Den SCL Code hatte ich nur zur Darstellung meines Problemes geschrieben, dass der nicht ganz richtig war, weil mir das ELSE fehlte hab ich glatt übersehen

Prinzipiell hat max mir mein Problem auch schon vereinfacht gelöst, durch den Wortweisen vergleich den er vorgeschlagen hat
 
Worum es eigentlich geht:
Ich habe in der HMI eine Matrix aufgebaut mit den vorhandenen Eingängen, und dazu eine Matrix zum Auswählen, welche Eingänge für eine Funktion abgefragt werden müssen.
Insgesamt 16 Funktionen und entsprechende Konfigurationen. Es können in den 32 Eingängen auch welche gesetzt sein, die aber nicht konfiguriert sind für diese Funktion, die darf ich dann halt nicht
auswerten. Am Ende kommt ein Summensignal : "Sensoren ok" aus meinem Baustein und damit arbeite ich weiter...
 
Zurück
Oben