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

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

Thema: Zusätzlich zu einer Instanz noch Struktur anlegen?

  1. #11
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    745
    Danke
    27
    Erhielt 164 Danke für 142 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Warten wir mal, ob Werner29 sich zum Thema meldet, der muss es schliesslich wissen. An eine VAR_INPUT/OUTPUT-Übergabe per Stack mag ich aber bei FB's auch nicht glauben. Schliesslich kann man im aufrufenden Programm an beliebigen Stellen auf diese Daten zugreifen und nicht nur beim FB-Aufruf. Da wird wohl schon direkt auf die FB-Instanz zugegriffen.
    Eine Übergabe per VAR_IN_OUT lohnt sich deshalb nur dann, wenn die Daten nicht nur an einen einzigen FB übergeben werden müssen. Dann macht es auch logisch Sinn, die Daten im Programm zu deklarieren, weil sie eben keinem FB eindeutig zuzuordnen sind.

  2. #12
    Bensen83 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.08.2009
    Beiträge
    776
    Danke
    25
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Also ich meinte nicht eine Struktur zu übergeben.
    Mir ging es nur darum, wenn jetzt bspw. 7 integer Eingänge auf der bausteinseite sind. Und ich nun Variablen auf diese lege dann benötige ich ja schon Speicherplatz für 14 Integer.
    Wenn ich im Programm direkt auf die Instanz zugreifen würde und auf die Variablen verzichte, so würde ich nur Speicherplatz für die 7 Eingangsinteger belegen. Wenn man es so weiterspinnt, benötigt man mit zusätzlichen Variablen, welche auf die Bausteine gelegt werden den doppelten Speicherplatz. Deswegen war die frage von mit ob man nicht besser direkt auf die Instanzen zugreift.
    Zitieren Zitieren Struktur sollte nicht als Übergabe gedacht sein  

  3. #13
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    @ST:
    Ich bin da ganz deiner Meinung ... ist aber auch eher "gefühlt" so ...

    @Benson:
    Was du vorhast ist klar - es geht hier jetzt schon eher um ein Grundsatz-Thema ...
    So, wie du es machst bzw. vorhast, ist es aus meiner Sicht (aus der ferne gesehen) gut und richtig ...

    Gruß
    Larry

  4. #14
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Ich habe mal irgendwo eine Anleitung gesehen in der steht wie man C++ Funktionen in Codesys einbinden kann. Das funktioniert ja nur wenn die Aufrufkonventionen gleich sind.

    Bevor man aber dieses Dokument finden kann man auch mal für ein ganz einfaches Programmbeispiel den generierten Assemblercode ansehen.
    Beispiel mit TwinCAT v2.10:

    Quellcode:
    Code:
    PROGRAM MAIN
    VAR
    	i : INT;
    	mainvar : DWORD;
    	outVar : DWORD;
    	TESTFBinstance : TESTFB;
    END_VAR
    
    mainvar := 16#CAFEBABE;
    i := i + 1;
    TESTFBinstance(in1 := 16#ABAD1DEA, in2 := 16#BAADF00D, out1 => outVar );
    END_PROGRAM
    
    FUNCTION_BLOCK TESTFB
    VAR_INPUT
    	in1 : DWORD;
    	in2 : DWORD;
    END_VAR
    VAR_OUTPUT
    	out1 : DWORD;
    	out2 : DWORD;
    END_VAR
    VAR
    	stat1 : DWORD;
    END_VAR
    
    stat1 := 16#DEADC0DE;
    out1 := in1;
    out2 := 16#1234ABCD;
    
    END_FUNCTION_BLOCK
    Das erzeugt folgenden x86-Assemblercode:

    Für Main:
    Code:
    mov     eax, 0CAFEBABEh
    add     al, 0           ; Add
    mov     ds:1E492h, eax
    add     al, 0           ; Add
    movsx   eax, word ptr ds:1E490h ; Move with Sign-Extend
    mov     edx, eax
    mov     eax, 1
    add     eax, edx        ; Add
    add     al, 0           ; Add
    mov     ds:1E490h, ax
    add     al, 0           ; Add
    mov     eax, 0ABAD1DEAh
    mov     ds:1E49Eh, eax
    mov     eax, 0BAADF00Dh
    mov     ds:1E4A2h, eax
    add     al, 0           ; Add
    lea     eax, ds:1E49Ah  ; Load Effective Address
    push    eax
    call    ds:dword_50     ; Indirect Call Near Procedure
    add     esp, 4          ; Add
    mov     eax, ds:1E4A6h
    mov     ds:1E496h, eax
    add     al, 0           ; Add
    pop     esi
    pop     edi
    pop     edx
    pop     ebx
    leave                   ; High Level Procedure Exit
    retn                    ; Return Near from Procedure
    und für TESTFB:
    Code:
    push    ebp
    mov     ebp, esp
    push    ebx
    push    edx
    push    edi
    push    esi
    mov     ebx, [ebp+8]
    push    large dword ptr ds:4018h
    mov     large ds:4018h, ebx
    add     al, 0           ; Add
    mov     eax, 0DEADC0DEh
    add     al, 0           ; Add
    mov     [ebx+0], eax
    add     al, 0           ; Add
    mov     eax, [ebx+4]
    add     al, 0           ; Add
    mov     [ebx+0Ch], eax
    add     al, 0           ; Add
    mov     eax, 1234ABCDh
    add     al, 0           ; Add
    mov     [ebx+10h], eax
    add     al, 0           ; Add
    pop     large dword ptr ds:4018h
    pop     esi
    pop     edi
    pop     edx
    pop     ebx
    leave                   ; High Level Procedure Exit
    retn                    ; Return Near from Procedure
    Ohne jetzt der große x86 Assemblerguru zu sein sehe ich folgendes.
    Vor Funktionsaufruf wird die Adresse der Instanz als ersten Parameter auf den Stack abgelegt:
    Code:
    lea     eax, ds:1E49Ah  ; Load Effective Address
    push    eax
    Im FB wird mit
    Code:
    mov     ebx, [ebp+8]
    der erste Funktionsparameter wieder in Register ebx geladen. Der Offset von 8 Bytes kommt daher, weil davor auf dem Stack noch die Rücksprungadresse und der alte Basepointer ebp liegen.

    Im Speicher eines FB werden die Daten in der Reihenfolge VAR, VAR_INPUT, VAR_OUTPUT abgelegt.

    DEADC0DE wird auf eine statische Variable geschrieben. Da es nur eine statische Variable gibt müsste das an Offset 0 sein. Wenn man nachguckt stimmt das auch:
    Code:
    mov     eax, 0DEADC0DEh
    add     al, 0           ; Add
    mov     [ebx+0], eax

  5. Folgende 2 Benutzer sagen Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Larry Laffer (28.12.2012),StructuredTrash (27.12.2012)

  6. #15
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    745
    Danke
    27
    Erhielt 164 Danke für 142 Beiträge

    Standard

    @Thomas_v2.1: Danke für Deine Mühe.

    Man sieht ausserdem, dass die INPUT-Variablen direkt in den FB geschrieben und die OUTPUT-Variable ebenso aus ihm gelesen werden. Warum auch nicht, die Adressen sind dem Programm ja genauso bekannt wie die der anderen Variablen. Alles andere wäre auch nicht sinnvoll.

  7. #16
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    745
    Danke
    27
    Erhielt 164 Danke für 142 Beiträge

    Standard

    Zitat Zitat von Bensen83 Beitrag anzeigen
    Deswegen war die frage von mit ob man nicht besser direkt auf die Instanzen zugreift.
    Ja, das ist besser. Sieh es doch mal so: Eine FB-Instanz ist eine Strukturvariable, die zusätzlich noch eine feste Verbindung zu dem zu ihrer Bearbeitung dienenden Code besitzt. Du hast also mit der FB-Instanz bereits eine Variable im Programm deklariert, wenn auch mit teilweise (aber durchaus sinnvoll) eingeschränktem Zugriffsrecht.

  8. #17
    Bensen83 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.08.2009
    Beiträge
    776
    Danke
    25
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Habe es gerade mal versucht. Denke wenn ich eine Struktur anlegen ist es wohl dich übersichtlicher, weil dann kann ich es so aufbauen dass Ventile, Achsen usw. Immer die gleiche Struktur haben. Bei verschiedenen Bausteinen ist das nicht der fall.

    Auch wenn ich den Baustein in der Visu verwenden und es kommt mal was anderes .... Ich weis das ist weit hergeholt, aber so kann ich die Visu lassen wie se ist und dann nur im Programm Anpassungen vornehmen.
    So kann ich bspw. Dann auch Programmteile kopieren und in Anlagen benutzen wo bspw. Andere Regler drin sind.
    Zitieren Zitieren Struktur vielleicht doch besser  

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 05.02.2012, 20:14
  2. Elemente einer Struktur initialisieren
    Von Tigerente1974 im Forum Programmierstrategien
    Antworten: 5
    Letzter Beitrag: 20.01.2012, 07:18
  3. Länge einer Struktur im DB ermitteln
    Von Knut333 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 22.01.2009, 18:04
  4. WinCC anlegen einer globalen Variable in C?
    Von BorisDieKlinge80 im Forum Hochsprachen - OPC
    Antworten: 0
    Letzter Beitrag: 11.06.2008, 12:29
  5. Aus einer FB Struktur ein Wort auslesen
    Von ottopaul im Forum Simatic
    Antworten: 18
    Letzter Beitrag: 11.07.2007, 00:39

Lesezeichen

Berechtigungen

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