Variablenänderung in Schleife

rapser

Level-1
Beiträge
48
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Gemeinde,

ich habe eine kleine Frage zu einer Variablenänderung in einer Schleife

und zwar sollen die Bits DBX 16.6 und DBX 31.6 ihren Wert ändern, wenn die Schleife erneut durchlaufen wird. D.H. waren sie 1, sollen sie zu 0 werden um umgekehrt.

Dafür habe ich mir ein Hilfbit (DBX 32.2) erstellt.

Ich habe es mir wie unten im Code gedacht.


Code:
         L     #AnzahlWiederholungen
NEWI: T     #AnzahlWiederholungen


// Hier werden irgendwelche berechnungen durchgeführt

            

  t1:   NOP   0
        U     DBX   16.6              // zu änderndes BIT          
        UN    DBX   32.2             // Hilfsbit
        R     DBX   16.6              // zu änderndes BIT   
        R     DBX   31.6              // zu änderndes BIT 
        S      DBX   32.2             // Hilfsbit
        SPB   x1
   
        UN    DBX   16.6             // zu änderndes BIT                   
        UN    DBX   32.2             // Hilfsbit
        S     DBX   16.6              // zu änderndes BIT                   
        S     DBX   31.6              // zu änderndes BIT 
        S     DBX   32.2              // Hilfsbit
   
  x1:   NOP   0
   
  // hier wird auch etwas durchgeführt
   
        L     #AnzahlWiederholungen
        LOOP  NEWI
   
  schr: NOP   0
Nun meine Frage, wo setze ich dieses Hilfsbit zurück, damit die Anweisung zum Ändern des Wertes von DBX 16.6 und DBX 31.6 erneut ausgeführt werden können?
 
Also irgendwie versteh ich deinen Ansatz nicht ...

Langt nicht ein simples:

Code:
UN DBX16.6
= DBX16.6
 
UN DBX32.2
= DBX32.2

Gruß
Dieter
 
Hallo,

besten Dank für eure Antworten - doch leider funktioniert es es so nicht.
Programmier ich es so wie ihr das wollt "flackern" die beiden Bits wenn die Schleife durchlaufen wird.

Im Prinzip geht es darum:

Ich möchte einen Funktionsbaustein bauen für die Kommunikation mit einem Balluff-Identsystem (BIS-C), hierfür gibt es zwar einen, doch dieser funktioniert nicht mit F-CPUs wovon ich jedoch eine im Einsatz habe.

Ich poste jetzt mal den ganzen Text für das schreiben auf den Datenträger des BIS-C:

Meinen FC rufe ich zur Zeit im OB1 auf:
Code:
      CALL  FC   520
       Parameter_DB  :="DATA_IDENT_01"           
       Command       :=2                // 2=schreiben
       Length        :=W#16#E         //Anzahl der Byte die geschrieben werden soll
       Address_MDS   :=B#16#0           // ab Adresse 0 auf Datenträger schreiben
       DAT_DB_number :="IDENT_01_WT"
       DAT_DB_address:=B#16#0           // ab Adresse 0 im Schreibdatenbaustein Daten für das Schreiben auf MDS abholen       AuftragStarten:="BIS_Kommunikation"._0._2
       Reset_BIS     :="BIS_Kommunikation"._0._0
Der FC hat folgenden Inhalt:

Netzwerk1: "14" Byte auf BIS-MDS "Schreiben" Teil 1 von 3
Code:
 U     #AuftragStarten
      AUF   #Parameter_DB
      UN    DBX   32.0                  // Bearbeitung.SchreibenBegonnen
      SPBN  NOSR
      AUF   #Parameter_DB
//******  beschreiben des ausgangspuffers mit befehlen
      L     #Command                    // 2=schreiben
      T     DBB   17                    // Befehlskennung (01Hex= lesen, 02Hex=schreiben) oder Daten

      L     #Address_MDS
      T     DBB   18                    // Anfangsadresse (Low Byte)

      L     0
      T     DBB   19                    // Anfangsadresse (High Byte)

      L     #Length
      T     DBB   20                    // Anzahl der Byte (Low Byte)

      L     0
      T     DBB   21                    // Anzahl der Byte (High Byte)

      CLR   
      =     DBX   16.7                  // Datenträgertyp: 0=32 Byte Blockgröße
      =     DBX   31.7

      SET   
      =     DBX   16.0                  // Signalisiert dem Identifikations-System, dass ein Auftrag vorliegt
      =     DBX   31.0

