TIA Bit Maskierung AWL in SCL

SalvatoreDC

Level-2
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen, ich habe ein Netzwerk für jeden Schieber und diese Netzwerk sieht so aus:

Schieber1
Screenshot 2025-01-27 101620.png
Schieber2

Screenshot 2025-01-27 101641.png


und so weiter, ich würde gerne eine For loop in scl änlich wie diese AWL funktion schreiben die quasi anstatt ein netzwerk pro Schieber, alles in einzige SCL netzwerk macht, beziehungsweise durch Array and For Schleife. Gibt es irgendwo tutorial oder kann mir jemanden das besser erklären?

Ich habe zu eine KI diese frage gestellt und kam diese Pseudo-Source-Code raus

C++:
// Variablendeklarationen

// Eingangsarray (Schieber-Eingänge)
// Annahme: Die Eingänge sind in einem Byte-Array gespeichert
// Z.B. IB0, IB1, IB2... IB13
// Datentyp und Adresse ggf. anpassen
BYTE Schieber_Inputs[14] AT %IB0;

// Ausgangsarray (Schieber-Ausgänge)
// Annahme: Die Ausgänge sind in einem Byte-Array gespeichert
// Z.B. QB0, QB1, QB2... QB13
// Datentyp und Adresse ggf. anpassen
BYTE Schieber_Outputs[14] AT %QB0;

// Temporäre Variable für den Schleifenindex
INT i;

// Start des Codeblocks
BEGIN
  // FOR-Schleife zur Iteration durch alle Schieber
  FOR i := 0 TO 13 DO
    // Logik für jeden Schieber
    // Entspricht deinem AWL-Code

    // Lade den Eingang des aktuellen Schiebers
    // Entspricht L #IB_Schieber1_16
    // In AWL hättest du #IB_Schieber2_16, #IB_Schieber3_16 usw.
    // Hier verwenden wir den Index 'i', um auf das richtige Array-Element zuzugreifen
    IF Schieber_Inputs[i] = 16#01 THEN // Entspricht L BYTE#16#01 und AW sb1 und JZ

      // Wenn der Eingang 1 ist, setze den Ausgang auf 1
      // Entspricht L #0_Schieber1_16 und L BYTE#16#01 und OW und T
      Schieber_Outputs[i] := 16#01;
    ELSE

      // Andernfalls setze den Ausgang auf FE
      // Entspricht sb1: L #O_Schieber1_16 und L BYTE#16#FE und AW und T
      Schieber_Outputs[i] := 16#FE;
    END_IF;
  END_FOR;
END_FUNCTION_BLOCK






 
Was ich zunehmend nicht so ideal finde, ist das man keine ordentliche Aufgabenbeschreibung macht.
Mir fällt das immer mehr auf.Fangt doch bitte erst mal an zu formulieren was die Aufgabe ist und dann sehen wir weiter.
Viele der hier gestellten Aufgaben führen in die falsche Richtung, weil man gar nicht genau weiss, was der TN will.
 
Wenn man Code von einer Programmiersprache in eine andere Sprachen konvertieren will, dann sollte man beide Programmiersprachen gut beherrschen und nicht ahnungslos eine KI fragen ...
Analysiere den vorhandenen Code, was er sinngemäß macht, ent-kompliziere ihn und formuliere in SCL neu.

Wie sind IB_Schieber1_16 und O_Schieber1_16 deklariert? BYTE?

Wenn ich den von dir nicht gezeigten Code der restlichen Netzwerke richtig vermute, dann braucht man keine Schleife, sondern kann alle 8 Bits auf einmal verarbeiten:
Code:
      L 0
      A #I_Schieber1_16
      A #FRG_Ventile
      JCN sbx

      L #IB_Schieber1_16
sbx:  T #O_Schieber1_16
oder in SCL
Code:
IF #I_Schieber1_16 AND #T_FRG_Ventile THEN
  #O_Schieber1_16 := #IB_Schieber1_16;
ELSE
  #O_Schieber1_16 := 0;
END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie sind IB_Schieber1_16 und O_Schieber1_16 deklariert? BYTE?
jo, das verwirrt, irgendwie suggeriert das ganze 16 verschiedene Schieber, passt dann aber nicht zum Byte.

Und irgendwie nicht klar, warum das ganze in AWL so kompliziert für jeden Schieber separat gemacht wurde 🤔
 
