Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

WAGO System.lib GET_RUN_VALUE funktioniert nicht auf 750-841

pischky
2010-03-02
2010-03-03
  • pischky - 2010-03-02

    Hallo,

    ich habe ein Problem auf der WAGO 750-841 mit der Funktion GET_RUN_VALUE() und GET_STOP_VALUE() aus der System.lib. Die Firmware des PLC ist "02.11.03 (14)".

    Das Problem ist das GET_RUN_VALUE() nicht TRUE wird beim ersten Durchlauf. Auf einer 750-842 bekomme ich das selbe Programm zum Laufen.

    Ziel ist es beim Start einen TCP Verbindung zu öffnen. Im Anhang habe ich es auf eine einfache Demo reduziert.

    Kann einer der Profis einem dummen Hochsprachenprogrammierer helfen?

    Muss ich das über Tasks machen? (Das muss ich wohl dringend lernen)

    Danke, Gruß

    Martin

    PROGRAM PLC_PRG
    (* Hardware:
        750-841 PLC
        750-530 8 DO ( A0 .. A7 )
        750-430 8 DI ( E0 .. E7 )
        750-600   Endklemmen
    *)
    VAR
        CycleCount : WORD := 0;
    END_VAR
    IF GET_RUN_VALUE(TRUE) THEN
        A6 := TRUE;
    END_IF;
    IF GET_STOP_VALUE(TRUE) THEN
        A6 := FALSE;
    END_IF;
    A5 := TRUE;
    (* Blink output A7 *)
    CycleCount := (CycleCount+1) MOD 16#0FFF;
    A7 := (CycleCount AND 16#0200) <> 0;
    END_PROGRAM
    
     
  • Oberchefe - 2010-03-02

    Die System.Lib ist eine 16Bit Library, also nur für den 842er Controller geeignet, nicht für den 841er. Da mußt Du was vergleichbares aus dem Ordner 32 Bit raussuchen.

     
  • pischky - 2010-03-02

    Hi,

    danke für den schnellen Hinweis.

    Ich habe geschaut:

    In dem Projekt für den 841 ist "System.lib 5.10.04 09:43:00" aus ...\CoDeSys V2.3\Targets\WAGO\Libraries\32_Bit eingebunden.

    In dem Projekt für den 842 ist "System.lib 6.12.00 08:50:26" aus

    ...\CoDeSys V2.3\Targets\WAGO\Libraries\16_Bit eingebunden.

    Bei meiner Installation gibt es aber nur im 16_Bit Verzeichnis eine passende Hexdatei.

    Ist das mein Problem?

    <edit></edit>

    Auch wenn ich "System.lib 18.10.04 05:23:28" aus ...\CoDeSys V2.3\Targets\WAGO\Libraries\IO_IPC einbinde tut es nicht

    Danke für die schnelle Hilfe, Gruß

    Martin

     
  • Oberchefe - 2010-03-02

    Zitat:
    Auch wenn ich "System.lib 18.10.04 05:23:28" aus ...\CoDeSys V2.3\Targets\WAGO\Libraries\IO_IPC einbinde tut es nicht

    Na klar, der 841 ist auch kein Industrie-PC.

    Also ich habe im Ordner 32 Bit keine system.lib, standardmäßig ist die da nicht drin. Ich würde mal unter "Resourcen", "Taskkonfiguration" bei den System Ereignissen "Start" und "Stop" aktivieren, da ein Programm definieren, dann kannst Du die Aktionen da ausführen.

     
  • pischky - 2010-03-03

    Oberchefe hat geschrieben:
    Na klar, der 841 ist auch kein Industrie-PC.

    Es war zumindest einen Versuch wert

    Also ich habe jetzt mit der Taskkonfiguration rumgespielt und bekomme mit dem folgenden Code ein ähnliches Verhalten wie auf der 842:

    PROGRAM PLC_PRG
        (* Hardware:
           750-841 PLC
           750-530 8 DO ( A0 .. A7 )
           750-430 8 DI ( E0 .. E7 )
           750-600 Endklemmen
        *)
        VAR_INPUT
           RunValue  : BOOL := FALSE; (* TRUE on first cycle *)
           StopValue : BOOL := FALSE; (* TRUE on last cycle *)
        END_VAR
        VAR
           CycleCount : WORD := 0;
        END_VAR
        IF RunValue THEN A6 := TRUE; END_IF;
        IF StopValue THEN A6 := FALSE; END_IF;
        A5 := TRUE;
        (* Blink output A7 *)
        CycleCount := (CycleCount+1) MOD 16#0FFF;
        A7 := (CycleCount AND 16#0200) <> 0;
    END_PROGRAM
    PROGRAM PLC_START
        PLC_PRG( RunValue := TRUE , StopValue := FALSE );
    END_PROGRAM
    PROGRAM PLC_STOP
        PLC_PRG( RunValue := FALSE , StopValue := TRUE );
    END_PROGRAM
    RESOURCE
        TASK PLC_PRG (PRIORITY := 1, INTERVAL := T#5ms);
            PLC_PRG(RunValue := FALSE, StopValue := FALSE );
            {Additional_info : 2,0,0,0,1,4294967295}
        END_TASK
        {event_task : 'start',
                      'Called when program starts',
                      'PLC_START',
                      'FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}
        {event_task_info : 1,1,11987}
        {event_task : 'stop',
                      'Called when program stops',
                      'PLC_STOP',
                      'FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}
        {event_task_info : 1,2,11987}
    END_RESOURCE
    

    Ich habe also zwei neuen Programme PLC_START und PLC_STOP eingefügt und diese bei den Systemereignissen Start und Stop eingetragen. Unter der freilaufenden Task PLC_PRG (PRIORITY=1) ist der Aufruf "PLC_PRG(RunValue:=FALSE,StopValue:=FALSE)" eingehängt.

    So kann folgt der Ausgang A6 dem Start/Stop aus Codesys und dem Betriebsartenschalter. Auch nach einem Reset geht A6 an. Mal sehen, ob ich damit mein eigentliches Problem lösen kann.

    Ich habe auch probiert die Bausteine über den Button "Baustein XXX erzeugen" aus der Taskkonfiguration anzulegen. Aber dann wird eine Funktion erzeugt

    Noch zwei Fragen:

    Ist die Priority 1 eine gute Wahl?

    Warum ist ein direktes Setzen eines Ausganges aus PLC_START wirkungslos, wenn der Ausgang nicht auch im PLC_PRG referenziert wird?

    Danke für die Hilfe, Gruß

    Martin

     
  • Oberchefe - 2010-03-03

    Bei den Prioritäten gilt: je kleiner die Zahl desto wichtiger wird der Task behandelt. Solange in dem Programm nicht mehr drinsteht ist die 1 überhaupt kein Problem. Ist das Programm größer und enthält es gar blockierende Dinge (wie z.B. Ethernet Funktionen), dann wäre eine 1 unter Umständen fatal, Kommunikationsaussetzer zum PC wäre wohl noch einer der harmlosesten Effekte.

    Zitat:
    Warum ist ein direktes Setzen eines Ausganges aus PLC_START wirkungslos, wenn der Ausgang nicht auch im PLC_PRG referenziert wird?

    Wenn man BOOLs in einem Task (Programm) setzen will und im anderen abfragen, nimmt man üblicherweise Global deklarierte Variablen.

     
  • Oberchefe - 2010-03-03

    BTW: was ist das eigentliche Problem? Einen BOOL für den ersten Zyklus kann man auch noch einfacher generieren, den für den letzten allerdings nicht.

     
  • pischky - 2010-03-03

    Oberchefe hat geschrieben:
    Bei den Prioritäten ...., dann wäre eine 1 unter Umständen fatal, Kommunikationsaussetzer zum PC wäre wohl noch einer der harmlosesten Effekte.

    Ok. Dann hoffe ich mal das der FB TCP_Server aus der WagoLibEthernet_01.ib nicht blockiert. Ebenso serial_interface_01.lib. In der Doku steht nichts dazu . Meine Versuche zeigen aber kein Problem mit blockieren.

    Oberchefe hat geschrieben:
    Wenn man BOOLs in einem Task (Programm) setzen will und im anderen abfragen, nimmt man üblicherweise Global deklarierte Variablen.

    Schon klar. Wenn ich A0 bis A7 in der Steuerungskonfiguration definiert habe als %QX0.0 .. %QX0.7 sind sie wohl global. Das Problem ist, wenn ich in PLC_START noch "A4 := TRUE" ergänze geht der Ausgang nicht an. Ich kann dann in PLC_MAIN ergänzen "IF A4 THEN ;; END_IF;" dann tut er.

    Oberchefe hat geschrieben:
    BTW: was ist das eigentliche Problem? Einen BOOL für den ersten Zyklus kann man auch noch einfacher generieren, den für den letzten allerdings nicht.

    Das STOP ist da eigentliche Problem. Die TCP-Verbindungen sollen sauber beendet werden (FIN).

    Danke für die Hilfe. Die Doku ist echt an vielen Stellen nicht hilfreich.

    Gruß

    Martin

     

Log in to post a comment.