TIA FM350-2 Zwei Werte miteinander vergleichen

JanM

Level-1
Beiträge
1
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

wir möchten einen Zählerstand mit einem von uns vorgegebenen Wert vergleichen. Die Baugruppe zählt und schreibt den aktuellen Zählwert in ACT_CNTV0. Jetzt möchten wir, dass wir einen Zählstand vorgeben und beim erreichen des Zählstandes der Ausgang Q0 gesetzt wird.

Unser Zählstand wird wie folgt gezählt:

Code:
      CALL  CNT2RDPN , "CNT2RDPN_DB"
         DB_NO    :=60
         RET_VALU :=#merker1
      NOP 0
      L     100
      T     "DB_Zaehler".JOB_RD.NO

Jetzt möchten wir unseren zu erreichenden Zählstand eingeben.

Code:
      U     "DB_Zaehler".JOB_WR.BUSY
      U     "Tag_11"
      SPB   no2
      L     1000
      T     %DBD116
      L     32
      T     "DB_Zaehler".JOB_WR.NO
      CALL  CNT2WRPN , "CNT2WRPN_DB_2"
         DB_NO    :=60
         RET_VALU :=#merker4

no2:  NOP 0

In CMP_VAL0 steht nun auch der Wert 1000.

Nun wissen wir nicht, wie wir den Ausgang setzen wenn unser Zähler den Wert 1000 erreicht. Den Ausgang haben wir bereits freigegeben.

Wir möchten nicht die Parametriermaske nutzen sondern unsere Vergleichswerte immer flexibel ändern können.

Vielen Dank für eure Hilfe!
 
Zuletzt bearbeitet:
Verbal beschrieben, Zählerstand laden und mit Vergleichswert auf "gleich oder größer" vergleichen, damit dann den Ausgang setzen ...
Oder verstehe ich da etwas falsch?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zählerstände im OB1 vergleichen und Ausgang schalten kann u.U. zu langsam sein.
Ich vermute, die Zähler-Hardware soll selber direkt den Dosier(?)-Ausgang schalten. Dafür kann man die Zählerkanäle zur Laufzeit parametrieren und Starten.
Welche Jobs man benutzen muß und Beispielprogramme sind im FM350-2-Handbuch zu finden.

Harald
 
Hallo JanM,

es sind drei Schritte nötig.

1. Das schaltverhalten des Ausganges DQ0 in der HW-Konfig der FM parametrisieren.

2. Den Vergleichswert in den Kanal DB schreiben. L 1000 T DB17.DBD18 (Bei mir DB17)

3. Mit den Baustein "CNT_CTRL" das schreiben des Vergleichswert starten. (hier über M30.1)

Im Bild 3 wird bei mir noch der Aktualwert mit M30.0 auf 0 gesetzt.

Liegt nun der Istwert innerhalb des Vergleichswert (siehe Bild 1) wird der Ausgang Ein geschaltet.

Über "STS_CMP1" des DB kann man den Status abfragen.

FM350-2.jpg FM350-2-2.jpg FM350-2-3.jpg

mfg Harald
 
Nun wissen wir nicht, wie wir den Ausgang setzen wenn unser Zähler den Wert 1000 erreicht.
Das Verhalten der Digitalausgänge wird in der Parametriermaske in HW Konfig festgelegt (z.B. (x) Einschalten bei Zählerstand >= Vergleichswert) und kann nicht im Programm geändert werden. Den Vergleichswert kann man aber zur Laufzeit umparametrieren. Dein Code mit dem Job 32 und CNT2WRPN sieht eigentlich gut aus.

Detaillierte Beschreibung findest Du im Gerätehandbuch
8.4 Einmalig Zählen
8.10 Einstellung: Verhalten der Digitalausgänge

Vielleicht hilft Dir das im Handbuch beschriebene Beispielprogramm in der TIA-Version:
Programmbeispiel FM 350-2 zXX34_01_FM350-2 für TIA Portal

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
      U     "DB_Zaehler".JOB_WR.BUSY
      U     "Tag_11"
      SPB   no2
      L     1000
      T     [COLOR="#FF0000"]%DBD116[/COLOR]                 <----- schreibe besser voll qualifiziert [COLOR="#0000FF"]"DB_Zaehler".CMP_VAL0[/COLOR]
      L     [COLOR="#FF0000"]32[/COLOR]                      <----- muß [COLOR="#0000FF"]30[/COLOR] für CMP_VAL0 sein
      T     "DB_Zaehler".JOB_WR.NO
      CALL  CNT2WRPN , "CNT2WRPN_DB_2"
         DB_NO    :=60
         RET_VALU :=#merker4

