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

ST: Wie Arrays von Funktionsblock an Funktion übergeben?

Anonymous
2007-03-13
2007-03-19
  • Anonymous - 2007-03-13

    Originally created by: TH

    Es geht um die Parameterübergabe in ST.

    Ich habe mehrere Funktionsblöcke, die jeweils unterschiedlich große UINT Arrays zur Datenhaltung verwenden. Die Anzahl UINTs im Array variiert je nach FB zwischen ca 100 bis ca 20000.

    Nun muss ich eine Funktion bauen, die eine den Funktionsblöcken gemeinsame Berechnung ausführt, und zwar jeweils auf einem Sub-Bereich des UINT Array des aufrufenden FBs. Wie kann ich der Funktion das jeweilige UINT Array des FBs plus passende Indices oder ein passendes Teilfenster des Arrays übergeben, ohne daß das gesamte Array jedes mal kopiert wird?

     
  • Erik Böhm - 2007-03-13

    Hallo

    Das schreit ja geradezu nach einem Pointer...

    Kennst du dich mit Pointern aus ?

    Gruss

    Erik

     
  • Anonymous - 2007-03-13

    Originally created by: TH

    Ich bin eigentlich C-Programmierer und kenne mich deshalb mit Pointern sehr gut aus. Ich beschäftige mich zum erstem mal mit ST, und zwar deshalb, weil ich eine pointer-verseuchte C-Library nach ST portieren soll. Daher auch der ganze Ansatz, den ich leider nicht um-designen kann.

    Ich hatte den ST-Pointer in der Hilfe gefunden. Dort hat mich aber folgender Text abgeschreckt: "ADR Adressfunktion, nicht von der Norm IEC61131-3 vorgeschrieben". Wie ist das zu deuten? Ich möchte gerne IEC61131-3 konform bleiben. Kann ich POINTER und ADR dann trotzdem verwenden?

     
  • Anonymous - 2007-03-13

    Originally created by: TH

    Ich habe die Pointer mal schnell ausprobiert.

    Also mit POINTER TO UINT in der Funktion und ADR(auiData[4711]) beim Aufruf käme ich sofort und sehr gut klar und würde mich als C-Programmierer fast wie zu Hause fühlen.

    Es bleibt meine Frage: Ist das noch konform mit IEC61131-3?

    Danke.

     
  • Marcus Hartmann - 2007-03-13

    Also so weit ich weis sieht die IEC61131-3 keine Pointer vor

    Aber da diese nützlich sind bietet CoDeSys diese auch an warum sollte man diese denn nicht auch verwenden ;o)

     
  • Erik Böhm - 2007-03-13

    Hallo

    Wenn du früher C Programmiert hast ist das ja gar kein Problem.

    Nimm die Pointer. Funktionalität ist die selbe.

    Ist es wichtig für dich ob das in der IEC 61131-3 steht ?

    Gruss

    Erik

     
  • Erik Böhm - 2007-03-13

    Ausserdem steht ja in der Hilfe dass Pointer 'nicht vorgeschrieben' sind und nicht 'verboten'.

    Pointer sind ne feine Sache, wenn der Programmierer weiss was er tut

     
  • Anonymous - 2007-03-14

    Originally created by: TH

    Danke für die Antworten.

    Also für CoDeSys sind Pointer kein Problem, und ich kann damit gut umgehen und weiß was ich tue. So weit so gut.

    Ich habe die Anforderung, die Library nach IEC61131-3 zu portieren. Ich bin eher zufällig bei CoDeSys gelandet. Im Idealfall sollte also mein ST Code auch mit anderen IEC61131-3-Tools funktionieren und nicht nur mit CoDeSys.

    Leider habe ich keinen Überblick über Tools, die im IEC61131-3 Umfeld relevant sind.

    So wie ich eure Kommentare verstehe, bin ich bei Verwendung von Pointern an CoDeSys gebunden, und mein Code wäre nicht IEC61131-3 konform im strengen Sinne, oder?

     
  • Erik Böhm - 2007-03-14

    Hallo

    So ganz genau kann das vermutlich nur jemand von 3S klären, wie und ob Pointer in der Norm vorgesehen sind.

    Richte die Frage doch mal direkt an e support@3s-software.com e .

    Wenn Pointer grundsätzlich erlaubt sind, aber kein muss, dann kann jeder Hersteller selbst entscheiden ob er das unterstützt oder nicht.

    Wenn du jetzt die Library mit CoDeSys erstellst und abspeicherst, hast du aber auf jeden Fall schon mal ein Problem die Lib z.B. in S7 oder AutomationStudio von B&R (oder so...) wieder zu importieren, weil ja schon das File Format unterschiedlich ist.

    Da scheint mir auch die Aufgabenstellung deines Auftraggebers ein wenig besser definierbar zu sein...

    Gruss

    Erik

     
  • Anonymous - 2007-03-14

    Originally created by: Fx64

    Hallo,

    verstehe die Diskussion nicht!? Warum soll ein System nicht mehr können als eine Norm? Ob man es benutzen möchte, ist eine andere Frage.

    Portabler Code ist so oder so eine Traumvorstellung - ein bisschen Anpassungsbedarf wird es immer geben!! Norm hin oder her.

    Also wer mit Pointern gut kann, dann verwenden.

    Viele Grüsse

     
  • Erik Böhm - 2007-03-14

    Hallo

    @FX64: Portabler Code ist keine Traumvorstellung, sondern Realität.

    Besonders bei Libraries nach IEC 61131.

    Dafür ist die Norm schliesslich da.

    Libraries die keine explizit zielsystemspezifischen Funktionen enthalten sollten immer portierbar sein.

    Für die Anpassungan ans Zielsystem gibts dann die SysX libs.

    Nur zur Info...

    Erik

     
  • Anonymous - 2007-03-14

    Originally created by: Fx64

    Hallo Erik,

    sagen wir es so, die IEC PLCs und die Projekte, die ich bisher kennengelernt habe waren und sind nur mit mehr oder weniger Anpassungen portierbar; von den Systemfunktionen abgesehen.

    Dann scheinst Du bessere Erfahrungen gemacht zu haben - für mich ist es ein Traumtürmchen.

    Viele Grüsse

     
  • Erik Böhm - 2007-03-14

    Hallo

    Ich hab hier in der Firma diverse CoDeSys programmierbare Steuerungen von verschiedenen Herstellern.

    Die Portierbarkeit liegt dann wohl zum grössten Teil an der gewissenhaftigkeit der ausführenden Programmierer.

    Ich benutze meine Quellcodes fast täglich systemübergreifend.

    Deshalb gefällt mir ja das CoDeSys-System auch so gut.

    Gruss

    Erik

     
  • Anonymous - 2007-03-14

    Originally created by: Fx64

    Hallo Erik,

    dann tauscht Du ja allenfalls das Target - ich meinte aber Portierbarkeit zu anderen IEC 61131 Tools und dann wird es ganz schnell dünn. Denn wenn Du bei einem Tool bleibst, brauchst Du die Norm eh nicht!

    Viele Grüsse

     
  • Rainer - 2007-03-14

    Kannst du das Array nicht global deklarieren?

    Dann ist es überall bekannt und du brauchst es nicht übergeben.

     
  • Anonymous - 2007-03-15

    Originally created by: Bernhard Werner

    Hallo allerseits,

    zur Klarstellung: Pointer sind in der Norm nicht vorgesehen, das ist eine "3S-Erfindung". Es dürfte aber jedem klar sein, dass der beschriebene Fall ohne Pointer nicht sinnvoll zu lösen ist. Deswegen haben wir ja auch Pointer eingeführt.

    Ich würde niemandem raten, in seinem Projekt nur "reine" IEC zu verwenden. Aber es ist gut, wenn man weiss, an welchen Stellen man die Norm verlässt. Sinnvoll kann es sein, systemspezifische Teile in eigene Bausteine zu stecken, und vielleicht in einer Bibliothek zu kapseln.

    Im vorliegenden Fall hiesse das: die Funktion, die den Array bekommt auszugliedern, die Funktionsblöcke die die Arrays beinhalten aber in portierbarem ST zu schreiben.

    Wenn man portieren muss, muss man dann nur abgegrenzte Teile des Projekts anfassen.

    Das einfachste ist aber, man wechselt nur zu anderen CoDeSys-programmierbaren Geräten.

    Bernhard

     
  • Anonymous - 2007-03-19

    Originally created by: TH

    Nochmal vielen Dank für die vielen Antworten.

    @Rainer

    Die Variante "globales Array" scheidet aus, da ich verschiedene Funktionsblöcke mit solchen Arrays habe, die pro Funktionsblock unterschiedliche Daten enthalten und unterschiedliche Größen haben. Die Funktion(en) soll(en) mit dem Datenstrom in den Arrays arbeiten.

    @alle

    Mit Pointern konnte ich das Problem gut lösen. Es ist dann eben keine IEC 61131-3 Portierung geworden, sondern eine CoDeSys-Portierung, weil ich POINTER, ADR und SIZEOF verwendet habe. Eine andere Lösung konnte ich nicht finden, und laut Bernhard scheint es ja auch keine zu geben. Alternativ bräuchte ich wohl so was wie eine "Referenz" auf das Array oder so eine Art "gleitendes Sub-Array, das über das große Array verschiebbar ist, oder so eine Art "Basisklasse" zu den Funktionsblöcken.

    Es geht konkret um eine ST Portierung der fuzzyTECH Runtime Library. fuzzyTECH wird die Fuzzy-System-spezifischen Daten plus i/o-interface als einen instanzierbaren Funktionsblock erzeugen. Die eigentliche Fuzzy-Berechnung wird dann in einer Funktion durchgeführt werden, die für alle erstellbaren Fuzzy-Systeme gleich ist und durch das jeweilige Instanz-Daten-Array geeignet gesteuert wird.

     

Log in to post a comment.