Und irgendwie nicht klar, warum das ganze in AWL so kompliziert für jeden Schieber separat gemacht wurde 🤔
Vielleicht wie das häufige kompliziert Denken IF Bool1 = 1 THEN Bool2 := 1; ELSE Bool2 := 0; hat der original Programmierer vielleicht gedacht "wenn das Eingangsbit 1 ist, dann soll das Ausgangsbit auch 1 werden, sonst 0" und es ist ihm nicht eingefallen, dass der Zustand einfach direkt übertragen werden kann (wie = anstatt S/R) oder er hat nicht gewusst wie, weil er auch noch jedes Bit für sich betrachtet hat, dessen Manipulation die anderen Bits nicht beeinflussen soll?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin jetzt nicht ganz dahinter gekommen, was du machen willst, abe eine einfache Bitmaskierung kannst du in scl so machen:

Code:
xBool := bByte and 16#01;

Wenn du jetzt noch die "16#1" durch eine Variable vom Typ Byte ersetzt, könntest du das bit in selbigen Byte über einen schiebebefehl verschieben.
 
Vielleicht wie das häufige kompliziert Denken IF Bool1 = 1 THEN Bool2 := 1; ELSE Bool2 := 0; hat der original Programmierer vielleicht gedacht "wenn das Eingangsbit 1 ist, dann soll das Ausgangsbit auch 1 werden, sonst 0" und es ist ihm nicht eingefallen, dass der Zustand einfach direkt übertragen werden kann (wie = anstatt S/R) oder er hat nicht gewusst wie, weil er auch noch jedes Bit für sich betrachtet hat, dessen Manipulation die anderen Bits nicht beeinflussen soll?
Ja.
Vermutlich war das auch eher ein Hochsprachenprogrammierer ;) zumindest sieht man diese Art von Ausmaskierung eher im HMI in C oder VBS...
Der klassische SPS-Programmierer hätte vermutlich eher absolut adressiert auf die einzelnen Bits zugegriffen, wenn ihm schon keine schöne symbolische Art eingefallen wäre ;)

Hat der TE irgendwo geschrieben, was das für ne SPS ist? 300/400 oder 1500?
 
Ich bin jetzt nicht ganz dahinter gekommen, was du machen willst,
er hat ein Byte, wo die Ansteuerung für 8 Schieber drinstehen. Das will er auf ein Ausgangsbyte rangieren. Wenn ein zusätzliches Freigabebit sowie ein zusätzlicher DI nicht true sind, sollen alle Schieber zu bleiben...
abe eine einfache Bitmaskierung kannst du in scl so machen:
Code:
xBool := bByte and 16#01;
Da gibt es aber mehrere schönere Varianten, um an ein Bit in einem Byte dranzukommen... z.B. AT-Sicht, geht bei jedem SPS-Typ in SCL.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da gibt es aber mehrere schönere Varianten, um an ein Bit in einem Byte dranzukommen... z.B. AT-Sicht, geht bei jedem SPS-Typ in SCL
Die habe ich bisher noch nie verwendet :LOL:
Wird wohl mal Zeit dafür..
Bisher ich das meistens über den Slice Zugriff gelöst.
 
Zuletzt bearbeitet:
Danke an alle für die Antworten. Ich versuche mehr Informationen raus zu geben und dazwischen habe den Code modifiziert weil ich 14 Schieber habe und in ein Byte kann ich nur 8 "maskieren".

Neue Screen:

Screenshot 2025-01-28 095327.png

In dem Fall habe ich ein Word verwendet dadurch kann ich bis 16 Schieber maskieren, und jetzt zu den Variabel-Typen die wurden so deklariert:

#I_Schieber1_16 = Bool; #IW_Schieber1_16 = Word; #O_Schieber1_16 Word;

Ich habe mit AWL nie gearbeitet und bin ziemlich neue mit TIA und SPS welt. Meine frage war nicht sauber formuliert, ich würde gerne wissen wie kann ich das gleiche in SCL realisieren und ob man maskierung auch in FUP irgendwie machen kann? Und würde gerne jede Art von Empfehlungen und Typ annehmen. Danke im Voraus :D
 
Zuletzt bearbeitet:
er hat ein Byte, wo die Ansteuerung für 8 Schieber drinstehen. Das will er auf ein Ausgangsbyte rangieren. Wenn ein zusätzliches Freigabebit sowie ein zusätzlicher DI nicht true sind, sollen alle Schieber zu bleiben...

Da gibt es aber mehrere schönere Varianten, um an ein Bit in einem Byte dranzukommen... z.B. AT-Sicht, geht bei jedem SPS-Typ in SCL.

Du hast ganz genau verstanden was ich wollte, danke für deine Antwort. Was ist mit AT-Sicht gemeint?
Sieht aus als es wäre ein bessere variante mit AT zu arbeiten.
 

