Alarmbereich auf 0 vergleichen

A

Anonymous

Guest
Zuviel Werbung?
->Hier kostenlos registrieren
Guten Tag allerseits

Ich möchte einen parametrierbaren Baustein programmieren der folgende Parameter beinhaltet:

IN= ANY (Beliebige Adresse DB od. M mit Länge des Blocks)
OUT= Alarm vorhanden (Bool)

Ich möchte einfach mit einem ANY-Zeiger einen beliebigen Alarmblock z.B. M200.0 bis M340.0 auf ungleich 0 vergleichen.

Hat jemand von euch einen Tip wie ich das programmieren könnte?
Hab schlechte Kenntnisse was Pointer angeht.

Besten Dank im voraus
Gruss
 

sps-concept

Well-known member
Beiträge
2.235
Punkte Reaktionen
249
Pdf

Hallo Zefix,

die Pdf is nur dafür im Netz um die Bausteinschnittstelle und den Kommentar zu sehen. Der Baustein ist mit Know-How-Schutz versehen. Wenn ich hier alles verrate kann ich den Laden gleich zumachen ;-) Aber mit ner vernünftigen Auswertung der ANY-Parameter und genug Zeit zum experimentieren isses für jemanden ohne Berührungsängsten bezüglich Pointern zu schaffen.

MfG
André Räppel
 
OP
A

Anonymous

Guest
Werbung

Tolle Werbung, aber so nen Dreck kaufen sich doch nur Looser. Kann man davon eigentlich existieren? Ich war mal auf deiner Seite. Ich würde für keinen der Bausteine auch nur einen Cent ausgeben. Wechsel den Job!
 

sps-concept

Well-known member
Beiträge
2.235
Punkte Reaktionen
249
Besten Dank

Besten Dank an den Kritiker! Ich war auch mal auf meiner Seite. Ich finde schon dass der eine oder andere Baustein für andere interessant ist. Deshalb werden ja auch einige gekauft und die Kunden sind zufrieden. Leben kann man nich davon. Aber es werden ja auch noch ganze Projekte erstellt.. zb nach VW-Standard usw.

MfG
André Räppel

http://www.sps-concept.de
 

churchill

Well-known member
Beiträge
193
Punkte Reaktionen
4
Hallo zusammen,

ich möchte mit diesem Beitrag unser André nicht überfahren, wir schätzen sicherlich alle seine Unterstützung und Hilfestellung. :D

Nur möchte ich sagen, dass ich selber kein Pointer-Guru bin, bin aber an dieser Programmierart sehr interessiert und noch diesbezüglich noch am lernen.
Ich habe also diese Aufgabe als Schulung wahrgenommen und dementsprechend mich an die Arbeit gemacht. Natürlich mit Hilfe von zahlreichen Unterlagen die die indirekte Adressierung beschreibt.

Nach zahlreichen Arbeitsstunden ist mir diese Zangengeburt gelungen.
Nach meinen Tests sollte sie auch funktionieren. Aber ich wäre um jegliche berechtigte Kritik froh, vielleicht könnte man noch ein bisschen herumfeilen?

Code:
      L     P##Alarmdaten
      LAR1  