//****** antwort des eingangspuffers

      U     DBX    0.1                  // Der Auftrag wurde erkannt und begonnen
      U     DBX   15.1
      U     DBX    0.0                  // Datenträger im Schreib-/Lesebereich des Schreib-/Lesekopfs
      U     DBX   15.0
      U     DBX    0.7                  // Das BIS-Identifikations-System befindet sich in betriebsbereitem Zustand.
      U     DBX   15.7
      S     DBX   32.0                  // Bearbeitung.SchreibenBegonnen

NOSR: NOP   0
Netzwerk2: "14" Byte auf BIS-MDS "Schreiben" Teil 2 von 3
Mein Ausgangspuffer ist 14 Byte groß, deswegen steht hier etwas mit "14", also bitte nicht wundern.
Code:
 U     #AuftragStarten
      AUF   #Parameter_DB
      U     DBX   32.0                  // Bearbeitung.SchreibenBegonnen
      UN    DBX   32.1                  // Bearbeitung.SchreibenBeendet
      SPBN  schr

// DB-Addresse im Sendenbaustein ab der die Daten auf MDS geschrieben werden sollen
      L     #DAT_DB_address             // DB-Addresse im Sendenbaustein ab der die Daten auf MDS geschrieben werden sollen
      SLD   3
      T     #Zeiger
      LAR1  #Zeiger

// Hilfzeiger für den Ausgangspuffer im Parameter_DB
      L     17                          // 17te Byte in Parameter_DB = Startbyte für Sendedaten 
      SLD   3
      T     #Hilfszeiger
      LAR2  #Hilfszeiger

// Anzahl der vollen Durchläufe für die neue Länge bestimmen
      L     #Length
      L     14
      /D    
      T     #AnzahlWiederholungen

// Anzahl des Wiederholungsrestes
      L     #Length
      L     14
      MOD   
      T     #AnzahlWiederholungenRest

      L     #AnzahlWiederholungenRest
      L     0
      <>D   
      SPBN  w1
      L     #AnzahlWiederholungen
      L     1
      +D    
      T     #AnzahlWiederholungen
      SPA   o1

w1:   NOP   0
      L     14
      T     #AnzahlWiederholungenRest



o1:   NOP   0
      L     #AnzahlWiederholungen
NEWI: T     #AnzahlWiederholungen

      L     #AnzahlWiederholungen
      L     1
      ==D   
      SPBN  m1
// Länge der Schreibdaten um 1 verringern
      L     #AnzahlWiederholungenRest
      L     1
      -D    
      T     #HilfswertLength
      SPA   n1
m1:   NOP   0
      L     13
      T     #HilfswertLength
n1:   NOP   0



      CLR   
      =     DBX   32.2

