Spezielle Step7 Code-Frage

ssound1de

Level-2
Beiträge
351
Reaktionspunkte
27
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi S7-Progger,

ich bräuchte bitte mal nen Tipp von Euch.
CPU = 315-2DP.

Hier ein Kurzauszug aus dem Code (der in Wirklichkeit wesentlich länger ist und in dieser Art häufig vorkommt).

Code:
M10:  AUF DB510
      U     M    121.1
      U     DBX  126.x  
      O     
      U     M    121.5
      U     DBX  152.x  
      O     
      U     M    122.1
      U     DBX  178.x
      O     
      ...

Ich würde den Code gerne in eine eigene "Standard FC" packen.
Einziger Knackpunkt: Die Bit-Nummer bei den DBX Zugriffen muss flexibel bleiben (soll in der FC-Schnittstelle übergeben werden)

Hat jemand hierzu einen Lösungsvorschlag?

Danke für Eure Zeit.
Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich kann da überhaupt keinen zusammenhang zwischen den operanden erkennen :confused:

wie dem auch sei, der zugriff über einen pointer sollte hier sehr gut funktionieren

mit

Code:
*
      L     #iByteByNumber              //LOAD MW NUMBER
      SLD   3                           //MADE POINTER  
      LAR1                              //AND LOAD IN AR1

erzeugst du den zugriff auf das byte, welches in iByteByNumber im INT format liegt ... die 3 stellen, die du verschiebst stellen die bitadresse dar und würde durch obiges eben null sein muß also erweitert werden durch:

Code:
*
      L     #iByteByNumber
      SLD   3
      L     #iBitByNumber
      +D    
      LAR1

dann kannst du direkt mit

