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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 25

Thema: Vorstellung und erste Frage Umschalter/Vergleicher 1-Byte-Werte

  1. #11
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.316
    Danke
    932
    Erhielt 3.331 Danke für 2.689 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Dann musst Du halt mit 2 Arrays arbeiten - ein größeres internes für die Zuweisungen und davon kopierst Du dann nur die Member 1 bis 28 in das Ausgangs-Array für den anderen Baustein.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  2. #12
    Registriert seit
    27.02.2014
    Ort
    Oberstenfeld
    Beiträge
    31
    Danke
    7
    Erhielt 2 Danke für 1 Beitrag

    Standard

    Haralds und huckis Vorschläge laufen jetzt beide einwandfrei - zumindest in der Simulation.
    WAGO 750-849 mit 753-646 KNX-TP1-Klemme
    GIRA Homeserver 4

  3. #13
    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 pauly2072 Beitrag anzeigen
    Dass die letzten 4 Stufen beim Verlassen der Treppe alle auf einmal ausgehen, wäre mir bestimmt erst beim Test am lebenden Objekt unangenehm aufgefallen! Das mit der 'virtuellen Timerbegehung' werde ich dann ganz sicher so einbinden.

    Wenn dann alles soweit läuft, träum ich ja schon davon, die Umschaltung von einem Dimmwert auf den anderen nicht abrupt ablaufen zu lassen, sondern fließend über eine art Dimmwert-Rampe.
    Wenn Du eine Dimmwert-Rampe integrierst, kannst Du Dir wahrscheinlich die virtuelle Begehung sparen, da sie ja im Prinzip das Gleiche macht.
    Von 255 auf 0 zu dimmen, dauert schließlich von Haus aus länger, als von 25 auf 0. Somit ist die entferntere Stufe auch eher aus.

    Dafür hast Du dann beim Hochdimmen eventuell ein Problem, wenn es mit dem Begehen der Stufen mithalten muss. Oder dort höhere "Geschwindigkeiten" verwenden.

  4. #14
    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 pauly2072 Beitrag anzeigen
    Haralds und huckis Vorschläge laufen jetzt beide einwandfrei - zumindest in der Simulation.
    Weil's mich und sicher auch andere interessiert - wie sieht denn Deine Umsetzung aus beiden bis dato aus?
    Ist ja sicher nicht 1:1 übernommen.

  5. #15
    Registriert seit
    27.02.2014
    Ort
    Oberstenfeld
    Beiträge
    31
    Danke
    7
    Erhielt 2 Danke für 1 Beitrag

    Standard

    Ja, klar, gerne!

    Ich schick mal voraus, dass sich mir die Variablenklassen VAR_INPUT, VAR_OUTPUT, VAR_IN_OUT noch nicht so ganz erschließen, wann man welche Klassen wie verwendet. Muss ich z.B. eine Variable, die ich in einem Programmbaustein als VAR_OUTPUT deklariere, in einem anderen Programmbaustein, in dem diese Variable verarbeitet werden soll, dort dann nochmals deklarieren und zwar als VAR_INPUT? Warum dann nicht gleich alles als VAR_IN_OUT deklarieren? Oder besser gleich alles als globale Variablen? Dann muss ich nicht beachten, in welchem (auch evtl. künftigen) Programmbaustein welche Variable verwendet werden soll?

    Mir ist schon klar, dass es die diversen Variablenklassen nicht ohne Grund gibt... Hat das damit zu tun, dass wenn ich alles als global deklariere, ich zuviel Speicherplatz verbrate und die Zykluszeit unnötig in die Höhe treibe? So hab ich mirs jedenfalls versucht zu erklären.

    Ich habe jedenfalls im Moment alle Variablen, die auch in anderen Programmbausteinen verwendet werden, als global deklariert, da mir Deklarationen als VAR_INPUT oder VAR_OUTPUT beim Übersetzen Fehlermeldungen generierten, dass hier noch genau 1 Eingang erwartet würde, oder dort eine Varible nicht deklariert sei.

    Da dieses Handling aber schließlich eine sehr grundlegende Sache ist, werde ich da bei mir noch Licht reinbringen müssen. Diese Basics sind m. E. in der Hilfe oder im Handbuch nicht gut dokumentiert.

    Meine Umsetzung von Haralds Vorschlag:

    PROGRAM _1000_DMX_Master_A
    Deklaration:
    Code:
    VAR
     DMX_Master_A  : FbDMX_StageProfi;
     Enable    : BOOL := TRUE;
     PortNumber   : WORD := 10001;
     FirstChannel  : WORD := 1;
     NumberOfChannels : BYTE := 12;
     Ready    : BOOL;
     Connect    : BOOL;
     ErrorCode   : DINT;
     ErrorWatchdog  : BOOL;
    END_VAR
    Code:
    Code:
    DMX_Master_A(
     xEnable:= Enable,
     sIPaddress:= '192.168.2.250',
     wPortNumber:= PortNumber,
     wStartChannel:= FirstChannel,
     bNumberOfChannels:= NumberOfChannels,
     abDMX_Values:= arData_ITRP_DMX_A_OUT,
     xReady=> Ready,
     xConnect=> Connect,
     diError=> ErrorCode,
     xWatchdog=> ErrorWatchdog);
    PROGRAM _1010_Ansteuerung_DMX_Innentreppe
    Deklaration:
    Code:
    VAR
     nCount: INT;
     arTemp_ITRP_DMX_A_OUT :ARRAY[-2..31] OF BYTE;
    END_VAR
    Code:
    Code:
    arData_ITRP_Sens_IN[1]:=DI_17B00;
    arData_ITRP_Sens_IN[2]:=DI_17B01;
    arData_ITRP_Sens_IN[3]:=DI_17B02;
    arData_ITRP_Sens_IN[4]:=DI_17B03;
    arData_ITRP_Sens_IN[5]:=DI_17B04;
    arData_ITRP_Sens_IN[6]:=DI_17B05;
    arData_ITRP_Sens_IN[7]:=DI_17B06;
    arData_ITRP_Sens_IN[8]:=DI_17B07;
    arData_ITRP_Sens_IN[9]:=DI_17B08;
    arData_ITRP_Sens_IN[10]:=DI_17B09;
    arData_ITRP_Sens_IN[11]:=DI_17B10;
    arData_ITRP_Sens_IN[12]:=DI_17B11;
    arData_ITRP_Sens_IN[13]:=DI_17B12;
    arData_ITRP_Sens_IN[14]:=DI_17B99;
    arData_ITRP_Sens_IN[15]:=DI_2AB00;
    arData_ITRP_Sens_IN[16]:=DI_2AB01;
    arData_ITRP_Sens_IN[17]:=DI_2AB02;
    arData_ITRP_Sens_IN[18]:=DI_2AB03;
    arData_ITRP_Sens_IN[19]:=DI_2AB04;
    arData_ITRP_Sens_IN[20]:=DI_2AB05;
    arData_ITRP_Sens_IN[21]:=DI_2AB06;
    arData_ITRP_Sens_IN[22]:=DI_2AB07;
    arData_ITRP_Sens_IN[23]:=DI_2AB08;
    arData_ITRP_Sens_IN[24]:=DI_2AB09;
    arData_ITRP_Sens_IN[25]:=DI_2AB10;
    arData_ITRP_Sens_IN[26]:=DI_2AB11;
    arData_ITRP_Sens_IN[27]:=DI_2AB12;
    arData_ITRP_Sens_IN[28]:=DI_2AB99;
    
    FOR nCount := -2 TO 31 DO
    arTemp_ITRP_DMX_A_OUT[nCount]:=0;
    END_FOR;
    FOR nCount := 1 TO 28 DO
      IF arData_ITRP_Sens_IN[nCount] = TRUE THEN
        arTemp_ITRP_DMX_A_OUT[nCount] := 100;
        IF arTemp_ITRP_DMX_A_OUT[nCount-1] < 70 THEN
          arTemp_ITRP_DMX_A_OUT[nCount-1] := 70;
        END_IF;
        IF arTemp_ITRP_DMX_A_OUT[nCount-2] < 30 THEN
          arTemp_ITRP_DMX_A_OUT[nCount-2] := 30;
        END_IF;
        IF arTemp_ITRP_DMX_A_OUT[nCount-3] < 10 THEN
          arTemp_ITRP_DMX_A_OUT[nCount-3] := 10;
        END_IF;
        IF arTemp_ITRP_DMX_A_OUT[nCount+3] < 10 THEN
          arTemp_ITRP_DMX_A_OUT[nCount+3] := 10;
        END_IF;
        IF arTemp_ITRP_DMX_A_OUT[nCount+2] < 30 THEN
          arTemp_ITRP_DMX_A_OUT[nCount+2] := 30;
        END_IF;
        IF arTemp_ITRP_DMX_A_OUT[nCount+1] < 70 THEN
          arTemp_ITRP_DMX_A_OUT[nCount+1] := 70;
        END_IF;
      END_IF;
    END_FOR;
    
    FOR nCount := 1 TO 28 DO
    arData_ITRP_DMX_A_OUT[nCount] := arTemp_ITRP_DMX_A_OUT[nCount];
    END_FOR;
    Globale_Variablen
    Deklaration:
    Code:
    VAR_GLOBAL
    
    (* _0252_KNX_Sensoren_Innentreppe *)
    
       (* DI 13A - 8 DI - E3-E8 -----------------------------------*)
     DI_17B00 AT %IX13.6  : BOOL;
     DI_17B01 AT %IX13.7  : BOOL;
     DI_17B02 AT %IX13.8  : BOOL;
     DI_17B03 AT %IX13.9  : BOOL;
     DI_17B04 AT %IX13.10 : BOOL;
     DI_17B05 AT %IX13.11 : BOOL;
       (* DI 13B - 8 DI - E1-E8 -----------------------------------*)
     DI_17B06 AT %IX13.12 : BOOL;
     DI_17B07 AT %IX13.13 : BOOL;
     DI_17B08 AT %IX13.14 : BOOL;
     DI_17B09 AT %IX13.15 : BOOL;
     DI_17B10 AT %IX14.0  : BOOL;
     DI_17B11 AT %IX14.1  : BOOL;
     DI_17B12 AT %IX14.2  : BOOL;
     DI_17B99 AT %IX14.3  : BOOL;
       (* DI 14A - 8 DI - E1-E8 -----------------------------------*)
     DI_2AB00 AT %IX14.4  : BOOL;
     DI_2AB01 AT %IX14.5  : BOOL;
     DI_2AB02 AT %IX14.6  : BOOL;
     DI_2AB03 AT %IX14.7  : BOOL;
     DI_2AB04 AT %IX14.8  : BOOL;
     DI_2AB05 AT %IX14.9  : BOOL;
     DI_2AB06 AT %IX14.10 : BOOL;
     DI_2AB07 AT %IX14.11 : BOOL;
       (* DI 14B - 8 DI - E1-E6 -----------------------------------*)
     DI_2AB08 AT %IX14.12 : BOOL;
     DI_2AB09 AT %IX14.13 : BOOL;
     DI_2AB10 AT %IX14.14 : BOOL;
     DI_2AB11 AT %IX14.15 : BOOL;
     DI_2AB12 AT %IX15.0  : BOOL;
     DI_2AB99 AT %IX15.1  : BOOL;
    
    (* _1000_DMX_Master_A *)
    
     arData_ITRP_DMX_A_OUT :ARRAY[1..255] OF BYTE;
    
    (*  _1010_Ansteuerung_DMX_Innentreppe *)
    
     arData_ITRP_Sens_IN  :ARRAY[1..28] OF BOOL;
    END_VAR
    Meine Umsetzung von huckis Vorschlag:

    PROGRAM _1000_DMX_Master_A
    Deklaration: wie oben
    Code: wie oben

    PROGRAM _1010_Ansteuerung_DMX_Innentreppe
    Deklaration:
    Code:
    VAR
     arTemp_ITRP_DMX_A_OUT: ARRAY [1..Stufen] OF BYTE; (* BYTE-Ausgabe füR DMX *)
     arDimm:     ARRAY [0..Neben] OF BYTE; (* Dimmstufen *)
     i:      INT;      (* Index-Variable benachbarte Stufen *)
     z:      INT;      (* Index-Variable Stufen *)
    END_VAR
    Code:
    Code:
    (* Übergabe der Sensoreingänge an Array *)
    
    //... wie oben
    
    (* Dimmstufen festlegen *)
    
    arDimm[0]:= 255;   (* Dimmstufe 0 = 100% = 255 *)
    arDimm[1]:= 179;   (* Dimmstufe 1 =  70% = 179 *)
    arDimm[2]:= 102;   (* Dimmstufe 2 =  40% = 102 *)
    arDimm[3]:=  25;   (* Dimmstufe 3 =  10% =  25 *)
    
    (* Treppenstufen abfragen und DMX-Werte zuweisen *)
    
    FOR z:= 1 TO Stufen BY 1 DO           (* Schleife über alle Stufen *)
     arTemp_ITRP_DMX_A_OUT[z]:= 0;         (* DMX-Wert für Stufe zurücksetzen *)
     FOR i:= 0 TO Neben BY 1 DO          (* Schleife über benachbarte Stufen *)
      IF arData_ITRP_Sens_IN[SEL(z + i > Stufen, z + i, z)] OR (* Wenn Stufe i höher  (wenn existent, sonst eigene) oder *)
         arData_ITRP_Sens_IN[SEL(z - i < 1, z - i, z)]   (*      Stufe i tiefer (wenn existent, sonst eigene) belegt *)
      THEN              (* Befehle bei belegter Stufe: *)
       arTemp_ITRP_DMX_A_OUT[z]:= arDimm[i];     (*      DMX-Byte entspechend Abstand zu belegter Stufe zuweisen und *)
       EXIT;             (*      Schleife über benachbarte Stufen vorzeitig verlassen *)
      END_IF;              (* Ende Befehle bei belegter Stufe *)
     END_FOR;              (* Ende Schleife über benachbarte Stufen *)
    END_FOR;               (* Ende Schleife über alle Stufen *)
    FOR z:= 1 TO Stufen BY 1 DO           (* Schleife über alle Stufen *)
    arData_ITRP_DMX_A_OUT[z] := arTemp_ITRP_DMX_A_OUT[z];    (* Ausgabe Array DMX-Wert an Array DMX Master A *)
    END_FOR;               (* Ende Schleife über alle Stufen *)
    Globale_Variablen
    Deklaration:
    Code:
    VAR_GLOBAL CONSTANT
    
    (*  _1011_Ansteuerung_DMX_Innentreppe *)
    
     Stufen: INT := 28;   (* Anzahl Stufen *)
     Neben: INT :=  3;   (* benachbarte Stufen *)
    
    END_VAR
    
    VAR_GLOBAL
    
    (* _0252_KNX_Sensoren_Innentreppe *)
    
    //... wie oben
    
    (* _1000_DMX_Master_A *)
    
     arData_ITRP_DMX_A_OUT :ARRAY[1..255] OF BYTE;
    
    (*  _1011_Ansteuerung_DMX_Innentreppe *)
    
     arData_ITRP_Sens_IN: ARRAY [1..Stufen] OF BOOL; (* Belegungserkennung Stufe *)
    END_VAR
    WAGO 750-849 mit 753-646 KNX-TP1-Klemme
    GIRA Homeserver 4

  6. Folgende 2 Benutzer sagen Danke zu pauly2072 für den nützlichen Beitrag:

    hucki (02.03.2014),PN/DP (02.03.2014)

  7. #16
    Registriert seit
    27.02.2014
    Ort
    Oberstenfeld
    Beiträge
    31
    Danke
    7
    Erhielt 2 Danke für 1 Beitrag

    Standard

    Zitat Zitat von pauly2072 Beitrag anzeigen
    Dass die letzten 4 Stufen beim Verlassen der Treppe alle auf einmal ausgehen, wäre mir bestimmt erst beim Test am lebenden Objekt unangenehm aufgefallen! Das mit der 'virtuellen Timerbegehung' werde ich dann ganz sicher so einbinden.
    Beim Grübeln darüber, wie ich die virtuelle Begehung, bzw. die Dimmrampe einbinde (in huckis Vorschlag), ist mir aufgefallen, dass sämtliche Lichter ja nicht nur beim Verlassen der der Treppe (nach oben, wie auch nach unten) auf einmal ausgehen, sondern auch immer dann, wenn das dürre Nachbarskind beim Treppensteigen sich genau zwischen zwei Lichttasterbeams befindet.

    Das würde ein Geblinke...
    WAGO 750-849 mit 753-646 KNX-TP1-Klemme
    GIRA Homeserver 4

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

    Standard

    Ein Grund mehr, die Rampe dem virtuellen Begehen vorzuziehen.

    Schnelles Einschalten langsames Ausdimmen sollte da eine gute Lösung sein.

  9. #18
    Registriert seit
    27.02.2014
    Ort
    Oberstenfeld
    Beiträge
    31
    Danke
    7
    Erhielt 2 Danke für 1 Beitrag

    Standard

    Zwischenfrage:

    Ich bin gerade dabei, die Dimm-Rampen einzubauen und stecke mit folgendem Problem fest:

    Aus der "oscat_basic_333.lib" möchte ich die mir für meine Zwecke passend scheinende Funktion "FRMP_B" verwenden. Deren Eingang "TD : TIME (Abgelaufene Zeit)" beschalte ich mit dem Ausgang der Standardfunktion TON. Die Standardfunktion TON lässt sich als Array definieren, die Oscat-Funktion FRMP_B aber nicht.
    Code:
     arTON:  ARRAY [1..Stufen, 0..Neben] OF TON;
     arFRMP_B: ARRAY [1..Stufen, 0..Neben] OF FRM_B;
    Zudem ist mir nicht klar, wie ich den Ausgang von FRM_B 'abgreife'. Wenn ich versuche, das mit der Zeile "FRMP_B => arDiffR[z]" zu erreichen, bekomme ich die Fehlermeldung, dass die Funktion FRMP_B zu viele Parameter habe (daher im Code als Kommentar gesetzt).
    Code:
    FOR z:= 1 TO Stufen BY 1 DO  (* Schleife über alle Stufen *)
     FOR i:= 0 TO Neben BY 1 DO (* Schleife über benachbarte Stufen *)
      arTON[z,i](
       IN := arDiff[z]<>0,
       PT:= arDimmT[i],
       Q => arDimmTE[i],
       ET => arRampT[i]);
      FRMP_B[z,i](
       START := BYTE#255-arDiff[z],
       DIR := arDiff[z]>0,
       TD := arRampT[i],
       TR := DWORD_TO_TIME((BYTE#255/(arDiff[z]+arDiffR[z]-BYTE#255))*TIME_TO_DWORD(arDimmT[i])));
       (* FRMP_B => arDiffR[z]); *)
     END_FOR;
    END_FOR;
    WAGO 750-849 mit 753-646 KNX-TP1-Klemme
    GIRA Homeserver 4

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

    Standard

    M.M.n. hast Du auch einen Denkfehler in Deinem Programm. Jede Stufe hat nur 2 DMX-Werte - einen IST und einen SOLL. Warum also die Schleifen über benachbarte Stufen?
    Die benachbarten Stufen fahren eh' ihre eigene Rampe!

    PS: Nur der Sollwert hängt von der Belegung der Nachbarstufen ab. Aber das hast Du ja schon weiter oben erfasst.
    Geändert von hucki (04.03.2014 um 10:15 Uhr)

  11. #20
    Registriert seit
    27.02.2014
    Ort
    Oberstenfeld
    Beiträge
    31
    Danke
    7
    Erhielt 2 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke für den Hinweis!

    Hast Du auch einen Tipp zur Array-Definition/Deklaration für die Rampe FRMP_B?
    WAGO 750-849 mit 753-646 KNX-TP1-Klemme
    GIRA Homeserver 4

Ähnliche Themen

  1. 2 Dimensionales ARRAY OF BYTE, Werte zuweisen
    Von KingHelmer im Forum CODESYS und IEC61131
    Antworten: 0
    Letzter Beitrag: 22.10.2013, 10:46
  2. Antworten: 4
    Letzter Beitrag: 13.04.2012, 08:11
  3. Byte werte in Real umrechen
    Von enter im Forum CODESYS und IEC61131
    Antworten: 7
    Letzter Beitrag: 25.06.2010, 09:09
  4. Antworten: 12
    Letzter Beitrag: 31.07.2006, 16:39
  5. Antworten: 3
    Letzter Beitrag: 26.11.2004, 17:38

Stichworte

Lesezeichen

Berechtigungen

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