Step 7 Hilfe bei einer FM350-2

Zuviel Werbung?
-> Hier kostenlos registrieren
danke dir. die ham ne magge :O das mit dem :p hatte ich versucht. aber das kann man ja nicht in der Variablentabelle so angeben. da muss ich also nen normale EW-Variable anlegen und diese im Baustein hinten mit :p erweitern... wer kommt auf sowas? omg, ich wusste schon, warum ich so lange in der classic welt entwickelt habe.
 
Noch eine Frage, wo kann ich die Adressen der integrierten E/As also die digitalen anpassen? ich finde nur die Adressen der Zählereingänge.
 
Meinst Du die digitalen E/A der FM350-2? Die belegen keine E/A-Adressen im Adressraum der CPU, die müsstest Du im Zähler-DB ansprechen (siehe DBX41.0-7 und DBX22.0-7).
Wenn man die E/A nicht für die Zählerkanäle braucht, dann kann man die E/A allgemein im SPS-Programm verwenden. In meinem FB wo ich die Zählerstände auslese (siehe FM350-2_Read.AWL.txt in #4) binde ich die E/A als E84.0-7 und A84.0-7 ins PAE/PAA ein. (blauer Code)
Außerdem lasse ich für Diagnosezwecke der Elektriker die letzte Ausgangs-LED (.7) flackern, wenn sich bei irgendeinem Zähler der Zählerstand ändert, weil die Zählereingänge keine LEDs haben.
Code:
NETWORK
TITLE =[COLOR="#008000"]Open SW-gates and signalize the module state at module-DQ7
//DI0..DI7 is used as E84.0..E84.7 
//DQ0..DQ6 is used as A84.0..A84.6
//DQ7 is used as Module-Diag-LED
//OFF   : module not in work
//ON    : module work properly
//BLINK : PG-testmode active
//INVERT: activity on counters (counter inputs A/B changed)[/COLOR]

...

[COLOR="#008000"]//State for LED[/COLOR]
      U     #AS_Clock_1Hz; 
      ON    "DB_FM350-2(1)".CHECKBACK_SIGNALS.STS_TFB; 
      =     #tempQ; 
[COLOR="#008000"]//+ Flicker[/COLOR]
      U     #tempQ; 
      XN    "DB_FM350-2(1)".CHECKBACK_SIGNALS.STS_DQ7; 
      U     #Cntx_activity; 
      X     #tempQ; 
[COLOR="#008000"]//      =     "DB_FM350-2(1)".CONTROL_SIGNALS.SET_DQ7[/COLOR]
      =     A84.7; [COLOR="#008000"]//--> "DB_FM350-2(1)".CONTROL_SIGNALS.SET_DQ7[/COLOR]


[COLOR="#0000FF"][COLOR="#008000"]//connect the Module-DI/DQ to PLC-IO IB84 and QB84[/COLOR]
      SPA   MIO4; 
      U     "DB_FM350-2(1)".CHECKBACK_SIGNALS.STS_DI0; [COLOR="#008000"]//dummy access for compare DB-Address[/COLOR]
      =     "DB_FM350-2(1)".CONTROL_SIGNALS.SET_DQ0; [COLOR="#008000"]//dummy access for compare DB-Address[/COLOR]

MIO4: L     DB5.DBB   41; [COLOR="#008000"]//"DB_FM350-2(1)".CHECKBACK_SIGNALS.STS_DIx[/COLOR]
      T     EB    84; 

      L     AB    84; 
      T     DB5.DBB   22; [COLOR="#008000"]//"DB_FM350-2(1)".CONTROL_SIGNALS.SET_DQx[/COLOR][/COLOR]

...

NETWORK
TITLE =[COLOR="#008000"]activity indicator
//Make a simple activity indicator because FM350-2 don't have CountInput-LEDs.[/COLOR]

      L     "DB_FM350-2(1)".ACT_CNTV0; 
      L     "DB_FM350-2(1)".ACT_CNTV1; 
      +D    ; 
      L     "DB_FM350-2(1)".ACT_CNTV2; 
      +D    ; 
      L     "DB_FM350-2(1)".ACT_CNTV3; 
      +D    ; 
      L     "DB_FM350-2(1)".ACT_CNTV4; 
      +D    ; 
      L     "DB_FM350-2(1)".ACT_CNTV5; 
      +D    ; 
      L     "DB_FM350-2(1)".ACT_CNTV6; 
      +D    ; 
      L     "DB_FM350-2(1)".ACT_CNTV7; 
      +D    ; 
      L     #Cntx_last; 
      TAK   ; 
      T     #Cntx_last; 
      <>I   ; 
      =     #Cntx_activity;

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Meinst Du die digitalen E/A der FM350-2? Die belegen keine E/A-Adressen im Adressraum der CPU, die müsstest Du im Zähler-DB ansprechen (siehe DBX41.0-7 und DBX22.0-7).
Wenn man die E/A nicht für die Zählerkanäle braucht, dann kann man die E/A allgemein im SPS-Programm verwenden. In meinem FB wo ich die Zählerstände auslese (siehe FM350-2_Read.AWL.txt in #4) binde ich die E/A als E84.0-7 und A84.0-7 ins PAE/PAA ein. (blauer Code)
Außerdem lasse ich für Diagnosezwecke der Elektriker die letzte Ausgangs-LED (.7) flackern, wenn sich bei irgendeinem Zähler der Zählerstand ändert, weil die Zählereingänge keine LEDs haben.

Harald
Ja, die meine ich. Irgendwie kapier ich nur nicht, wie dann die E/As angesteuert werden. Ich hab das Programm von dir so übernommen. Beim übersetzen sagt mit TIA Das E/As verwendet werden, die nicht in der Hardware projektiert sind. Halt die E/As der FM-Baugruppe.
Mir fehlt noch der Zusammenhang wie die E/As an der FM angehen/eingelesen werden, wenn ich die E84.0-7 und A84.0-7 nirgends projektiert hab. Oder sind das die eigentlichen E/As der FM?

DI: "DB_FM350-2(1)".CHECKBACK_SIGNALS.STS_DI0; //dummy access for compare DB-Address
DO: "DB_FM350-2(1)".CONTROL_SIGNALS.SET_DQ0; //dummy access for compare DB-Address

Danke
 
Der FC CNT2_CTR kopiert die Statussignale und Digital-E/A der FM350-2 zwischen der Baugruppe und dem Zähler-DB.
Und dieser Code kopiert die E/A zwischen Zähler-DB und PAE/PAA der CPU:
Code:
MIO4: L     DB5.DBB   41; [COLOR="#008000"]//"DB_FM350-2(1)".CHECKBACK_SIGNALS.STS_DIx[/COLOR]
      T     EB    84; 

      L     AB    84; 
      T     DB5.DBB   22; [COLOR="#008000"]//"DB_FM350-2(1)".CONTROL_SIGNALS.SET_DQx[/COLOR]
Deshalb kann ich danach im restlichen SPS-Programm die E/A der Baugruppe einfach so ansprechen:
Code:
      O     E84.0;
      O     E84.1;
      =     #irgendwas;

      U     #AS_Clock_1Hz;
      =     A84.0;

      U     #irgendwas;
      =     A84.1;

Wenn Du die TIA-Warnungen nicht willst, dann kannst Du das Kopieren der EB84/AB84 weglassen und die E/A der Baugruppe so ansprechen:
Code:
      O     "DB_FM350-2(1)".CHECKBACK_SIGNALS.STS_DI0; [COLOR="#008000"]//FM350-2 DI .0[/COLOR]
      O     "DB_FM350-2(1)".CHECKBACK_SIGNALS.STS_DI1; [COLOR="#008000"]//FM350-2 DI .1[/COLOR]
      =     #irgendwas;

      U     #AS_Clock_1Hz;
      =     "DB_FM350-2(1)".CONTROL_SIGNALS.SET_DQ0;   [COLOR="#008000"]//FM350-2 DQ .0[/COLOR]

      U     #irgendwas;
      =     "DB_FM350-2(1)".CONTROL_SIGNALS.SET_DQ1;   [COLOR="#008000"]//FM350-2 DQ .1[/COLOR]

Der nie ausgeführte Code
Code:
      SPA   MIO4; [COLOR="#008000"]//nachfolgenden Code überspringen![/COLOR]
      U     "DB_FM350-2(1)".CHECKBACK_SIGNALS.STS_DI0; [COLOR="#008000"]//dummy access for compare DB-Address[/COLOR]
      =     "DB_FM350-2(1)".CONTROL_SIGNALS.SET_DQ0; [COLOR="#008000"]//dummy access for compare DB-Address[/COLOR]
ist dafür, daß ich die absoluten DBX-Anfangsadressen im Zähler-DB (DBX41.0 und DBX22.0) für die Verwendung in den nachfolgenden absolut adressierten Byte-Zugriffen (DBB41 und DBB22) sehe (ich wollte nicht 16 Bits einzeln kopieren), und damit ich die Zugriffe in den Referenzdaten finde.

Harald
 
Jetzt habe ich es kapiert, bin selber nochmal den Code durchgegangen und hatte die Zuweisungen auf die imaginären Ein- und Ausgänge gefunden. Danke dir für deine Ausdauer! :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Weil ich gerade eine FM350-2 in Betrieb genommen habe mit Durchflussmessern mit Hallsensoren mit Open-Collector-NPN-Ausgängen, hier mal 3 Schalt-Varianten, wie man solche Sensoren an die FM350-2 anschließen kann. (Wir hatten uns für die Variante "NAMUR 8,2V" entschieden.)

(1) als "NAMUR-Sensor" mit Pullup-Widerstand 1 kOhm 1/4 W an der 8,2V-Sensorversorgung.
Die betreffende Kanalgruppe muss als "Namur" spezifiziert werden und beim Geber des Kanals die "Hardwareüberwachung" abgeschaltet werden.

(2) als 24V-Sensor mit Pullup-Widerstand (1,8 ..) 2,2 kOhm 1/2 W an 24V.
(die Standard "billig" Lösung NPN an 24V-PNP-Digitaleingängen) da wird etwas Wärme verbraten, und es entstehen nur 13,6V (.. 14,8V) Eingangsspannung am SPS-Eingang (braucht mindestens 11V). Der Widerstand darf deshalb nicht wesentlich größer als 2,2 kOhm sein. Und nicht kleiner als 1,5 kOhm, sonst wird der Sensor-Ausgang überlastet (hier max 20 mA)

(3) mit schnellem Optokoppler,
z.B. Weidmüller 895072 TOS 24VDC/48VDC 0,1A oder 895078 TOP 24VDC/48VDC 0,1A, die können bis 3 kHz Schaltfrequenz, d.h. max 3000 Impulse/s bzw. die Impulse und die Impuls-Pausen vom Durchflussmesser müssen jeweils mindestens 0,17ms lang sein.
 

Anhänge

  • NPN_an_FM350-2.pdf
    367,4 KB · Aufrufe: 3
  • FM350-2_Namur_1.png
    FM350-2_Namur_1.png
    24,9 KB · Aufrufe: 8
  • FM350-2_Namur_2.png
    FM350-2_Namur_2.png
    18,5 KB · Aufrufe: 8
Weil ich gerade eine FM350-2 in Betrieb genommen habe mit Durchflussmessern (...)
Fortsetzung der Erklärung der Lösung:

In der FM350-2 sind alle Kanäle auf "Endlos Zählen" eingestellt. Die Baugruppe wird initialisiert und gestartet und die Zählerstände der Kanäle 0..3 aus der Baugruppe werden direkt über die PEW (jeweils nur Low-Word reicht) in den Zähler-DB "DB_FM350-2(1)" eingelesen mit meinem bewährten FB "350-2_Read" siehe Beitrag #4 (da ist auch der Programmcode als AWL-Quelle FM350-2_Read.AWL.txt).

An den Zählerkanälen 0..3 der FM350-2 sind Durchflussmesser angeschlossen mit K-Faktor 1000 Pulse/Liter. Mit einem weiteren FB "FB_Wasser_Durchfluss" wandele ich die Zählerstände der Zählkanäle in die Durchflussrate in Liter/s. Dafür werden jeweils über 500ms die Differenzen des Zählerstandes addiert (~ gezählt) und dann die Pulse/500ms in Liter/s umgerechnet. So entsteht alle halbe Sekunde ein neuer Messwert - für die Visu reicht das.

Die beiden FB werden normal im OB1 aufgerufen. Während der Zykluszeit des OB1 können sich die Zählerstände nicht um mehr als 32767 ändern, daher reicht es, nur die Low-Words der Zählerstände zu verarbeiten. Weil ich immer nur die Differenz des Zählerstandes zum Zählerstand im Zyklus vorher verarbeite, brauche ich den Zählerüberlauf nicht besonders beachten. Dank Zweierkomplement-Darstellung von INT und DINT funktioniert die Differenzberechnung ganz automatisch ohne den Überlauf zu beachten. Für einen Zählkanal sieht das so aus:
Code:
FUNCTION_BLOCK "FB_Wasser_Durchfluss"
TITLE =Impulse von 4 Durchflussmessern an FM350-2 in Liter/s umwandeln
AUTHOR : PN_DP
FAMILY : FM_CNT
VERSION : 0.1

VAR_INPUT
  ACT_CNT1 : DINT ; //Zählerstand
  ACT_CNT2 : DINT ; //Zählerstand
  ACT_CNT3 : DINT ; //Zählerstand
  ACT_CNT4 : DINT ; //Zählerstand
END_VAR
VAR_OUTPUT
  Flowrate1 : REAL ; //Durchfluss l/s
  Flowrate2 : REAL ; //Durchfluss l/s
  Flowrate3 : REAL ; //Durchfluss l/s
  Flowrate4 : REAL ; //Durchfluss l/s
END_VAR
VAR
  old_CNT1 : INT ;
  Cnt_500_1 : DINT ;
  Cnt_sek_1 : DINT ;
  Flowrate_1 : REAL ; //l/s
  Puls500ms : BOOL ; //Puls alle 500ms
  FPM500ms : BOOL ; //Flankenhilfsmerker
END_VAR
BEGIN

NETWORK
TITLE =Messperiode 500ms Puls erzeugen
      U     "AS_Clock_2Hz";  //CPU Taktmerker .3 2Hz
      FP    #FPM500ms;
      =     #Puls500ms;

NETWORK
TITLE =Wasserzähler 1 an FM350-2 Kanal 0 in Liter/s umwandeln
      L     #old_CNT1;
      L     #ACT_CNT1;       //Zählerstand Endloszähler FM350-2
      T     #old_CNT1;       //merken
      TAK   ;
      -I    ;                //muß -I! braucht keinen Wordwrap beachten! funzt automatisch
      ITD   ;
      L     #Cnt_500_1;      //total Pulse über 500ms
      +D    ;                //Differenz seit letztem Zyklus dazu
      T     #Cnt_500_1;

//alle 500ms die gezählten Pulse übernehmen und neu beginnen
      U     #Puls500ms;      //Puls alle 500ms
      SPBN  ska1;

      L     #Cnt_500_1;      //total Pulse über 500ms
      L     2;
      *D    ;
      T     #Cnt_sek_1;      //total Pulse über 1s

      L     0;
      T     #Cnt_500_1;      //neue Zählperiode

//Pulse pro Sekunde in Liter/s umrechnen und ausgeben
ska1: L     #Cnt_sek_1;
      DTR   ;
      L     1.000000e+003;   //k-Faktor 1000 Pulse/Liter
      /R    ;
      T     #Flowrate_1;     //Ergebnis intern
      T     #Flowrate1;      //und an FB-Output

(...)
END_FUNCTION_BLOCK

Der "FB_Wasser_Durchfluss" wird im OB1 nach dem FB "350-2_Read" so aufgerufen:
Code:
Netzwerk: 4 Zählkanäle FM350-2 in Liter/s umwandeln

                   "IDB_Wasser_Durchfluß"
                  +-----------------------+
                  | "FB_Wasser_Durchfluß" |
                  |                       |
             ...--|EN                     |
                  |                       |
"DB_FM350-2(1)".  |                       |
       ACT_CNTV0--|ACT_CNT1               | "DB_Visu".
                  |              Flowrate1|-Flowrate1
"DB_FM350-2(1)".  |                       |
       ACT_CNTV1--|ACT_CNT2               | "DB_Visu".
                  |              Flowrate2|-Flowrate2
"DB_FM350-2(1)".  |                       |
       ACT_CNTV2--|ACT_CNT3               | "DB_Visu".
                  |              Flowrate3|-Flowrate3
"DB_FM350-2(1)".  |                       |
       ACT_CNTV3--|ACT_CNT4               | "DB_Visu".
                  |              Flowrate4|-Flowrate4
                  |                       |
                  |                    ENO|-
                  +-----------------------+

Harald
 

Anhänge

  • FB_Wasser_Durchfluss.AWL.txt
    5,4 KB · Aufrufe: 3
Zuletzt bearbeitet:
Zurück
Oben