WinCC WinCC UserArchive "scrollen" mit c-skript

Redstup

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Sehr geehrtes Forum,
ich bräuchte mal Hilfe im c-skripten in den User Archiven. Und zwar will ich meine Datensätze im Archiv per Button "klick" Stück für Stück auslesen, diese landen dann in EA-Feldern um dann entweder gelöscht zu werden,verschoben zu werden etc.. Mein Problem ist nicht die Erfassung von den Daten aus den Felder sondern ich komme nicht aus der ersten Zeile und lade diese immer wieder. Hat wer ne Anregung zum "scrollen"?( uaArchiveMoveNext funzt dabei bisher nicht so). uaArchiveMoveFirst hab ich drin um erstmal nur die Lesefkt. zu testen.


Schon mal danke für etwaige Bemühungen und Hilfen MfG Red!

Code:
#include "apdefap.h"
void UAReadFromArchive()
{
UAHCONNECT hConnect = 0;
UAHARCHIVE hArchive = 0;
long NumberOfFields ;
int Index,ID,IntValue,Anzahl,count;
float FloatValue;
char ArchivName[255], StringField[255];
SYSTEMTIME zeit;


//connect to component 
if (uaConnect( &hConnect ) == FALSE )
{
printf("uaConnect error: %d\n", uaGetLastError() );
}
if (hConnect == NULL)
{
printf("Handle UAHCONNECT equals NULL\n" );
return;
}


//connect to archive via archive name
if (uaQueryArchiveByName( hConnect, "Rezept1", &hArchive ) == FALSE )
{
printf("uaQueryArchive Error: %d\n" , uaGetLastError() );
}


// open archive
if ( uaArchiveOpen( hArchive ) == FALSE )
{
printf("uaArchive Open Error\n" );
}

//get numbers of field
NumberOfFields = uaArchiveGetFields( hArchive );
printf("Number of Fields = %u\n", NumberOfFields );


uaArchiveMoveFirst(hArchive);

//read and show data field
for ( Index = 0; Index < NumberOfFields; Index++ )
{
switch ( Index )
{
case 0 :


if (uaArchiveGetFieldValueLong ( hArchive, Index, &ID ) ==TRUE )
{
printf("ID = %i\n", ID );
}
else
{
printf("Error callinguaArchiveGetFieldValueLong ID: %d\n",uaGetLastError() );
break;
}
Index=1;


case 1:
if (uaArchiveGetFieldValueFloat ( hArchive, Index, &FloatValue ) ==TRUE )
{
SetOutputValueDouble("Rezept1","EA-Feld4",FloatValue);
printf("real1 = %f\n", FloatValue );
}
else
{
printf("Error callinguaArchiveGetFieldValueFloat real1: %d\n",uaGetLastError() );
break;
}
Index=2;

case 2 :
if (uaArchiveGetFieldValueFloat (hArchive, Index, &FloatValue ) ==TRUE )
{
printf("real2 = %f\n",FloatValue );
SetOutputValueDouble("Rezept1","EA-Feld5",FloatValue);
}
else
{
printf("Error calling uaArchiveGetFieldValueFloat real2: %d\n",uaGetLastError() );
break;
}
Index=3;

case 3 :
if (uaArchiveGetFieldValueFloat (hArchive, Index, &FloatValue ) ==TRUE )
{
printf("real3 = %f\n",FloatValue );
SetOutputValueDouble("Rezept1","EA-Feld6",FloatValue);
}
else
{
printf("Error calling uaArchiveGetFieldValueFloat real3: %d\n",uaGetLastError() );
break;
}
Index=4;

case 4:
if (uaArchiveGetFieldValueString ( hArchive, Index, StringField,255 ) == TRUE )
{
printf("Rezeptname = %s\n", StringField );
SetOutputValueChar("Rezept1","EA-Feld8",StringField);
}
else
{
printf("Error callinguaArchiveGetFieldValueString rezeptname: %d\n",uaGetLastError() );
break;
}
Index=5;

case 5:
if (uaArchiveGetFieldValueString ( hArchive, Index, StringField,255) ==TRUE )
{
printf("Kommentar=%s\r\n ",StringField );
SetOutputValueChar("Rezept1","EA-Feld10",StringField);
}
else
{
printf("Error calling uaArchiveGetFieldValuString kommentar: %d\n",uaGetLastError() );
break;
}
Index=6;

case 6:
if (uaArchiveGetFieldValueDate ( hArchive, Index,&zeit ) ==TRUE )
{
printf( "%d.%d.%d,%d.%d.%d\r\n ", zeit.wDay, zeit.wMonth, zeit.wYear,zeit.wHour,zeit.wMinute,zeit.wSecond );
SetOutputValueDouble("Rezept1","EA-Feld12",uaArchiveGetFieldValueDate ( hArchive, Index,&zeit ));    
}
else
{
printf("Error calling uaArchiveGetFieldValuString kommentar: %d\n",uaGetLastError() );
break;
}
Index=7;
}
}

uaArchiveMoveNext(hArchive);


//******* Close Archive


if( NULL != hArchive )
{
if (uaArchiveClose ( hArchive ) == FALSE )
{
printf("error on closing archive\n" );
}
}
//****** Release Connection to Archive


if( NULL != hArchive )
{
if (uaReleaseArchive ( hArchive ) == FALSE )
{
printf("error on releasing archive\n" );
}
hArchive = 0;
}
//******* Disconnect to Component User Archives


if( NULL != hConnect )
{
if (uaDisconnect ( hConnect ) == FALSE )
{
printf("error on disconnection\n" );
}
hConnect = 0;
}
}
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich weiss nicht ob es hilft. Aber ich hatte das mal Testweise gemacht und da hat es mit movenext funktioniert.
War allerdings WinCC Prof TIA V15.
Die c-funktionen heißen aber gleich.
Hier ist mein Testcode. Damit konnte ich aus allen Rezepten die Namen auslesen.
https://github.com/JonasRadtke/WinCC...from_recipes.c

