# Problem Rohdaten schreiben WinCC zu Step7



## rene-privat65 (5 September 2010)

Ich möchte Werte mit einer Eingabe im Ein/Ausgabe Feld von WinCC zum Datenbaustein schreiben.
Dieses realisiere ich mit der Funktion – SetTagRaw – im - Ein und Ausgabe Feld -,  in Ereignis > Ausgabe/Eingabe > Eingabewert.
Um den Eingabewert zum Datenbaustein zu schreiben benutze ich in diesen Script die interne Funktion – GetInputValueDouble – , die den Eingabewert im Format double ermittelt.
Hier wandle ich den Eingabewert  dann double zu integer.
Gebe ich einen Wert ein im Ein/Ausgabe Feld und bestätige dieses wird dieser Wert auch richtig im Datenbaustein angezeigt.
Leider werden dabei alle anderen Werte in diesen Datenbaustein zu  „0 „ geschrieben.
Dieses kann ich nicht verstehen.
Ich denke weil der Eingabewert richtig geschrieben wird zum Datenbaustein und die anderen Werte des Datenbausteines zu 0 geschrieben werden ist das ein Problem der Funktion SetTagRaw.
Ihr könnt  mir glauben ich habe alle Kombinationen ausprobiert, das heist die Werte verändert - BYTE Buffer[78] -, SetTagRaw(Raw_Data_Value,&Buffer[0],78),  aber leider ohne Erfolg. Dazu noch andere Funktionen angewendet.
Ich möchte unbedingt mit dieser Art die Werte zum Datenbaustein schreiben.
Ich wäre so dankbar wenn mir einer helfen könnte.

#include "apdefap.h"
void OnPropertyChanged(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName,  char*  value)
{
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 2
#define Raw_Data_Value "SA_Raw_Data_drive_102"
#define Raw_Data_Value_Integer_write "SA_Raw_data_DB_DW_32_drive_102"
// WINCC:TAGNAME_SECTION_END
// WINCCICNAME_SECTION_START
// syntax: #define PicNameInAction "PictureName"
// next PicID : 1
// WINCCICNAME_SECTION_END
short int IntValue;
int integer;
double flowpoint;
BYTE *IntBuffer; 
BYTE Buffer[78];      // Buffer to turn the Bytes
double flowpoint;
flowpoint=GetInputValueDouble(lpszPictureName,lpszObjectName);
integer= (int) flowpoint;
IntValue = integer;
IntBuffer = (BYTE*)&IntValue;   // Pointer for transfer 
Buffer[32] = IntBuffer[1]; // write Integeger Value into Raw Data DB Data Box
Buffer[33] = IntBuffer[0];
SetTagRaw(Raw_Data_Value,&Buffer[0],78); // write the RawDataVariable
}


----------



## Thomas_v2.1 (5 September 2010)

Was sollen denn auch sonst für Werte in dem Datenbaustein landen?

Du schreibst 78 Bytes aus einen byte Array, von denen du nur 2 Bytes (32 und 33) einen definierten Wert zuweist.

Ich weiß nicht ob sich das C in WinCC anders als normales C verhält, bei dem ist der Startwert von
BYTE Buffer[78]; // Buffer to turn the Bytes

nämlich nichtmal definiert.
Es könnten in den anderen Feldern auch zufällige Werte stehen.

Warum willst du überhaupt Rohdaten schreiben? Sollen Tags gespart werden oder welchen Hintergrund hat diese Vorgehensweise?


----------



## IBFS (5 September 2010)

Man sollte immer versuchen das WinCC Projekt ins STEP7 Projekt zu integrieren.
Mittels AS-OS-Tranfer lassen sich dann wunderbar alle benötigten Variablen
im WinCC automatisch anlegen. 

Frank


----------



## Jochen Kühner (5 September 2010)

*Nur 2 Byte...*

Wenn du nur 2 Bytes im DB beschreiben willst, dann darfst du auch nur eine Rohdatenvariable mit 2 Bytes an der gewünschten Adresse anlegen. Wenn du es mit der Variablen machen willst die du hast, musst du sie erst einlesen (GetTagRawWait) und dann die Bytes ändern und wieder zur sps schreiben. Aber natürlich kann sich dann wärend dieser Zeit ein Wert in deinem DB geändert haben, welchen du dann überschreibst!


----------



## rene-privat65 (5 September 2010)

