# Habe da ein kniffliges Problem bei der Programmierung einer Fehlerauswertung



## Kayser (19 April 2006)

Komme hier einfach nicht mehr weiter!!
Hardware: Siemens CPU 414-2DP; CP 443-1 IT
Software: Simatic Step 7 V5.2 +SP1 (AWL, FUP)


Folgendes:
Im DB104 werden die Fehlerbits (Bereich zwischen DB104.DBX 128.0
bis DB104.DBX 255.7 ) dynamisch von der Anlage gesetzt. Diese könne manuell vom
Bediener wieder zurückgesetzt werden.
Als Fehlermaskierung habe ich den DB200 einen Bereich zwischen DB200.DBX 0.0 und DB200.DBX 127.7 zugeordnet. Hier wird statisch festgelegt, welcher Fehler eine Relevanz für die darauf folgende Auswertung hat.

Beispiel:
DB200.DBX 1.0 hat den bool’schen Wert ’1’ und
im DB104.DBX 129.0 ist durch einen Fehler ebenfalls auf ’true’ gesetzt, 
so ist dieser Fehler relevant.

Mein jetziges Konzept:
Wird ein Fehlerbit im DB104 gesetzt, soll nach dem Vergleich des DB104 mit dem DB200 die Bitadresse ermittelt werden. Im Anschluss daran soll automatisch eine Email generiert werden (hier verwende ich die Funktion FC50 (AG Long Send), die im DB10 als Anlage die Fehlernummer (= Fehlerbit) und eine Beschreibung des Fehlers im Klartext dynamisch eingefügt werden soll.

OB1

```
[COLOR=black]Netzwerk 1:[/COLOR]
[COLOR=black]Call FB 10, DB11[/COLOR]
 
[COLOR=black]Netzwek 2:[/COLOR]
[COLOR=black]Call FB 30 , DB30[/COLOR]
```
 
FB10

```
[COLOR=black]Netzwerk 1: Flankensteuerung, da beim Aufteten eines Fehlerfalls der Anlage nur eine Email versendet werden soll (Vermeidung von Dauerfeuer)[/COLOR]
 
[COLOR=black]U M11.0  // Aktivierung[/COLOR]
[COLOR=black]FP M11.1  // Flanke[/COLOR]
[COLOR=black]= M10.0  // Sendeimpuls[/COLOR]
 
[COLOR=black]Netzwerk 2: Kommunikationsbaustein[/COLOR]
[COLOR=black]CALL FC50[/COLOR]
[COLOR=black]ACT:= M10.0[/COLOR]
[COLOR=black]ID:= 1[/COLOR]
[COLOR=black]LADDR:= W#16#1FF8[/COLOR]
[COLOR=black]SEND:= P#DB10.DBX0.0 BYTE 558[/COLOR]
[COLOR=black]LEN:= 558[/COLOR]
[COLOR=black]DONE:= M10.1  // Ausführung der Versandbestätigung[/COLOR]
[COLOR=black]ERROR:= M10.2[/COLOR]
[COLOR=black]STATUS:= MW100[/COLOR]
 
[COLOR=black]Netzwerk 3: Speichern der Versandbestätigung[/COLOR]
[COLOR=black]U M10.1[/COLOR]
[COLOR=black]S M10.5  // Versandbestätigung[/COLOR]
[COLOR=black]U M10.4 // Rücksetzen der Versandbestätigung[/COLOR]
[COLOR=black]R M10.5 [/COLOR]
 
Netzwerk 3:
BE
```
 
FB 30

```
[COLOR=black]Netzwerk 1:[/COLOR]
[COLOR=black]TAR1 #Adr_1[/COLOR]
[COLOR=black]TAR2 #Adr_2[/COLOR]
 
[COLOR=black]Netzwerk 2:[/COLOR]
[COLOR=black]L 104[/COLOR]
[COLOR=black]T #Quell_DB[/COLOR]
 
[COLOR=black]L 200[/COLOR]
[COLOR=black]T #Maske_DB[/COLOR]
 
[COLOR=black]Netzwerk 3:[/COLOR]
[COLOR=black]LAR1 P#128.0[/COLOR]
[COLOR=black]LAR2 P#0.0[/COLOR]
 
[COLOR=black]Netzwerk 4:[/COLOR]
[COLOR=black]// Bit-Schleife[/COLOR]
[COLOR=black]L 127[/COLOR]
[COLOR=black]M002: T #zaehler_1[/COLOR]
 
[COLOR=black]L 7[/COLOR]
[COLOR=black]M001: T #zaehler[/COLOR]
 
[COLOR=black]AUF DB [#Quell_DB][/COLOR]
[COLOR=black]U DBX [AR1,P#0.0][/COLOR]
[COLOR=black]AUF DB [#Maske_DB][/COLOR]
[COLOR=black]U DBX [AR2,P#0.0]   [/COLOR]
[COLOR=black]= M30.0    // setzen der pos. Flanke[/COLOR]
 
[COLOR=black]+AR! P#0.1[/COLOR]
[COLOR=black]+AR2 P#0.1[/COLOR]
 
[COLOR=black]L #zaehler[/COLOR]
[COLOR=black]LOOP M001[/COLOR]
 
[COLOR=black]// Byte-Schleife[/COLOR]
[COLOR=black]LAR1 P#128.0[/COLOR]
[COLOR=black]LAR2 P#0.0[/COLOR]
 
[COLOR=black]+AR1 P#1.0[/COLOR]
[COLOR=black]+AR2 P#1.0[/COLOR]
 
[COLOR=black]L #zaehler_1[/COLOR]
[COLOR=black]LOOP M002[/COLOR]
 
[COLOR=black]Netzwerk 5:[/COLOR]
[COLOR=black]LAR1 #Adr_1[/COLOR]
[COLOR=black]LAR2 #ADR_2[/COLOR]
 
[COLOR=black]Netzwerk 6:[/COLOR]
[COLOR=black]BE[/COLOR]
```
 
Hat jemand mit der mathematische Operation LN Erkenntnisse im
Bezug auf die Berechnung der Bit-Position?
_Formel: bitposition = LN bitwert / LN 2_

Mein Problem ist der *Vergleich* der Datenbausteine als auch die *Fehlerbit-Berechnung* und zu guter Letzt die Implementierung der *Fehlernummer/Klartext* im Anhang der Email. 

Im Voraus sag ich schon mal DANKE!

Mfg
Kayser

P.S. Rückfragen und Anregungen erwünscht!


----------



## Rainer Hönle (19 April 2006)

Die Formel gilt nur, wenn nur ein Bit gesetzt ist. Ansonsten wird wahrscheinlich nur das höchstwertige Bit erkannt.


----------



## Ralle (19 April 2006)

Ich würde auf jeden Fall Wort- oder Doppelwortweise vorgehen, das Fehlerwort und das Freigabewort miteinander "verunden" und bei einem Vegleichs-Ergebnis > 0 das entsprechende Bit ermitteln, sonst mit dem nächsten Wort weitermachen, das verkürzt die Schleife enorm.


----------



## Rainer Hönle (20 April 2006)

Haben Sie auch einen Baustein für den letzten Wert? Wann soll die Mail geschickt werden? Nur bei kommenden Fehlern oder auch bei gehenden?


----------



## Kayser (21 April 2006)

Hallo Herr Hönle, 

_Haben Sie auch einen Baustein für den letzten Wert?_ 
Da kann ich Ihnen leider nicht ganz folgen. 
Was meinen Sie mit dem letzten Wert?

_Wann soll die Mail geschickt werden? _
_Also beim Auftreten eines Fehlers, wird ein Bit im DB104 gesetzt._
_Durch einen Vergleich mit der Fehlermaskierung DB200 soll die Relevanz, _
_ob eine Email generiert wird oder nicht, entscheiden._

_Ist der Fehler relevant, so soll die Bitnummer (Fehlernummer) im Anhang_
_der Email eingesetzt werden und anschließend automatisch verschickt._
_Dieses muß natürlich flankengesteuert abgewickelt werden, da sonst _
_eine Überflut von Email versand wird._
_Taucht der Fehler nach der Fehlerquittierung wieder auf, so soll_
_erneut eine Email mit der Fehlernummer versand werden._


----------



## Rainer Hönle (21 April 2006)

Kayser schrieb:
			
		

> Haben Sie auch einen Baustein für den letzten Wert?
> Da kann ich Ihnen leider nicht ganz folgen.
> Was meinen Sie mit dem letzten Wert?


Sie haben einen Baustein mit der Freigabe (DB 200) und einen Baustein mit den Aktualwerten (DB 104). Um einen Flankenwechsel zu erkennen benötigt man noch den alten Zustand. Oder sind im DB 104 nicht die Aktualwerte sondern die Flanken?


----------



## Kayser (24 April 2006)

Hallo, 
jetzt verstehe ich die Problematik! Also wenn kein Fehler registriert wurde, 
sind alle Aktualwerte "false" gesetzt. Beim Fehler wird ein Bit des 
entsprechenden Fehlerortes gesetzt, z.B. DB104.DBX 129.1. Dieser steht 
solange an bis eine Quittierung vom Bediener erfolgt.
Ist der Fehler als relevant eingestuft (Vergleich mit den statischen 
Werten im DB200), so soll die Bitadresse ermittelt werden und in den 
Anhang der Email implementiert und ein Versand angestoßen werden.

Klar, wird jetzt wieder der DB104 verglichen, so würde wiederum eine 
Email versand. Somit muss alle Aktualwerte sammeln und bearbeiten.
D.h. wird im DB104 ein Bit von 0 -> 1 gesetzt, so muss ich diesen Wert 
andernorts speichern. 

Wo ich jetzt gerade noch hänge ist, wie kann ich das umsetzen?

Schöne Grüß von der Küste

Kayser


----------



## Rainer Hönle (24 April 2006)

Einfach noch einen Speicherbereich (z.B. in einem DB) einführen, in dem die Zustände aus dem letzten Zyklus stehen. Nur wenn ein Flankenwechsel nach 1 erfolgt (aktueller Zustand 1, letzter Zustand 0, Freigabebit 1) wird dann die Mail verschickt.


----------



## Kayser (24 April 2006)

ein wichtiger Gedankenanstoß:

DANKE!!!!


----------

