Obsidean_VM/01-Documentation/AI - IA - LLM - Artificial .../Prompts/Scripts/Update S7 DB without names/x1 Copiar valores actuales ...

4.9 KiB

S7_DB_Utils

************************************
file _format.db
************************************

TYPE "udt1"
FAMILY : DataType
VERSION : 0.1


  STRUCT 	
   xxx : type := ddd;
   xx1 : type := ddd;
  END_STRUCT ;	
END_TYPE

DATA_BLOCK "NAME"
TITLE =
{ S7_language := '28(1) Albanese  15.06.2005  17:07:04' }
FAMILY : Resource
VERSION : 0.0


  STRUCT 	
   name : STRUCT 	
    name : STRUCT 	
     yyy : type  := value;	
     yy1 : type  := value;	
     udt_name : "udt1";	
     yy3 : type  := value;	
   END_STRUCT ;	
     yyy1 : type  := value;	
  END_STRUCT ;	
BEGIN

    yyy : type  := value;	
    yy1 : type  := value;	
    xxx : type := ddd;
    xx1 : type := ddd;
    yy3 : type  := value;	
    yyy1 : type  := value;	
END_DATA_BLOCK

************************************
file _data.db
************************************

DATA_BLOCK "NAME"
TITLE =
{ S7_language := '28(1) Albanese  15.06.2005  17:07:04' }
FAMILY : Resource
VERSION : 0.0


  STRUCT 	
   name : STRUCT 	
    name : STRUCT 	
     STAT_yyy : type  := data_value_1;	
     STAT_yy1 : type  := data_value_2;	
     STAT_xxx : type := data_ddd_3;
     STAT_xx1 : type := data_ddd_4;
     STAT_yy3 : type  := data_value_5;	
   END_STRUCT ;	
     STAT_yyy1 : type  := data_value_6;	
  END_STRUCT ;	
BEGIN

    STAT_yyy : type  := data_value_7;	
    STAT_yy1 : type  := data_value_8;	
    STAT_xxx : type := data_ddd_9;
    STAT_xx1 : type := data_ddd_10;
    STAT_yy3 : type  := data_value_11;	
    STAT_yyy1 : type  := data_value_12;	
END_DATA_BLOCK

************************************
file _updated.db
************************************

TYPE "udt1"
FAMILY : DataType
VERSION : 0.1


  STRUCT 	
   xxx : type := data_ddd_3;
   xx1 : type := data_ddd_4;
  END_STRUCT ;	
END_TYPE

DATA_BLOCK "NAME"
TITLE =
{ S7_language := '28(1) Albanese  15.06.2005  17:07:04' }
FAMILY : Resource
VERSION : 0.0


  STRUCT 	
   name : STRUCT 	
    name : STRUCT 	
     yyy : type  := data_value_1;	
     yy1 : type  := data_value_2;	
     udt_name : "udt1";	
     yy3 : type  := data_value_5;	
   END_STRUCT ;	
     yyy1 : type  := data_value_6;	
  END_STRUCT ;	
BEGIN

    yyy : type  := data_value_7;	
    yy1 : type  := data_value_8;	
    xxx : type := data_ddd_9;
    xx1 : type := data_ddd_10;
    yy3 : type  := data_value_11;	
    yyy1 : type  := data_value_12;	
END_DATA_BLOCK


Quiero que me ayudes a revisar este script para usar los valores iniciales y actuales del archivo source_file se copien a un nuevo archivo pero con los nombres de las variables tomados de target_file. Esto lo debo realizar porque se han perdido los nombres de las variables y quiero volver a recuperar los nombres pero con los datos actuales provenientes de source_file. Por ejemplo source_file :"STAT3 : REAL  := 2.000000e-01;    ", target_file:  "CO2Offset : REAL  := 4.500000e-01;"  debe copiar lo que esta luego del := "2.000000e-01" hasta el ";" de source_file y lo que esta antes del := y luego del ";" del target_file. El resultado seria: "CO2Offset : REAL  :=2.000000e-01;". Lo que esta luego del ";" pueden ser comentarios que son utiles mantener. Puede ser tambien que no haya asignaciones en source_file , en ese caso tampoco las debe haber en target_file. Este procedimiento se debe seguir para los valores inciales ( primera parte de DATA_BLOCK antes de BEGIN, para las UDT y luego con los valores actuales que es el area entre el BEGIN y END_DATA_BLOCK.

En realidad como estamos asignando por posicion y no por nombre la idea seria usar un indice de posicion. El indice se puede incrementar siempre que una linea termine o centenga ";" ya que puede haber comentarios luego del ";". Teniendo en cuenta este sistema solo debemos saltar a las UDT para los valores iniciales pero a nivel de posicionamiento se debe seguir. Por lo que una variable posicionada en la indice 40 se debe asignar a una posicionada en la indice 40 siempre siguiendo que estos indices trabajen siguiengo los ";" y haciendo los saltos para las UDT.

El archivo output_file debe ser similar a output_file solo con los valores actualizados tomas desde source_file. Lo que propongo seria que se analice el archivo source_file y se cree una lista con el indice consecutivo, tipo de tado y valor a copiar ( valor entre := y ";" ) inicial y actual ( luego del BEGIN ) . Luego se analice cada linea del target_file creando un diccionario con las tuplas ( numero de linea, indice ) . En esta pasada al crear el diccionario se puede controlar los tipos de datos y se asocian numero de linea con el indice correspondiente sobre el source_file. De esta manera en una nueva pasada se va copiando cada linea de target_file y si aparece en el diccionario se copia el correspondiente valor inicial o actual segun el arean donde estamos.

Te adjunto un ejemplo de los archivos que debo procesar y el script de partida que aun no funciona correctamente.