Code:
*
      U     DBX [AR1,P#0.0]

auf dein eingestelltes bit im eingestellten byte zugreifen
 
Hi,

Vielen Dank für Eure Antworten.

Die Byte-Nummern sind so wie im Code unten beschrieben (also fest vergeben).
Die Bit-Nummer soll vom Aufrufenden Baustein an die FC übergeben werben. Sie bleibt dann die ganze FC über unverändert.

Ich wollte mir eben diese ganze AR1 Geschichte sparen (für jede DBX Abfrage neu addieren usw.)

Hier nochmal der komplette Code ... (kommt im Prog gut 30x vor).
Jedesmal ist x dann eine bestimmte Bit-Nummer.
Gibt es keinen kürzeren Weg - also irgendwie x durch einen Pointer zu ersetzen?

Code:
M10:  U     M    121.1
      U     DBX  126.x
      O     
      U     M    121.5
      U     DBX  152.x
      O     
      U     M    122.1
      U     DBX  178.x
      O     
      U     M    122.5
      U     DBX  204.x
      O     
      U     M    123.1
      U     DBX  230.x
      O     
      U     M    123.5
      U     DBX  256.x
      O     
      U     M    124.1
      U     DBX  282.x
      O     
      U     M    124.5
      U     DBX  308.x
      O     
      U     M    125.1
      U     DBX  334.x
      O     
      U     M    125.5
      U     DBX  360.x
      O     
      U     M    126.1
      U     DBX  386.x
      O     
      U     M    126.5
      U     DBX  412.x
      O     
      U     M    127.1
      U     DBX  438.x
      O     
      U     M    127.5
      U     DBX  464.x
      O     
      U     M    128.1
      U     DBX  490.x
      O     
      U     M    128.5
      U     DBX  516.x
      =     #FK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
nach gründlicher analyse deines codes habe ich folgendes festgestellt:

es sind 16 und-verknüpfungen
die schrittweite bei den merkern ist 4 bit
die schrittweite bei den datenbaustein-bits ist 26 byte

diese erkenntnisse schlagen sich im folgenden code nieder:

Code:
*
      TAR1  
      T     #dAR1Save
      TAR2  
      T     #dAR2Save

      L     #iByteMerker
      SLD   3
      L     #iBitMerker
      +D    
      LAR1  

      L     #iByteDB
      SLD   3
      L     #iBitDB
      +D    
      LAR2  

      AUF   #DBnumber

      L     16
next: T     #iLoopCounter
      U     M [AR1,P#0.0]
      U     DBX [AR2,P#0.0]
      SPB   ok
      +AR1  P#0.4
      +AR2  P#26.0
      L     #iLoopCounter
      LOOP  next
      R     #FK
      SPA   end
ok:   =     #FK

end:  L     #dAR1Save
      LAR1  
      L     #dAR2Save
      LAR2
*ROFL*
 
Zuletzt bearbeitet:
Ich wollte mir eben diese ganze AR1 Geschichte sparen (für jede DBX Abfrage neu addieren usw.)

U M 121.5
U DBX 152.x
O
U M 122.1
U DBX 178.x
O
U M 122.5
U DBX 204.x
O
U M 123.1
U DBX 230.x
O
U M 123.5
U DBX 256.x
[/code]

ich würde das so machen .... zwar nicht ohne ar aber fast !

L Wert // Dein wert von 0-7 für die Bitposi
LAR1

U M 121.5
U DBX [AR1,P#152.0]
O
U M 122.1
U DBX [AR1,P#178.0]
O
U M 122.5
U DBX [AR1,P#204.0]
O
U M 123.1
U DBX [AR1,P#230.0]
O
U M 123.5
U DBX [AR1,P#256.0]

so sollte es gehen ... einfach den Wert ändern und schon wird das in ein anderes Bit geschrieben

gruß
 
@vierlagig
Das ist doch mal ne schöne Schleife.
In der S5 hätt ich das im Schlaf gemacht, aber in der S7 bin ich leider nur selten unterwegs - letztes Projekt ist 2 Jahre her (habe deshalb Syntax-Probs).

DANKE!!!

Ähm - der AR Save nur falls nötig, oder?!

@stricky
Hmm - das andersherum zu machen ist auch gut - hab ich garnicht dran gedacht (wie gesagt - Syntax-Probs).
DANKE!!!
 
Zuletzt bearbeitet:
nach gründlicher analyse deines codes habe ich folgendes festgestellt:

es sind 16 und-verknüpfungen
die schrittweite bei den merkern ist 4 bit
die schrittweite bei den datenbaustein-bits ist 26 byte

diese erkenntnisse schlagen sich im folgenden code nieder:

Code:
*
      TAR1  
      T     #dAR1Save
      TAR2  
      T     #dAR2Save

      L     #iByteMerker
      SLD   3
      L     #iBitMerker
      +D    
      LAR1  

      L     #iByteDB
      SLD   3
      L     #iBitDB
      +D    
      LAR2  

      AUF   #DBnumber

      L     16
next: T     #iLoopCounter
      U     M [AR1,P#0.0]
      U     DBX [AR2,P#0.0]
      SPB   ok
      +AR1  P#0.4
      +AR2  P#26.0
      L     #iLoopCounter
      LOOP  next
      R     #FK
      SPA   end
ok:   =     #FK

end:  L     #dAR1Save
      LAR1  
      L     #dAR2Save
      LAR2
*ROFL*

so gehts natürlich auch
 
ja weil das hier ausführlich besprochen wird.
wenn du das erste mal in die steuerung siehst und diesen code siehst kommen sicher die??????:rolleyes:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
der auszug nicht,aber wenn jemand sowas macht,dann sieht mit sicherheit das ganze programm so aus.:confused:

spreche aus erfahrung.darf mich oft genug mit solch tollen codes herumschlagen.:rolleyes:
 
Es ist immer wieder verwunderlich wie vie Mühe sich manche geben ein anscheinend funktionierendes Programm so zu schreiben das nicht jeder gleich durchblickt. Na ja nur so ist man eben selbst der Held.:ROFLMAO:
 
@vierlagig
Also Danke nochmal.
Hoffe Du bist mir nicht böse, wenn ich den Code nochmal meinen Bedürfnissen angepasst habe.

Code:
      TAR1
      T #dAR1Save
      TAR2 
      T #dAR2Save
 
      L P#121.1
      LAR1 
 
      L P#126.0
      L #Datenbit
      +D 
      LAR2 
 
      AUF #DBnumber
 
      L 16
next: T #iLoopCounter
      U M [AR1,P#0.0]
      U DBX [AR2,P#0.0]
      = #FK
      SPB end
      +AR1 P#0.4
      +AR2 P#26.0
      L #iLoopCounter
      LOOP next
 
end:  L #dAR1Save
      LAR1 
      L #dAR2Save
      LAR2


Es ist immer wieder verwunderlich wie vie Mühe sich manche geben ein anscheinend funktionierendes Programm so zu schreiben das nicht jeder gleich durchblickt.
Warum anscheinend funktionierend?

Na ja nur so ist man eben selbst der Held.:ROFLMAO:
Darum geht's doch, oder!!! :cool:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Darum geht's doch, oder!!! :cool:

ja aber nur wenn man sich unersetzlich machen will.
kann man aber auch anders machen.
mit guter, verlässlicher,sauberer arbeit.

wenn dann nämlich mal wer anderer was dort suchen muß, wird er denjenigen verfluchen,der diesen tollen code geschrieben hat.:rolleyes:
 
wenn dann nämlich mal wer anderer was dort suchen muß, wird er denjenigen verfluchen,der diesen tollen code geschrieben hat.:rolleyes:

da meine bausteine beim ersteller 4lagig drin stehen habe und ich hier im forum schon oft verflucht wurde würde mich das nicht weiter stören ...

ABER: *ACK* ...saubere arbeit ist das bessere aushängeschild!
 
Zurück
Oben