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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Fester Speicherbereich

  1. #1
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    755
    Danke
    27
    Erhielt 166 Danke für 144 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    vermutlich wäre ich mit meiner Frage bei 3S oder Beckhoff besser aufgehoben, aber vielleicht weiss ja jemand etwas. Gibt es bei CoDeSys/TwinCat einen Speicherbereich, der bei Online Changes garantiert NICHT verschoben wird? Was ist z. B. mit dem Merkerbereich MB?
    Zitieren Zitieren Fester Speicherbereich  

  2. #2
    Registriert seit
    19.12.2006
    Beiträge
    185
    Danke
    25
    Erhielt 26 Danke für 21 Beiträge

    Standard

    myVar AT %IB4: BYTE;

    Oder was meinst du?

  3. #3
    StructuredTrash ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    755
    Danke
    27
    Erhielt 166 Danke für 144 Beiträge

    Standard

    Ich meine z. B.
    myVar AT %MB4:BYTE;
    myVar wird natürlich immer an Byte 4 des MB-Bereichs stehen. Meine Frage ist allerdings, ob der gesamte MB-Bereich bei einem Online Change möglicherweise an eine andere Speicheradresse verschoben wird oder nicht.

  4. #4
    Registriert seit
    19.12.2006
    Beiträge
    185
    Danke
    25
    Erhielt 26 Danke für 21 Beiträge

    Standard

    Aber warum?
    Zeig doch mal den Hintergrund deiner Überlegung auf!

  5. #5
    StructuredTrash ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    755
    Danke
    27
    Erhielt 166 Danke für 144 Beiträge

    Standard

    Ich habe z. B. in meiner Lib einen FB, der die Adresse eines zweiten FB's benötigt. Diese Verknüpfung zu dem zweiten FB bleibt während der gesamten Laufzeit unverändert. Bei nur einem zyklischen Aufruf würde ich die Adresse per VAR_IN_OUT übergeben und mir keine weiteren Gedanken machen. Jedoch hat der FB auch Aktionen, die in der Anwendung recht häufig aufgerufen werden und bei denen ich die VAR_IN_OUT auch jedesmal übergeben muss. Ich würde die FB-Adresse lieber nur einmal bei der Programminitialisierung als Pointer übergeben. Dafür müsste ich aber sicher sein, dass der FB durch Online Changes auf keinen Fall verschoben wird.

  6. #6
    Registriert seit
    19.12.2006
    Beiträge
    185
    Danke
    25
    Erhielt 26 Danke für 21 Beiträge

    Standard

    Mahlzeit,

    du übergibst per Pointer eine Instanz eines FB an einen FB???
    Warum?
    Greifst du auf die Instanzdaten zu oder was passiert da?

    Die Aktion eines FB greift doch auf den Variablenhaushalt des FB zu. Da muss man doch nichts neues übergeben.

    Auch wenn du per Pointer auf die Anfangsadresse einer FB Instanz zeigst, sollte sich doch hier nichts verschieben. Die Adresse bleibt die Adresse bleibt die Adresse...

    Abgesehen davon halte ich deine Vorgehensweise für unsauber was Wartung und Erweiterung deines Codes angeht. Gerade für andere Programmierer die mal auf soetwas stoßen.

    M.M.n. sollten man sauber trennen und verwendete Speicherbereiche z.B. in strukturen sammeln um dann per IN_OUT darauf zu zeigen.

    Oder ich habe deine Beschreibung einfach nicht verstanden

    Poste doch mal ein Codebeispiel!


    Gruß und schönes Fest!

  7. #7
    StructuredTrash ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    755
    Danke
    27
    Erhielt 166 Danke für 144 Beiträge

    Standard

    Zitat Zitat von mkd Beitrag anzeigen
    du übergibst per Pointer eine Instanz eines FB an einen FB???
    Warum?
    Greifst du auf die Instanzdaten zu oder was passiert da?
    Ich rufe den übergebenen FB auch auf. Wenn ich nur auf seine Daten zugreifen will, was bei anderen FB's meiner Lib der Fall ist, packe ich die benötigten Daten in eine Struct im VAR_OUTPUT-Bereich des FB's und übergebe dann nur diese Struct an andere FB's.
    Zitat Zitat von mkd Beitrag anzeigen
    Die Aktion eines FB greift doch auf den Variablenhaushalt des FB zu. Da muss man doch nichts neues übergeben.
    Tue ich auch nicht. Aber wenn ich in einem FB VAR_IN_OUT deklariere, muss ich die bei jedem Aufruf, auch bei dem von Aktionen, übergeben. Die dafür benötigte Rechenzeit stört mich bei einem Beckhoff CX kaum. Die Schreibarbeit schon etwas mehr. Vor allem stört mich aber, dass die Aktionen die VAR_IN_OUT gar nicht benötigen, sondern nur auf die lokalen FB-Daten zugreifen.
    Zitat Zitat von mkd Beitrag anzeigen
    Auch wenn du per Pointer auf die Anfangsadresse einer FB Instanz zeigst, sollte sich doch hier nichts verschieben. Die Adresse bleibt die Adresse bleibt die Adresse...
    Dein Wort in Beckhoffs Ohr. Aber ich bin mir da nicht so sicher. Ich habe schon Online Changes erlebt, nach denen sich die Werte von Konstanten munter änderten. Einmal wusste der Rechner sogar nicht mal mehr, wo seine Eingänge waren. Daher auch meine eigentliche Frage.
    Zitat Zitat von mkd Beitrag anzeigen
    Abgesehen davon halte ich deine Vorgehensweise für unsauber was Wartung und Erweiterung deines Codes angeht. Gerade für andere Programmierer die mal auf soetwas stoßen.
    Da gebe ich Dir sogar ein wenig Recht. Was ich da mache, ist eigentlich ein Fall für OOP-Vererbung und die damit verbundene erweiterte Typkompatibilität. Aber ich kann mich derzeit noch nicht zum Umstieg auf TwinCat3 durchringen. Habe zu oft Versuchskaninchen gespielt.
    Eine andere Möglichkeit wäre der Einsatz von Quelltextbibliotheken, die die Deklaration bestimmter Bezeichner in der Anwendung voraussetzen. In Pascal konnte man damit einiges machen, in CoDeSys
    ist so etwas aber nur sehr umständlich durch Export/Import einzelner POUs, DUTs usw. möglich.

    So, jetzt wünsche ich aber auch erst mal ein frohes Fest. Die Frage entspringt sowieso keiner aktuellen Notlage. Aber wenn es so kurz vor Weihnachten auch vorm Laptop etwas besinnlicher wird, kommt man schon mal auf Ideen, für die man sonst gar keine Zeit hat.

  8. #8
    Registriert seit
    19.12.2006
    Beiträge
    185
    Danke
    25
    Erhielt 26 Danke für 21 Beiträge

    Standard

    Zitat Zitat von StructuredTrash Beitrag anzeigen
    Dein Wort in Beckhoffs Ohr. Aber ich bin mir da nicht so sicher. Ich habe schon Online Changes erlebt, nach denen sich die Werte von Konstanten munter änderten. Einmal wusste der Rechner sogar nicht mal mehr, wo seine Eingänge waren. Daher auch meine eigentliche Frage.
    Das ist natürlich übel!
    Ich habe auch schon viel Dreck mit den Beckhoff Sachen erlebt. Aber Konstanten die keine Konstanten mehr sind...
    Einen großen Bogen gehe ich auch um neue Beckhoff Produkte. Die werden m.M.n. zu früh auf den Markt geworfen.
    Lasst die Kunden mal damit klar kommen... oder... wir müssen mit unseren Prospekten erster sein...
    Nur gut das die Jungs aus dem Support so gut sind!

    Aber zurück zum Thema:
    So ganz konnte ich deine Ausführungen nicht nachvollziehen.
    Kannst du mal ein Beispielcode (um die vorgehensweise zu Schildern) posten?

  9. #9
    StructuredTrash ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    755
    Danke
    27
    Erhielt 166 Danke für 144 Beiträge

    Standard

    Der Code wird nicht viel nützen, weil es ja nicht um ihn geht, sondern um Deklarationsort und Beziehungen zwischen FB's. Ich beschreibe das Ganze aber gern noch mal etwas genauer.
    In meiner Lib habe ich einen FB, der eine Störungsliste für die Visu verwaltet. Die Anwendung kann direkt, durch Aufruf einer FB-Aktion, Störungen in die Liste eintragen, tut das aber normalerweise nicht. Stattdessen werden noch Störungs-FB's zwischengeschaltet, die ebenfalls in der Lib deklariert sind. So ein Störungs-FB sammelt die Störungen einer Maschine oder Baugruppe, speichert sie bis zu ihrer Quittierung und trägt sie flankengetriggert in die Störungsliste ein. Dazu braucht der Störungs-FB die Adresse des Listen-FB's, um seine entsprechende Aktion aufrufen zu können. Ich könnte dazu bereits in der Lib eine globale Instanz des Listen-FB's deklarieren. Das möchte ich aber nicht, um im Ernstfall auch einen anwendungsspezifisch abgewandelten Listen-FB einsetzen zu können.
    Listen-FB und Störungs-FB's werden also in der Anwendung instanziiert, und dort muss ich den Störungs-FB's die Adresse des Listen-FB's übergeben. Derzeit mache ich das per VAR_IN_OUT. Die Störungs-FB's haben eine Aktion, mit der die Anwendung die Störungen in den FB's speichern kann. Am Ende der POU erfolgt dann der zyklische Aufruf des Störungs-FB's, und erst dabei werden die Störungen in die Liste eingetragen. Die Adresse des Listen-FB's wird also nur beim zyklischen Aufruf des Störungs-FB-Hauptcodes benötigt. Da man VAR_IN_OUT-Parameter aber nicht unbelegt lassen kann, muss ich die Adresse auch beim Aufruf der Speicher-Aktionen übergeben, obwohl sie dabei gar nicht gebraucht wird. Das ist zwar keine Katastrophe, stört mich aber ein wenig.
    Wenn ich die Adresse des Listen-FB's nicht als VAR_IN_OUT, sondern als VAR_INPUT-Pointer übergeben würde, könnte ich die Übergabe auf den zyklischen Aufruf des Störungs-FB's beschränken. Wirklich toll finde ich das aber auch nicht, weil ich die Typüberprüfung des Compilers bei VAR_IN_OUT nicht ohne Not aufgebe. Wenn ich die Adresse dagegen nur einmal beim Programmstart übergeben bräuchte, würde mir das die Pointerlösung vielleicht etwas schmackhafter machen. Dann darf aber die Adresse des Listen-FB's durch Online Changes nicht verschoben werden. Und nach meinen bisherigen Erfahrungen schreckt das Laufzeitsystem vor nichts zurück, wenn es ihm für die Speicherreorganistation in den Kram passt. Meine einzige Hoffnung ist, dass vielleicht der MB-Speicherbereich verschont bleibt, solange man in ihm keine Änderungen vornimmt.

  10. #10
    Registriert seit
    19.12.2006
    Beiträge
    185
    Danke
    25
    Erhielt 26 Danke für 21 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Nach einem Beispiel hatte ich gefragt, weil wenige Zeilen abgespeckter Code mehr als 1000 Worte sagt.

    Ein PLC Programm würde ich so nicht programmieren.
    Grundsatzdiskussionen helfen dir aber hier nicht weiter und beantworten ja nicht deine Frage...

    Am meisten Sicherheit würde mir bei deinem "Konstrukt" die IN_OUT Variante geben.
    Nach deinen negativen Erfahrungen würde mich das wenige Mehr an Tipparbeit nicht stören.
    Ich kaufe mir gerne Sicherheit,Stabilität,einfach zu wartenden Code usw. durch Tipparbeit!

    Wie wäre es mit einem Input
    ADR(FB_Instance)
    ?

    Auch wenn sich FB_Instance irgendwo im Speicher verschiebt, wird ja die neue Adresse übergeben.


    Gruß

  11. Folgender Benutzer sagt Danke zu mkd für den nützlichen Beitrag:

    StructuredTrash (27.12.2013)

Ähnliche Themen

  1. zu fester Uhrzeit Schütz ansteuern
    Von Thomasheins11 im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 02.08.2013, 19:06
  2. CX9010 mit fester IP ins Netzwerk aufnehmen
    Von mike_roh_soft im Forum CODESYS und IEC61131
    Antworten: 8
    Letzter Beitrag: 03.12.2011, 19:16
  3. AWL Speicherbereich
    Von Chefmech im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 13.09.2011, 09:23
  4. Speicherbereich
    Von siemensdepp im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 28.02.2011, 09:12
  5. Antworten: 5
    Letzter Beitrag: 10.02.2006, 08:59

Lesezeichen

Berechtigungen

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