// ================================================================
// Prüfe Datenfeld
// ================================================================
      L     B [AR1,P#6.0]               // Lade aktuelles Datenfeld
      L     W#16#81                     // Kennung für 'I' 
      ==I   
      SPB   TYP                         // Sprung falls OK
      TAK                               // Tausche AKKU 1& 2
      L     W#16#83                     // Kennung für 'M'
      ==I   
      SPB   TYP                         // Sprung falls OK
      TAK                               // Tausche AKKU 1& 2
      L     W#16#84                     // Kennung für 'DB'
      ==I   
      SPB   DB                          // Sprung falls OK
      =     #Fehler                     // Fehler
      BEA   
DB:   L     W [AR1,P#4.0]
      T     #DB_Nummer
      AUF   DB [#DB_Nummer]
// ================================================================
// Prüfe die möglichen Datentypen  
// ================================================================
TYP:  L     B [AR1,P#1.0]               // Lade aktueller Datentyp
      L     W#16#2                      // Prüfe auf Kennung
      ==I   
      L     1
      SPB   CHCK                        // Sprung falls OK
      L     B [AR1,P#1.0]               // Lade aktueller Datentyp
      L     W#16#4                      // Prüfe auf Kennung Word
      ==I   
      L     2
      SPB   CHCK                        // Sprung falls OK
      L     B [AR1,P#1.0]               // Lade aktueller Datentyp
      L     W#16#6                      // Prüfe auf Kennung DWord
      ==I   
      L     4
      SPB   CHCK                        // Sprung falls OK
      =     #Fehler                     // Fehler
      BEA   
// ================================================================
// Prioritätsprüfung
// ================================================================
CHCK: L     W [AR1,P#2.0]               // Lade Wiederholungsnummer
      *I                                // multipliziere und
      T     #Byte_Nummer                // rette die Byte-Nummer

      CLR   
      =     #Fehler                     // Reset Fehler
      =     #Alarm                      // Setze Alarmbit
      L     D [AR1,P#6.0]               // Lade Startadresse 
      LAR1                              // Rette ins AR1
      L     B [AR1,P#0.0]               // Lade erstes Byte
      T     #temp_byte                  // Rette es temporär
      L     #Byte_Nummer                // Schleifenzähler
LOOP: T     #Schleifenzaehler
      L     D [AR1,P#0.0]
      L     0                           // Vergleich auf Null 
      <>D   
      SPB   ENDE                       // Sprung falls Vergleich ungleich 0
      L     #temp_byte
      +AR1  P#1.0
      +D    
      T     #temp_byte
      CLR   
      =     #Alarm                      // Reset Alarmbit
      L     #Schleifenzaehler
      LOOP  LOOP
      BEA   
ENDE: NOP   0
      SET   
      =     #Alarm                      // Setze Alarmbit
      BE

Ich bitte also diejenigen die dieses Programm austesten ihre Meinung in dieses Forum zu schreiben. Man kann nur daraus lernen. :wink:

mfG churchill
 

Onkel Dagobert

Well-known member
Beiträge
4.824
Punkte Reaktionen
876
Danke, churchill

Hallo churchill,

ich finde, du hättest wenigstens ein "Dankeschön" für deine Mühe verdient. Da dies unser "Gast" offenbar nicht für nötig hält, tue ich es ebend.

Danke, churchill! :)

Gruß, Onkel
 

stefan.fuhrmann

Active member
Beiträge
31
Punkte Reaktionen
0
ich habs momentan noch so gelöst:
U(
L DB2.DBD 180
L L#0
==D
)
U(
L DB2.DBD 188
L L#0
==D
)
= M 42.0


Ist nicht elegant, aber es tut auch (leider nicht parametrierbar)
was solls....
Wenn dein baustein tut werde ich ihn naturlich nur mit deiner zustimmung verwenden
gruss
stefan
 

Markus

Administrator
Teammitglied
Beiträge
5.217
Punkte Reaktionen
1.265
geht aber a bissel einfacher...

L DB2.DBD 180
L DB2.DBD 188
OD
L 0
<>D
= M 42.0

(nach dbd180 kommt aber 184 - oder ist das absicht?)



@churchill
finde es sehr schön und verständlich geschrieben, gefällt mir! danke!
 

Schmiegel

Active member
Beiträge
33
Punkte Reaktionen
1
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo Churchill,
danke für dieses ausführlich kommentierte Beispiel.

Ich habe zum Code einige Fragen:
1. Was macht die Variable #temp_byte?
2. Warum adressierst Du den Speicherbereich im Loop im Doppelwortmodus (L D [AR1,P#0.0])?
Wenn ich als Alarmdaten P#DB100.DBX0.0 Byte 10 übergebe, müsste das programm in deiner Version den Bereich DB100.DBB0 bis DBB12 statt bis DBB9 abfragen, da im letzten Schleifendurchgang DB100.DBD9 überprüft wird. Dies müsste auch bei WORD und DWORD Format des ANY-Pointers so sein.
3. Warum muss ich im Loop die Variable Alarm zurücksetzen?

Gruesse
Michael
 

churchill

Well-known member
Beiträge
193
Punkte Reaktionen
4
Hallo Stefan

Natürlich kannst du den Baustein verwenden, du kannst ihn auch nach dir benennen :wink:

mfG churchill

Hallo Schmiegel

1. Ich habe noch keine andere Möglichkeit gefunden, die Anzahl zu überprüfenden Bytes, zu addieren. Falls es noch geschicktere Lösungen gibt, dann wären sicher auch noch andere Forum-Kollegen froh darüber informiert zu werden. :D

2. Hast vollkommen recht, das erste Ausfeilen ist angekommen.
Richtig ist es mit L W[AR....

3. Dies hast du auch gut bemerkt. Es ist sicherlich nicht zwingend den Alarmbit in der Schleife zu reseten. Das ist eher eine Angewohnheit von mir, alles so gut wie es geht, 100%ige Sicherheit zu gewährleisten. Ich war früher mal mit einer S5-115U 945CPU betreff. der Übergabe des VKE's in das nächste NW, auf die Schnauze gefallen.Hatte einmal nicht funktioniert. Laut Siemens damals: Das kann vorkommen (1 zu 1000). Von da an versuche ich solche Dinge zu vermeiden, falls es eine Möglichkeit gibt. :wink:

Also man sieht dass es doch noch einige Kanten gibt.
Vielleicht, wenn es so weiter geht, werden wir alle ein 2-zeiliger Alarmbaustein zum testen haben. :lol:

Nochmals vielen Dank für euren Beitrag.
mfG churchill
 

stefan.fuhrmann

Active member
Beiträge
31
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
im header wird dein name stehen churchill
Ich fände es gar nicht so übel, wenn es so ne art up and download-area geben würde....
gruss an den admin!
stefan
(nicht falsch verstehen, ich find das forum gut!)
 

churchill

Well-known member
Beiträge
193
Punkte Reaktionen
4
Guten Abend Stefan, Guten Abend Admin,

Das mit einem Down-und Upload-Area wäre wirklich gar nicht so schlecht :D

Was meinen die anderen Kollegen dazu?
mfG churchill
 

stefan.fuhrmann

Active member
Beiträge
31
Punkte Reaktionen
0
Gut aber ausschliesslich wenn kein komerzieller hintergrund besteht
ich helfe gern, weil auch mir oft geholfen wurde.
Jeder der sagt, er kann S7 perfekt der lügt eben. man(n) lernt nie aus

mfg
stefan
 
Oben