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

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

Thema: e!Cockpit Modbus Abfrage

  1. #11
    Florian Se. ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.08.2018
    Beiträge
    10
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi,

    ich hab noch ein paar kleine Typos rausgeholt, aber er funktioniert nicht der Code. Zumindest hab ich den Eindruck.
    Im Debugger kann ich das sauch nicht wirklich nachvollziehen, da der Timer asynchron hochzählt oder?


    Code:
    IF (xTrigger AND (iJobCounter=0)) THEN
        xTimer:=True;
    END_IF
    
    
    delay(IN := xTimer, PT := T#500MS); //TON
    delay.ET;
    
    mySerialMaster( I_Port      := COM1,        // my serial port
                    utQuery:=Jobliste[iJobCounter], 
                    xTrigger:=xTrigger, 
                    
                    utResponse:=Responseliste[iJobCounter]
                  );
                  
    
    
    FB_F_Trigger (clk:=xTrigger);
    
    
    IF FB_F_Trigger.Q THEN
        iJobCounter := (iJobCounter+1);
        IF NOT (iJobCounter=iMaxJobs) THEN
            xTrigger:=TRUE;
        END_IF
    END_IF
    
    
    IF delay.Q AND  (iJobCounter=iMaxJobs) THEN
        xTrigger:=TRUE;
        xTIMER:=FALSE;
        iJobCounter:=0;
    END_IF

  2. #12
    Registriert seit
    20.01.2012
    Beiträge
    177
    Danke
    0
    Erhielt 62 Danke für 59 Beiträge

    Standard

    Hallo,
    Zitat Zitat von Florian Se. Beitrag anzeigen
    Hi,

    ich hab noch ein paar kleine Typos rausgeholt, aber er funktioniert nicht der Code. Zumindest hab ich den Eindruck.
    Im Debugger kann ich das sauch nicht wirklich nachvollziehen, da der Timer asynchron hochzählt oder?
    ja da habe ich mit dem Timer Mist gebaut. Der läuft nur einmal durch, da er keinen Flankenwechsel erkennt.

    So müßte es gehen:
    Code:
    IF (xTrigger AND (iJobCounter=0)) THEN
        xTimer:=True;
    END_IF
    
    
    
    
    mySerialMaster( I_Port      := COM1,        // my serial port
                    utQuery:=Jobliste[iJobCounter], 
                    xTrigger:=xTrigger, 
                    
                    utResponse:=Responseliste[iJobCounter]
                  );
                  
    
    
    FB_F_Trigger (clk:=xTrigger);
    
    
    IF FB_F_Trigger.Q THEN
        iJobCounter := (iJobCounter+1);
        IF NOT (iJobCounter=iMaxJobs) THEN
            xTrigger:=TRUE;
        END_IF
    END_IF
    
    
    IF delay.Q AND  (iJobCounter=iMaxJobs) THEN
        xTrigger:=TRUE;
        xTIMER:=FALSE;
        iJobCounter:=0;
    END_IF
    
    
    delay(IN := xTimer, PT := T#500MS); //TON
    delay.ET; // So funktioniert das nicht. Entweder einer Dummy Variablen zuweisen oder den Deklarationsteil im Onlinemodus ansehen.
    Dadurch ergibt sich jetzt ein Jitter von mindestens einer Zykluszeit. Sonst könnte man den delay Timer auch zweimal aufrufen, einmal oben und einmal unten.

    Gruß

  3. #13
    Florian Se. ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.08.2018
    Beiträge
    10
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,

    irgendwie bin ich mit dem Code nicht wirklich klar gekommen. Habe jetzt mal selbst was versucht. Im Sekundentakt werden die Jobs ausgeführt. Stimmt das so?
    Code:
    Timer(IN := NOT (Timer.Q), PT := T#500MS); //TP Timer
    Timer.ET;//nur für live ansicht
    
    FB_R_Trigger (clk:=Timer.Q);
    //Es wird ein 1 Sekundentakt erkannt
    IF FB_R_Trigger.Q THEN
        xTrigger := TRUE;
        iJobCounter := 0;
    END_IF
    
    
    mySerialMaster( I_Port      := COM1,        // my serial port
                    utQuery:=Jobliste[iJobCounter], 
                    xTrigger:=xTrigger,                 
                    utResponse:=Responseliste[iJobCounter]
                  );
                  
    //Jobende erfolgt, nächsten Job starten
    IF xTrigger = FALSE AND iJobCounter < (iMaxJobs -1)  THEN 
      iJobCounter := iJobCounter +1;
      xTrigger := TRUE;
    END_IF

    Viele Grüße

  4. #14
    Florian Se. ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.08.2018
    Beiträge
    10
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Also Hintergrund ist, dass ich oft die gleichen Werte habe. So 10 sek. lang und ich glaube, dass er die Werte nicht richtig abruft, weil bei einem Stromzähler so oft die gleichen Werte ist ja unwarscheinlich. Entweder weil das Skript nicht läuft oder weil sonst was passiert. TimeOut oder so.
    Kann man das irgendwo sehen?

  5. #15
    Registriert seit
    20.01.2012
    Beiträge
    177
    Danke
    0
    Erhielt 62 Danke für 59 Beiträge

    Standard

    Hallo,
    Zitat Zitat von Florian Se. Beitrag anzeigen
    Also Hintergrund ist, dass ich oft die gleichen Werte habe. So 10 sek. lang und ich glaube, dass er die Werte nicht richtig abruft, weil bei einem Stromzähler so oft die gleichen Werte ist ja unwarscheinlich. Entweder weil das Skript nicht läuft oder weil sonst was passiert. TimeOut oder so.
    Kann man das irgendwo sehen?
    ich schau mir das mal die Woche an. Muß eh noch etwas anderes ausprobieren.

    Hast Du die 500ms mal verlängert? Ich weiß ja jetzt nicht mit wieviel b/s Du arbeitest, aber da kann schon mal etwas an Zeit zusammenkommen bei der seriellen Kommunikation.

    Gib mir mal Deine Kommunikationsparameter der Schnittstelle und am besten auch die Modbusadressen oder verlinke auf das Handbuch zu Deinem Zähler.

    Bei einem Zähler von Saia steht z.B. im Handbuch auch, daß die Werte nur alle 10s aktualisiert werden.

    Gruß

  6. #16
    Registriert seit
    20.01.2012
    Beiträge
    177
    Danke
    0
    Erhielt 62 Danke für 59 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    So,

    ich habe mal was getestet. Die Timerfunktion arbeitet so wie sie soll. Hier mal mein Beispiel, den Modbusbaustein habe ich durch einen Dummy ersetzt, der alle 10 Aufrufe xTrigger zurücksetzt.

    Code:
    PROGRAM PLC_PRG
    VAR
        FB_Dummy:FB_TEST;
        FB_F_Trigger: F_Trig;
        delay: TON;
        
        xTrigger: BOOL := TRUE;
        xTimer: BOOL;
        
        iJobCounter: INT;
        iMaxJobs: INT := 4;
        iCounter:INT;
        tTime:TIME;
    END_VAR
    Code:
    IF (xTrigger AND (iJobCounter=0)) THEN
        xTimer:=True;
    END_IF
    
    FB_Dummy (xTrigger:=xTrigger, iCounter=>iCounter);
    
    FB_F_Trigger (clk:=xTrigger);
    
    IF FB_F_Trigger.Q THEN
        iJobCounter := (iJobCounter+1);
        IF NOT (iJobCounter=iMaxJobs) THEN
            xTrigger:=TRUE;
        END_IF
    END_IF
    
    IF delay.Q AND  (iJobCounter=iMaxJobs) THEN
        xTrigger:=TRUE;
        xTIMER:=FALSE;
        iJobCounter:=0;
    END_IF
    
    delay(IN := xTimer, PT := T#10000MS, ET => tTime); //TON
    und hier die Dummyfunktion
    Code:
    FUNCTION_BLOCK FB_TEST
    VAR_OUTPUT
        iCounter:INT;
    END_VAR
    VAR_IN_OUT
        xTrigger:BOOL;    
    END_VAR
    Code:
    IF xTrigger THEN
        iCounter:=iCounter+1;
        IF iCounter=10 THEN
            iCounter := 0;
            xTrigger := FALSE;
        END_IF
    END_IF
    Time1.PNG
    Time2.PNG
    Gruß

Ähnliche Themen

  1. e!Cockpit Modbus-TCP
    Von Pari im Forum WAGO
    Antworten: 10
    Letzter Beitrag: 10.09.2018, 23:32
  2. Modbus Adresse E! Cockpit
    Von rasoul_1989 im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 15.09.2017, 12:36
  3. Wago E Cockpit Modbus
    Von weku im Forum WAGO
    Antworten: 1
    Letzter Beitrag: 16.05.2017, 09:04
  4. Antworten: 3
    Letzter Beitrag: 18.09.2015, 08:28
  5. Antworten: 1
    Letzter Beitrag: 12.12.2014, 10:19

Lesezeichen

Berechtigungen

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