DB-Änderung melden

G

ghost

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe folgendes Problem:
ich möchte gerne einen alt-neu-Vergleich eines DB´s machen um somit festellen zu können, ob sich die Daten im DB geändert haben.Weiter wäre es nicht schlecht, wenn ich irgenwie ein Signal bekommen würde, welches ich zum Triggern der Send/Resive-Schnittstelle verwenden könnte, damit die Daten aus dem DB nicht zyklisch gesendet werden, sondern nur bei Datenänderung.
Kann mir da einer einen Tip geben wie ich das realisieren kann???

Danke schon mal
 
dazu kannst du den fc10 aus iec nehmen.
den datenbereich deiner dbs mit dem sfc20 in je eine temp-variable vom typ string kopieren. der fc10 vegleicht die nun auf =


Code:
      CALL  SFC   20
       SRCBLK :=P#DB48.DBX0.0 BYTE 20
       RET_VAL:=MW40
       DSTBLK :=#st1
      NOP   0

      CALL  SFC   20
       SRCBLK :=P#DB49.DBX0.0 BYTE 20
       RET_VAL:=MW40
       DSTBLK :=#st2
      NOP   0

      CALL  FC    10
       S1     :=#st1
       S2     :=#st2
       RET_VAL:=M33.0
      NOP   0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Voraussetzung: In dem DB werden alle Werte als Null gespeichert (bei mir is das nen Fehler-DB, der bei eins nen Fehler am OP anzeigt dann).

Von dem DB ne 1:1 kopie im gleichen Projekt machen. Bei mir immer DB 100 (FehlerDB) DB 101 (SpiegelDB).

Um eine Änderung (also Fehler) festzustellen:

Code:
      U     #NICHT_NULL
      R     #NICHT_NULL

      L     #START_ADR
      T     MW   200
      L     #ANZAHL
      +I    
      T     #LAENGE