Danke, allerdings lande ich mit MoveNext auch nur in der ersten Zeile. Immerhin komm ich mit MoveFirst->MoveNext in die 2.:neutral:.
 
Ich kann jetzt zwar alle Daten in meinem Applikationsfenster auslesen, jedoch schaff ich es nicht diese schritt-für-schritt zu lesen:/. Hier der Erweiterte Code mit einer For-Schleife der solange zählt bis mein merker=maxDatensatz erreicht ist.
Code:
uaArchiveGetCount(hArchive,&merker);
printf("Anzahl:%d\n",merker);




for(i=1;i<merker+1;i++)
{
printf("AnzahlDatensätze=%i\n",merker);
printf("AktuellerDatensatz=%i\n",i);


//read and show data field
for ( Index = 0; Index < NumberOfFields; Index++ )
{
switch ( Index )
{
case 0 :


if (uaArchiveGetFieldValueLong ( hArchive, Index, &ID)==TRUE )
{
printf("ID = %i\n", ID );
SetOutputValueDouble("Rezept1","EA-Feld13",ID);
}
else
{
printf("Error callinguaArchiveGetFieldValueLong ID: %d\n",uaGetLastError() );
break;
}
Index=1;


case 1:
if (uaArchiveGetFieldValueFloat ( hArchive, Index, &FloatValue ) ==TRUE )
{
SetOutputValueDouble("Rezept1","EA-Feld4",FloatValue);
printf("real1 = %f\n", FloatValue );
}
else
{
printf("Error callinguaArchiveGetFieldValueFloat real1: %d\n",uaGetLastError() );
break;
}
Index=2;




case 2 :
if (uaArchiveGetFieldValueFloat (hArchive, Index, &FloatValue ) ==TRUE )
{
printf("real2 = %f\n",FloatValue );
SetOutputValueDouble("Rezept1","EA-Feld5",FloatValue);
}
else
{
printf("Error calling uaArchiveGetFieldValueFloat real2: %d\n",uaGetLastError() );
break;
}
Index=3;




case 3 :
if (uaArchiveGetFieldValueFloat (hArchive, Index, &FloatValue ) ==TRUE )
{
printf("real3 = %f\n",FloatValue );
SetOutputValueDouble("Rezept1","EA-Feld6",FloatValue);
}
else
{
printf("Error calling uaArchiveGetFieldValueFloat real3: %d\n",uaGetLastError() );
break;
}
Index=4;




case 4:
if (uaArchiveGetFieldValueString ( hArchive, Index, StringField,255 ) == TRUE )
{
printf("Rezeptname = %s\n", StringField );
SetOutputValueChar("Rezept1","EA-Feld8",StringField);
}
else
{
printf("Error callinguaArchiveGetFieldValueString rezeptname: %d\n",uaGetLastError() );
break;
}
Index=5;


case 5:
if (uaArchiveGetFieldValueString ( hArchive, Index, StringField,255) ==TRUE )
{
printf("Kommentar=%s\r\n ",StringField );
SetOutputValueChar("Rezept1","EA-Feld10",StringField);
}
else
{
printf("Error calling uaArchiveGetFieldValuString kommentar: %d\n",uaGetLastError() );
break;
}
Index=6;


case 6:
if (uaArchiveGetFieldValueDate( hArchive, Index,&zeit ) ==TRUE )
{
printf( "%d.%d.%d.%d.%d.%d\r\n ", zeit.wDay,zeit.wMonth,zeit.wYear,zeit.wHour,zeit.wMinute,zeit.wSecond);


}
else
{
printf("Error calling uaArchiveGetFieldValuString zeit: %d\n",uaGetLastError() );
break;
}
Index=7;
}
}


uaArchiveMoveNext(hArchive);
}


