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

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

Thema: Dynamische Arrays

  1. #11
    Flo123 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    05.01.2016
    Beiträge
    13
    Danke
    7
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    danke für die schnelle Antwort,

    dann versuche ich das nun mit __NEW und __DELETE.

    Wenn ich
    Matrix = __NEW(LREAL,3);
    schreibe
    kann ich komischerweise die Elemente
    Matrix[0], Matrix[1], Matrix[2] und Matrix[3] ansprechen. Es müssten doch aber eigentlich nur 3 sein. Welche sind denn die richtigen Indixes? 0-2 oder 1-3?

    Schöne Grüße

  2. #12
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.314
    Danke
    932
    Erhielt 3.329 Danke für 2.688 Beiträge

    Standard

    Und was nützt Dir das Spiel mit dem NEW/DELETE? Kannst die verschiedenen Arrays trotzdem nicht an Deine Function übergeben.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #13
    Flo123 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    05.01.2016
    Beiträge
    13
    Danke
    7
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Doch das geht bei mir schon

    Main Programm:
    VAR
    pElem : POINTER TO LREAL;
    END_VAR

    pElem := __NEW(LREAL, 3);
    pElem[0] := 1;
    pElem[1] := 2;
    pElem[2] := 3;

    fInitMatrix(3,1,pElem,m=>test);

    Funktion fInitMatrix
    VAR_INPUT
    nRows : UDINT;
    nCols : UDINT;
    pElem : POINTER TO LREAL;
    END_VARS

    pElem[0] := 10;
    pElem[1] := 20;
    usw.

    Dabei kann die 3 in jedem zyklus im Main Programm verändert werden und somit nimmt die Funktion eine "variable" Größe des Arrays auf. Oder sehe ich das falsch?
    Geändert von Flo123 (07.01.2016 um 16:31 Uhr)

  4. #14
    Registriert seit
    15.08.2011
    Beiträge
    383
    Danke
    2
    Erhielt 73 Danke für 71 Beiträge

    Standard

    Zitat Zitat von Flo123 Beitrag anzeigen
    danke für die schnelle Antwort,

    dann versuche ich das nun mit __NEW und __DELETE.

    Wenn ich
    Matrix = __NEW(LREAL,3);
    schreibe
    kann ich komischerweise die Elemente
    Matrix[0], Matrix[1], Matrix[2] und Matrix[3] ansprechen. Es müssten doch aber eigentlich nur 3 sein. Welche sind denn die richtigen Indixes? 0-2 oder 1-3?

    Schöne Grüße
    Der Speicher liegt im Bereich von Matrix[0..2].
    Ein Zugriff ist auch auf Matrix[22] oder welcher Wert auch immer möglich.
    Du als Programmierer bist selbst dafür verantwortlich, den allocierten Speicher "richtig" zu nutzen.

    Den oben gezeigten "falschen" Zugriff kannst du mit einer Überpürfungsfunktion: "POU for implicit checks" erkennen und abfangen.
    Hier weitere Informationen.

  5. Folgender Benutzer sagt Danke zu mac203 für den nützlichen Beitrag:

    Flo123 (08.01.2016)

  6. #15
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.314
    Danke
    932
    Erhielt 3.329 Danke für 2.688 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Und was nützt Dir das Spiel mit dem NEW/DELETE?
    Zitat Zitat von Flo123 Beitrag anzeigen
    Main Programm:
    VAR
    pElem : POINTER TO LREAL;
    END_VAR

    pElem := __NEW(LREAL, 3);
    pElem[0] := 1;
    pElem[1] := 2;
    pElem[2] := 3;

    fInitMatrix(3,1,pElem,m=>test);

    Funktion fInitMatrix
    VAR_INPUT
    nRows : UDINT;
    nCols : UDINT;
    pElem : POINTER TO LREAL;
    END_VARS

    pElem[0] := 10;
    pElem[1] := 20;
    usw.

    Dabei kann die 3 in jedem zyklus im Main Programm verändert werden und somit nimmt die Funktion eine "variable" Größe des Arrays auf.
    Ganz ohne NEW:
    Code:
    Main Programm:
    VAR
     pElem : POINTER TO LREAL;
     matrix1 : ARRAY[1..3] OF LREAL;
     matrix2 : ARRAY[1..4,1..3] OF LREAL;
    END_VAR
    
    pElem := ADR(matrix1);
    fInitMatrix(3,1,pElem,m=>test);
    
    pElem := ADR(matrix2);
    fInitMatrix(4,3,pElem,m=>test);
    
    //vermutlich geht auch direkt
    fInitMatrix(3,1,ADR(matrix1),m=>test);
    fInitMatrix(4,3,ADR(matrix2),m=>test);
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Flo123 (11.01.2016)

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

    Standard

    Zitat Zitat von Blockmove Beitrag anzeigen
    Der Sinn von dynamischen (zur Laufzeit änderbaren) Arrays auf einer SPS hat sich mir noch nie erschlossen.
    Ich muss die SPS sowieso so auslegen, dass sie die größten Arrays verarbeiten kann. Also wo soll der Vorteil sein bzw. nennt mir mal einen Anwendungsfall wo es zwingend notwendig ist.

    Gruß
    Dieter
    Genau, es ist eine Frage der Sicherheit, damit schon im Moment des Programmdownloads klar ist, dass es keine Memory Probleme geben kann, weil irgendwann einmal eine Grenze überschritten wird oder dass das Memory durch ewige NEW/DELETE fragmentiert ist.

    Der Programmierer soll und kann ja eine Maximal Grösse angeben und dann im Zuge der Anwendung nur einen Teil des Arrays benutzen.

    Das Gleiche ist auch die Begründung für die Einschränkung, dass man aus einer Funktion heraus keinen Funktionsbaustein instanzieren kann.
    Als Freelancer immer auf der Suche nach interessanten Projekten.
    Zitieren Zitieren Sicherheit  

  9. #17
    Registriert seit
    29.03.2004
    Beiträge
    5.797
    Danke
    144
    Erhielt 1.707 Danke für 1.239 Beiträge

    Standard

    Zitat Zitat von RobiHerb Beitrag anzeigen
    Das Gleiche ist auch die Begründung für die Einschränkung, dass man aus einer Funktion heraus keinen Funktionsbaustein instanzieren kann.
    Finde ich als Begründung nicht schlüssig, denn in einer Funktion ließe sich die Instanz auch auf dem Stack erzeugen und nicht auf dem Heap. Wie es bei C++ auch gemacht wird wenn ich ein Objekt mit z.B.
    Object foo;
    erzeuge und nicht über einen Zeiger und new.
    Dann gibt es keine Fragmentierung des Speichers. Höchstens einen Stacküberlauf, aber den kann man sich ja auch einfangen in dem man z.B. große Strings oder sonstige große Variablen anlegt.
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

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

    Standard

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Finde ich als Begründung nicht schlüssig, .... Höchstens einen Stacküberlauf, aber den kann man sich ja auch einfangen in dem man z.B. große Strings oder sonstige große Variablen anlegt.
    Im Prinzip kann ich auch eine SPS wohl leicht abschiessen, wenn ich z.B. recursiv ohne Ende eine Funktion aufrufe.

    Bei der Entwicklung der Sprache ST wollte man gerade auf die Probleme eingehen, die durch "unerfahrene" C Programmierer überall entstanden sind. Speicherüberlauf, Fragmentierung, nicht wieder freigegebene Resourcen etc. Wem aus der SPS Welt sind schon Stack und Heap mit allen Konsequenzen klar, wer überblickt Millionen/Milliarden von ggf. gegenläufigen Speicheranforderungen und Freigaben?

    Deshalb die Einschränkungen in ST, man hatte den Stndard SPS Programmierer im Blick:

    Quereinsteiger aus dem Elektro Bereich,
    Autodidakt ohne IT Ausbildung,
    Einzelkämpfer ohne Test und Freigabe Abteilung,
    Schnellschuss Fixer auf der Baustelle mit nervösem Chef im Rücken.
    Als Freelancer immer auf der Suche nach interessanten Projekten.
    Zitieren Zitieren Wer programmiert die SPS ?  

  11. #19
    Registriert seit
    29.03.2004
    Beiträge
    5.797
    Danke
    144
    Erhielt 1.707 Danke für 1.239 Beiträge

    Standard

    Zitat Zitat von RobiHerb Beitrag anzeigen
    Im Prinzip kann ich auch eine SPS wohl leicht abschiessen, wenn ich z.B. recursiv ohne Ende eine Funktion aufrufe.

    Bei der Entwicklung der Sprache ST wollte man gerade auf die Probleme eingehen, die durch "unerfahrene" C Programmierer überall entstanden sind. Speicherüberlauf, Fragmentierung, nicht wieder freigegebene Resourcen etc. Wem aus der SPS Welt sind schon Stack und Heap mit allen Konsequenzen klar, wer überblickt Millionen/Milliarden von ggf. gegenläufigen Speicheranforderungen und Freigaben?
    Die statische Analyse wie des Aufrufbaums im Programm lässt sich problemlos durch den Compiler erledigen, und dann ggf. eine Warnmeldung erzeugen. Es macht auch keinen Unterschied ob ich eine FB-Instanz mit 200 Bytes Instanzdaten, oder einen String mit 200 Zeichen auf dem Temp-Bereich (also Stack) ablege. D.h. der Stack"verbrauch" steht schon zur Compilezeit fest.
    Bei Siemens S7 ist das noch einfacher. Da ist keine Rekursion erlaubt (zumindest nicht ohne Umwege um den Compiler zu täuschen), die maximale Schachtelungstiefe ist auf einen festen Wert begrenzt, und es gibt eine feste größe an Lokaldaten(-stack) pro Baustein. Da kann bezüglich Speicher nichts schiefgehen.

    Eine logische Erklärung warum eine FB-Instanz nicht in einer Funktion abgelegt werden kann wäre für mich, dass dann die Funktion der Instanz-Variablen nicht mehr der entspricht wie sie in der IEC-Norm vorgegeben ist. Mit unklarem Speicherverbrauch oder Fragmentierung hätte das nichts zu tun, weil es wenn dann auf dem Stack abgelegt würde.
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

  12. #20
    Flo123 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    05.01.2016
    Beiträge
    13
    Danke
    7
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von PN/DP Beitrag anzeigen
    Ganz ohne NEW:
    Code:
    Main Programm:
    VAR
     pElem : POINTER TO LREAL;
     matrix1 : ARRAY[1..3] OF LREAL;
     matrix2 : ARRAY[1..4,1..3] OF LREAL;
    END_VAR
    
    pElem := ADR(matrix1);
    fInitMatrix(3,1,pElem,m=>test);
    
    pElem := ADR(matrix2);
    fInitMatrix(4,3,pElem,m=>test);
    
    //vermutlich geht auch direkt
    fInitMatrix(3,1,ADR(matrix1),m=>test);
    fInitMatrix(4,3,ADR(matrix2),m=>test);
    So habe ich das nun auch gemacht. Finde ich die beste und einfachste Lösung!!

    Vielen Dank

Ähnliche Themen

  1. Dynamische Modbusadressierung
    Von AB5656 im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 19.07.2013, 08:03
  2. Dynamische Structs? S7
    Von voluba im Forum Programmierstrategien
    Antworten: 5
    Letzter Beitrag: 05.06.2012, 20:31
  3. dynamische Arrays?
    Von merlin im Forum CODESYS und IEC61131
    Antworten: 7
    Letzter Beitrag: 30.05.2008, 16:06
  4. Dynamische Schrittkette
    Von Pau1e im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 26.03.2008, 20:09
  5. Dynamische Domain?
    Von knabi im Forum Stammtisch
    Antworten: 6
    Letzter Beitrag: 14.03.2006, 20:53

Lesezeichen

Berechtigungen

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