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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 27

Thema: Indirekte Adressierung bei Codesys/TwinCat

  1. #1
    Registriert seit
    19.07.2008
    Ort
    Aachen
    Beiträge
    270
    Danke
    2
    Erhielt 21 Danke für 20 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute. Im Zuge meiner Facharbeiterprüfung hab ich in der S7 einen Baustein mit indirekter Adressierung geschrieben. Habe dadurch natürlich den Sinn und Zweck dieser Technik entdeckt. Jetzt habe ich eine Frage zu der Thematik: Ich möchte Messwerte in ein Array schreiben. Bei der S7 geht das so: Über Multipanel kann man bis zu 4 Quell-DB's auswählen, in denen der Messwert steckt (z.b. der Hauptistwert eines FU) Dazu dann noch das Wort, in welchem der Messwert innerhalb des DB steckt. In einer frei wählbaren Abtastzeit wird dann der erste Wert genommen und vom Quell-DB in den Ziel-DB geschrieben. Dieser beinhaltet ein Array aus 4000 Integer-Werten. Die ersten 1000 sind für Messwert 1, die zweiten 1000 für Messwert 2 usw. Das Programm adressiert über das Adressregister den ersten Integer-Wert des Array, schreibt den zur Messzeit aktuellen Messwert dort hinein und die Ziel-Adresse wird um 1 Wort erhöht. Zum nächsten Messzeitpunkt wird der zu diesem Zeitpunkt aktive Messwert in das 2. Wort des Array geschrieben. Dies wiederholt sich, bis der Bereich für diesen Messwert (sprich die ersten 1000 Worte des Array) voll sind. Wie kann ich soetwas mit Codesys umsetzen frage ich mich nun, denn ich arbeite mich privat gerade in Codesys ein. Hoffe mir kann jemand helfen. Grüße Sven
    Zitieren Zitieren Indirekte Adressierung bei Codesys/TwinCat  

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

    Standard

    Es gibt zwar auch Pointer etc. in Codesys, aber es geht viel einfacher. Du kannst Arrays erstellen (Wie auch in einem Step7-DB). Aber Codesys kann direkt über die Arrayindizes Daten in die Arrays schreiben. Der Indize darf also eine Variable sein. (Geht bei Step 7 nur mit SCL und wird dann intern von einem Compiler in Befehle mit ind. Adressierung umgesetzt). Das geht auch mit mehrdimensionalen Arrays, so daß du deine 3*1000 Meßwerte bei Bedarf in einem zweidimensionalen Array unterbringen kannst.
    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

  3. #3
    Majestic_1987 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.07.2008
    Ort
    Aachen
    Beiträge
    270
    Danke
    2
    Erhielt 21 Danke für 20 Beiträge

    Standard

    Gut, anderer Fall, der Fall, durch den ich auf ind. adressierung kam:

    Kunde will einen Betriebsstundenzähler für erstmal 10 Betriebsmittel, der die Betriebsstunden ausfallsicher speichert.

    Lösung S7:
    1 FC
    Lokale Parameter:
    IN:
    DB Nummer: INT
    DB Adresse: WORD

    plus 1 Datenbaustein mit folgender Struktur
    Seconds - INT
    Minutes - INT
    Hours - DINT
    --------------
    Das Muster wiederholt sich 100 mal.

    Der FC bekommt nen 1Hz-Taktmerker.
    Mit jeder steigenden Flanke wird der Sekunden-Wert inkrementiert:

    AUF DB[#DB_Nummer]

    L P##DB_Adresse
    LAR1

    U Taktmerker
    FP Temp_Taktmerker
    L DBW[AR1, P#0.0]
    + 1
    T DBW[AR1, P#0.0]

    Dann folgt der Vergleich des dort liegenden Wertes auf 60.
    Ist der Wert gleich 60 wird das Adressregister um P#2.0 erhöht.

    Dann dieser Wert (Minuten) um 1 inkrmentiert, Sekundenwert auf 0 gesetzt und Minutenwert auf 60 verglichen.

    Adressregister wieder um 1 Wort erhöht und dann die Stunden inkrementiert, Minuten auf 0 gesetzt....usw.

    Beim Aufruf des FC übergibt man die DB-Nummer sowie die Adresse, an welcher der Datenbereich des zu überwachenden Betriebsmittels beginnt, z.B. DBW20

    Ist auch das in Codesys (einfacher) lösbar?

    Zur Array-Struktur in Codesys (habe dort bisher nicht mit Arrays gearbeitet):

    Gelten für das Array hier auch die selben Grenzen wie bei Step7? Also max 65535 Werte und maximal 6 Dimensionen?
    Und wie lautet der Befehl (AWL, ST) mit dem ich auf ein Datenelement im Array zugreife? Speziell wenn dieses eine Variable ist?
    Geändert von Majestic_1987 (26.03.2009 um 17:33 Uhr)

  4. #4
    Registriert seit
    27.04.2006
    Ort
    Sauerland
    Beiträge
    626
    Danke
    183
    Erhielt 88 Danke für 81 Beiträge

    Standard

    Aus der Codesys Hilfe:

    Code:
    Pointer 
     pt:POINTER TO INT;
     var_int1:INT := 5;
     var_int2:INT;
     pt := ADR(var_int1);
     var_int2:= pt^; (* var_int2 ist nun 5 *)
    Trotzdem würde ich das mit Arrays machen.
    Die Kunst in der Personalführung ist es
    die Mitarbeiter so über den Tisch zu ziehen,
    dass sie die Reibungshitze als Nestwärme empfinden.

  5. #5
    Majestic_1987 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.07.2008
    Ort
    Aachen
    Beiträge
    270
    Danke
    2
    Erhielt 21 Danke für 20 Beiträge

    Standard

    Wir lernen also, dass es in Codesys nur speicherindirekte Adressierung gibt.

    Mensch, das is das blöde daran, bei Siemens zu lernen: Nur da gibts diese DB-Geschichte....und wenn man daran gewöhnt is fällts schwer, davon weg zu kommen xD

  6. #6
    Registriert seit
    19.11.2006
    Beiträge
    1.346
    Danke
    6
    Erhielt 254 Danke für 231 Beiträge

    Standard

    Ich kenne mich mit Step7 leider nicht so gut aus und mit AWL komm ich auch nicht klar, daher werde ich dir mal kurz erläutern, wie man bei CoDeSys /TwinCAT mit Strukturiertem Text solche Dinge angeht:

    DBs sind bei CoDeSys Strukturen.
    Deklaration:
    Code:
    TYPE myStructType:
        STRUCT 
           bBool1 : BOOL;
           iInteger1: INT;
           sString1: STRING(20);
           arrInteger1: ARRAY [0..10] OF INT;
        END_STRUCT
    END_TYPE
    In deinem Programmteil, sei's ein Programm oder ein Funktionsbaustein, kannst du nun einzelne dieser Strukturen deklarieren oder auch ganze Arrays davon:
    Code:
    VAR
         stMyStruct: myStructType;
         arrstMyStruct: ARRAY [0..5] OF myStructType;
         iarrMesswerte: ARRAY [0..10] OF INT;
    END_VAR
    Im Array kann man dann je nach bedarf einzelne Elemente der Struktur behandeln oder z.B. mittels Schleifen ganze Abläufe automatisieren.
    Code:
    stMyStruct.bBool1  := TRUE;
    stMyStruct.arrInteger1[2] := 32;                  (* Array in der Struktur beschrieben *)
    arrstMyStruct[1].stMyStruct.arrInteger1[3] := 64;  (* Array-Element des Arrays beschrieben *)
    
    ....
    
    (*Bearbeitung mittels Schleife*)
    FOR i:=0 TO 10 DO
        stMyStruct.arrInteger1[i] := iarrMesswerte[i];
    END_FOR
    
    ...
    
    CASE y OF
    1:  stMyStruct.arrInteger1[y] := iMesswert;
         stMyStruct.bBool1  := TRUE;
         stMyStruct.sString1 := 'Messwert im Index 1';
    2:  stMyStruct.arrInteger1[y] := iMesswert;
         stMyStruct.bBool1  := FALSE;
         stMyStruct.sString1 := 'Messwert im Index 2';
    END_CASE
    (Du kannst die maximale Array-Größe auch mit einer VAR CONSTANT festlegen)
    Code:
    VAR
         arrstMyStruct: ARRAY [0..iMax ] OF myStructType;
    END_VAR
    VAR CONSTANT
         iMax : INT := 5;
    END_VAR
    So kannst du bei CoDeSys und TwinCAT alles komplett ohne direkte Adressierungen und ohne Pointer erledigen
    ... noch Fragen?
    Geändert von trinitaucher (26.03.2009 um 17:59 Uhr)

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

    Standard

    Zitat Zitat von Majestic_1987 Beitrag anzeigen
    Mensch, das is das blöde daran, bei Siemens zu lernen: Nur da gibts diese DB-Geschichte....und wenn man daran gewöhnt is fällts schwer, davon weg zu kommen xD
    Wenn du bei S symbolisch programmierst interessieren dich (außer evtl. in FUP/AWL) die DBs auch nicht mehr.

    Dein Anwendungsfall würde ich in ST lösen.

    Code:
    TYPE runtime_t :
    STRUCT
        seconds : INT;
        minutes : INT;
        hours    : DINT;
    END_STRUCT
    END_TYPE
    Zählfunktion mit so einer Schnittstelle:

    Code:
    FUNCTION runtime_counter : BOOL
    VAR_INPUT
        running : BOOL; (* Antrieb in Betrieb *)
    END_VAR
    VAR_IN_OUT
        runtime : runtime_t;
    END_VAR
    Dann kannst du dir ein globales Array in beliebiger Dimension vom Typ runtime_t anlegen, und damit jeden Funktionsaufruf mit z.B. antriebe[1, 9] beschalten.

    Die Zähleraufrufe dann im 1 Sekunden Task aufrufen.

  8. #8
    Majestic_1987 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.07.2008
    Ort
    Aachen
    Beiträge
    270
    Danke
    2
    Erhielt 21 Danke für 20 Beiträge

    Standard

    Erstmal dankeschön für die fixen Antworten.

    Ist halt alles ne Sache der Gewöhnung Sieht so zwar auf den ersten Blick kompliziert aus (weil ich auch bisher wenig in ST gemacht hab) aber scheint doch recht easy und vor allem durchschaubar zu sein.

    Hab in nem anderen Beitrag (wo jemand was ähnliches machen will) den Befehl

    Code:
    TVar[i] := 0
    entdeckt. Was hats damit auf sich? Versuche mich grad nämlich an soner Schleife in ST.

    Ist ST eig. für sämtliche Aufgaben der Steuerungstechnik geeignet oder ist in bestimmten Bereichen FUP oder CFC sinnvoller?

    Und an Thomas zum Thema DB's interessieren nicht:

    Projekte bei uns (ich denke da z.b. an Hochregallager oder auch an Stahlwerke) bestehen aus mindestens so vielen DB's wie FC's Also das ist in der Step7-Programmierung, auch wenn sie voll symbolisch erfolgt, standard.
    Der unterschied zur IEC ist ja vor allem, dass man in Step7 komplett selber adressiert während man in der IEC komplett mit Variablen arbeitet und sich nicht um adressierung kümmern muss..oder verwendet hier jemand Merker in Codesys??
    Geändert von Majestic_1987 (26.03.2009 um 18:08 Uhr)

  9. #9
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.735
    Danke
    321
    Erhielt 1.523 Danke für 1.283 Beiträge

    Standard

    Hier mal eine Quick and Dirty Lösung für dein Betriebsstundenprob,
    jetzt bist du mit Siemens wieder dran ...

    Einfach das Txt von der Datei hinten löschen, und in Codesys öffnen.

    Mfg
    Manuel
    Angehängte Dateien Angehängte Dateien
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

  10. #10
    Majestic_1987 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.07.2008
    Ort
    Aachen
    Beiträge
    270
    Danke
    2
    Erhielt 21 Danke für 20 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke schonmal, aber ich versuchs erstmal selber

    In Step7 hab ichs übrigens schon lauffähig, wie gesagt möchte ich aber (stichwort Rundumblick) auch Codesys lernen, und da is dann ohne DB's der Anfang schwer xD

Ähnliche Themen

  1. KOP/FUB indirekte Adressierung
    Von S7-kub im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 14.03.2010, 19:13
  2. Indirekte Adressierung
    Von Bensen83 im Forum Simatic
    Antworten: 34
    Letzter Beitrag: 26.01.2010, 11:33
  3. Indirekte-Adressierung
    Von johnij im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 14.02.2008, 14:32
  4. Indirekte Adressierung
    Von hbck im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 29.06.2007, 17:11
  5. Indirekte Adressierung aus DB
    Von Abbath im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 18.04.2005, 15:58

Lesezeichen

Berechtigungen

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