Funtionen des User Archiv Table Elementes

franzlurch

Level-1
Beiträge
339
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Morgen zusammen,

ist es möglich, die Funtionen des User Archiv Table Element zu nutzen ohne ein User Archiv Table Element zu Verwenden??? Ich würde das ganze nämlich gerne mit lauter E/A Felder erstellen, da ich bei der Wertänderung der Variablen gerne den alten Wert, dann den neuen Wert, den eingeloggten User und einen Änderungsgrund in ein Archiv speichern möchte.

Christian
 
Im Anhang ein WinCC Beispielprojekt, wo Werte von UA zur SPS und zurück per Scriptfunktionen geschrieben werden.

Benutzeraktionen kannst du auch mit der WinCC-Option Audit aufzeichnen.
Da musst du dir mal ausrechnen, was billiger ist. Audit zu kaufen oder deine Scripte zu schreiben inkl. testen usw.
 

Anhänge

  • UA_Test_MPP.zip
    580,3 KB · Aufrufe: 39
Zugriff mit einem E/A Feld auf User Archiv

Hi Marlob vielleicht bista noch da,

also ich habe das mit den C Scripten getesttet funktioniert soweit auch. Wie bekoom ich das jetzt hin, dass ich in einem normalen E/A-Feld den einhalt einer Spalte des Userarchives anzeigen und verändern kann.
Das der Wert aus dem User Archiv im E/A-Feld angezeigt wird ist kein Thema, aber ich will den Wert auch im User Archiv wieder Überschreiben, wenn in das E/A-Feld etwas eingegeben wird.

Hier mal das bischen Syntax dass ich dafür verwende.


#include "apdefap.h"
double _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
int UA_ID_DB_an_SPS;
float Feld;
char Filter[255];
UAHCONNECT hConnect;
UAHARCHIVE hArchive;
//************************************************************************************************************************************************
// Datenbank Archiv öffnen
//************************************************************************************************************************************************
UA_ID_DB_an_SPS = GetTagDWord("UA_ID_DB_an_SPS"); //Return-Type: DWORD
uaConnect(&hConnect); //Return-Type: BOOL
uaQueryArchiveByName(hConnect,"Regelparameter",&hArchive); //Return-Type: BOOL
sprintf(Filter,"ID = %d",UA_ID_DB_an_SPS); //Return-Type: long int
uaArchiveSetFilter(hArchive, Filter);
uaArchiveOpen(hArchive);
//************************************************************************************************************************************************
// E/A -Feld lesen/schreiben
//************************************************************************************************************************************************
uaArchiveMoveFirst(hArchive);
uaArchiveGetFieldValueFloat(hArchive,1,&Feld);
// ??? uaArchiveSetFieldValueFloat(hArchive,1,Feld);???
//************************************************************************************************************************************************
//Datenbak Archiv schließen
//************************************************************************************************************************************************
uaArchiveClose(hArchive);
uaReleaseArchive(hArchive);
uaDisconnect(hConnect);

return (Feld);
}





Christian
 
Hi Marlob vielleicht bista noch da,

also ich habe das mit den C Scripten getesttet funktioniert soweit auch. Wie bekoom ich das jetzt hin, dass ich in einem normalen E/A-Feld den einhalt einer Spalte des Userarchives anzeigen und verändern kann.
Das der Wert aus dem User Archiv im E/A-Feld angezeigt wird ist kein Thema, aber ich will den Wert auch im User Archiv wieder Überschreiben, wenn in das E/A-Feld etwas eingegeben wird.

...

Im Beispielprojekt von mir gibt es doch den Button "von SPS --> zum UA"
Die dahinterliegende Funktion macht doch genau das. Im Beispielprojekt werden die Daten aus den Eingabefeldern gelesen und ins UA geschrieben

P.S.
Beispielcode hier im Forum bitte in Codetags verpacken
[CODE ] hier der Code [/CODE ] (ohne Leerzeichen zwichen den Klammern)
 
Bei dem Script von SPS->UA wird dazu ja ein Button betätigt. Was ich versuche ist, daßß ich praktisch ein E/A feld habe, in dem der Wert des UA Feldes angezeit wird. Wenn ich dann in das E/A-Feld reinklick und den Wert ändere, soll der Wert auch im UA geändert werden. Ohne seperaten Button also.
 
Du kannst das Skript auch auf Wertänderung triggern lassen. Dann wird es ausgeführt sobald der Wert, der dahinterliegenden Variable sich ändert
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