Hallo Jochen
Danke für Deine Mühe sich mit dem Problem zu beschäftigen.
Leider sind meine C Kenntnisse beschränkt. Ich bin mehr auf Step7 fixiert.
Ja Jochen ich möchte es mit der gleichen Variable machen das heist eine Rohdaten Variable mit 78 Bytes.
Mein  Problem ist jetzt wie ich den C Script schreibe um die Werte mit GetTagRawWait einlese und dann die Werte mit SetTagRawWait zum Datenbaustein schreibe.
Ich denke wenn man eine Eingabe Wert im Ein Ausgabe Feld macht und dann bestätigt ist das eine sehr kurze Zeit in der sich die Werte im DB ändern. Ich denke zu kurz. Das ist ja nur im Moment der Bestätigung mit Enter Taste und die Aktualwerte werden immer wieder aktualisiert in Step7.
Muss ich unbedingt GetTagRawWait benutzen oder kann man das noch eleganter lösen.
Kannst Du mir zu beiden Möglichkeiten das Skript senden.
Ich wäre Dir sehr dankbar dafür und habe schon so viel Zeit geopfert.
Vielen Dank
Rene


----------



## IBFS (5 September 2010)

rene-privat65 schrieb:


> Leider sind meine C Kenntnisse beschränkt. Ich bin mehr auf Step7 fixiert.


 

Genau deshalb hatte ich dir ja die WinCC-Integration empfohlen.

Da brauchst du KEINE C-Skripte mehr sondern verbindest dich direkt
mir der Variablen aus dem S7-Projekt. Hast du dich damit schon mal
beschäftigt?????

Frank


----------



## rene-privat65 (5 September 2010)

Hallo Thomas
Auch danke für Deine Mühen sich mit dem Problem zu beschäftigen.
Wie kann ich das umgehen dass ich 78 Bytes aus ein Array schreibe und nur 2 Bytes 2 Bytes (32 und 33) schreib zum DB.
Ich denke ich habe Schwierigkeiten die Funktion Settagraw zu verstehen.
Für mich ist das eine Funktion die von Siemens angeboten wird und dann für Solche Zwecke wie Rohdaten zur Step7 schreiben verwendet werden soll.
Sonst braucht man solche Funktion nicht.
Einlesen klappt ja auch wunderbar mit Gettagraw.
Ja ich möchte Tags sparen.
Aber das wichtigste ist die Visualisierung umzugestalten auf objektorientiertes Programmieren.
Das heist die Werte zum Beispiel für ein Motor schreibe ich in Step 7 mit einen FC immer zu den gleichen Datenfach.
In WinCC möchte ich dann die dazugehörigen Objekte anlegen und nur noch umverdrahten und nie wieder in den C Skripten arbeiten.


----------



## rene-privat65 (5 September 2010)

Hallo Frank
Leider habe ich mich noch nie mit WinCC Integration in Step7 beschäftigt.
Aber was haben die C Scripte mit der Integration WinCC in Step7 zu tun.
Ich muss doch für viele Anwendungen der Objekte ein C Script verwenden.
Da kommt man nicht drum rum.
René


----------



## IBFS (5 September 2010)

rene-privat65 schrieb:


> Ich muss doch für viele Anwendungen der Objekte ein C Script verwenden.
> Da kommt man nicht drum rum.


 
Das ist schon richtig, ganz ohne C oder VBA gehts nicht.

Aber wenn ich mir überlege, alle bei mir im Projekt verwendeten 
Variablen müßte ich mit der Hand zerhacken oder zusammenbauen,
da nehme ich zumindest für die ganzen E/A-Felder oder die Variablen
die ich im TAG-Logging anlege, gleich die S7-Variablen. 

Die Variablenanbindung ist natürlich nicht ganz so einfach für FLEX aber
dafür hat man auf einen Rutsch nur die wirklich benötigten Varablen 
im WinCC Projekt. Einfach im DB an der Variablen den B&B-Tag setzen,
die DB-Eigenschaften auf die ggf. nötige Skalierung anpassen und dann
AS-OS-Transfer starten. Blubb ... und schon sind alle Variablen in WinCC bekannt. 
Man kann aber auch Merker und E/As einlesen, aber das versuche ich zu vermeiden.

Ich gebe zu, das diese Vorgehensweise bei Bildbausteinen schwieriger ist,
d.h. von man kein PCS7 hat, dort gibts für alles Wizzards. 