no2:  NOP 0

In CMP_VAL0 steht nun auch der Wert 1000.
Die 32 - ist das ein Tippfehler? Du arbeitest mit Zählerkanal CH0, zum setzen von CMP_VAL0 muß die JOB_WR.NO 30 benutzt werden.


Das Auslesen aller 8 Kanäle der FM350-2 mache ich so:
Code:
//*** Invoke control function for counter module FM350-2 ***
//assign module addresses
      L     W#16#130                    //E 304 module address
      T     "DB_FM350-2(1)".MOD_ADR

//assign the number of the counter-channel-DB for CNT2-FCs
      L     5                           //DB5 "DB_FM350-2(1)"
      T     #CNT2_DB

      AUF   "DB_FM350-2(1)"             //for reference list

      CALL  "CNT2_CTR"
       DB_NO:=#CNT2_DB


//*** Open SW-gates and signalize the module state at module-LED DQ7 ***

      ...
      =     "DB_FM350-2(1)".CONTROL_SIGNALS.SW_GATE0
      ...

      U     "DB_FM350-2(1)".CHECKBACK_SIGNALS.PARA    //FM350-2 parameters assigned?
      =     "DB_FM350-2(1)".CONTROL_SIGNALS.CTRL_DQ7

      U     "AS_Clock_1Hz"
      ON    "DB_FM350-2(1)".CHECKBACK_SIGNALS.STS_TFB
      =     "DB_FM350-2(1)".CONTROL_SIGNALS.SET_DQ7


//*** Read count/measurement values from FM350-2 ***
      U     "DB_FM350-2(1)".CHECKBACK_SIGNALS.PARA    //FM350-2 ist fertig mit Startup?
      SAVE                              //Set BIE
      SPBN  END                         //No, process no application

//read-job active?
      L     "DB_FM350-2(1)".JOB_RD.NO   // 0 indicates: no active read-job
      PUSH
      OW
      O     <>0
      O     "DB_FM350-2(1)".JOB_RD.BUSY // read-job active? 
      SPB   RDDO                        // Yes, process the job

//trigger a new read job
//If PG-testmode is active (STS_TFB=TRUE), then only read the count values every 100 ms,
//if PG-testmode is not active, then read so fast as possible.
      U     "AS_Clock_10Hz"
      FP    #RD_Trig_FPM
      ON    "DB_FM350-2(1)".CHECKBACK_SIGNALS.STS_TFB
      SPBN  RDEN                        //No new reading job

      L     100                         //job_no 100 for count channel 0 to 3
      U     #Job_Sel                    //now count channel 4 to 7?
      SPBN  JOB
      L     101                         //job_no 101 for count channel 4 to 7
JOB:  T     "DB_FM350-2(1)".JOB_RD.NO

//Load counter values from FM350-2
RDDO: CALL  "CNT2_RD"
       DB_NO  :=#CNT2_DB
       RET_VAL:=#RD_RETVAL

RDEN: UN    BIE                         //Error: job_no unknown or RD_RETVAL with error
      =     #RD_ERROR

      U     "DB_FM350-2(1)".JOB_RD.DONE
      SPBN  RDDE
      R     "DB_FM350-2(1)".JOB_RD.DONE

      L     #RD_RETVAL
      T     #RD_RETVAL_SAV

      UN    #Job_Sel                    //change to the other channels (0-3 <-> 4-7)
      =     #Job_Sel

RDDE: L     #RD_RETVAL_SAV              //für Beobachten
END:  SET

Braucht man einen Zählerstand in jedem OB1-Zyklus, dann kann man PEW/PED ab Baugruppenadresse + 8 lesen (werden alle 2 ms aktualisiert). Siehe Handbuch S.51 Direktzugriffe

Harald
 
Zurück
Oben