speziell an Franzlurch:

Hast du Erfahrung mit den UserArchives??? Lässt sich dazu irgendwie ne Beschreibung finden, hättest du da nen Link für mich???

Wie lässt sich beispielweise eine bestimmte Anzahl an Zeilen (in unserem Fall 102) in der *.csv - Datei im C -Skript überprüfen, welche ich in WinCC importieren möchte???? Leider lässt die Beschreibung von Siemens zu den C-Funktionen für die UserArchives (ua*) zu wünsche übrig!
 
Hier mal das Importskript von marlob, vielen Dank dafür:

Code:
#include "apdefap.h"
void OnLButtonDown(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName, UINT nFlags, int x, int y)
{
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
// WINCC:TAGNAME_SECTION_END

// WINCC:PICNAME_SECTION_START
// syntax: #define PicNameInAction "PictureName"
// next PicID : 1
// WINCC:PICNAME_SECTION_END

UAHCONNECT hConnect = 0;
UAHARCHIVE hArchive = 0;
//------------------------------------------------------------------
// Folgende Ebenen müssen unbedingt eingehalten werden:

// uaConnect             <--> uaDisconnect
// uaQueryArchiveByName  <--> uaReleaseArchive
// uaArchiveOpen         <--> uaArchiveClose


UAExport_VAM5();    //Return-Type: long int 


if ( uaConnect( &hConnect ) )
{
    if ( uaQueryArchiveByName( hConnect, "VAM5", &hArchive ) ) //***!! Adjust the archive name !!*****************
    {
        if ( uaArchiveOpen( hArchive ) )
        {

            //----------------------------------------------------------------------------------------------


            //**************************** Delete all Records  ****************************

            uaArchiveDelete( hArchive, "");
            
            //****************** Import all Records of the CSV-File  *************************
            //************* !! Adjust the Filename of the CSV-File !!***************************

                
            uaArchiveImport(hArchive,"D:\\WinCC_HL2_Recept_Data\\Import_Backups\\HL2_VAM5.csv",0,0);

            
            //-----------------------------------------------------------------------------

            uaArchiveClose( hArchive );
        }
        else
        {
            printf( "Open failed.\r\n",uaGetLastError() );
        }

        uaReleaseArchive( hArchive );
    }
    else
    {
        printf( "Query failed.\r\n",uaGetLastError() );
    }

    uaDisconnect( hConnect );
}
else
{
printf( "Connect failed.\r\n",uaGetLastError() );
}

}
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Oh Sorry Marlob,
Franzlurch war ja der Fragende und du der Antwortende:rolleyes:

Also beim Import die Anzahl der Zeilen überbrüfen ob wirklich 102 Zeilen in der *.csv enthalten sind, welche ich importieren will!

Export klappt ganz gut, importieren jetzt erst in ein Test_Archiv um vorher zu testen ob alles klatt läuft, da man ja vorm Import erst das ganze alte Archiv löschen muss und bei Fehlschlagen dann das ganze UserArchiv im Eimer wäre!!

Schön wäre mal ne richtige Beschreibung zu allen ua-Funktionen welche Siemens in C bietet!
 
Zuletzt bearbeitet:
Hallo zusammen,
ich stecke gerade genau an einem ähnlichen Problem.

Bei mir ist es so, das ich nur Werte aus dem Archiv auslesen möchte.

Mein Problem ist nur, wie kann ich dem Bsp-Programm "UA_Test_MPP." sagen, das er nicht mit Hilfe der ID (1,2,3) Daten raussucht, sondern wenn ich z.b. eine andere E/A-Eingabe haben möchte, die vielleicht in Spalte 5 (Test) steht und er mir dann die dazugehörigen Werte ausgibt.


Danke schonmal

Gruß
André
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo und danke für die schnelle Hilfe.

Habe es leider noch nicht ganz so verstanden, da ich das erste Mal mit dem Archiv arbeite.

bei der Funktion:

"uaArchiveSetFilter(Archiv, Filter)"
Muss ich jetzt bei Filter z.b. ChargeName = (Spalten-Name) eingeben?


Ich finde in dem Projekt auch noch garnicht wo und wie auf die ID gefiltert wird, sonst wäre ich schon ein bisschen weiter.

Vielleicht kannst du mir ja da kurz helfen.

danke
 
Zurück
Oben