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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Eingänge zu Simulationszwecken softwaremäßig in CoDeSys setzen

  1. #1
    Registriert seit
    30.07.2009
    Beiträge
    9
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich hab ein kleines Problem:
    Für Schulungszwecke möchte ich ein Stern-Dreieck-Anlauf programmieren lassen. Die Simulation habe ich gebastelt und die Schulungsteilnehmer sollen das Programm dazu entwerfen (im Hintergrund läuft ein weiteres Programm, um z.B. Bewegungen darzustellen). Damit es keine Probleme mit Variablennamen gibt, greifen meine aktiven Schaltsymbole der Visu (Schalter / Taster) auf Eingangsvariablen (z.B. %IX24.2) zu. Dies funktioniert ohne Probleme! Da ich aber sehr gerne ein Rückmeldekontakt eines Schützes simulieren möchte, sollte ich nun im Hintergrund-Programm ein Eingang setzen können, wie %IX24.5 := %QX24.3; . Dies funktioniert natürlich nicht ... aber ich weiß, dass man dies irgendwie manipulieren kann!! ...Ideen wie Kabel stecken geht nicht, da ja keine Hardware angeschlossen ist!!

    Vielleicht kenn mir jemand helfen!! Ich freu mich über jede Anregung!

    Viele Grüße
    Zitieren Zitieren Eingänge zu Simulationszwecken softwaremäßig in CoDeSys setzen  

  2. #2
    Registriert seit
    01.09.2008
    Ort
    Berlin
    Beiträge
    172
    Danke
    51
    Erhielt 51 Danke für 44 Beiträge

    Standard

    Mit Pointern kannst du auch die Eingänge Überschreiben. Aber das müsste in jeden Zyklus vor der Abfrage geschehen.

    Wieso verwendest du nicht einfah irgentwelche Variablen?

  3. Folgender Benutzer sagt Danke zu ebt'ler für den nützlichen Beitrag:

    Silversurger (14.11.2010)

  4. #3
    Silversurger ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.07.2009
    Beiträge
    9
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Mit Pointern? ...wie sollte das funktionieren? Hab aber auch so etwas gelesen! ...ich hab jetzt mal versucht, ein Pointer auf das Eingangsarray zu legen! Hab dann mit der PUTBIT-Anweisung das fünfte Bit gesetzt und meinem Pointer zurückgegeben, aber mein Eingang bleibt statisch!!

    Ich kann keine einfachen Variablen benutzen, da ich es meinen Schulungsteilnehmern gerne ermöglichen möchte, dass sie selbst die Variablennamen festlegen können!
    Geändert von Silversurger (14.11.2010 um 09:58 Uhr)

  5. #4
    Silversurger ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.07.2009
    Beiträge
    9
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    So, hab das Problem nun selbst gelöst!!

    Zuerst muss man ein Array über die Inputs legen:

    (* Übergabe der Eingangsbytes an Array *)
    Adr_der_Inputs := ADR(%IB0); (* Deklaration: Adr_der_Inputs: POINTER TO ARRAY [0..63] OF BYTE; *)


    Daraufhin kann man mit der PUTBIT-Funktion die einzelnen Bits verändern (hier das Bit 5) und schon funktionierts:

    (* Manipulation der Inputs für Rückmeldekontakt Stern-Schütz *)
    IF %QX24.2
    THEN
    Adr_der_Inputs^[48] := DWORD_TO_BYTE(PUTBIT(Adr_der_Inputs^[48], 5, TRUE));
    ELSE
    Adr_der_Inputs^[48] := DWORD_TO_BYTE(PUTBIT(Adr_der_Inputs^[48], 5, FALSE));
    END_IF


    Weshalb ich allerdings mit meinem Pointer auf das IB 48 zeigen muss, obwohl ich auf das IB24 zugreifen möchte habe ich nicht verstanden! ...nach 2std try and error hats dann funktioniert!!

    Vielleicht kann mir jemand dies erklären!!
    Zitieren Zitieren Lösung  

  6. #5
    Registriert seit
    01.09.2008
    Ort
    Berlin
    Beiträge
    172
    Danke
    51
    Erhielt 51 Danke für 44 Beiträge

    Standard

    Ich hätte es so gelöst:

    Code:
    PROGRAM PLC_PRG
    VAR
        pt : POINTER TO WORD;
        bit_adr: WORD;
        wert: BOOL;
    END_VAR
    ________________________________________________________
    
    bit_adr := BITADR(%IX0.0);
    
    pt := ADR(%IW0) + bit_adr / 16;
    pt^ := pt^  AND NOT SHL( BOOL_TO_WORD (1) , bit_adr MOD 16);
    IF wert = 1 THEN
    pt^ := pt^ OR SHL( BOOL_TO_WORD (1) , bit_adr MOD 16);
    END_IF
    Mit "wert" bestimmst du dann ob das Bit auf 0 oder 1 gesetzt werden soll.

    Die 48 aus deinen Bsp. kommen daher, dass der Pointer auf ein Array of BYTE gelegt ist, du aber die Eingänge im Format WORD vorliegen hast:
    WORDadresse.BITadresse

  7. #6
    Registriert seit
    23.11.2010
    Ort
    Lohr
    Beiträge
    3
    Danke
    0
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Zitat Zitat von Silversurger Beitrag anzeigen
    Hallo zusammen,

    ich hab ein kleines Problem:
    (Schalter / Taster) auf Eingangsvariablen (z.B. %IX24.2) zu. Dies Vielleicht kenn mir jemand helfen!! Ich freu mich über jede Anregung!

    Viele Grüße
    Hi,

    also ich mache meine Eingangssimulation etwas einfacher als die Kollegen:

    ptrEingang := ADR(%IW160);
    ptrEingang^.0 := bAblaufrutscheBelegt_i;
    ptrEingang^.1 := bMagazinschieberHinten_i;
    ptrEingang^.2 := bMagazinschieberVorne_i;
    ptrEingang^.3 := bHubQuerEinheitRechts_i;
    ptrEingang^.4 := bHubQuerEinheitMitte_i;
    ptrEingang^.5 := bHubQuerEinheitLinks_i;
    ptrEingang^.6 := bHubQuerEinheitOben_i;
    ptrEingang^.7 := bHubQuerEinheitUnten_i;
    ptrEingang^.8 := bGreiferOffen_i;
    ptrEingang^.9 := bGreiferGeschlossen_i;
    ptrEingang^.10 := bBandeinlaufBelegt_i;
    ptrEingang^.11 := bMagazinLeer_i;
    ptrEingang^.12 := bBehaelterTypA_i;
    ptrEingang^.13 := bBehaelterBereit_i;
    ptrEingang^.14 := bTeilAinZufuehrung_i;
    ptrEingang^.15 := bTeilBinZufuehrung_i;

    Gruß

    Michael

  8. Folgender Benutzer sagt Danke zu Lohrer für den nützlichen Beitrag:

    ebt'ler (24.11.2010)

  9. #7
    Registriert seit
    01.09.2008
    Ort
    Berlin
    Beiträge
    172
    Danke
    51
    Erhielt 51 Danke für 44 Beiträge

    Standard

    Die Bitadresse ist zwar nicht dynamisch, aber je nach Anwendung ist es eine schönere Lösung.

  10. #8
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Zitat Zitat von ebt'ler Beitrag anzeigen
    Ich hätte es so gelöst:

    Code:
    PROGRAM PLC_PRG
    VAR
        pt : POINTER TO WORD;
        bit_adr: WORD;
        wert: BOOL;
    END_VAR
    ________________________________________________________
    
    bit_adr := BITADR(%IX0.0);
    
    pt := ADR(%IW0) + bit_adr / 16;
    pt^ := pt^  AND NOT SHL( BOOL_TO_WORD (1) , bit_adr MOD 16);
    IF wert = 1 THEN
    pt^ := pt^ OR SHL( BOOL_TO_WORD (1) , bit_adr MOD 16);
    END_IF
    Mit "wert" bestimmst du dann ob das Bit auf 0 oder 1 gesetzt werden soll.

    Die 48 aus deinen Bsp. kommen daher, dass der Pointer auf ein Array of BYTE gelegt ist, du aber die Eingänge im Format WORD vorliegen hast:
    WORDadresse.BITadresse
    Weil du in einem andern Beitrag auf diesen Thread hier verweist hätte ich eine Frage zu deinem Code.

    Wo genau wird der Variablen "wert" ein Wert zugewiesen oder wo wird auf "wert" verwiesen?
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  11. #9
    Registriert seit
    17.08.2010
    Ort
    Blaichach
    Beiträge
    84
    Danke
    1
    Erhielt 9 Danke für 9 Beiträge

    Standard

    hier noch meine "Version"

    (*Kassetten-Vorhanden über Visu simulieren*)
    IF KassetteVorhanden
    THEN
    pBool:=ADR(ST01_403_B3_6.BitInToCheck);
    pBool^:=TRUE;
    pBool:=ADR(ST01_403_B3_7.BitInToCheck);
    pBool^:=TRUE;
    END_IF
    Real programmers don’t comment their code. It was hard to write, it should be hard to understand.

  12. #10
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.687 Danke für 1.226 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von BerndAllgäu Beitrag anzeigen
    hier noch meine "Version"

    (*Kassetten-Vorhanden über Visu simulieren*)
    IF KassetteVorhanden
    THEN
    pBool:=ADR(ST01_403_B3_6.BitInToCheck);
    pBool^:=TRUE;
    pBool:=ADR(ST01_403_B3_7.BitInToCheck);
    pBool^:=TRUE;
    END_IF
    Hallo Bernd,
    ich hatte das mal so wie du in einer etwas anderen Weise probiert, siehe hier:
    http://www.sps-forum.de/showpost.php...63&postcount=4
    musste aber nachher feststellen dass es nicht ging. Welchen Datentyp hat deine Variable pBool? Ich nehme doch an auch POINTER TO BOOL oder?

Ähnliche Themen

  1. Eingänge setzen
    Von Poldi007 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 27.09.2009, 22:51
  2. PLCsim Eingänge über ext. Programm setzen?
    Von ottopaul im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 11.04.2009, 20:42
  3. AE-Kanäle softwaremäßig deaktivieren?
    Von DarkLykan im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 04.12.2008, 16:21
  4. Antworten: 8
    Letzter Beitrag: 14.03.2008, 13:55
  5. WinCC Eingänge setzen
    Von Anonymous im Forum HMI
    Antworten: 7
    Letzter Beitrag: 20.08.2004, 13:07

Lesezeichen

Berechtigungen

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