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

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

Thema: WinCC V7.2 C-Skript Performance beim ersten lesen von 150 String-Variablen

  1. #11
    Avatar von RONIN
    RONIN ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.367
    Danke
    457
    Erhielt 696 Danke für 521 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo! Mittlerweile hab ich ein wenig Zeit gefunden das Thema wieder aufzugreifen.

    Grundsätzlich funktioniert die von Thomas beschriebene Funktion (Beitrag #3) GetTagMultiWait sehr schön.
    Jetzt hatte ich mir gedacht ich schreib mir im GlobalScript eine Funktion die mir mittels GetTagMulti ein globales String-Array bereitstellt auf welches
    ich dann von meinen Funktionen in den Bildern zugreifen kann. Also sowas:

    Code:
    char SPZM_ArtBez[10][32];
    
    void neueFunktion()
    {
    ...
    zugreifen kann man dann in einem Prozessbild mit z.B.:
    Code:
    extern char SPZM_ArtBez[10][32];
    Alles bekannt soweit.

    Im Beispiel von Thomas wird für die Funktion GetTagMulti bzw. für die Variablenwerte (sofern ich's richtig verstehe) ein Array von Pointern (char* value[30]; )angelegt.
    GetTagMulti bekommt dann mit &VarName die Adresse der Pointer, legt die Ergebnisse mit SysMalloc an und schreibt in den Pointer die jeweile Adresse rein.
    Glaub ich halt. An diesem Punkt kommt mein Mangel an Verständnis echt ans Tageslicht.

    Mein Problem ist dass ich den globalen Zugriff auf diese Pointer nicht zustande bringe. Kann mir da jemand bitte auf den richtigen Weg helfen?
    Wie muss man z.B.: im Mausklick-Event eines Buttons in einem Bild auf diese Daten zugreifen damit man die GetTagMulti-Werte aus dem Global-Script bekommt?
    Geändert von RONIN (26.01.2014 um 00:49 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  2. #12
    Registriert seit
    29.03.2004
    Beiträge
    5.800
    Danke
    144
    Erhielt 1.710 Danke für 1.240 Beiträge

    Standard

    Da ich nicht vollständig weiß wie die SysMalloc Verwaltung WinCC intern funktioniert, würde ich die Strings die bei GetTagMulti zurückkommen in deine globalen Variablen umkopieren. Dann sollte man bezüglich Speicherverwaltung auf der sicheren Seite sein.
    Dazu hinter den GetTagMulti pro Array Eintrag:
    strcpy(SPZM_ArtBez[0], &value[0]);
    oder mit strncpy wenn du eine Längenüberprüfung mit drin haben möchtest.

    Das würde dann auch zu deiner Deklaration der globalen Variable passen.

    Andere Variante wäre, die globale Variable als Array aus char Zeigern anzulegen (char *SPZM_ArtBez[10]) und diese direkt der GetTagMulti Funktion zu übergeben. Da weiß ich aber nicht wie sich die Funktion verhält, wenn die Parameter schon mit SysMalloc reservierten Speicher enthalten. Schlimmstenfalls wird jedes Mal mit SysMalloc neuer Speicher reserviert, und der alte nicht freigegeben.

  3. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    RONIN (26.01.2014)

  4. #13
    Avatar von RONIN
    RONIN ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.367
    Danke
    457
    Erhielt 696 Danke für 521 Beiträge

    Standard

    Hatte ich den ganzen Pointer-Zusammenhang tatsächlich richtig verstanden?
    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Andere Variante wäre, die globale Variable als Array aus char Zeigern anzulegen (char *SPZM_ArtBez[10]) und diese direkt der GetTagMulti Funktion zu übergeben. Da weiß ich aber nicht wie sich die Funktion verhält, wenn die Parameter schon mit SysMalloc reservierten Speicher enthalten. Schlimmstenfalls wird jedes Mal mit SysMalloc neuer Speicher reserviert, und der alte nicht freigegeben.
    Ja leider habe ich mit dieser Version nichts zustande gebracht, wenn ich von einem Bild drauf zugreifen wollte bekam ich mal "Access Violation" mal Kauderwelsch als Daten.
    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Da ich nicht vollständig weiß wie die SysMalloc Verwaltung WinCC intern funktioniert, würde ich die Strings die bei GetTagMulti zurückkommen in deine globalen Variablen umkopieren.
    Haha, Lustig! So sieht meine "Behelfslösung" im Moment aus. Kann mich deinem Betrag aber nur anschließen dass dies vermutlich die
    sicherer Variante ist und ich auch dabei bleiben werde.

    Ich werde jetzt erstmal die ersten Skripte daraufhin umbauen und sehen wie sich die Performance verhält.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  5. #14
    Registriert seit
    29.04.2012
    Beiträge
    195
    Danke
    13
    Erhielt 42 Danke für 37 Beiträge

    Standard

    Hatte ich den ganzen Pointer-Zusammenhang tatsächlich richtig verstanden?
    Ich glaube nicht ganz. Arrays und Pointer sind in C nicht immer austauschbar, auch wenn das oft behauptet wird. Einfachstes Beispiel:

    Code:
    Datei 1:
    int mango[100];
    
    Datei 2:
    extern int *mango;
    xyz = mango[i]; // autsch
    Es gibt einen grundsätzlichen Unterschied zwischen char *SPZM_ArtBez[10] und char SPZM_ArtBez[10][32]

    *SPZM_ArtBez[10]
    ist ein Array von 10 Pointern und hat selbst keinerlei Speicher für echte Daten.
    Worauf diese Pointer zeigen (Adresse) kann beliebig verändert werden. Vorrausgesetzt der Speicher wurde an anderer Stelle allokiert - sei es malloc oder eine anderes Array.

    SPZM_ArtBez[10][32]
    ist wirklich ein zusammenhängendes Stück Speicher von 320 Bytes. Man kann es mit [][] oder [] adressieren und den Inhalt verändern, aber niemals die Adresse ändern auf die z.B. SPZM_ArtBez[0] zeigt.

    Das hier kann also unmöglich gut gehen:
    Code:
    char SPZM_ArtBez[10][32];
    GetTagMultiWait("%s","Tag1", &SPZM_ArtBez[0]);
    Das hier schon (ist prinzipiell richtig):
    Code:
    char *SPZM_ArtBez[10];
    GetTagMultiWait("%s","Tag1", &SPZM_ArtBez[0]);
    GetTagMultiWait reserviert den Speicher selbst und kann auch den Pointer auf die neue Adresse ändern (was beim der Array Deklaration nicht geht).
    So wie ich die Hilfe verstehe, bleibt der Speicher von Sysmalloc aber nur bis zum Ende der Aktion bestehen. Deshalb greift das Bild später ins Leere.

    Man könnte malloc im Global Script versuchen. Die Frage ist dann, ob und wann ein Bild dazu auch free aufruft - und ob das überhaupt zu koordinieren ist.
    Das Umkopieren in globale Variablen ist vermutlich einfacher.
    There are two kinds of fools. One says, “This is old, and therefore good.” And one says, “This is new, and therefore better.”

  6. Folgender Benutzer sagt Danke zu Pipboy für den nützlichen Beitrag:

    RONIN (27.01.2014)

  7. #15
    Avatar von RONIN
    RONIN ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.367
    Danke
    457
    Erhielt 696 Danke für 521 Beiträge

    Standard

    @Pipboy. Vielen Dank das du die die Mühe gemacht hast die Sache noch mal so übersichtlich darzustellen.
    So wie du es schreibst hatte ich das schon richtig verstanden.

    Ich hab nur merkwürdigerweise keinen globalen Zugriff auf die Strings hinter den Pointern zustande bekommen.
    (Ich hatte schon char *SPZM_ArtBez[10]; global deklariert, also als Pointer-Array)
    Also hab ich die Daten, wie Thomas schon vorgeschlagen, in ein fest deklariertes globales struct-Array kopiert.

    Aber trotzdem danke für die Bestätigung.
    Geändert von RONIN (27.01.2014 um 00:51 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  8. #16
    Registriert seit
    22.11.2007
    Beiträge
    731
    Danke
    6
    Erhielt 89 Danke für 62 Beiträge

    Standard

    @Pipboy irgendwie lesen sich deinen Aussagen komisch


    *SPZM_ArtBez[10]
    ist ein Array von 10 Pointern und hat selbst keinerlei Speicher für echte Daten.

    Doch es hat Speicher für Daten die der 10 Pointer


    Das hier kann also unmöglich gut gehen:
    char SPZM_ArtBez[10][32];
    GetTagMultiWait("%s","Tag1", &SPZM_ArtBez[0]);

    warum soll das nicht gehen? &SPZM_ArtBez[0] ist ein 100% valider Zeiger auf einen Speicherbereich der 32 Zeichen aufnehmen "könnte"
    ob der Speicher direkt linear im Array angeordnet ist oder das Array per Zeiger drauf verweist ist doch völlig egal
    - aber GetTagMultiWait mag es so eben für Strings so nicht - sonst aber schon


    GetTagMultiWait reserviert den Speicher selbst und kann auch den Pointer auf die neue Adresse ändern
    http://support.automation.siemens.co...ard&viewreg=WW
    Geändert von LowLevelMahn (27.01.2014 um 07:39 Uhr)

  9. #17
    Registriert seit
    29.04.2012
    Beiträge
    195
    Danke
    13
    Erhielt 42 Danke für 37 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Doch es hat Speicher für Daten die der 10 Pointer
    Natürlich. Der Punkt ist, dass Adressen allein nutzlos sind, wenn es nicht etwas gibt auf das man zeigen kann.

    warum soll das nicht gehen? &SPZM_ArtBez[0] ist ein 100% valider Zeiger auf einen Speicherbereich der 32 Zeichen aufnehmen "könnte"
    Mit der Definition char SPZM_ArtBez[10][32] ist &SPZM_ArtBez[x] ein fester Offset zur Startadresse des Arrays. Malloc wird versuchen die Adresse zu ändern - nicht den Inhalt - und das geht nicht.

    ob der Speicher direkt linear im Array angeordnet ist oder das Array per Zeiger drauf verweist ist doch völlig egal
    Hier kannst du sehen, was im Vergleich passiert:
    http://codepad.org/YpUBtqLy
    There are two kinds of fools. One says, “This is old, and therefore good.” And one says, “This is new, and therefore better.”

Ähnliche Themen

  1. WinCC 7 Performance Variablen-Trigger
    Von Krumnix im Forum HMI
    Antworten: 1
    Letzter Beitrag: 25.09.2013, 08:43
  2. Antworten: 4
    Letzter Beitrag: 14.11.2012, 18:43
  3. Antworten: 9
    Letzter Beitrag: 12.11.2012, 20:40
  4. WinCC flexible Skript beim Bildabbau beenden
    Von philippD im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 30.01.2012, 15:07
  5. Antworten: 2
    Letzter Beitrag: 19.04.2011, 10:32

Lesezeichen

Berechtigungen

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