// ab hier Übergabe der Werte an Ausgangspuffer
      AUF   #DAT_DB_number              // DB-Nummer des Bausteins aus dem die Daten auf MDS geschrieben werden
      L     DBB [AR1,P#0.0]             // Lade 1te Byte aus Sende_DB
      AUF   #Parameter_DB
      T     DBB [AR2,P#0.0]

      L     #HilfswertLength
      L     0
      ==D   
      SPB   t1

//      L     #AnzahlVollerWiederholung
      L     #HilfswertLength
NEXT: T     #AnzahlDurchlaeufe

      L     #Zeiger
      L     P#1.0
      +D    
      T     #Zeiger
      LAR1  #Zeiger

      L     #Hilfszeiger
      L     P#1.0
      +D    
      T     #Hilfszeiger
      LAR2  #Hilfszeiger

      AUF   #DAT_DB_number
      L     DBB [AR1,P#0.0]
      AUF   #Parameter_DB
      T     DBB [AR2,P#0.0]

      L     #AnzahlDurchlaeufe
      LOOP  NEXT




t1:   NOP   0
      U     DBX   16.6                  // TI-BIT Zeigt bei Leseauftrags an, dass die Steuerung für weitere Daten bereit ist.
      UN    DBX   32.2
      R     DBX   16.6                  // TI-BIT Zeigt bei Leseauftrags an, dass die Steuerung für weitere Daten bereit ist.
      R     DBX   31.6
      S     DBX   32.2
      SPB   x1

      UN    DBX   16.6                  // TI-BIT Zeigt bei Leseauftrags an, dass die Steuerung für weitere Daten bereit ist.
      UN    DBX   32.2
      S     DBX   16.6                  // TI-BIT Zeigt bei Leseauftrags an, dass die Steuerung für weitere Daten bereit ist.
      S     DBX   31.6
      S     DBX   32.2


// Bearbeitung.TI_Bit_Invertiert
      NOP   0



      U     DBX    0.1                  // AA-BIT Der Auftrag wurde erkannt und begonnen
      U     DBX   15.1
      U     DBX    0.2                  // AE-BIT Der Auftrag wurde ohne Fehler beendet
      U     DBX   15.2
      U     DBX    0.0                  // CP-BIT Datenträger im Schreib-/Lesebereich des Schreib-/Lesekopfs
      U     DBX   15.0
      U     DBX    0.7                  // BB-BIT Das BIS-Identifikations-System befindet sich in betriebsbereitem Zustand.
      U     DBX   15.7
      SPBN  z1
      S     DBX   32.1                  // Bearbeitung.SchreibenBeendet
      R     DBX   32.0                  // Bearbeitung.SchreibenBegonnen
      SPA   schr

z1:   NOP   0
      U     DBX    0.1                  // AA-BIT Der Auftrag wurde erkannt und begonnen
      U     DBX   15.1
      UN    DBX    0.2                  // AE-BIT Der Auftrag wurde ohne Fehler beendet
      UN    DBX   15.2
      U     DBX    0.0                  // CP-BIT Datenträger im Schreib-/Lesebereich des Schreib-/Lesekopfs
      U     DBX   15.0
      U     DBX    0.7                  // BB-BIT Das BIS-Identifikations-System befindet sich in betriebsbereitem Zustand.
      U     DBX   15.7

      SPBN  schr

      L     #AnzahlWiederholungenRest
      T     #Length

      L     #Zeiger
      L     P#1.0
      +D    
      T     #Zeiger
      LAR1  #Zeiger

      L     #Hilfszeiger
      L     P#13.0
      -D    
      T     #Hilfszeiger
      LAR2  #Hilfszeiger

      L     #AnzahlWiederholungen
      LOOP  NEWI

schr: NOP   0
Netzwerk3: "14" Byte auf BIS-MDS "Schreiben" Teil 3 von 3
Code:
 U     #AuftragStarten
      AUF   #Parameter_DB
      U     DBX   32.1                  // Bearbeitung.SchreibenBeendet
      SPBN  ende
      AUF   #Parameter_DB
      CLR   
      =     DBX   16.0                  // AV-BIT Signalisiert dem Identifikations-System, dass ein Auftrag vorliegt
      =     DBX   31.0
      =     DBX   16.6                  // TI-BIT Zeigt bei Leseauftrags an, dass die Steuerung für weitere Daten bereit ist.
      =     DBX   31.6
      =     DBX   32.2                  // Bearbeitung.TI_Bit_Invertiert
      =     #AuftragStarten
      =     DBX   32.1                  // Bearbeitung.SchreibenBeendet
ende: NOP   0
      SPA   EXIT
Wenn ich beim Aufruf sage, dass ich 14 Byte (E) an Daten senden möchte funktioniert die ganze Sache, möchte ich nun mehr als 14Byte senden, z.B. 16, dann bleibe ich hängen. Das 15te und 16te Byte werden mir zwar in den Ausgangspuffer gelegt, doch nun müssten sich wieder die Bits DBX 16.6
und DBX 31.6 ändern, damit die Daten gesendet werden.

Ich hoffe einer von Euch kann mir da etwas helfen.
 
Kannst Du Deine Frage nicht ein bissel konkretisieren?
Verstehe ich es richtig, dass Du abhängig von der Länge die 2 Bits toggeln musst?

Code:
L #Lenght
L 14
<=I
SPB OK
UN DBX16.6
= DBX16.6
UN DBX32.2
= DBX32.2
OK: NOP 0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also so ganz verstehe ich die Programmierung nicht.
Im OB1 übergibst du W#16#E also 15, in der Schleife arbeitest du absolut mit14.
Kann es sein, dass bei den Berechnungen mit length und deiner Länge etwas schief läuft?
Wenn ich richtig sehe muss du schon beim Aufruf von dem FC die richtige Länge übergeben. so wie es aussieht ist die Länge Nutzdaten +1.


Habe kein S7 hier um das anschauen zu können.


bike
 
@bike: Im OB1 übergebe ich die 15, da hast du recht - bei 15 funktioniert es soweit, dass er wie ich schon geschrieben habe erst meinen Ausgangspuffer belegt, dann die beiden benötigten Bits toggelt und anschließend mir das 15 Bit in den Ausgangspuffer legt. Jetzt werden jedoch die beiden benötigten Bits nicht getoggelt, so dass das Programm nicht beendet wird.
 
Hallo,
wenn ich das Ganze richtig verstanden habe, dann übergibst du dem System Daten in Blöcken à 14 Byte - sind also 14 Byte zu übergeben, dann ist das ein kompletter Block - sind es 15 dann übergibst du einen Block mit den ersten 14 Byte und danach den 2.Block mir nur einem Byte ... soweit korekkt ? Wenn ja, dann stellt sich mir die Frage, warum du bei Blockgrößen > 14 nicht mit einer 2. Schleife über der schon vorhandenen arbeitest. Dann wäre auch das Problem mit der Bitsteuerung, die jetzt ja scheinbar nicht sauber funktioniert (und die ich auch auf den ersten Blick nicht durchblicke) überholt ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber mich würde auch mal interessieren, warum der Balluff-Baustein nicht auf einer F-CPU läuft! Das dürfte doch eigentlich gar keinen Einfluß haben oder irre ich mich da?
Kennst du die Ursache oder hast du eine konkrete Aussage von Balluff oder Siemens?
 

@LL:
Genau du siehst das richtig. Ich nutze doch die vorhandene Schleife oder sehe ich das falsch?

@Ralle:

Aber mich würde auch mal interessieren, warum der Balluff-Baustein nicht auf einer F-CPU läuft! Das dürfte doch eigentlich gar keinen Einfluß haben oder irre ich mich da?
Kennst du die Ursache oder hast du eine konkrete Aussage von Balluff oder Siemens?


Da habe ich die Aussage vom Balluff-Support.
 
... Ich nutze doch die vorhandene Schleife oder sehe ich das falsch?

... ich habe deine vorhandene Schleife so interpretiert, dass sie dazu dient jeweils 14 Byte Daten aus der Quelle auf den Sensor zu schreiben.

Ich kriege jetzt im Augenblick keinen anderen Ansatz auf die Reihe ...
Insgesamt brauchst du aber m.E. einen sequentielleren Ablauf. Es wird ja wohl so funktionieren :
1. Header ausfüllen + Nutzdaten in den entsprechenden Bereich schreiben
2. Daten zur Übertragung freigeben
3. warten bis Übertragung quittiert ist
4. Falls nötig nächsten Datenblock übertragen

Der Punkt 3. ist für mich nicht so richtig auffindbar in deinem Code ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren

@LL:
Genau du siehst das richtig. Ich nutze doch die vorhandene Schleife oder sehe ich das falsch?

@Ralle:




Da habe ich die Aussage vom Balluff-Support.

Danke. Aber so richtig will mir das einfach nicht einleuchten. Warum soll ein Baustein, der Daten per Profibus (Ist das so?) holt bzw. per Profibus an ein BIS liefert, bei einer F-CPU nicht funktionieren? Komische Sache ist das aber schon. Ich weiß, das hilft dir grad nicht weiter, bin nur neugierig, den Rest macht ja Larry ganz prima :ROFLMAO:.
 
Zurück
Oben