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

Ergebnis 1 bis 7 von 7

Thema: ADS-Zugriff auf lokale Variable im FB?

  1. #1
    Registriert seit
    04.09.2009
    Ort
    Mainz
    Beiträge
    15
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich habe ein kleines Verständnisproblem beim SPS-Variablenzugriff über ADS, vllt kann mir jemand aushelfen.

    Mein aktueller "Testaufbau" ist der folgende:

    Auf der SPS läuft ein einfacher Test-FB der (u.a.) die lokale Variable "_test" enthält:
    Code:
    FUNCTION_BLOCK FB_Test
    VAR
      _test : BOOL := FALSE;
    END_VAR
    ...
    Die "ADS-Adresse" ist dann - also mit dem Programm, das nichts anderes tut als den FB zu instanziieren und auszuführen: PRG_TestExec._tempFb._test

    Und genau auf diese Variable kann ich via ADS zugreifen und manipulieren - obwohl sie keine Input- oder In-Out-Variable ist, sondern eigentlich "lokal".

    Wie kann das sein - oder habe ich etwas bei der SPS-Programmstruktur mit ST nicht so ganz verstanden? (Ich bin ja Quereinsteiger aus der Softwarewelt...)


    Grüße!
    ahds
    Zitieren Zitieren ADS-Zugriff auf lokale Variable im FB?  

  2. #2
    Registriert seit
    01.03.2008
    Beiträge
    487
    Danke
    3
    Erhielt 43 Danke für 39 Beiträge

    Standard

    genau so ist es...

    so wie die Variable heisst, so kannst du dieses auch als Namen auslesen.

    Wichtig ist nur zu erwähnen, dass bei Twincat im PLC-Server unter Optionen das Häckchen für "Sammeleinträge ausgeben" oder so ähnlich gesetzt ist.

    MfG CAS
    www.cas-solution.de

    Alles geregelt...


    Weltraumflug in den USA zu gewinnen!
    Kratze hier ▒▒▒▒▒▒▒▒▒▒▒▒ mit einer Münze,
    und finde heraus, ob Du der Gewinner bist!

  3. #3
    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 ahds Beitrag anzeigen
    Hallo,

    .... Und genau auf diese Variable kann ich via ADS zugreifen und manipulieren - obwohl sie keine Input- oder In-Out-Variable ist, sondern eigentlich "lokal".

    Wie kann das sein - oder habe ich etwas bei der SPS-Programmstruktur mit ST nicht so ganz verstanden? (Ich bin ja Quereinsteiger aus der Softwarewelt...)


    Grüße!
    ahds
    Man kann das zumindest als schlechten Stil bezeichnen. Ein FB sollte den inneren Teil über die "Schnittstelle" (Parameter) von der Aussenwelt abkoppeln. Wer auf Umwegen zugreift (dazu zählen eigetlich auch schon Zeiger) schafft sich selber potentiell Probleme.

    Moderne OO Sprachen lassen so etwas gar nicht mehr zu, da gibt es die Modifizierer "public, protected, private" und der Compiler weigert sich so etwas zu fressen.
    Als Freelancer immer auf der Suche nach interessanten Projekten.
    Zitieren Zitieren Nicht nur Stilfrage  

  4. #4
    ahds ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    04.09.2009
    Ort
    Mainz
    Beiträge
    15
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von RobiHerb Beitrag anzeigen
    Man kann das zumindest als schlechten Stil bezeichnen. Ein FB sollte den inneren Teil über die "Schnittstelle" (Parameter) von der Aussenwelt abkoppeln. Wer auf Umwegen zugreift (dazu zählen eigetlich auch schon Zeiger) schafft sich selber potentiell Probleme.

    Moderne OO Sprachen lassen so etwas gar nicht mehr zu, da gibt es die Modifizierer "public, protected, private" und der Compiler weigert sich so etwas zu fressen.
    Ja ich bin es aus meiner bequemen Hochsprachen-Welt gewohnt, dass die Sprachkonzepte von pedantischen Compilern überwacht werden. Und das finde ich jetzt noch umso besser.

    Und dementsprechend überrascht bin ich ja, dass so ein harter Bruch eines Sprachkonzeptes so einfach möglich ist! Wenn man bei der ganzen SPS-Programmiererei überhaupt von "Sprachkonzept" sprechen kann... ST ist ja schon ganz schön "clumsy".

    Für mich als Quereinsteiger wäre es jetzt aber doch sehr interessant zu wissen, wie ich die Stilfrage am besten löse. Zumindest eurer Meinung nach.

    Lohnt es sich für mich mit "VAR_IN_OUT" zu experimentieren? (Dieses Konzept habe ich, offen gesagt, immer noch nicht ganz verstanden.)
    Oder lohnt es sich vllt, für ADS-Zugriff "von außen" immer Structs in VAR_INPUT und _OUTPUT zu definieren?

    Für Tipps und Hinweise zu "gutem Stil" bin ich jedenfalls sehr dankbar!

    Grüße,
    ahds

  5. #5
    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 ahds Beitrag anzeigen

    Lohnt es sich für mich mit "VAR_IN_OUT" zu experimentieren? (Dieses Konzept habe ich, offen gesagt, immer noch nicht ganz verstanden.)
    Oder lohnt es sich vllt, für ADS-Zugriff "von außen" immer Structs in VAR_INPUT und _OUTPUT zu definieren?

    Für Tipps und Hinweise zu "gutem Stil" bin ich jedenfalls sehr dankbar!

    Grüße,
    ahds
    VAR_IN_OUT entspricht einer Übergabe per adress reference, in C++ ziemlich exakt einer Reference, d.h. einem Zeiger, der nicht in der Adresse verändert werden kann. Vorteil auch, man muss nicht die komplizierte Pointer Schreibweise nutzen, wenn man auf Elemente einer struct zugreift.

    Ich übergebe an FB in der Regel structs mit VAR_IN_OUT, ein besseres information hiding ist in ST kaum möglich, wenn man die Effizienz eines Systems nicht in Frage stellen möchte.
    Als Freelancer immer auf der Suche nach interessanten Projekten.
    Zitieren Zitieren Var_in_out  

  6. #6
    ahds ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    04.09.2009
    Ort
    Mainz
    Beiträge
    15
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von RobiHerb Beitrag anzeigen
    Ich übergebe an FB in der Regel structs mit VAR_IN_OUT, ein besseres information hiding ist in ST kaum möglich, wenn man die Effizienz eines Systems nicht in Frage stellen möchte.
    So in etwa hatte ich mir das auch vorgestellt - aber in Verbindung mit dem ADS-Zugriff hatte ich da Probleme: Mein Test-Programm hatte das Struct angelegt (_struct) und dem FB als In/Out-Struct durch Aufrufen gesetzt:

    Code:
    _testFB(InOutData := _struct)
    Mit dem Effekt, dass ich zwar per ADS auf Programm._testFB.InOutData zugreifen konnte, aber schreibend die Änderungen nicht "ankamen". Ich nehme an, dass der Aufruf oben in jedem Zyklus dafür gesorgt hat, dass der Inhalt von _struct in den FB geschrieben wurde.

    Aber ich nehme eher an, dass ich da noch was falsch mache...

    Stellt sich also die Frage, wie ich VAR_IN_OUT-Structs "bestmöglich" mit ADS benutze.


    Grüße,
    ahds
    Grüße,

  7. #7
    Registriert seit
    17.10.2007
    Ort
    35043 Marburg
    Beiträge
    176
    Danke
    4
    Erhielt 30 Danke für 29 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    Ich nehme an, dass der Aufruf oben in jedem Zyklus dafür gesorgt hat, dass der Inhalt von _struct in den FB geschrieben wurde.
    Genau so ist es!
    Wie schon zuvor beschrieben ist eine In/Out variable eine Zeiger auf eine Variable (in deinem Fall "_struct") die vom FB lesend und schreibend bearbeitet werden kann.
    Stellt sich also die Frage, wie ich VAR_IN_OUT-Structs "bestmöglich" mit ADS benutze.
    Du musst in jedem Fall auf die variable "Programm._struct" zugreifen, welche quasi die variable ist die vom FB lesend & schreibend bearbeitet werden kann.
    Wenn du keine zusätzlichen variablen verwenden möchtest, musst du wohl den Umweg über Inputs zum schreiben und Outputs zum lesen gehen.
    Grüße...
    Paradox ist, wenn sich jemand im Handumdrehen den Fuß bricht.

Ähnliche Themen

  1. Lokale Variable hat 2 Zustände
    Von peraho im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 08.04.2010, 18:05
  2. Zugriff auf NC-&PLC-Variable per C++/DDE
    Von Ulrich im Forum Hochsprachen - OPC
    Antworten: 0
    Letzter Beitrag: 21.05.2008, 11:22
  3. lokale Variable "hängt sich auf"
    Von Dodo im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 27.03.2006, 08:20
  4. Arrays als lokale Variable verwenden
    Von omignobi im Forum HMI
    Antworten: 3
    Letzter Beitrag: 30.09.2005, 08:54
  5. globale-lokale variable
    Von Anonymous im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 13.06.2005, 12:21

Lesezeichen

Berechtigungen

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