4.9 KiB
4.9 KiB
************************************
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.