Problematisch ist bei Einzeladressierung natürlich auch der TAG-Verbrauch :-(

Grüß

Frank


----------



## rene-privat65 (6 September 2010)

Hallo Frank
Ich versuche in nächster Zeit mich zu befassen wie man WinCC mit einer OS Station in Step7 integriert.
Ich denke die andere Möglichkeit mit Rohdaten in WinCC zu arbeiten ist auch interessant.
Wenn es doch bloß eine elegante Möglichkeit geben würde, ohne die Variablen zu zerstückeln nur die Variable zu schreiben zum Beispiel Word 32 (Byte 32 und 33)zum DB. Das Ziel ist es die anderen Variablen vom DB nicht zu schreiben das heist die Werte verändern, sondern nur die eine. Das wäre ein Traum. 
Ich schreibe nochmal an Lochen Kühner.
Gruß

René


----------



## rene-privat65 (6 September 2010)

Hallo Jochen
Muss man unbedingt alle Variablen vom DB mit gettagrawwait einlesen?
Das wäre ja ein sehr langer Script in jedem Objekt in WinCC.
Kann man das umgehen? Ein Traum wäre wahr.
Wenn du eine Lösung findest ohne gettagrawwait einlesen jeder Variable vom DB bin ich sehr glücklich.
Kannst Du mir den anderen Skript senden mit einlesen gettagrawwait falls Du keine andere Lösung findest.
Ich danke Dir
René


----------



## Thomas_v2.1 (6 September 2010)

Also dieses Block-Daten-Gefummle zum Tags sparen ist wirklich grausam. Muss es sowas sein? Dann lass nachher bloß nicht den Kunden sehen was du da zusammengebaut hast, ich würde sowas als Kunde nicht abnehmen.

Wenn es wirklich nicht anders geht, würde ich wenigstens alle Variablen die von WinCC aus geschrieben werden sollen (Sollwerte, Befehle) als eigenen Tag anlegen. Bei Istwerten kannst du ja ohne Probleme immer den ganzen Block lesen und dann per Skript auseinandernehmen.

Mit den Set/GetTagRaw-Funktionen kannst du über den letzten Parameter auch weniger Bytes lesen/schreiben als in der Datenbasis angelegt, aber die Startadresse ist immer fest und lässt sich Imho nicht ändern.

Bei der WinCC-Integration in Step7 die IBFS hier propagiert, werden dir für alle Variablen die es in Step7 gibt einzelne Tags angelegt. Da ist es mit Tags sparen eh vorbei, also dürfte kaum die Lösung für dein Problem darstellen.
Ich lege meine Datenbasis für WinCC normalerweise über Excel/CSV-Dateien an, da mein WinCC-ES nicht auf dem Step7-Rechner läuft. Das geht auch komfortabel (oder sogar komfortabler) ohne die Integration, wenn man sich die entsprechenden Tools geschrieben hat...


----------



## Jochen Kühner (6 September 2010)

rene-privat65 schrieb:


> Hallo Frank
> Ich versuche in nächster Zeit mich zu befassen wie man WinCC mit einer OS Station in Step7 integriert.
> Ich denke die andere Möglichkeit mit Rohdaten in WinCC zu arbeiten ist auch interessant.
> Wenn es doch bloß eine elegante Möglichkeit geben würde, ohne die Variablen zu zerstückeln nur die Variable zu schreiben zum Beispiel Word 32 (Byte 32 und 33)zum DB. Das Ziel ist es die anderen Variablen vom DB nicht zu schreiben das heist die Werte verändern, sondern nur die eine. Das wäre ein Traum.
> ...



Warum sollen den die 2 Bytes dann überhaupt mit einer rohdatenvariable geschrieben werden? warum legst du für diese nicht noch eine extra variable an? gehts um tags zu sparen, oder um was sonst? Wenn du halt eine rohdatenvar mit 78 bytes hast, dann müssen diese erst gelesen werden und dann später alle zurückgeschrieben werden (zumindest alle werte bis zu byte 33) aber ich finde das keine gute lösung!


----------



## IBFS (6 September 2010)

Thomas_v2.1 schrieb:


> Bei der WinCC-Integration in Step7 die IBFS hier propagiert, werden dir für alle Variablen die es in Step7 gibt einzelne Tags angelegt. Da ist es mit Tags sparen eh vorbei, also dürfte kaum die Lösung für dein Problem darstellen.


 
Ich propagiere ich garnix, denn propagieren kommt von Propaganda 

Bei den Projekten, die ich bisher gemacht habe, wurde immer abgewogen
zwischen sauberen nachvollzierbaren Schnittstellen (also ohne ext. Tools
und Excel) und dem Tag-sparen.

Es ist immer eine Abwägung zwischen MannKosten und TagKosten.
Ich habe schon beides erlebt und finde, wenn man genug Tagreserven 
hat, natürlich die Integration schöner. Aber wie das jeder einzelne 
dann macht ich mir Wurst. Es war ja nur ein Vorschalg für die 
C-Skript-Vermeider.

Frank


----------



## Thomas_v2.1 (6 September 2010)

IBFS schrieb:


> Bei den Projekten, die ich bisher gemacht habe, wurde immer abgewogen
> zwischen sauberen nachvollzierbaren Schnittstellen (also ohne ext. Tools
> und Excel) und dem Tag-sparen.
> 
> ...



Klar, ich bin ja auch Tag-Sparfuchs, aber nur bis zu einer gewissen Grenze.
 Z.B. habe ich eine definierte Befehls-Schnittstelle, also ein Datenwort/byte pro Antrieb. Das Datenwort ist in der SPS als UDT angelegt. Mit der Integration würden soweit ich das noch weiß alle Einzelbits ins WinCC übernommen.
Um Tags zu sparen mache ich es aber an der Stelle im WinCC schonmal so, dass ich die UDT als Word anlege, und dann einzelne Bits setze und dieses Word dann komplett zurückschreibe. Die Abarbeitung der Befehle erfolgt dann in der SPS, wo die Bits nach Bearbeitung zurückgesetzt werden.

Vielleicht kann rene mal schreiben was er für eine Lizenz hat. Scheint ja nur eine 1-Tag Lizenz zu sein...


----------



## IBFS (6 September 2010)

Thomas_v2.1 schrieb:


> Mit der Integration würden soweit ich das noch weiß alle Einzelbits ins WinCC übernommen....


 
Bei PCS7 wird nach PO (Prozessobjekten) abgerechnet.
Da kann man Strukturen verballen "fast" ohne Ende.

In WinCC ist das leider nicht so schön gelöst :-(




> *Beschreibung*
> 
> 
> Die PCS 7 Operator Station Software kann - je nach Anforderung der Anlage - nach Anzahl der Prozessobjekte (PO) gestaffelt bestellt werden:
> ...


 
Frank


----------



## rene-privat65 (6 September 2010)

Hallo an alle die mir helfen wollen
Das Tag sparen sollte nur ein Nebeneffekt sein und nicht der Hauptgrund für meine Versuche.
Es kommt nicht auf die Lizens drauf an. Aber mehr wie 1 tag habe ich immer zur Verfügung.
Ich wollte erreichen eine einfache Projektierung für alle Projekte in WinCC.
Das heist ich habe ein DB natürlich mit UDT dort sind zum Beispiel alle Variablen für ein Motor.
In WinCC wollte ich dann die dazu gehörigen Objekte projektieren.
Wie Ihr wisst sind in ein Projekt beispielsweise 100 Motore.
In Step 7 schreibe ich die Daten immer im selben Fach des DBs und auch die anderen Variablen die dazugehören zum Beispiel variablen zum Steuern an aus usw.
Dann habe ich mir gedacht wenn ich einmal alle Objekte in WinCC projektiert habe für ein Motor dann nur kopieren und um Verdrahten die Rohdaten Variable und schon ist der nächste Motor fertig. Und das ist immer fehlerfrei und spart enorm Zeit.
Aber wie es im Leben so ist nicht alle Träume werden wahr.
Dann mache ich das so wie Thomas mir heute geschrieben hat. Ich verarbeite in WinCC alle Istwerte in den Objekten mit GETTAGRAW  und das funktioniert ja auch prima und die Werte die zur SPS geschrieben werden lege ich dann Tags dafür die einzelnen Tags an. Wie gewohnt.
Ich danke Euch alle die mir geholfen haben und es hat Spaß gemacht mit Euch zu schreiben.
War einfach Klasse.
Nochmals großes Dankeschön
René


----------



## Paule (6 September 2010)

[OT]
Hi René,

kannst du nicht ein kleinere Schriftart nehmen?
[/OT]


----------

