Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Bitnummer in DB (SCL)

  1. #1
    Registriert seit
    08.08.2007
    Ort
    Süd-Süd-Deutschland (CH)
    Beiträge
    220
    Danke
    29
    Erhielt 27 Danke für 21 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen.
    Ich bin dabei, einen SCL-FC zu erstellen, mit einem Bit als Eingangsparameter.
    Dieses Bit ist immer Teil eines Arrays. Nun sollte ich im FC den Arrayindex davon wissen.

    Wenn ich also DBXY.ArrayXY[25] am FC verknüpfe, brauche ich IM(!!) FC die 25 als zBsp. Integer.
    Wobei das ArrayXY vom Typ Bool ist.

    Da das Array immer am Anfang eines DB's liegt, könnte ich das Bit als Pointer einlesen.
    Denn die Bitnummer entspricht dabei immer dem Arrayindex da das Array von 0 - n geht.


    Aus diesem Faden habe ich folgende Lösung:

    http://www.sps-forum.de/simatic/2451...-kein-any.html

    Code:
    FUNCTION FC333 : void
    
    
    
    VAR_INPUT
       Zeiger1 : POINTER;
        _Zeiger1 AT Zeiger1 : STRUCT
            DBNr: WORD;
            Adr: DWORD;
        END_STRUCT;
    END_VAR
    
    
    
          ;
    END_FUNCTION
    Wie da auch steht, ist diese Deklaration als Input-Parameter in einem FC nicht möglich.

    Ach übrigens, im AWL haben wir das so gemacht:
    (ArrayBit ist ein InOut-Parameter vom Typ Pointer)
    Code:
          L     P##ArrayBit
          LAR1 
          L     W [AR1,P#0.0]
          T     #DB_NR
     
          L     D [AR1,P#2.0]
          L     DW#16#FFFFFF
          UD   
          T     #INDEX
    Und es muss ein FC sein. Hat jemand sowas ähnliches schon realisiert?
    Ich hab auch daran gedacht einen reinen Pointer als Input-Parameter und einen als Tempvariable mit der Struktur
    aber auch das frisst er mir nicht.

    Im FB gehts. Der FC mag mich nicht

    Bin für alle Ideen dankbar.

    Liebe Grüsse
    "Hätte ich das gewusst, hätte ich einen anderen Beruf gelernt." - "Hast Du gelernt diese Scheisse?"
    (Zitat aus Knockin' on Heaven's Door)

    "Kommentare? Wieso? Steht doch alles im Code..!"

    Avatar erstellt auf www.sp-studio.de
    Zitieren Zitieren Bitnummer in DB (SCL)  

  2. #2
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.738
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    Wenn Du dem FC den "DBXY.ArrayXY[25]" oder sonst einen "DBXY.ArrayXY[x]" übergibst, ist Dir doch zu diesem Zeitpunkt die Indexnummer 25 oder x bereits bekannt, sonst könntest Du den Arrayeintrag ja nicht übergeben.

    Warum also übergibst Du die Indexnummer dann nicht einfach nochmal separat, wenn Du sie im FC benötigst?

  3. #3
    Avatar von Schnick und Schnack
    Schnick und Schnack ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    08.08.2007
    Ort
    Süd-Süd-Deutschland (CH)
    Beiträge
    220
    Danke
    29
    Erhielt 27 Danke für 21 Beiträge

    Standard

    Hi hucki
    Da geb ich Dir natürlich zu 100% recht. Die Funktionalität wäre so absolut gegeben. Das ist nicht das Problem.
    Es ist halt nicht die schönste Lösung. Ich möchte diesen einen Eingang mit dem Index noch sparen.
    Ich habe ihn ja im Bit schon drin also ist es unnötig ihn nochmals manuell zu vergeben. Das muss einfach gehen.
    Wie gesagt, manuell vergeben funktioniert, aber widerstrebt mir etwas. Auch weil der FC duzende Male pro Anlage verwendet wird.

    Trotzdem Danke

    Gruss
    "Hätte ich das gewusst, hätte ich einen anderen Beruf gelernt." - "Hast Du gelernt diese Scheisse?"
    (Zitat aus Knockin' on Heaven's Door)

    "Kommentare? Wieso? Steht doch alles im Code..!"

    Avatar erstellt auf www.sp-studio.de

  4. #4
    Registriert seit
    06.10.2003
    Beiträge
    3.445
    Danke
    453
    Erhielt 509 Danke für 411 Beiträge

    Standard

    Zitat Zitat von Schnick und Schnack Beitrag anzeigen
    ..Wenn ich also DBXY.ArrayXY[25] am FC verknüpfe..
    Was willst du denn nun eigentlich übergeben? Ein Bit (z.Bsp. aus einem ARRAY), ein ARRAY oder einen Pointer? In SCL oder in AWL?
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  5. #5
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.738
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    Zitat Zitat von Schnick und Schnack Beitrag anzeigen
    Es ist halt nicht die schönste Lösung. Ich möchte diesen einen Eingang mit dem Index noch sparen.
    Ich habe ihn ja im Bit schon drin
    Wenn Du nur das Bit übergibst, ist der Index nicht mit drin.



    Zitat Zitat von Schnick und Schnack Beitrag anzeigen
    könnte ich das Bit als Pointer einlesen.

    Und das ist dann schöner und weniger umständlich als ein Bit und ein Int-Wert?
    Ich glaub' da gehen unsere Ansichten auseinander. Vor allem dann, wenn das später mal jemand anderes (z.B. Instandhalter) verstehen muss.

    Aber das ist Deine Entscheidung.

  6. #6
    Avatar von Schnick und Schnack
    Schnick und Schnack ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    08.08.2007
    Ort
    Süd-Süd-Deutschland (CH)
    Beiträge
    220
    Danke
    29
    Erhielt 27 Danke für 21 Beiträge

    Standard

    Nochmals. Es ist ein FC geschrieben in SCL.
    Dieser FC bearbeitet Mehrere Arrays. Diese Arrays sind alle gleich dimensioniert. In der Regel 1-512.
    Gehen wir also davon aus, wir haben 3 Arrays, jeweils 1-512, 1 mal Bool, 1 mal Real, 1 x Integer.

    Ein FC bearbeitet immer die drei Variabeln mit dem selben Index, also zBsp ArrayXYBool[34], ArrayXYReal[34] und ArrayXYInteger[34].
    Dem FC muss ich dafür jeweils den Index angeben. Also gibts für jeden verwendeten Index einen FC-Aufruf.
    Wie Hucki nun schon angemerkt hat, könnte ich dem FC einen INT als Input-Parameter geben und ihn einfach von aussen mit dem Index beschalten.
    Funktioniert garantiert.

    So, nun kann es sein, dass ich auf Inbetriebnahme oder Störungsbehebung den FC-Aufruf für den Index 34 suche. Ich weiss gerade nicht in welchem Baustein dieser Aufruf programmiert ist. Dann müsste ich eine Klartextsuche nach 34 machen.

    Nun die Idee. Da das Array mit den Bits immer am Anfang vom DB steht, ist der Index immer Bitposition im DB + 1.
    Bit 0.0 entspr. Bitposition 0 entspr. Index 1
    Bit 0.1 entspr. Bitposition 1 entspr. Index 2
    usw.

    Wenn ich nun also als Input-Parameter einen Pointer verwende, und aussen am FC das Bit aus dem Array anlege, erhalte ich durch den Pointer
    die Bitposition und somit den Index. Nur ist mir noch nicht ganz klar, wie ich in SCL mit dem Pointer dann umgehen kann. Wie wir das früher in AWL gemacht haben, habe ich ja als Beispiel angefügt. Wie es in einem FB geht, ist mir auch klar, aber der FC hat da so seine eigenen Bestimmungen und das ist mir nicht ganz klar und deshalb frage ich.

    Das es mit dem Index einfacher ist, ist mir schon auch klar, aber was du sagst, stimmt nicht ganz. Gerade das Bit aus dem Array wird immermal wieder im Programm verwendet. Nehmen wir an im FBZZZ. Nun möchte ich im FBZZZ wissen wo der angesprochene FC-Aufruf für das Bit ArrayXYBool[34] ist, das kann ich dann mit einem Querverweis machen. Ist also Prinzipiell für den Instandhalter noch einfacher als nach Klartext 34 zu suchen.
    "Hätte ich das gewusst, hätte ich einen anderen Beruf gelernt." - "Hast Du gelernt diese Scheisse?"
    (Zitat aus Knockin' on Heaven's Door)

    "Kommentare? Wieso? Steht doch alles im Code..!"

    Avatar erstellt auf www.sp-studio.de

  7. #7
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.642
    Danke
    787
    Erhielt 654 Danke für 497 Beiträge

    Standard

    Dein AWL Beispiel gibt dir aber auch nicht die indexnummer im Array aus oder? Das ist doch eher Zufall dass es grad passt.
    Häng da mal ein zweites Array des DB an und überprüf den Index.

    Edit: sorry letztes Post nicht gesehen. Wenn das Array immer am Anfang ist, funktioniert das natürlich. Aber brrr!
    Geändert von vollmi (31.10.2014 um 09:01 Uhr)

  8. #8
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.308
    Danke
    932
    Erhielt 3.321 Danke für 2.683 Beiträge

    Standard

    Du könntest das Bit inklusive Index als ANY übergeben.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  9. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.792
    Danke
    398
    Erhielt 2.416 Danke für 2.012 Beiträge

    Standard

    Zitat Zitat von Schnick und Schnack Beitrag anzeigen
    Ach übrigens, im AWL haben wir das so gemacht:
    (ArrayBit ist ein InOut-Parameter vom Typ Pointer)
    Hallo,
    wenn du es in AWL mit einem INOUT machst - warum dann in SCL nicht auch ?
    Ich kann das gerade nicht testen - könnte mir aber vorstellen, dass es dann geht (mit der AT-Sicht und der Auflösung davon).

    Gruß
    Larry

  10. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Schnick und Schnack (31.10.2014)

  11. #10
    Registriert seit
    06.10.2003
    Beiträge
    3.445
    Danke
    453
    Erhielt 509 Danke für 411 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich glaube, ich habe das Anliegen verstanden. Hier mal ein Beispiel dazu. Die Typprüfung ist natürlich optional.

    Code:
    VAR_INPUT
      DEIN_BIT                          : ANY;                          // Bit als ANY übergeben
    END_VAR
    
    VAR_TEMP
      ANY_DEIN_BIT                      : ANY;
      X AT ANY_DEIN_BIT:
        STRUCT
          ID                            : BYTE;
          TYP                           : BYTE;
          ANZAHL_TYP                    : INT;
          DB_NR                         : WORD;
          ZEIGER                        : DWORD;
        END_STRUCT;
      BIT_INDEX                         : DINT;
      BYTE_INDEX                        : INT;
    END_VAR
    
    
    BEGIN
    
       ANY_DEIN_BIT := DEIN_BIT;
       IF SHR(IN:=X.ZEIGER, N:=24) <> 2#10000100 OR          // kein DB
          X.TYP <> 16#01                                     // Typ nicht BOOL
          THEN RETURN;
       END_IF;
    
       BIT_INDEX  := DWORD_TO_DINT(X.ZEIGER AND 16#0FFF);
       BYTE_INDEX := WORD_TO_INT(DWORD_TO_WORD(SHR(IN:=X.ZEIGER, N:=3)) AND 16#0FFF);
    
    END_FUNCTION
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  12. Folgender Benutzer sagt Danke zu Onkel Dagobert für den nützlichen Beitrag:

    Schnick und Schnack (31.10.2014)

Ähnliche Themen

  1. WinCC flexible Bitmeldungen-Bitnummer
    Von nocind im Forum HMI
    Antworten: 7
    Letzter Beitrag: 23.10.2014, 16:51
  2. Antworten: 5
    Letzter Beitrag: 24.02.2012, 16:57
  3. Bitnummer zu groß
    Von Flacla im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 08.09.2011, 13:10
  4. Bitnummer aus Datenbaustein schreiben
    Von amigo del sol im Forum HMI
    Antworten: 5
    Letzter Beitrag: 16.08.2011, 09:25
  5. Antworten: 4
    Letzter Beitrag: 07.10.2006, 00:34

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •