Step 7 Setpoint Management - Fehler im Programm

DDuesentrieb

Level-1
Beiträge
44
Reaktionspunkte
1
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
 
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
 
@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;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
Ach ja, OUT von Bausteinen zu setzen ist immer irgendwie Mist!
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.
 
Zuletzt bearbeitet:
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.
 
Zurück
Oben