Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: Multiinstanzing aus einem OB

  1. #11
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Naja ... für die Inistialisierung könntest du da ja einiges Vereinfachen ...
    Dein WMF hat z.B. einen Eingang "Init" und wenn der =True ist, dnn spulst du intern den ganzen Kram der Reihe nach durch - also auch die ggf. geänderte Beschaltung. Vielleicht läßt sich da für den OB1-Aufruf auch noch etwas finden ...

  2. #12
    Avatar von vollmi
    vollmi ist gerade online Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.619
    Danke
    776
    Erhielt 646 Danke für 492 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Naja ... für die Inistialisierung könntest du da ja einiges Vereinfachen ...
    Dein WMF hat z.B. einen Eingang "Init" und wenn der =True ist, dnn spulst du intern den ganzen Kram der Reihe nach durch - also auch die ggf. geänderte Beschaltung. Vielleicht läßt sich da für den OB1-Aufruf auch noch etwas finden ...
    Also wenn ich den MasterFB aus dem OB100 mit einem Initeingang auf true aufrufe und dann im FB nur die ID und Param Beschaltung durchlaufe ausspringe und dann zum OB1 wechsle. Gleicher Aufruf mit INIT := False und im MasterFB dann die aufrufe mit ID und Param überspringe funktioniert es.

    Wenn ich allerdings den OB100 ganz weglasse. Den Init über

    Code:
          L     #OB1_SCAN_1                 // Abfrage Erstdurchlauf OB1
          L     B#16#3
          <>I   
          =     "Init"
    Im OB1 mache. Inklusive ID und Param beschaltung. Dann motzt der wieder vonwegen Baustein wurde nicht initialisiert obwohl ich mit einem Merker erkenne das der Init ausgeführt wurde (er hat die mit ID und Param beschaltenen Aufrufe durchlaufen im ersten Zyklus).

    Der scheint das irgndwie zu erkennen ob die Initialisation durch OB100 gemacht wird oder durch OB1 Firstscan.

  3. #13
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Zitat Zitat von vollmi Beitrag anzeigen
    Der scheint das irgndwie zu erkennen ob die Initialisation durch OB100 gemacht wird oder durch OB1 Firstscan.
    ... das kann ich mir irgendwie nicht vorstellen ...

    Wie hast du es denn jetzt konkret realisiert ?

  4. #14
    Avatar von vollmi
    vollmi ist gerade online Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.619
    Danke
    776
    Erhielt 646 Danke für 492 Beiträge

    Standard

    DEr MasterFB sieht jetzt so aus

    Code:
    VAR_INPUT
      Init : BOOL ;    
      MOD1ID : WORD ;    
      MOD1PARAM : BLOCK_DB ;    
      MOD2ID : WORD ;    
      MOD2PARAM : BLOCK_DB ;    
    END_VAR
    VAR
       MOD1 : "MODBUSPN";    
      MOD2 : "MODBUSPN";    
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
          U     #Init; 
          SPBN  INIT; 
    
          CALL #MOD1 (
               ID                       := #MOD1ID,
               DB_PARAM                 := #MOD1PARAM,
               BUSY                     := "CONTROL_DAT".MOD1.BUSY,
               CONN_ESTABLISHED         := "CONTROL_DAT".MOD1.CONN_ESTABLISHED,
               DONE_NDR                 := "CONTROL_DAT".MOD1.DONE_NDR,
               ERROR                    := "CONTROL_DAT".MOD1.ERROR,
               STATUS_MODBUS            := "CONTROL_DAT".MOD1.STATUS_MODBUS,
               STATUS_CONN              := "CONTROL_DAT".MOD1.STATUS_CONN,
               STATUS_FUNC              := "CONTROL_DAT".MOD1.STATUS_FUNC);
    
          L     500; 
          T     "CONTROL_DAT".MOD1.RECV_TIME; 
    
          L     T#5S; 
          T     "CONTROL_DAT".MOD1.CONN_TIME; 
    
          L     "CONTROL_DAT".MOD1.STATUS_CONN; 
          T     "CONTROL_DAT".MOD1.Save_STATUS_CONN; //for static display in VAT
    
          L     "CONTROL_DAT".MOD1.STATUS_MODBUS; 
          T     "CONTROL_DAT".MOD1.Save_STATUS_MODBUS; //for static display in VAT
    
          L     2; 
          T     "CONTROL_DAT".MOD2.ID; 
    
          CALL #MOD2 (
               ID                       := #MOD2ID,
               DB_PARAM                 := #MOD2PARAM,
               BUSY                     := "CONTROL_DAT".MOD2.BUSY,
               CONN_ESTABLISHED         := "CONTROL_DAT".MOD2.CONN_ESTABLISHED,
               DONE_NDR                 := "CONTROL_DAT".MOD2.DONE_NDR,
               ERROR                    := "CONTROL_DAT".MOD2.ERROR,
               STATUS_MODBUS            := "CONTROL_DAT".MOD2.STATUS_MODBUS,
               STATUS_CONN              := "CONTROL_DAT".MOD2.STATUS_CONN,
               STATUS_FUNC              := "CONTROL_DAT".MOD2.STATUS_FUNC);
    
          L     500; 
          T     "CONTROL_DAT".MOD2.RECV_TIME; 
    
          L     T#5S; 
          T     "CONTROL_DAT".MOD2.CONN_TIME; 
    
          L     "CONTROL_DAT".MOD2.STATUS_CONN; 
          T     "CONTROL_DAT".MOD2.Save_STATUS_CONN; //for static display in VAT
    
          L     "CONTROL_DAT".MOD2.STATUS_MODBUS; 
          T     "CONTROL_DAT".MOD2.Save_STATUS_MODBUS; //for static display in VAT
    
    
    
    INIT: NOP   0; 
    NETWORK
    TITLE =
    
    
    
          CALL #MOD1 (
               RECV_TIME                := "CONTROL_DAT".MOD1.RECV_TIME,
               CONN_TIME                := "CONTROL_DAT".MOD1.CONN_TIME,
               ENQ_ENR                  := "CONTROL_DAT".MOD1.ENQ_ENR,
               DISCONNECT               := "CONTROL_DAT".MOD1.DISCONNECT,
               REG_KEY                  := "LICENSE_DB".REG_KEY,
               LICENSED                 := "CONTROL_DAT".MOD1.LICENSED,
               BUSY                     := "CONTROL_DAT".MOD1.BUSY,
               CONN_ESTABLISHED         := "CONTROL_DAT".MOD1.CONN_ESTABLISHED,
               DONE_NDR                 := "CONTROL_DAT".MOD1.DONE_NDR,
               ERROR                    := "CONTROL_DAT".MOD1.ERROR,
               STATUS_MODBUS            := "CONTROL_DAT".MOD1.STATUS_MODBUS,
               STATUS_CONN              := "CONTROL_DAT".MOD1.STATUS_CONN,
               STATUS_FUNC              := "CONTROL_DAT".MOD1.STATUS_FUNC,
               IDENT_CODE               := "CONTROL_DAT".MOD1.IDENT_CODE,
               UNIT                     := "CONTROL_DAT".MOD1.UNIT,
               DATA_TYPE                := "CONTROL_DAT".MOD1.DATA_TYPE,
               START_ADDRESS            := "CONTROL_DAT".MOD1.START_ADDRESS,
               LENGTH                   := "CONTROL_DAT".MOD1.LENGTH,
               TI                       := "CONTROL_DAT".MOD1.TI,
               WRITE_READ               := "CONTROL_DAT".MOD1.WRITE_READ);
    
    
    
    NETWORK
    TITLE =Modbus 2
    
          CALL #MOD2 (
               RECV_TIME                := "CONTROL_DAT".MOD2.RECV_TIME,
               CONN_TIME                := "CONTROL_DAT".MOD2.CONN_TIME,
               ENQ_ENR                  := "CONTROL_DAT".MOD2.ENQ_ENR,
               DISCONNECT               := "CONTROL_DAT".MOD2.DISCONNECT,
               REG_KEY                  := "LICENSE_DB".REG_KEY,
               LICENSED                 := "CONTROL_DAT".MOD2.LICENSED,
               BUSY                     := "CONTROL_DAT".MOD2.BUSY,
               CONN_ESTABLISHED         := "CONTROL_DAT".MOD2.CONN_ESTABLISHED,
               DONE_NDR                 := "CONTROL_DAT".MOD2.DONE_NDR,
               ERROR                    := "CONTROL_DAT".MOD2.ERROR,
               STATUS_MODBUS            := "CONTROL_DAT".MOD2.STATUS_MODBUS,
               STATUS_CONN              := "CONTROL_DAT".MOD2.STATUS_CONN,
               STATUS_FUNC              := "CONTROL_DAT".MOD2.STATUS_FUNC,
               IDENT_CODE               := "CONTROL_DAT".MOD2.IDENT_CODE,
               UNIT                     := "CONTROL_DAT".MOD2.UNIT,
               DATA_TYPE                := "CONTROL_DAT".MOD2.DATA_TYPE,
               START_ADDRESS            := "CONTROL_DAT".MOD2.START_ADDRESS,
               LENGTH                   := "CONTROL_DAT".MOD2.LENGTH,
               TI                       := "CONTROL_DAT".MOD2.TI,
               WRITE_READ               := "CONTROL_DAT".MOD2.WRITE_READ);
    
    
    END_FUNCTION_BLOCK
    Im OB1 rufe ich ihn auf mit einem FALSE auf Init

    Im OB100 rufe ich ihn auf mit einem TRUE auf init sowie die ID und PARAM beschalten.

    Das funktioniert so.

    Interessant wäre es natürlich wenn ich den FB direkt aus dem OB1 aufrufen könnte mit dem INIT abhängig vom Erstdurchlauf.

    Und ID und PARAM beschalten.

    Code:
          L     #OB1_SCAN_1                 // Abfrage Erstdurchlauf OB1
          L     B#16#3
          <>I   
          =     #INIT
    
    
    
          L     1
          T     "CONTROL_DAT".MOD1.ID
          L     2
          T     "CONTROL_DAT".MOD2.ID
    
    
          CALL  "Modbus" , DB101
           Init     :=#INIT
           MOD1ID   :="CONTROL_DAT".MOD1.ID
           MOD1PARAM:="MODBUS_PARAM"
           MOD2ID   :="CONTROL_DAT".MOD2.ID
           MOD2PARAM:="MODBUS_PARAM"
    So funktioniert es aber nicht. Dann wird die Initialisation nicht sauber durchgeführt. Keine Ahnung wieso.

    IM OB1 der Aufruf mit INIT= FALSE und im OB100 derselbe Aufruf mit INIT gleich TRUE dann funktioniert die Initialisation.

    Und noch schöner wärs wenn ich die Treiber im Masterfb nicht zweimal eintragen müsste nur um sie abhängig vom Init zu überspringen.
    Geändert von vollmi (18.02.2011 um 13:52 Uhr)

  5. #15
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Der Unterschied zwischen der einen und der anderen Variante sind (mit OB100) 2 verschiedene Zyklen bzw. (nur mit OB1) ein und der gleiche Zyklus.
    Mach doch mal ein "BEA" vor deine Sprungmarke "INIT: NOP0". Dann sollte es auch, wie du es haben willst, funktionieren ...

    Gruß
    Larry

  6. #16
    Avatar von vollmi
    vollmi ist gerade online Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.619
    Danke
    776
    Erhielt 646 Danke für 492 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Der Unterschied zwischen der einen und der anderen Variante sind (mit OB100) 2 verschiedene Zyklen bzw. (nur mit OB1) ein und der gleiche Zyklus.
    Mach doch mal ein "BEA" vor deine Sprungmarke "INIT: NOP0". Dann sollte es auch, wie du es haben willst, funktionieren ...
    Habe ich mir auch schon gedacht hat aber leider auch keine Verbesserung gebracht.

    Vor allem ohne BEA wird ja beim Aufruf aus OB100 auch gleich die Communikation nach der Initialisation im gleichen Zyklus angestossen. Und da funktionierts ja auch.

    *grml*

Ähnliche Themen

  1. UDT in einem DB
    Von Bensen83 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 10.08.2010, 13:39
  2. Adressierung in einem FB
    Von Gerri im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 13.11.2008, 13:13
  3. Ausgang von einem BK9100 aus einem BC9050 steuern
    Von merlin im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 28.09.2008, 10:51
  4. 2 mastersysteme an einem cp
    Von delphie im Forum Feldbusse
    Antworten: 0
    Letzter Beitrag: 15.03.2008, 04:02

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •