# SPS Variablen über eigenes ActivX lesen/schreiben?



## BorisDieKlinge80 (14 Mai 2008)

Hallo Leute,

ihr kenn evtl. die Problematik mit den externen Tags und den Liszenkosten. Nun schwebt uns vor ein ActiveX zu proggen, welches variablen des SPS in interne Tags mapped und wieder zurück. 
Die Kommunikation zur SPS Siemess STEP 7 soll über TCP/IP erfolgen.

1. Gibt es free source files um SPS Daten/Variabeln zu elsen (c++)
2. Wie erkennt WinCC ob sich eine Variable auf der SPS geändert hat? Wir da ständig jede Variable gelesen udn geschaut ob ne ändereun ansteht?

grüße


----------



## afk (14 Mai 2008)

BorisDieKlinge80 schrieb:


> 1. Gibt es free source files um SPS Daten/Variabeln zu elsen (c++)


Libnodave (ist in C programmiert)



BorisDieKlinge80 schrieb:


> 2. Wie erkennt WinCC ob sich eine Variable auf der SPS geändert hat? Wir da ständig jede Variable gelesen udn geschaut ob ne ändereun ansteht?


Richtig.


Gruß Axel


----------



## BorisDieKlinge80 (14 Mai 2008)

Das ging schnell danke. Ok gut C wäre auch kein Problem. das Libnodave (ist in C programmiert) ist free mit source oder? 

Was hat das denn mit der Variablen und Qualität auf sich was man bspw. in WinCC bzw. auf einen OPC server sieht? Das hat doch mit der echt heit des variablen wertes zu tun!?!?!


----------



## afk (14 Mai 2008)

BorisDieKlinge80 schrieb:


> Das ging schnell danke. Ok gut C wäre auch kein Problem. das Libnodave (ist in C programmiert) ist free mit source oder?


Ist OpenSource und steht unter der LGPL.



BorisDieKlinge80 schrieb:


> Was hat das denn mit der Variablen und Qualität auf sich was man bspw. in WinCC bzw. auf einen OPC server sieht? Das hat doch mit der echt heit des variablen wertes zu tun!?!?!


Mit der Quality sagt ein OPC-Server dem OPC-Client, ob der Wert noch aktuell und gültig ist, bzw. aus welchem Grund er es nicht (mehr) ist.


Gruß Axel


----------



## BorisDieKlinge80 (14 Mai 2008)

Muss ich jede VAriable auf er SPS prüfen auf Änderung? und dann lesen? oder teilt mir die SPS irgendwie mit das sich eine Variable geändert hat?


----------



## Zottel (14 Mai 2008)

Die SPS sendet von sich aus nichts. Variablen lesen kostet auch immer mindestens die Zeit für eine Anfrage und die Antwort.
Wenn du viele Variablen hast, die sich aber nicht häufig ändern, kannst du im SPS-Programm prüfen, was sich verändert hat und Merker setzen. Im PC-Programm liest du zunächst die Merker und nur wenn einer gesetzt ist, auch die zugehörigen Daten.


----------



## Rainer Hönle (14 Mai 2008)

Also Siemens hat schon Möglichkeiten über Änderung an Variablen zu informieren. Wird auch soweit ich weiß in WinCC bzw. WinCC flexible genutzt. Allerdings unterstützt derzeit keine Kommunikationsbibliothek diese Möglichkeiten. Außerdem muss für die Änderungsnachricht entweder die Parametrierung oder das SPS-Programm (je nach verwendeter Variante) angepaßt werden.
Somit bleibt nur pollen und prüfen.


----------



## BorisDieKlinge80 (14 Mai 2008)

das ist problemematisch, naja wincc wird so schlau sein, und nur die tags lesen bzw. beschreiben welche im aktuellen zustand nowendig sind.. bspw. wenn sich Fenster X öffnet das für fenster x laden und anzeigen etc.

Nehmen wir an ich müsste 8000 tags mit der größe von 4 Bytes lesen bspw. mit C libnodave.. wie lange würde das dauern.. hat jemand erfahrung?


----------



## LowLevelMahn (14 Mai 2008)

Rainer Hönle schrieb:


> ...Allerdings unterstützt derzeit keine Kommunikationsbibliothek diese Möglichkeiten...



~noch nicht~ 

ciao LowLevelMahn


----------



## Rainer Hönle (14 Mai 2008)

BorisDieKlinge80 schrieb:


> das ist problemematisch, naja wincc wird so schlau sein, und nur die tags lesen bzw. beschreiben welche im aktuellen zustand nowendig sind.. bspw. wenn sich Fenster X öffnet das für fenster x laden und anzeigen etc.
> 
> Nehmen wir an ich müsste 8000 tags mit der größe von 4 Bytes lesen bspw. mit C libnodave.. wie lange würde das dauern.. hat jemand erfahrung?


Welche CPU kommt mit welcher CP zum Einsatz? Wie hoch ist die Zykluszeit? Wie ist die Kommunikationslast eingestellt? Wie intelligent ist die Anfrage gestaltet? Pauschal kann diese Frage nicht beantwortet werden.


----------



## BorisDieKlinge80 (15 Mai 2008)

Da müsste ich unsere SPS Gurus fragen:

glaube Siemens Step 7 
CPU 416-20P
CP400 
Zykluszeit 20ms

Kan LibNoDave auch via Industrial Ethernet kommunizieren? oder Muss es TCPIP ssein?


----------



## Ralle (15 Mai 2008)

Also für WinCC hat ein Kollege von mir ein ActiveX-Control geschrieben, mit welchem er aus/in Rohdatenvariablen (max. 204 Byte Länge) beliebige Daten (Byte, Word, DWord, String, Bool etc.) und in interne Variablen einsortiert. Das hat also einiges an Tags gespart. Allerdings gibt es dabei einige Probleme. Das betrifft zum Einen das Verhalten beim Hochlaufen von WinCC (man muß immer zuerst von der SPS lesen!) und andererseits gibt es Probleme, wenn man die gleiche Variable von der SPS liest und von WinCC aus schreiben will. Insgesamt wurde einiges an Zeit und Arbeit investiert, der Aufwand lohnt sicher erst nach einigen WinCC-Applikationen, bei welchen dann Tags und somit Lizensekosten gespart werden.


----------



## BorisDieKlinge80 (16 Mai 2008)

Eben Ralle, das ist das problem die wollen hier von ner 8K WinCC lizens auf ner 128 Lizens...! Die meinten haja mit dem rohdaten prinzip wäre es "kein" poblem.

Aber die gesamte kommunikation hängt dann von dem ActiveX ab, performance technisch kommt man nich an winCC ran.


----------



## Ralle (16 Mai 2008)

Warum das? Wenn sich eine Rohdatenvariable ändert, löst WinCC einen Trigger aus, daraufhin wird ein Script abgearbeitet, daß die Variablen separiert, umgekehrt das Gleiche, die Rohdaten werden immehnoch normal von WinnCC als Block gelesen und geschrieben. Unser WinCC-Server versorgt 8 WebNavigator-Clients. wir nutzen eine 256-er Lizense (für manche Dinge nehme ich dann schon eine direkte Variable, zumal nicht alles fein in Blöcken auf der SPS liegt und ich auch mal faul bin). Der Server ist bei weitem nicht ausgelastet, bis wohin WinCC problemlos mitspielt muß man bei dieser Menge Variablen eh austesten. Die Webclients und die Triggerzeiten bei WinCC sind ohnehion nicht so superschnell, ich finde es immer etwas träge, wenn man auf einem Bild die Trigger zu schnell wählt, werden manchmal die Variablen nicht mehr gelesen, aber das ist schon bei normalen Variblen so.


----------



## BorisDieKlinge80 (16 Mai 2008)

ja an sowas hab ich auch schon gedacht... 

1. Müssen alle DB der SPS zu rohdatneblöcke zusammengepackt werden (bzw. kopiert und gelesen werden)

2. ich muss alles externen 8000 Tags in internte Tags protieren..

3. Scripte einbauen, welche ablaufen wenn sich ein interen tag ändert, und dann das entsprechende rowhdatentag auf die sps schreiben?

aber wie bekommen meine scripte mit welches interne tag geändert wurde? kann ja nich auf jedes Tag triggern oder.. wäre doch umständlich? sorry bin nich so involvieert mit wincc


----------



## Ralle (16 Mai 2008)

Ich hab mal nachgeschaut.
Die meisten Daten werden zu Anzeigezwecken nur aus der SPS-ausgelesen und niemals zurückgeschrieben. Es mach absolut Sinn diese separat zu behandeln, mit einer Funtion (RAWREAD) aus einem ActiveX-Control. Getriggert wird dabei auf die Rohdatenvariable. Außerdem sind im ActiveX-Control Funktionen ausprogrammiert, die das korrekte Separieren indie Internen Variablen machen, da sind z.Bsp. die Bytes verdreht etc. Spezielle Daten (Parameter werden gelesen und geschrieben, dabei triggert man ein Script auf die Rohdatenvariablen, eines auf die "enthaltenen" interen Variablen). Buttons etc. haben wir direkt über Wordvariablen genutzt, da das "gleichzeitige" Schreiben und Lesen am Anfang Probleme gemacht hat und wir mit den Tags auch so ganz gut hin kamen. Also von 8000 auf 128 halte ich für unrealistisch, ich würde mal mit allen nur anzuzeigenden Variablen beginnen.


----------



## BorisDieKlinge80 (16 Mai 2008)

eben, glabu auch das dies nich gehen wird.. wenn ich nen button drücke... könnte ich ja diese aktion auf eine property event des activx Triggern oddr?


----------



## Ralle (16 Mai 2008)

Das mit dem ActiveX haben wir anders gelöst. Das AxtiveX stellt Funktionen zur Verfügung, eigentlich wie eine DLL, aber das ActiveX ist halt in VBA leicht einzubinden, weiß gar nicht, on das mit einer "reinen" DLL ginge. Der Button löst über seine Variable ein Action-Script in WinCC aus, dieses ruft dann ein fertiges GlobalScript auf, in welchem mit Hilfe des ActiveX die Rohdaten geschrieben werden. Es ist ja kein visuelles ActiveX auf der Oberfläche!


----------



## BorisDieKlinge80 (16 Mai 2008)

hey ralle genau so hab ich mir das auch grad gedacht.. ne gute idee.. ich leg ei ntrigger an welcher auf änderung der interen tags wartet , und ein funktion des Active X aufruft...

Wenn ich eine Aktion in winCC scripte, kann ich ja unter "Trigger/Info" Tag anfügen.. aber immer nur einzlen.. Kann man keine tag gruppen auswählen.. oder wie könnte ich es machen damit ein trigger bspw. auf 1000 tag hört? Zudem gibt es ne möglichkeit das ich sogar rausbekommen, welches dieser tausend tag sich geändert hat? was eigentlich egal wäre, weil die 1000 Tag ja ehh komplett in den rohdatenbock geschrieben werden...


----------



## Ralle (16 Mai 2008)

BorisDieKlinge80 schrieb:


> hey ralle genau so hab ich mir das auch grad gedacht.. ne gute idee.. ich leg ei ntrigger an welcher auf änderung der interen tags wartet , und ein funktion des Active X aufruft...
> 
> Wenn ich eine Aktion in winCC scripte, kann ich ja unter "Trigger/Info" Tag anfügen.. aber immer nur einzlen.. Kann man keine tag gruppen auswählen.. oder wie könnte ich es machen damit ein trigger bspw. auf 1000 tag hört? Zudem gibt es ne möglichkeit das ich sogar rausbekommen, welches dieser tausend tag sich geändert hat? was eigentlich egal wäre, weil die 1000 Tag ja ehh komplett in den rohdatenbock geschrieben werden...



Nein, bloß nicht so. Wenn du einen Button drückst, willst du dann 8000 Variablen aktualisieren und als Rohdatenpakete zur SPS schicken? Das wäre übertrieben. Du solltest jeden Rohdatenblock triggern zum Lesen und die Variablen im Rohdatenblock, welche von der Visu geändert werden können, zum Schreiben triggern. Somit wird es für jede Rohdatenvariable ein Script zum lesen geben und, wenn nötig, ein Script zum Schreiben.


----------



## BorisDieKlinge80 (16 Mai 2008)

ja ich versteh dich schon, aber hätte ich 1000 Bit Tags, welche in einem Rohdatenblock untergebracht wären, müsste ich ja auf all diese Tags triggern, und den dafür vorgesehenen Rohdatenblock übertragen....


----------



## Ralle (16 Mai 2008)

BorisDieKlinge80 schrieb:


> ja ich versteh dich schon, aber hätte ich 1000 Bit Tags, welche in einem Rohdatenblock untergebracht wären, müsste ich ja auf all diese Tags triggern, und den dafür vorgesehenen Rohdatenblock übertragen....



Bits habe ich schon deshalb kaum in Benutzung.  Man kann ja alles in WinCC erledigen, indem man ein DWord nutzt und die aktiven Bits selektiert (Farbumschläge, Buttons etc,)


----------



## Flinn (16 Mai 2008)

Ralle,

Ich habe ein paar Fragen zu Deiner Lösung:
1) Kann man wirklich in WinCC auf eine externe Rohdatenvariable triggern?
Wäre mir neu.

2) Warum nutzt Ihr ein ActiveX und nicht z.B. ein Global-Script (vorzugsweise C, VBS ginge auch) als Schnittstelle interne Variablen <=> Rohdatenvariable?

Gruß
Flinn


----------



## Ralle (16 Mai 2008)

1. Die Rohdatenvarible wird unter der entsprechenden Verbindung in WinCC angelegt. Mann kann ein Script anlegen, daß mit einer Änderung diser Rohdatenvariable getriggert wird, das funktioniert problemlos.

2. Ich habe teilweise auch ohne ActiveX mit Scripten gearbeitet. So habe ich sämtliche Störmeldungen in WinCC (ca. 1200) über Rohdatenvariable realisiert. 
Dann hatten wir aber auch gemischte Blöcke, die enthielten Byte, DWord, Int, Real, String. Es ist ziemlich anstrengend und fehlerträchtig die Daten korrekt aus den Rohdaten herauszuholen und die Bytes entsprechend richtig zu vertauschen. VBA und auch C unter WinCC unterliegt wohl auch einigen Beschränkungen (VBA kann hier nicht alles, was Microsoft ihm eigentlich spendiert hat, warum wissen nur die Siemens-Entwickler), konnte also ohnehin nicht alles, was wir benötigten (Drucken von Labeln über Netzwerk, Daten an andere Server verschicken und empfangen etc.) Dabei stellte mein Kollege dann fest, daß er sich in den ActiveX richtig austoben konnte (Delphi 2006) und alles so programmieren konnte, wie er es von Windows gewohnt ist, ohne Script- und WinCC-Einschränkungen. Das ActiveX dann in WinCC zu benutzen ist rel. einfach, integriert sind gleich Funktionen, um die Daten korrekt zu extrahieren.


----------



## Flinn (16 Mai 2008)

Ralle schrieb:


> 1. Die Rohdatenvarible wird unter der entsprechenden Verbindung in WinCC angelegt. Mann kann ein Script anlegen, daß mit einer Änderung diser Rohdatenvariable getriggert wird, das funktioniert problemlos.
> 
> 2. Ich habe teilweise auch ohne ActiveX mit Scripten gearbeitet. So habe ich sämtliche Störmeldungen in WinCC (ca. 1200) über Rohdatenvariable realisiert.
> Dann hatten wir aber auch gemischte Blöcke, die enthielten Byte, DWord, Int, Real, String. Es ist ziemlich anstrengend und fehlerträchtig die Daten korrekt aus den Rohdaten herauszuholen und die Bytes entsprechend richtig zu vertauschen. VBA und auch C unter WinCC unterliegt wohl auch einigen Beschränkungen (VBA kann hier nicht alles, was Microsoft ihm eigentlich spendiert hat, warum wissen nur die Siemens-Entwickler), konnte also ohnehin nicht alles, was wir benötigten (Drucken von Labeln über Netzwerk, Daten an andere Server verschicken und empfangen etc.) Dabei stellte mein Kollege dann fest, daß er sich in den ActiveX richtig austoben konnte (Delphi 2006) und alles so programmieren konnte, wie er es von Windows gewohnt ist, ohne Script- und WinCC-Einschränkungen. Das ActiveX dann in WinCC zu benutzen ist rel. einfach, integriert sind gleich Funktionen, um die Daten korrekt zu extrahieren.


 
zu 1) Danke für die Info! Werde ich mal testen.

zu 2) Und wir haben die ganzen Konvertierungen mit WinCC-Mitteln gemacht... Na,ja, fertig ist fertig.


----------



## BorisDieKlinge80 (19 Mai 2008)

ja die sripterei ist ja ganz edel, aber oft nicht 100% durchschaubar, elegant und nicht debugbar... zudem könnte man ein activeX schön konfigurierbar machen. bspw. XML Dokument als rohdatentag / interntag schnittstellen beschreiben etc.

Ich hab auch schon für einzelne Module rohdaten konverteirt gesplittet byteorder umtegereht etc. etc. und diese dann an eine datenbank geschickt.. wenn man den code dann länger nich mehr anschaut.. weis man oft nicht mehr genau was da vorsich geht


WAS ABER SCHEISSE IST, wenn ich von 240WORD variablen welche über 1 Rohdatentag gemppt wird, triggen muss...ich muss ja dann eine triggerfunktion anlagen, und jede der 240 internen tags als trigger einbinden..


----------