// SCHLEIFEN DURCHLAUF
LOOP: NOP   0
      AUF   #QUELL_DB                   // WERT AUS QUELL_DB EINLESEN
      L     MB   201
      SLW   3
      LAR1  
      L     DBB [AR1,P#0.0]
      L     0                           // WERT MIT NULL VERGLEICHEN
      ==I   
      SPB   same
      UN    #NICHT_NULL                 //ERGEBNISBIT SETZEN
      S     #NICHT_NULL
      BEA   
same: NOP   0
      L     MW   200
      INC   1
      T     MW   200
      L     #ANZAHL
      <=I   
      SPB   LOOP

IN:
QUELL_DB
START_ADR
ANZAHL
OUT:
NICHT_NULL // 1 bei min. einer Änderung
TEMP:
LAENGE

Wenn du dann den Fehler oder die Änderung ausgewertet hast, musst du
deinen Spiegel-DB wieder reseten:

Code:
      L     #START_ADR
      T     MW   200
      L     #ANZAHL
      +I    
      T     #LAENGE

// SCHLEIFEN DURCHLAUF
LOOP: NOP   0
      AUF   #QUELL_DB                   // WERT AUS QUELL_DB EINLESEN
      L     MB   201
      SLW   3
      LAR1  
      L     0
      T     DBB [AR1,P#0.0]


      NOP   0
      L     MW   200
      INC   1
      T     MW   200
      L     #ANZAHL
      <=I   
      SPB   LOOP

IN:
QUELL_DB
START_ADR
ANZAHL
TEMP:
LAENGE

Gruß
 
@CrazyCat:

Du musst den DB, in dem du deinen String hast, in die VAT eintragen!

Z.B. Hast du einen String als statische Variable mit der Startadresse 256.0 im FB6 / DB6 eingetragen, musst du anschließend diese Startadresse in deiner VAT eintragen


VAT:

Operand------------Symbole---------Anzeige--------Satuswert

DB6.DBB 256----------s1-------------Zeichen
DB6.DBB 257----------s2-------------Zeichen
DB6.DBB 258----------s3-------------Zeichen
. -------------------------------------------- .
. -------------------------------------------- .
. -------------------------------------------- .
DB6.DBB 511---------s511------------Zeichen

Die Anzeige auf "Zeichen" stellen und dann kannst du den String beobachten.

Gruß
ghost
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Soweit so gut. Die Strings werden angezeigt, allerdings erhalte ich immer nur die Anfangswerte, obwohl ich die Strings mit diesem Block in den DB speichere.

CALL "BLKMOV"
SRCBLK :=#s_datum
RET_VAL:=MW8
DSTBLK :="dfx_data".date1

Das MW8 ist 0 d.h. es wird gemeldet das der String erfolgreich geschrieben wurde.

"dfx_data".date1 ist ebenfalls ein String der im DB liegt. Warum sehe ich keine Aktualwerte bzw. werden keine Strings in den DB geschrieben?
 
woher bekommst du #s_datum

poste mal den code

und wie sieht das ziel absolut adressiert aus?
 
CALL "R_STRNG"
IN :="data_in".Temp1
RET_VAL:=#str


CALL "BLKMOV"
SRCBLK :=#str
RET_VAL:=MW3
DSTBLK :="dfx_data".temp_1_D

Der Wert Temp1 ist in einem DB als REAL Variable gepseichert. Der Wert wird aus dem DB ausgelesen, in einen String konvertiert und sollte in einem anderen DB gespeichert werden.

Absolut wäre das Ziel DB130.DB28
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das prob ist glaub ich nich die sfc20 sondern die fc30

ich hab mal was getestet

temp: st1 String[14] adresse:20
Code:
      CALL  FC    30
       IN     :=3.150000e+000
       RET_VAL:=#st1

      L     LD    20
      T     MD    20
      L     LD    24
      T     MD    24
      L     LD    28
      T     MD    28
      L     LD    32
      T     MD    32
da stehen nur nullen drin.
im moment keine ahnung warum
 
Ich korrigiere auch meine Angabe. Es stehen nicht die Anfangswerte sondern nur Nullen drin. Anfangs war das mein Anfangswert, aber den habe ich jetzt geändert und trotzdem einen String voller Nullen.

Liegt es an der Konvertierung oder am schreiben eines Strings in einen DB.

Ich muß auch INT - Konvertieren -> gleicher Effekt.
 
Es funktioniert. Folgende Vorgehensweise:

1. den FC30 aus der stdlib verwenden, nicht den aus der standard library
2. den FC30 nur aus einem FB aufrufen, mit OBs oder FCs funktioniert es interessanterweise nicht

Klingt komisch, ist es auch.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,


das funktioniert vermutlich nicht, weil man
bei 'Stringvariablen' in den Lokaldaten vor Aufruf
der FC 30 die definierte Länge des Strings manuell
in Byte 0 eintragen muss.

(siehe auch in der Hilfe zu FC30 --klick auf 'STRING')


mfg.

Rolf
 
ahhhh. hab ich auch mal was gelernt. :D

so gehts
Code:
      L     14
      T     LB    20

      CALL  FC    30
       IN     :=3.150000e+000
       RET_VAL:=#st1

      L     LD    20
      T     MD    20
      L     LD    24
      T     MD    24
      L     LD    28
      T     MD    28
      L     LD    32
      T     MD    32
 
Die Umwandlung des Real funktioniert, dafür habe ich jetzt das selbe Problem bei der Umwandlung von INT - Variablen in einen STRING.

Ich habe einen FB, einen String[3] (Vorzeichen + 2 stellige Zahl) als temporäre Variable angelegt und bekomme trotzdem nur Nullen!

Warum?
 
geht ganz genauso. nicht vergessen die stringlänge vorher anzugeben

Code:
      L     4                           //länge von #string_1
      T     LB     0

      CALL  FC    16
       I      :=347
       RET_VAL:=#string_1
      NOP   0

      L     LB     0
      T     MB    30
      L     LB     1
      T     MB    31
      L     LB     2                    //vorzeichen
      T     MB    32
      L     LB     3                    //ab hier beginnt  der wert
      T     MB    33
      L     LD     4
      T     MD    34
 
Zurück
Oben