if(uaArchiveUpdate(hArchive)==FALSE)
printf("error:uaArchiveUpdate:%d\n",uaGetLastError());
 
Hallo,

wollte schon schreiben, das in der ersten Version ein "uaArchiveMoveNext" ganz "alleine steht" ohne ein while-Schleife.

Nun wird hier das "uaArchiveMoveNext" ohne jede Bedingung ausgeführt (innerhalb der for-Schleife). Wie soll da das Archiv Schritt für Schritt ausgelesen werden ??

Es fehlt da eine Bedingung oder Anweisung vor dem "uaArchiveMoveNext", um das Schrittweise durchzuführen. Warum gibt es den Befehl "uaArchiveUpdate", wenn nicht ins Archiv geschrieben wird?

Das mit der Lösung ist etwas gewöhnungsbedürftig - Bei einem Siemensbeispiel wird zunächst über ein "uaArchiveGetFieldType" der Type des Datenfelds ausgelesen und dann
mit z. B. case UA_FIELDTYPE_INTEGER die Typeauswertung gestartet.

Nur mal so meine Anmerkungen.

Viel Erfolg
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Joa habs geschafft:).
Code:
merker=GetOutputValueDouble("Rezept1","EA-Feld13")+1;
for(i=0;i<merker;i++)
{


uaArchiveMoveNext(hArchive);
if(i==uaArchiveGetCount(hArchive,&MaxID))
{i=0;
merker=1;
uaArchiveMoveFirst(hArchive);
}
}
SetOutputValueDouble("Rezept1","EA-Feld13",merker);




//read and show data field


//********************************ID**********************************************
if (uaArchiveGetFieldValueLong ( hArchive, 0, &ID)==TRUE )
{
printf("ID = %i\n", ID );
//SetOutputValueDouble("Rezept1","EA-Feld13",ID);
}
else
{
printf("Error callinguaArchiveGetFieldValueLong ID: %d\n",uaGetLastError() );
}


//********************************REAL1**********************************************
if (uaArchiveGetFieldValueFloat ( hArchive, 1, &FloatValue ) ==TRUE )
{
SetOutputValueDouble("Rezept1","EA-Feld4",FloatValue);
printf("real1 = %f\n", FloatValue );
}
else
{
printf("Error callinguaArchiveGetFieldValueFloat real1: %d\n",uaGetLastError() );
}


//********************************REAL2**********************************************
if (uaArchiveGetFieldValueFloat (hArchive, 2, &FloatValue ) ==TRUE )
{
printf("real2 = %f\n",FloatValue );
SetOutputValueDouble("Rezept1","EA-Feld5",FloatValue);
}
else
{
printf("Error calling uaArchiveGetFieldValueFloat real2: %d\n",uaGetLastError() );
}


//********************************REAL3**********************************************
if (uaArchiveGetFieldValueFloat (hArchive,3, &FloatValue ) ==TRUE )
{
printf("real3 = %f\n",FloatValue );
SetOutputValueDouble("Rezept1","EA-Feld6",FloatValue);
}
else
{
printf("Error calling uaArchiveGetFieldValueFloat real3: %d\n",uaGetLastError() );
}
//********************************REZEPTNAME**********************************************
if (uaArchiveGetFieldValueString ( hArchive,4, StringField,255 ) == TRUE )
{
printf("Rezeptname = %s\n", StringField );
SetOutputValueChar("Rezept1","EA-Feld8",StringField);
}
else
{
printf("Error callinguaArchiveGetFieldValueString rezeptname: %d\n",uaGetLastError() );
}




//********************************KOMMENTAR**********************************************
if (uaArchiveGetFieldValueString ( hArchive, 5, StringField,255) ==TRUE )
{
printf("Kommentar=%s\r\n ",StringField );
SetOutputValueChar("Rezept1","EA-Feld10",StringField);
}
else
{
printf("Error calling uaArchiveGetFieldValuString kommentar: %d\n",uaGetLastError() );
}
//********************************DATUM**********************************************
if (uaArchiveGetFieldValueDate( hArchive,6,&zeit ) ==TRUE )
{
printf( "%d.%d.%d.%d.%d.%d\r\n ", zeit.wDay,zeit.wMonth,zeit.wYear,zeit.wHour,zeit.wMinute,zeit.wSecond);
}
else
{
printf("Error calling uaArchiveGetFieldValuString zeit: %d\n",uaGetLastError() );
}
 
Zurück
Oben