Anhänge

  • 2.png
    2.png
    77,4 KB · Aufrufe: 27
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Auch bei "Word" bleibe ich bei meinem Lösungsvorschlag (fast der einzige Beitrag, der von dir kein Danke erhalten hat - hast du den Beitrag gesehen und gelesen und verstanden?):
Wenn ich den von dir nicht gezeigten Code der restlichen Netzwerke richtig vermute, dann braucht man keine Schleife, sondern kann alle 8 Bits auf einmal verarbeiten:
Code:
      L 0
      A #I_Schieber1_16
      A #FRG_Ventile
      JCN sbx

      L #IB_Schieber1_16
sbx:  T #O_Schieber1_16
oder in SCL
Code:
IF #I_Schieber1_16 AND #T_FRG_Ventile THEN
  #O_Schieber1_16 := #IB_Schieber1_16;
ELSE
  #O_Schieber1_16 := 0;
END_IF;
Das funktioniert auch mit WORD (16 Bit gleichzeitig) und DWORD (32 Bit gleichzeitig).
 
#I_Schieber1_16 = Bool; #IW_Schieber1_16 = Word; #O_Schieber1_16 Word;
Versuch bitte, konsistent zu bleiben. IW_Schieber1_16 ist ein Word, aber O_Schieber1_16 auch, I_Schieber1_16 nicht...

Zum Thema AT-Sicht findest du bestimmt einiges auf den Siemens-Support-Seiten.

Im Prinzip definierst du eine Variable in deiner Funktion (meinetwegen vom Typ Word) und überlagerst sie mit einer anderen Variable von einem anderen Datentyp (beispielsweise Array[0..15] of Bool). Dann kannst du die Variable über beide Datentypen ansprechen, was deine Werkzeugpalette für dieses Datum erweitert. Du könntest eine Word-Verknüpfung benutzen, oder das Array mit einer Schleife bearbeiten, aber der Wert in der Variable ist immer der gleiche.

Grundlegend lässt sich alles mit unterschiedlicher Kompliexität in allen Programmiersprachen ausführen. Aber hier gilt wie überall, dass jedes Werkzeug einen anderen Anwendungsfall abdeckt. Du kannst das also bestimmt in FUP machen, aber der erste Schritt zur Umsetzung ist ein klar definiertes Problem (sprich: Aufgabenstellung)
 
Auch bei "Word" bleibe ich bei meinem Lösungsvorschlag (fast der einzige Beitrag, der von dir kein Danke erhalten hat - hast du den Beitrag gesehen und gelesen und verstanden?):

Das funktioniert auch mit WORD (16 Bit gleichzeitig) und DWORD (32 Bit gleichzeitig).

Super! Vielen Dank. Ich bin gerade am Lesen und Testen. Ich habe nicht gerechnet dass so viele Leuten bereit zu helfen waren.
Danke an alle.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wird hier gezeigt. Das mit der AT Sicht wird hier gezeigt


Mfg Hannes
 
Ich finde, AT-Sicht und Slice sind bei dieser Aufgabe hier nicht nötig. Und wenn es denn trotzdem unbedingt aufwendig mit einer Schleife gelöst werden soll, dann braucht man Arrays (wir wollen doch nicht mehr mit Pointern im Speicher rumstochern ;) ).

Nicht ganz unwichtige, aber bisher fehlende Grund-Angabe: Mit welcher CPU soll das funktionieren? Welche CPU hast du?
 
Das
Ich finde, AT-Sicht und Slice sind bei dieser Aufgabe hier nicht nötig. Und wenn es denn trotzdem unbedingt aufwendig mit einer Schleife gelöst werden soll, dann braucht man Arrays (wir wollen doch nicht mehr mit Pointern im Speicher rumstochern ;) ).

Nicht ganz unwichtige, aber bisher fehlende Grund-Angabe: Mit welcher CPU soll das funktionieren? Welche CPU hast du?

Das Projekt hat ein CPU 1510-SP1-pn. Die Maschine ist ein Betonverteiler mit 14 Schieber die einzelnen gesteuert werden können und den Code stamm aus den FB für die Hydraulikfunktion.

Bitmaskierung wird verwendet und die Speicher Adresse für Bitmaskierung abzufragen. Das heißt für jeden Schieber den Netzwerk sieht so aus:

3.png

Das heißt dass ich insgesamt 14 Netzwerke habe und mein Ziel wäre beziehungsweise würde gerne wissen ob ein besserer, Kompakter und schöner Variant gibt und das gleiche in ein einzige Netzwerk zu machen, deswegen habe gefragt wie kann mann irgendwie durch for-loop and array das gleiche machen. Komm auf Hochsprachige Programmiersprache und habe das gleiche in C++ realisiert, kann aber in Tia nicht das gleiche durch For-loop and Array realisieren.
 
Zurück
Oben