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

Ergebnis 1 bis 7 von 7

Thema: Setpoint Management - Fehler im Programm

  1. #1
    Registriert seit
    06.12.2011
    Beiträge
    44
    Danke
    19
    Erhielt 1 Danke für 1 Beitrag

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Ihr,

    ich habe folgendes Problem. Ich möchte mit Hilfe dieser Funktion, abhängig von einem Sollwert und dem Aktualwert, einen Setpoint Merker zuweisen, setzen oder zurücksetzen.
    Wenn ich den Setpoint Merker zuweise funktioniert dies problemlos. Sobald ich aber das Setzen oder Rücksetzen verwende wird der Ausgang dauerhaft auf 1 geschrieben.
    Kann mir bitte jemand weiterhelfen, wo der Fehler ist.
    Wahrscheinlich hab ich ein grundlegenden Mechanismus von Step7 außer acht gelassen, wo mir noch das tiefere Verständnis von Step7 fehlt.

    Nachfolgend habe ich die Quelle von meiner Funktion angefügt.

    Code:
    FUNCTION "Creating _Setpoint" : VOID
    TITLE =
    VERSION : 0.1
    
    
    VAR_INPUT
      Act_Value : REAL ;    
      Set_Value : REAL ;    
      Delay_Timer_Set : TIMER ;    
      Delay_Set_Value : S5TIME ;    
      Type_Setting : INT ;    //0 = "=" 1 = "S" 2 = "R"
      Type_Setpoint : INT ;    //0 = "==" 1 = "<>" 2 = "<" 3 = "<=" 4 = ">" 5 = ">="
      Release_Setpoint_Set : BOOL ;    
    END_VAR
    VAR_OUTPUT
      Setpoint_Out : BOOL ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =Selection of Type
    
          L     0; 
          L     #Type_Setpoint; 
          ==I   ; 
          SPB   J000; 
    
    
          L     1; 
          L     #Type_Setpoint; 
          ==I   ; 
          SPB   J001; 
    
    
          L     2; 
          L     #Type_Setpoint; 
          ==I   ; 
          SPB   J002; 
    
    
          L     3; 
          L     #Type_Setpoint; 
          ==I   ; 
          SPB   J003; 
    
    
          L     4; 
          L     #Type_Setpoint; 
          ==I   ; 
          SPB   J004; 
    
    
          L     5; 
          L     #Type_Setpoint; 
          ==I   ; 
          SPB   J005; 
    
          BE    ; //Bausteinende
    NETWORK
    TITLE =Create Setponit "=="
    
    J000: NOP   0; 
    
          L     #Act_Value; 
          L     #Set_Value; 
          ==R   ; 
          U     #Release_Setpoint_Set; 
          L     #Delay_Set_Value; 
          SE    #Delay_Timer_Set; 
    
          SPA   Ende; 
    NETWORK
    TITLE =Create Setponit "<>"
    
    J001: NOP   0; 
    
          L     #Act_Value; 
          L     #Set_Value; 
          <>R   ; 
          U     #Release_Setpoint_Set; 
          L     #Delay_Set_Value; 
          SE    #Delay_Timer_Set; 
    
          SPA   Ende; 
    NETWORK
    TITLE =Create Setponit "<"
    
    J002: NOP   0; 
    
          L     #Act_Value; 
          L     #Set_Value; 
          <R    ; 
          U     #Release_Setpoint_Set; 
          L     #Delay_Set_Value; 
          SE    #Delay_Timer_Set; 
    
          SPA   Ende; 
    NETWORK
    TITLE =Create Setponit "<="
    
    J003: NOP   0; 
    
          L     #Act_Value; 
          L     #Set_Value; 
          <=R   ; 
          U     #Release_Setpoint_Set; 
          L     #Delay_Set_Value; 
          SE    #Delay_Timer_Set; 
    
          SPA   Ende; 
    NETWORK
    TITLE =Create Setponit ">"
    
    J004: NOP   0; 
    
          L     #Act_Value; 
          L     #Set_Value; 
          >R    ; 
          U     #Release_Setpoint_Set; 
          L     #Delay_Set_Value; 
          SE    #Delay_Timer_Set; 
    
          SPA   Ende; 
    NETWORK
    TITLE =Create Setponit ">="
    
    J005: NOP   0; 
    
          L     #Act_Value; 
          L     #Set_Value; 
          >=R   ; 
          U     #Release_Setpoint_Set; 
          L     #Delay_Set_Value; 
          SE    #Delay_Timer_Set; 
    
    Ende: NOP   0; 
    
    NETWORK
    TITLE =Select Type of Setting
    
          L     0; 
          L     #Type_Setting; 
          ==I   ; 
          SPB   S000; 
    
    
          L     1; 
          L     #Type_Setting; 
          ==I   ; 
          SPB   S001; 
    
    
          L     2; 
          L     #Type_Setting; 
          ==I   ; 
          SPB   S002; 
    
    
    
    NETWORK
    TITLE =Set bit with "="
    
    S000: NOP   0; 
    
          U     #Delay_Timer_Set; 
          =     #Setpoint_Out; 
    
          BE    ; 
    NETWORK
    TITLE =Set bit with "S"
    
    S001: NOP   0; 
    
          U     #Delay_Timer_Set; 
          S     #Setpoint_Out; 
    
          BE    ; 
    NETWORK
    TITLE =Reset bit with "R"
    
    S002: NOP   0; 
    
          U     #Delay_Timer_Set; 
          R     #Setpoint_Out; 
    
          BE    ; 
    END_FUNCTION
    Grüße DDuesentrieb
    Zitieren Zitieren Setpoint Management - Fehler im Programm  

  2. #2
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    dein Problem

    Code:
     L     #Act_Value; 
          L     #Set_Value; 
          <>R   ; 
          U     #Release_Setpoint_Set;
    die Lösung

    Code:
          U(    
          L     #Act_Value
          L     #Set_Value
          <>R   
          )     
          U     #Release_Setpoint_Set
    für alle deine Vergleiche ab NW 2

    ansonsten sollte es so funktionieren, wie von dir gewünscht.
    der Sinn erschließt sich sicher dem Eingeweihten

    ein Tipp noch: SPL
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  3. Folgender Benutzer sagt Danke zu vierlagig für den nützlichen Beitrag:

    DDuesentrieb (07.08.2014)

  4. #3
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Ach ja, OUT von Bausteinen zu setzen ist immer irgendwie Mist!

  5. #4
    Registriert seit
    13.10.2007
    Beiträge
    12.035
    Danke
    2.789
    Erhielt 3.269 Danke für 2.157 Beiträge

    Standard

    @4L
    bist du sicher das dieses nicht funktioniert, mal abgesehen von der Variablendeklaration als OUT,
    die er nicht zugewiesen hat?

    Code:
          L     #Act_Value; 
          L     #Set_Value; 
          <>R   ; 
          U     #Release_Setpoint_Set;
    - - -
    Wer als Werkzeug nur einen Hammer hat, sieht in jedem Problem einen Nagel.

  6. #5
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    bis ich es nach diesem Post Finde den Fehler ?!?!?!?
    selber ausprobiert hatte ging ich von der gleichen Annahme aus - bzw. kam ich irgendwie nicht in die Verlegenheit derartige Konstrukte in AWL zu programmieren ... für Bitverknüpfungen gibt es schließlich KOP
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  7. #6
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Zitat Zitat von Mr.XX Beitrag anzeigen
    Kann mir bitte jemand weiterhelfen, wo der Fehler ist.
    Wahrscheinlich hab ich ein grundlegenden Mechanismus von Step7 außer acht gelassen, wo mir noch das tiefere Verständnis von Step7 fehlt.
    Code:
    FUNCTION "Creating _Setpoint" : VOID
    
    VAR_OUTPUT
      Setpoint_Out : BOOL ;    
    END_VAR
    
    ...
          S     #Setpoint_Out; 
    
    ...
         R     #Setpoint_Out; 
    END_FUNCTION
    Zitat Zitat von vierlagig Beitrag anzeigen
    Ach ja, OUT von Bausteinen zu setzen ist immer irgendwie Mist!
    Zitat Zitat von rostiger Nagel Beitrag anzeigen
    mal abgesehen von der Variablendeklaration als OUT,
    die er nicht zugewiesen hat?
    @Mr.XX,

    was Dir die beiden hier so ganz nebenbei mitteilen:
    In einer Funktion (FC) verhalten sich OUT-Variablen genauso wie TEMP-Variablen. Deren Zustand ist der Funktion nach ihrer Beendigung nicht länger bekannt, da deren Speicherplatz wieder für anderweitige Verwendung freigegeben wird.
    Das bedeutet, Du musst sie in jedem Zyklus zuweisen, PS: ansonsten ist ihr Zustand undefiniert und zufällig.

    Möchtest Du mit SET/RESET arbeiten, musst Du statt OUT INOUT verwenden, damit der letzte Zustand der Variablen außerhalb der FC gespeichert und beim Aufruf von der FC wieder eingelesen wird.

    Alternativ kannst Du statt einer Funktion einen Funktionsbaustein verwenden. Dort wird der Zustand der OUT-Variablen im Instanzdatenbaustein gespeichert.
    Geändert von hucki (06.08.2014 um 20:05 Uhr)

  8. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    DDuesentrieb (07.08.2014)

  9. #7
    Registriert seit
    06.12.2011
    Beiträge
    44
    Danke
    19
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Vielen Dank für die Hilfe! Habe ich wieder etwas dazu gelernt.

    Der Hinweis mit den Klammern und die Verwendung von IN_Out als Deklarierung war die Lösung von meinem Problem

    Nachfolgend meine Quelle von der funktionierenden Funktion

    Code:
    FUNCTION "Creating _Setpoint" : VOID
    TITLE =
    VERSION : 0.1
    
    
    VAR_INPUT
      Act_Value : REAL ;    
      Set_Value : REAL ;    
      Delay_Timer_Set : TIMER ;    
      Delay_Set_Value : S5TIME ;    
      Type_Setting : INT ;    //0 = "=" 1 = "S" 2 = "R" 
      Type_Setpoint : INT ;    //0 = "==" 1 = "<>" 2 = "<" 3 = "<=" 4 = ">" 5 = ">="
      Release_Timer : BOOL ;    
      Release_Setpoint_Set : BOOL ;    
      Reset_Setpoint : BOOL ;    
    END_VAR
    VAR_IN_OUT
      Setpoint_Out : BOOL ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =Selection of Type
    
    
          L     #Type_Setpoint; 
          SPL   Max; 
          SPA   J000; 
          SPA   J001; 
          SPA   J002; 
          SPA   J003; 
          SPA   J004; 
          SPA   J005; 
    Max:  BE    ; 
    
    NETWORK
    TITLE =Create Setponit "=="
    
    J000: NOP   0; 
    
          U(    ; 
          L     #Act_Value; 
          L     #Set_Value; 
          )     ; 
          ==R   ; 
          U     #Release_Timer; 
          L     #Delay_Set_Value; 
          SE    #Delay_Timer_Set; 
    
          SPA   Ende; 
    NETWORK
    TITLE =Create Setponit "<>"
    
    J001: NOP   0; 
    
          U(    ; 
          L     #Act_Value; 
          L     #Set_Value; 
          )     ; 
          <>R   ; 
          U     #Release_Timer; 
          L     #Delay_Set_Value; 
          SE    #Delay_Timer_Set; 
    
          SPA   Ende; 
    NETWORK
    TITLE =Create Setponit "<"
    
    J002: NOP   0; 
    
          U(    ; 
          L     #Act_Value; 
          L     #Set_Value; 
          )     ; 
          <R    ; 
          U     #Release_Timer; 
          L     #Delay_Set_Value; 
          SE    #Delay_Timer_Set; 
    
          SPA   Ende; 
    NETWORK
    TITLE =Create Setponit "<="
    
    J003: NOP   0; 
    
          U(    ; 
          L     #Act_Value; 
          L     #Set_Value; 
          )     ; 
          <=R   ; 
          U     #Release_Timer; 
          L     #Delay_Set_Value; 
          SE    #Delay_Timer_Set; 
    
          SPA   Ende; 
    NETWORK
    TITLE =Create Setponit ">"
    
    J004: NOP   0; 
    
          U(    ; 
          L     #Act_Value; 
          L     #Set_Value; 
          )     ; 
          >R    ; 
          U     #Release_Timer; 
          L     #Delay_Set_Value; 
          SE    #Delay_Timer_Set; 
    
          SPA   Ende; 
    NETWORK
    TITLE =Create Setponit ">="
    
    J005: NOP   0; 
    
          U(    ; 
          L     #Act_Value; 
          L     #Set_Value; 
          )     ; 
          >=R   ; 
          U     #Release_Timer; 
          L     #Delay_Set_Value; 
          SE    #Delay_Timer_Set; 
    
    Ende: NOP   0; 
    
    NETWORK
    TITLE =Reset Setpoint
    
    
          U     #Reset_Setpoint; 
          SPBN  H001; 
    
          U     #Reset_Setpoint; 
          R     #Setpoint_Out; 
    
    H001: NOP   0; 
    
    
    
    NETWORK
    TITLE =Selection of Type
    
    
          L     #Type_Setting; 
          SPL   Max1; 
          SPA   S000; 
          SPA   S001; 
          SPA   S002; 
    Max1: BE    ; 
    
    NETWORK
    TITLE =Set bit with "="
    
    
    S000: NOP   0; 
    
          U     #Delay_Timer_Set; 
          U     #Release_Setpoint_Set; 
          =     #Setpoint_Out; 
    
          BE    ; 
    NETWORK
    TITLE =Set bit with "S"
    
    
    S001: NOP   0; 
    
          U     #Delay_Timer_Set; 
          U     #Release_Setpoint_Set; 
          S     #Setpoint_Out; 
    
          BE    ; 
    NETWORK
    TITLE =Set bit with "R"
    
    
    S002: NOP   0; 
    
          U     #Delay_Timer_Set; 
          U     #Release_Setpoint_Set; 
          R     #Setpoint_Out; 
    
          BE    ; 
    END_FUNCTION
    Nachtrag:

    Das Setzen und Rücksetzen brauche ich in der Funktion, da ich die Funktion zweimal verwende zum Einen zum Setzen und zum Anderen zum zurücksetzen eines Bits.
    Grüße DDuesentrieb

Ähnliche Themen

  1. Antworten: 8
    Letzter Beitrag: 12.08.2013, 17:00
  2. Fehler im Programm.... Bitte um Hilfe
    Von blubb12345 im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 13.04.2012, 19:05
  3. Fehler in S7-Programm
    Von Earny im Forum Simatic
    Antworten: 20
    Letzter Beitrag: 18.03.2009, 23:18
  4. Fehler im Programm
    Von Tompson im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 31.05.2008, 18:53
  5. Fehler S5-Programm??
    Von INST im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 16.03.2006, 08:56

Stichworte

Lesezeichen

Berechtigungen

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