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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 27

Thema: Indirekte Adressierung bei Codesys/TwinCat

  1. #11
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.751
    Danke
    323
    Erhielt 1.526 Danke für 1.286 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zu deinem Siemens-Code Schnipsel,
    eine Flankenauswertung in einem Mehrfach aurfrufbaren FC kannst du eh vergessen,
    das aber nur ganz am Rande ...
    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).

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

    Standard

    Zitat Zitat von Majestic_1987 Beitrag anzeigen
    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.
    "i" ist eine gewöhnliche Variable. Kannst auch nen anderen Namen nehmen. Hier steht i für den Index eines Array. So kannst du in Schleifen durch manipulation des Index sehr unkompliziert zB ein ganzes Array in einem Rutsch beschreiben.
    Code:
    VAR
      iArray: ARRAY [0..iMax] OF INT;
      i : INT;
    END_VAR
    VAR CONSTANT
      iMax: INT := 999;
    END_VAR
    
    ----------------------
    FOR i:= 0 TO iMax DO
      iArray[i] := (* irgendwas *);
    END_FOR
    Zitat Zitat von Majestic_1987 Beitrag anzeigen
    Ist ST eig. für sämtliche Aufgaben der Steuerungstechnik geeignet oder ist in bestimmten Bereichen FUP oder CFC sinnvoller?
    Wir nutzen bei uns nur ST. Haben bisher auch noch nie irgend eine "Grenze" erkannt.
    Vorteil, sofern man sich an das Hochsprachen-ähnliche Programmieren gewöhnt hat, ist für mich, dass du insbesondere solche Schleifen oder Verriegelungen sehr einfach realisieren kannst. Und dann ist der Schritt zur kompletten Datenverwaltung innerhalb der SPS nicht mehr schwer. Insbeondere TwinCAT bietet dir ja bei PC-Systemen zig Möglichkeiten um mit PC-Daten oder Datenbanken zu arbeiten.
    Im Gegensatz zu "grafischen" Sprachen ist der Bildschirm nicht so voll. Probier mal größere mathematische Rechungen mit FUP ,
    und im Vergleich zu AWL finde ich ist ST-Code leichter lesbar, wenn's ums Debuggen geht.

  3. #13
    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

    Naja das ST für Mathe top ist war mir von vorn herein klar, hatte nur immer meine Zweifel in sachen Bit-Logic, wofür ja AWL und FUP prädestiniert sind.

    Andere Sache:

    Angenommen ich hab 4 Arrays.
    Array1
    Array2
    Array3
    Array4

    Ich möchte gerne das Array, auf das mein Baustein zugreifen soll, als Lokalparameter diesem Baustein übergeben...


    Wie mach ich das? Welchen Typ muss die IN-Variable haben?

    Ziel wäre z.b. dass ich in der Visualisierung für ne Kurve oder sowas mittels Drop-Down das Array auswählen kann, in das mein Baustein Daten schreibt.

    @Trinitaucher:

    Das i war mir klar, das TVar nicht. Mir is dann grad auch mal aufgefallen, dass es sich bei TVar um ein Array handelt, auf dessen i-tes Element zugegriffen wird.

  4. #14
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Zitat Zitat von Majestic_1987 Beitrag anzeigen
    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
    DBs sind IMHO Rotz. Die Pointerei auf der S7 ist 1. auch Rotz und 2. auch "speicherindirekt" (wie Du es getauft hast). Man bildet einen Pointer von einer Variable und manipuliert diesen dann mit Byteoffsets. Das kann man in CoDeSys zwar auch tun aber oft ist dies nicht notwendig da man auch von einem Pointer aus Symbolisch weiteradressieren kann.
    Dies bringt mich zu Deiner Frage mit den Arrays:
    Zitat Zitat von Majestic_1987 Beitrag anzeigen
    ...
    Angenommen ich hab 4 Arrays.
    Array1
    Array2
    Array3
    Array4

    Ich möchte gerne das Array, auf das mein Baustein zugreifen soll, als Lokalparameter diesem Baustein übergeben...


    Wie mach ich das? Welchen Typ muss die IN-Variable haben?

    Ziel wäre z.b. dass ich in der Visualisierung für ne Kurve oder sowas mittels Drop-Down das Array auswählen kann, in das mein Baustein Daten schreibt.
    ...
    Obligatorische Gegenfrage wie würdest Du das bei der S7 machen?

    Ich gehe davon aus das Du nun keine Kopie des Arrays anlegen willst da kann man dann zu einem Pointer greifen.

    Ich geh mal davon auf das Du die Arrays irgend wo global definiert hast:
    Code:
    VAR_GLOBAL
      Array1 : ARRAY[0..MAXCHART] OF INT;
      Array2 : ARRAY[0..MAXCHART] OF INT;
      Array3 : ARRAY[0..MAXCHART] OF INT;
      Array4 : ARRAY[0..MAXCHART] OF INT;
      (* MAXCHART ist eine globale Konstante damit man das nicht immer von Hand anpassen muss *)
    END_VAR
    Nun zum Eingang der Funktion:
    Code:
    VAR_INPUT
         Chart : POINTER TO ARRAY[0..MAXCHART] OF INT;
    END_VAR
    In der Funktion kann man dann auf das Array so Zugreifen:
    Code:
    Chart^[2] := 99; (* fester INDEX*)
    
    FOR i := 0 TO MAXCHART DO
      Chart^[i] := 0; (* variabler INDEX*)
    END_FOR
    Nun ist bei dem Aufruf der Funktion noch zu beachten das man einen Pointer versorgen muss:
    Code:
    RetVal := MyFunction(Chart:=ADR(Chart1));
    ---

    Diese Anwendung eigent sich auch für Strukturen (Benutzerdefinierte Datentypen). Da man halt im Baustein dann weiterhin Symbolisch zugreifen kann.

    PS: Man könnte es auch ganz schnöde mit einem FB und einem IN_OUT lösen den gibt es aber im FC nun mal nicht.
    PPS: Es gibt immer für und wider
    Geändert von zotos (26.03.2009 um 19:27 Uhr)
    If you open your Mind too much, your Brain will fall out.

  5. #15
    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

    Zitat Zitat von zotos Beitrag anzeigen
    [/code]Nun ist bei dem Aufruf der Funktion noch zu beachten das man einen Pointer versorgen muss:
    Code:
    RetVal := MyFunction(Chart:=ADR(Chart1));
    ---

    Diese Anwendung eigent sich auch für Strukturen (Benutzerdefinierte Datentypen). Da man halt im Baustein dann weiterhin Symbolisch zugreifen kann.

    PS: Man könnte es auch ganz schnöde mit einem FB und einem IN_OUT lösen den gibt es aber im FC nun mal nicht.
    PPS: Es gibt immer für und wider
    1. Frage:

    Wo trägst du denn jetzt den Namen des Array (Array1) ein?
    RevVal ist doch der Rückgabewert der Funktion welche du weiter oben geschrieben hast. Aber irgendwo muss ich dem Pointer ja sagen "Adressiere Array1" So dass dessen interne Adresse dann im FC zur Verfügung steht.

    2. Frage:

    Wie hätte man das per IN_OUT gelöst?
    IN_OUT vom Typ Array of Int oder wie?

  6. #16
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Zitat Zitat von Majestic_1987 Beitrag anzeigen
    1. Frage:

    Wo trägst du denn jetzt den Namen des Array (Array1) ein?
    Ähm ja Schreibfehler ich wollte die Variablen Array1 bis 4 eigentlich Chart1 bis 4 nennen und habe das in der globalen Deklaration dann doch verschnarcht.

    Zitat Zitat von Majestic_1987 Beitrag anzeigen
    RevVal ist doch der Rückgabewert der Funktion...
    Der RetVal hat nichts mit dem Thema zu tun das habe ich einfach reflexartig beim Funktionsaufruf verwendet.

    Zitat Zitat von Majestic_1987 Beitrag anzeigen
    2. Frage:

    Wie hätte man das per IN_OUT gelöst?
    IN_OUT vom Typ Array of Int oder wie?
    IN_OUT nur bei PRGs und FBs erlaubt und dann einfach:

    Code:
    VAR_IN_OUT
        Chart : ARRAY[0..MAXCHART] OF INT;
    END_VAR
    If you open your Mind too much, your Brain will fall out.

  7. #17
    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

    Hallo Leute....

    wo ist hier der Fehler?? Das schreiben der Werte in das Array soll stoppen, sobald Start = False ist...aber egal welchen Zustand Start hat, das Array wird weiter beschrieben

    Code:
    VAR_INPUT
        Start: BOOL;
        Array_Nummer: INT :=0; (*Werte schreiben ab diesem Element*)
        Array_Elements: INT; (*Gesamtheit der Elemente im Array*)
    END_VAR
    VAR_OUTPUT
        Error: BOOL;
    END_VAR
    VAR
        timer1:TP;
        timer2:TP;
        ft1: R_TRIG;
        Zaehl: INT;
    
    ----------------------------------------------------------------------
    
    Timer1 (IN:=Start AND NOT Timer2.Q,PT:=T#100ms);
    Timer2 (IN:=Start AND NOT Timer1.Q,PT:=T#100ms);
    ft1 (CLK:=Timer1.Q);
    
    IF Array_Elements > 1000 THEN
        Error := TRUE;
             RETURN;
    END_IF
    
    IF Start AND ft1.Q THEN
            Messwerte[Zaehl] := Analogwert;
            Zaehl := Zaehl + 1;
    
                IF Zaehl > Array_Elements THEN
                Zaehl := 0;
                END_IF
    
    END_IF

  8. #18
    Registriert seit
    29.03.2004
    Beiträge
    5.792
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    Zitat Zitat von zotos Beitrag anzeigen
    IN_OUT nur bei PRGs und FBs erlaubt und dann einfach:
    Bei TwinCat gehen IN_OUT auch bei FCs, oder worauf bezieht sich diese Beschränkung?

  9. #19
    Registriert seit
    09.11.2007
    Ort
    Rhein Main (Darmstadt)
    Beiträge
    663
    Danke
    61
    Erhielt 112 Danke für 80 Beiträge

    Lächeln

    Zitat Zitat von Majestic_1987 Beitrag anzeigen
    Hallo Leute....

    wo ist hier der Fehler?? Das schreiben der Werte in das Array soll stoppen, sobald Start = False ist...aber egal welchen Zustand Start hat, das Array wird weiter beschrieben

    Code:
    VAR_INPUT
        Start: BOOL;
        Array_Nummer: INT :=0; (*Werte schreiben ab diesem Element*)
        Array_Elements: INT; (*Gesamtheit der Elemente im Array*)
    END_VAR
    ...
    Ich sehe den Fehler nicht direkt und es ist auch unvollständig.

    Ich würde es etwas defensiver angehen und die Eingangsparameter alle oder gar keinen vorbelegen.

    Zitat Zitat von Majestic_1987 Beitrag anzeigen
    Code:
    IF Start AND ft1.Q THEN
            Messwerte[Zaehl] := Analogwert;
    Dann würde ich hier so ansetzen:

    IF ((Start <> FALSE) AND (ft1.Q <> FALSE)) THEN

    So bin ich zumindest sicher, dass keine Auswerte Prioritäten durcheiander geraten.

    Wenn es immer noch nicht hilft:

    BOOL bTest := (Start <> FALSE) AND (ft1.Q <> FALSE);

    und im Debugger anschauen, was daraus wird. Ansonsten erst mal Wochenende ausschlafen.
    Als Freelancer immer auf der Suche nach interessanten Projekten.
    Zitieren Zitieren Defensiv  

  10. #20
    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
    Oha, ich bin überzeugt.
    Habe jetzt ne richtig schicke Messwertspeicher-Funktion. In Kombination mit dem "CASE" Befehl wirklich praktisch Also ich mag Codesys

    Hier mal mein geistiger Erguss, ich bitte um Kommentierung:

    Variablen:
    Code:
    FUNCTION_BLOCK Test_Adress
    VAR_INPUT
        Start: BOOL; (*Start-Bit für Messwertspeicherung*)         
        Array_Nummer: INT :=0; (Array-Element ab welchem Speicherung erfolgen soll*)
        Array_Elements: INT; (*Gesamtmenge der Elemente im Array, die beschrieben werden sollen*)
        Delete_Array: BOOL; (*Aktives Array löschen*)
        Array_Name: POINTER TO ARRAY [0..MaxChart] OF INT; (*Parameter Pointer auf nächstes Array*)
    END_VAR
    
    VAR_IN_OUT
    END_VAR
    
    VAR_OUTPUT
        Error: BOOL;
        Delete_Run: BOOL;
        Array_Full: BOOL;
    END_VAR
    VAR
        Active_Array: POINTER TO ARRAY [0..MaxChart] OF INT; (*aktives Array*)
        timer1:TP;
        timer2:TP;
        Zaehl: INT;
        ft1: R_TRIG;
        ft2: R_TRIG;
    END_VAR
    Programmcode:
    Code:
    Timer1 (IN:=Start AND NOT Timer2.Q,PT:=T#125ms);
    Timer2 (IN:=NOT Timer1.Q,PT:=T#125ms);
    ft1 (CLK:=Timer1.Q);
    
    (* Neues Array nur akzeptieren, wenn altes voll oder leer*)
    IF Array_Full OR Zaehl = 0 THEN
        Active_Array := Array_Name;
    END_IF
    
    (*Wenn Array-Elementzahl größer als Maximalwert -> Fehler*)
    IF Array_Elements > 1000 THEN
        Error := TRUE;
        RETURN;
    ELSE
        Error := FALSE;
    END_IF
    
    (*Wenn Start und Abtastzeit starte Werttransfer*)
    IF Start AND ft1.Q THEN
            Active_Array^[Zaehl] := Analogwert;
            Zaehl := Zaehl + 1;
            Array_Full := FALSE;
    
                IF Zaehl > Array_Elements THEN
                    Array_Full := TRUE;
                    Zaehl := 0;
                END_IF
    
    END_IF
    
    (*Bei Flanke am Lösch-Bit aktives Array mit 0 beschreiben*)
    
    ft2 (CLK:=Delete_Array);
    
    IF ft2.Q THEN
        FOR Zaehl := 0 TO Array_Elements DO
        Active_Array^[Zaehl] := 0;
        Delete_Run := TRUE;
        END_FOR
        Zaehl := 0;
    ELSE
        Delete_Run := FALSE;
    END_IF
    Geändert von Majestic_1987 (26.03.2009 um 23:53 Uhr)

Ä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
  •