# WinCC externe Variablen zerstückeln



## pjoddi (1 September 2007)

Hallo allerseits

habe nun mein erstes echtes WinCC Projekt auf dem Tisch, und natürlich die "kleine Lizenz-Nummer". (by King Customer)
Also muß ich externe Variablen sparen.
Habe mir in der SPS also meine Bits in DWs gesammelt, und muß sie in WinCC nun wieder auseinanderpflücken.

Und da beginnt mein Problem. Hat jemand einen Ansatz oder ein C-script, mit dem man diese Auflösung in einzelne Bits bewerkstelligen kann?  Habe bisher noch nicht mit scripten gearbeitet.


----------



## godi (1 September 2007)

Kenn mich mit WinCC jetzt nicht aus aber kann man da nicht Struct Variablen auch übergeben und man benötigt nur 1Tag?
Da kannst ja deine Daten in Struct zusammenfassen und das sollte dann leicht wieder zum auseinandernehmen sein.
Geht das so?  

godi


----------



## schumi91 (1 September 2007)

godi schrieb:


> Kenn mich mit WinCC jetzt nicht aus aber kann man da nicht Struct Variablen auch übergeben und man benötigt nur 1Tag?
> Da kannst ja deine Daten in Struct zusammenfassen und das sollte dann leicht wieder zum auseinandernehmen sein.
> Geht das so?
> 
> godi



Jedes Struct Mitglied ist ein Powertag. Leider.

Gruß Schumi91


----------



## godi (1 September 2007)

schumi91 schrieb:


> Jedes Struct Mitglied ist ein Powertag. Leider.
> 
> Gruß Schumi91


 
OK habe ich mich also geirrt!  

Naja bei der Lizenzpolitik denkt halt Siemens mehr nach als wie bei manch anderen Sachen. 

Was ist eigentlich mit ARRAY? Auch mehr Powertags?

godi


----------



## geduldiger (1 September 2007)

Wo ist das Problem, du kannst doch das Bit das du aus deinem DW möchtest in wincc einfach angeben, zuerst Variable dann bit auswählen, oder verstehe ich die frage falsch, so hab ichs bei meinem projekt gemacht und echt en haufen tags "gespart"

mfg


----------



## pjoddi (1 September 2007)

*Natürlich, Danke!*

Danke Euch, habs jetzt gefunden.
Wer lesen kann ist klar im Vorteil!
Man kann natürlich, genau so wie`s "geduldiger" geschildert hat, eine externe Variable vom Typ "Word" angeben, und mit der Schaltfläche "Bit" dann das entsprechende Bit auswählen.
Schönen Abend noch!


----------



## eYe (1 September 2007)

Und diese ganzen Word Variablen kannste dann in einem Array zusammenfassen, das kostet dich dann auch nur einen Powertag


----------



## geduldiger (1 September 2007)

echt? dachte mehr sparen geht net, muss ich mir gleich mal angucken


----------



## Christian73 (3 September 2007)

@eYe

Kannst Du das bitte mal erklären ? Kenne nur die Struct's.  

Danke 
Christian


----------



## Bender25 (3 September 2007)

Kannst auch Rohdaten verwenden. Damit kannst du bis zu 256 Byte mit einer Variable einlesen. Mußt es dann halt per C skript wieder zerpflücken.


----------



## Christian73 (3 September 2007)

Mit den Rohdaten ist mir bekannt, aber nicht über Arrays  

Gruß
Christian


----------



## Bender25 (3 September 2007)

Hab hier was. aber noch nicht getestet. Iss gleich Feierabend  



```
struct {
       WORD Stat1;
       WORD Stat2;
       WORD Stat3;
       WORD Stat4;
       WORD Stat5;
       WORD Stat6;
       WORD Stat7;
       WORD Stat8;
       } RStat;
 
#define pRawTag = "Deine_Rohdaten_Variable"
 
DWORD        TagState;
 
GetTagRawState(pRawTag,(BYTE *)&RStat,sizeof(RStat),&TagState);
 
if(TagState) 
     return 0; 
 
 
 
 
//ab hier kannst du auf die einzelnen Word´s zugreifen bzw auf interne Variable schreiben die ja nicht gezählt werden :)
//ist aber ein wenig dirty *g*
 
SetTagWord(Deine_interne_16Bit_Variable,RStat.Stat1);
//usw
```


----------



## godi (3 September 2007)

Christian73 schrieb:


> @eYe
> 
> Kannst Du das bitte mal erklären ? Kenne nur die Struct's.
> 
> ...


 
Hallo!

Brauchst nur in deinem DB ein ARRAY anlegen.
zb.:

```
DATA_BLOCK DB 1
TITLE =
VERSION : 0.1

  STRUCT  
   Dein_Speicher : ARRAY  [1 .. 10 ] OF //Array mit 10 Word
   WORD ; 
  END_STRUCT ; 
BEGIN
   Dein_Speicher[1] := W#16#0; 
   Dein_Speicher[2] := W#16#0; 
   Dein_Speicher[3] := W#16#0; 
   Dein_Speicher[4] := W#16#0; 
   Dein_Speicher[5] := W#16#0; 
   Dein_Speicher[6] := W#16#0; 
   Dein_Speicher[7] := W#16#0; 
   Dein_Speicher[8] := W#16#0; 
   Dein_Speicher[9] := W#16#0; 
   Dein_Speicher[10] := W#16#0; 
END_DATA_BLOCK
```
 
godi


----------



## Christian73 (4 September 2007)

@godi

Moin,

bin wohl noch nicht ganz wach aber wie definiere ich dann die Variable in WinCC  ?

Gruß
Christian


----------



## godi (4 September 2007)

godi schrieb:


> Kenn mich mit WinCC jetzt nicht aus...
> godi


 
Sorry da kann ich dir momentan nicht weiterhelfen...
Wenn ich am Abend (ist ja schon  ) Zeit habe werde ich schaun wie das geht wenn sich kein anderer bereiterklärt dir das zu sagen!  

godi


----------



## godi (4 September 2007)

Habe gerade mal WinCC V6.0 gestartet gehabt!  
Was ich so gesehen habe geht das leider nicht, das man ein Array übergiebt!  
Maximal geht ein 32BIT vorzeichenlose Variable

godi


----------



## Christian73 (5 September 2007)

@godi

Vielen Dank für Deine Mühe !  

Na vielleicht erklärt uns das *eYe* nochmal  

Gruß
Christian


----------



## Bender25 (5 September 2007)

was für eine Variable denn?? Komm net ganz mit? Eine stinknormale externe Variable anlegen?


----------



## Christian73 (5 September 2007)

Nö, das weiß ich ja  

Zu meinem Verständnis (wurde alles schon mal erwähnt) :
Mir ist klar das wenn man eine Wort oder Doppelwort Variable anlegt (WinCC) man auf die einzelnen Bits zugreifen kann aber nur ein Powetag benötigt. Ich weiß auch das beim Struct für jedes Mitglied ein Powertag fällig ist. Die Lösung über eine Rohdatenvariable zu gehen und diese anschließend über C wieder auseinanderzudrösseln kenn ich auch ...

Man was ich alles kenne  

Nu sagt eYe aber:



eYe schrieb:


> Und diese ganzen Word Variablen kannste dann in einem Array zusammenfassen, das kostet dich dann auch nur einen Powertag


 
Und das versteh ich nicht ganz !

Meint er damit eine Doppel/Wortvariable in WinCC anlegen und diese in der SPS wie von godi bereits gezeigt entsprechend nach Bedarf zu füllen ?

Gruß
Christian


----------



## Bender25 (5 September 2007)

keine ahnung. Aber einen anderen weg als über Rohdaten Variablen zu sparen kenn ich ehrlich gesagt auch nicht.


----------



## eYe (5 September 2007)

Sry bin momentan auf Inbetriebnahme und nicht wirklich motiviert Abends noch große Romane zu schreiben 

Bei der Visualisierung die ich bei dem Projekt von einem Kollegen übernommen habe, hat er einige Arrays in der Variablenliste von WinCC Flexible erstellt und hat mir gesagt das man dafür nur einen Powertag angerechnet bekommt.
(z.B. ein INT Array mit 32 Feldern/Variablen)

Das einzige Problem an den Arrays ist nur das man nicht für alle Funktionen auf die Felder zugreifen kann...

Ich werde hoffentlich morgen mal dazu kommen nen screeni einzustellen.

sry, eYe


----------



## godi (5 September 2007)

Eh WinCC flexible?
war nicht die rede von WinCC?
Da ist ein sehr großer unterschied!


----------



## eYe (5 September 2007)

godi schrieb:


> Eh WinCC flexible?
> war nicht die rede von WinCC?
> Da ist ein sehr großer unterschied!



:shock:  

ähm, ich sag dann einfach mal no comment 

*in die Ecke stell und schäm*


----------



## Christian73 (6 September 2007)

eYe schrieb:


> :shock:
> 
> ähm, ich sag dann einfach mal no comment
> 
> *in die Ecke stell und schäm*


 
Na Du bist mir ja einer  

Trotzdem noch viel Erfolg bei Deiner Inbetriebnahme.

Gruß
Christian


----------



## xhasx (17 September 2007)

Hier noch was von mir... ...ShiftAndMask

' 2. Parameter: Zylinder 1..32 zur Grundstellung: Auswerten (Bit 0..31)
TempLong = CLng(SmartTags("EcmRezeptur\Edit\AblaufIntern")(Adresse+1))
For ZylinderIndex = 0 To 31
 ShiftAndMask TempLong,Ergebnis, ZylinderIndex, &H0001
 If Ergebnis Then
  SmartTags("EcmRezeptur\Edit\Aktion2ZylinderZurGs")(ZylinderIndex) = True
 Else
    SmartTags("EcmRezeptur\Edit\Aktion2ZylinderZurGs")(ZylinderIndex) = False 
 End If
NextIf
Next


----------



## mst (30 März 2010)

pjoddi schrieb:


> Danke Euch, habs jetzt gefunden.
> Wer lesen kann ist klar im Vorteil!
> Man kann natürlich, genau so wie`s "geduldiger" geschildert hat, eine externe Variable vom Typ "Word" angeben, und mit der Schaltfläche "Bit" dann das entsprechende Bit auswählen.
> Schönen Abend noch!


 
Hallo Leute,

hab jatzt eine Stunde lang versucht, irgendwie springt der Funke nicht. Kann mir das jemand genauer erklären.


mfg mst

ach ja Basic Panel KTP600


----------



## mst (31 März 2010)

pjoddi schrieb:


> Hallo allerseits
> 
> habe nun mein erstes echtes WinCC Projekt auf dem Tisch, und natürlich die "kleine Lizenz-Nummer". (by King Customer)
> Also muß ich externe Variablen sparen.
> ...


 
Genau daselbe Problem hab ich auch.



pjoddi schrieb:


> Danke Euch, habs jetzt gefunden.
> Wer lesen kann ist klar im Vorteil!
> Man kann natürlich, genau so wie`s "geduldiger" geschildert hat, eine externe Variable vom Typ "Word" angeben, und mit der Schaltfläche "Bit" dann das entsprechende Bit auswählen.
> Schönen Abend noch!


 
Ich finde die Schaltfläche "Bit" nicht.


----------



## mst (31 März 2010)

OK Leute,

bin anscheinend nicht ganz bei mir, hab nun festgestellt das alle von WinCC reden und ich von WinCC Flex *schäm*.

..gibts da auch so eine Möglichkeit?
Hab mir die multiplexe Funktion angesehen, allerdings werden da die externen Variablen natürlich auch gezählt.


----------



## Larry Laffer (31 März 2010)

@mst:
Was soll es denn jetzt nun bei dir werden ...?


----------



## mst (31 März 2010)

OK - ich glaub ich hab für genug Verwirrung gesorgt.

Ich hab zum ersten mal ein Basic Panel KTP600 color (6AV6 647-0AD11-3AX0), dieses ist auf 128 Variablen begrenzt, ist von mir übersehen worden.

Ich benötige jetzt allerdings 158, suche jetzt nach einer Möglichkeit diese 30 einzusparen. Hab genug Bit Variablen die ich zusammenführen kann, aber finde keine Möglichkeit dies in WinCC Flex wieder zu trennen.

mfg mst


----------



## marlob (31 März 2010)

mal als Lösungsansatz, falls dein Panel Scripte kann
Bit aus byte lesen WinCC Flex


----------



## mst (31 März 2010)

marlob schrieb:


> mal als Lösungsansatz
> Bit aus byte lesen WinCC Flex


 

soweit ich das sehe kann das Panel keine Scripte, leider...


----------



## Larry Laffer (31 März 2010)

... dann fallen schon mal alle Sachen aus, die sich irgendwie mit demaskieren und auf andere Variablen aufteilen machen lassen ...

Du hast natürlich in Flex die Möglichkeit z.B. wenn du Eingänge oder Ausgänge oder Merker (als Bit) anzeigst, dir das Byte zu laden und die Animation an das einzelne Bit zu hängen. Das würde sich lohnen, wenn du relativ viele Bits einzeln lädst. Eventuell kann man hier sogar mit Worten arbeiten (wobei sich da dann die Bit-Reihenfolge verdreht).

Das gleiche würde gelten für binäre Steuer-Befehle. Hier gäbe es ja auch die Funktion "SetzeBitinVariable" (oder so ähnlich), die es ermöglichen würde in einem Byte (oder größer) ein einzelnes Bit umzusteuern. Hierbei wäre dann auch nur das Byte (oder Wort) dein Tag.

Trifft das für dich zu ... oder hast du das sowieso schon so gemacht ?

Gruß
LL


----------



## mst (31 März 2010)

Larry Laffer schrieb:


> ... dann fallen schon mal alle Sachen aus, die sich irgendwie mit demaskieren und auf andere Variablen aufteilen machen lassen ...
> 
> Du hast natürlich in Flex die Möglichkeit z.B. wenn du Eingänge oder Ausgänge oder Merker (als Bit) anzeigst, dir das Byte zu laden und die Animation an das einzelne Bit zu hängen. Das würde sich lohnen, wenn du relativ viele Bits einzeln lädst. Eventuell kann man hier sogar mit Worten arbeiten (wobei sich da dann die Bit-Reihenfolge verdreht).
> 
> ...


 
... hab das mit den Animationen gemacht, und div. Sachen die nicht ganz so Wichtig sind einmal weggelassen. - Somit komm ich fürs erste klar, ist allerdings keine Dauerlösung, werd wohl ein anderes Panel einsetzen oder auf die neue Firmeware ende des Jahre warten, mit der lt. Siemens die Grenzen höher gesetzt werden.

... die Funktion "SetzeBitinVariable" kann ich nicht finden, wird bei diesem Panel anscheinend nicht understützt.

besten dank, mst


----------



## Larry Laffer (31 März 2010)

ich meinte z.B. bei einem Button unter Ereignisse - Drücken - SetzeBitInVariable - m.E. gibt es diese Funktion auch bei dir ...

Gruß
LL


----------



## mst (31 März 2010)

Larry Laffer schrieb:


> ich meinte z.B. bei einem Button unter Ereignisse - Drücken - SetzeBitInVariable - m.E. gibt es diese Funktion auch bei dir ...


 
nein, gibt es nicht...


----------

