File
Los valores que otro programa escribe en un archivo de una carpeta local o de red (el CSV de una máquina de ensayo, el registro de un registrador de datos, un resultado en JSON o XML) leídos como tags, y líneas o archivos completos escritos para otro programa: las tarjetas Carpeta y archivo, Texto del archivo y Escritura, lo que lee un tag en cada formato, la carpeta de entrada, el escaneo que ofrece un tag por columna o campo, tres ejemplos completos y lo que el driver no hace.
El driver File lee los valores que otro programa escribe en un archivo: el CSV al que una máquina de ensayo agrega una fila después de cada muestra, el registro de un registrador de datos, un archivo de resultado en JSON o XML, un archivo de texto que solo contiene un código de lote. Cada tag lee un valor del archivo, y sus valores llegan donde llegan los de cualquier otro tag: a Logic, a los paneles de control, a las corridas de un banco de pruebas de Process. Donde el dispositivo lo permite, el driver también escribe para otro programa: una línea agregada a un archivo, o un archivo completo reemplazado.
Leer es el uso principal, y pide tres respuestas: la carpeta, el archivo y su formato. Cómo se lee el texto del archivo (su codificación, su separador de columnas, su separador decimal) se lee del propio archivo mientras se deja en detectar, el escaneo ofrece un tag por columna o campo, y todo tag nace de solo lectura. Lo que tiene que ver con la escritura solo aparece cuando se activa la escritura en el dispositivo.
Un dispositivo de este driver es una carpeta y el archivo que lee en ella: dos archivos de la misma
carpeta son dos dispositivos. La carpeta es una unidad y una carpeta (C:\TestMachine\Logs) o un
recurso compartido de red y una carpeta dentro de él (\\lab-pc\results), y la estación accede a ella
con los permisos de Windows de la cuenta con la que se ejecuta. Los dispositivos cuelgan del driver
y pueden archivarse en carpetas, Driver → Carpeta → Dispositivo → Tag, como en cualquier
driver sin línea serie ni broker.
La página del driver
La línea bajo el encabezado dice "Cada dispositivo lee un archivo, o los archivos que llegan a una carpeta. Agregue un dispositivo, ingrese su carpeta, su archivo y su formato, y después escanéelo para agregar sus valores como tags." Para Configurar el conector, la página contiene la tarjeta Alcance del escaneo propia del driver, con el archivo que lee el escaneo (vea Descubrimiento). Debajo está la tabla Dispositivos de cualquier driver (vea La tabla de dispositivos), que crece con Agregar dispositivo, a la derecha de su título; vacía, dice "Todavía no hay dispositivos." La barra del driver lleva Descubrir, en gris hasta que la tarjeta Alcance del escaneo está completa. El driver aparece en Archivos y bases de datos, la categoría que va entre Web y API y Pruebas en toda lista de drivers.
Dispositivo
Un dispositivo de este driver no tiene tarjeta Conexión: en su lugar está la tarjeta Carpeta y archivo, seguida de la tarjeta Texto del archivo y, en un dispositivo que lee un archivo, de la tarjeta Escritura. El Intervalo de sondeo (ms) de la tarjeta Dispositivo, 1000 por defecto, dice cada cuánto leen el archivo los tags, y cada tag puede reemplazarlo como en cualquier driver.
Un dispositivo nuevo no tiene carpeta: dice "Carpeta aún sin indicar", su página dice "La estación no lee este dispositivo mientras no tenga una carpeta, así que todavía no se lee nada de él y no hay ningún error que mostrar. Indique la carpeta en la tarjeta Carpeta y archivo de abajo y la estación empieza a leerlo."
y no se lee nada hasta que se indica la carpeta. La URI base que muestra el encabezado es la dirección de
ejecución, con la carpeta y el nombre escritos en forma de URI, y después lo que no está en detectar:
file://single?folder=C%3A%5CTestMachine%5CLogs&name=Log_%7Byyyy-MM-dd%7D.csv&format=delimited, o
file://inbox?... para una carpeta de entrada.
La tarjeta Carpeta y archivo
| Campo | Significado | Por defecto |
|---|---|---|
| Ruta de la carpeta | "Una unidad y una carpeta, o un recurso compartido de red. Se accede a la carpeta con los permisos de Windows de la cuenta con la que se ejecuta la estación." La casilla muestra C:\TestMachine\Logs como sugerencia. |
vacío |
| Nombre del archivo | En un dispositivo que lee un archivo: "Un nombre dentro de la carpeta. Las partes entre llaves son la fecha y la hora de la estación: Log_.csv es un archivo nuevo cada día." Una subcarpeta de la carpeta puede formar parte del nombre (results\last.csv). |
vacío |
| Archivos que leer | La misma casilla en una carpeta de entrada: "Los archivos que leer, directamente en la carpeta: * equivale a cualquier serie de caracteres y ? a uno solo, como Test_*.csv." | vacío |
| Leer de | Un archivo: "El archivo se vuelve a leer cada vez que cambia. Un archivo que crece se lee desde donde terminó la última lectura." Carpeta de entrada: "Cada archivo nuevo se lee una vez, por orden de llegada, y se mueve a la subcarpeta Processed. No se elimina nada." | Un archivo |
| Formato del archivo | CSV y texto en columnas, Texto libre, JSON o XML: cómo encuentra un tag su valor en el archivo (vea Direccionamiento del tag). | CSV y texto en columnas |
Un nombre con una parte de fecha se escribe entre llaves con un formato .NET de fecha y hora, en el
reloj de la propia estación: Log_{yyyy-MM-dd}.csv es Log_2026-10-03.csv hoy y el archivo del día
siguiente pasada la medianoche, y Data_{yyyy-MM}.txt cambia cada mes. Bajo la casilla, la tarjeta muestra
qué archivo es ahora: "Hoy: Log_2026-10-03.csv". Las llaves dobles {{ y }} son llaves del nombre.
Una parte de fecha nunca escribe dos puntos, que ningún nombre de archivo admite: {HH-mm}, no
{HH:mm}.
Cuando el dispositivo está en marcha, la tarjeta dice qué archivo lee:
| La tarjeta dice | Cuándo |
|---|---|
| "Leyendo ahora: Log_2026-10-03.csv" | El archivo en uso, tal como el dispositivo lo lee ahora. |
| "Leyendo ahora: Log_2026-10-03.csv (aún no existe)" | El archivo todavía no existe: sus tags esperan y el dispositivo sigue en línea. |
| "Un tag escribió este nombre. Tras un reinicio, el dispositivo vuelve a leer su archivo configurado." | Un tag que lee el nombre del archivo se escribió y apunta el dispositivo a otro archivo (vea Escritura). |
| "3 archivos en espera en la carpeta de entrada" | Una carpeta de entrada, con los archivos que coinciden con su patrón aún por leer ("1 archivo en espera en la carpeta de entrada" para uno). |
Un ajuste que la tarjeta no puede aceptar se dice bajo las tarjetas, y el dispositivo no se guarda hasta que se corrige:
| Usted escribe | La tarjeta dice |
|---|---|
Una carpeta que no es una ruta completa, como Logs |
"La carpeta es una ruta completa: una unidad y una carpeta (C:\Test), o un recurso compartido de red y una carpeta dentro de él (\server\tests)." |
Una carpeta con un carácter que ningún nombre de carpeta admite, o un recurso compartido sin carpeta dentro (\\server) |
"La carpeta contiene un carácter que ningún nombre de carpeta admite, o es un recurso compartido de red sin una carpeta dentro." |
| Ningún nombre de archivo | No se rechaza: el dispositivo se guarda y espera, "Nombre del archivo aún sin indicar" ("Archivos que leer aún sin indicar" en una carpeta de entrada), hasta que se indica un nombre. |
Una ruta completa como nombre, como C:\Logs\last.csv |
"El nombre del archivo es un nombre dentro de la carpeta, no una ruta completa: la carpeta va en la casilla Ruta de la carpeta." |
Un nombre con .., como ..\other\last.csv |
"El nombre del archivo sale de la carpeta con "..". El driver nunca sale de su carpeta." |
Un nombre con : u otro carácter que ningún nombre de archivo admite, o una parte que termina en un punto o un espacio |
"El nombre del archivo contiene un carácter que ningún nombre de archivo admite (como : o |), o una parte termina en un punto o un espacio. Una parte de fecha no debe escribir dos puntos: use , no ." |
Un nombre que Windows reserva para un dispositivo, como CON o COM1 |
"Windows reserva este nombre para un dispositivo (CON, NUL, COM1 y similares). Elija otro." |
* o ? en un dispositivo que lee un archivo |
"Solo el patrón de una carpeta de entrada admite * o ?. Indique el nombre de un solo archivo, o lea de una carpeta de entrada." |
| Una subcarpeta en el patrón de una carpeta de entrada | "Una carpeta de entrada es la propia carpeta: ponga la subcarpeta en la casilla Ruta de la carpeta y deje aquí solo el patrón." |
| Una parte de fecha sin cerrar, o que no es un formato de fecha | "Una parte de fecha del nombre no está cerrada o no es un formato de fecha. Escríbala entre llaves, como Log_.csv." |
El guardado cumple las mismas reglas, y el registro de acciones lo dice cuando rechaza una: "El dispositivo 'Tensile tester' tiene un ajuste de archivo que su driver no puede usar. Ábralo y corrija el campo que marca su panel."
La tarjeta Texto del archivo
Cómo se leen los caracteres, las columnas y los números del archivo. Todo ajuste empieza en Detectar en el archivo, y el driver lo lee del archivo en uso. Bajo un ajuste dejado así, una vez que el dispositivo ha leído el archivo, una línea dice lo que encontró, como "Encontrado en el archivo: UTF-8". Cualquier ajuste se puede fijar eligiéndolo, para un archivo cuyas primeras líneas no lo dicen.
| Campo | Se muestra | Opciones | Por defecto |
|---|---|---|---|
| Codificación | siempre | Detectar en el archivo, UTF-8, Windows-1252 (ANSI) (la codificación de los programas antiguos de Windows) |
Detectar en el archivo |
| Separador de columnas | CSV | Detectar en el archivo, Punto y coma (;), Coma (,), Tabulador | Detectar en el archivo |
| Separador decimal | siempre | Detectar en el archivo, Punto decimal (12.5), Coma decimal (12,5) | Detectar en el archivo |
| Fila de encabezado | CSV | De 0 a 1000: "La línea que contiene los nombres de las columnas, contada desde 1. 0 si el archivo no tiene." Las líneas anteriores se saltan. | 1 |
| Ajuste | Lo que lee la detección |
|---|---|
| Codificación | Una marca de orden de bytes al principio del archivo, que se impone a cualquier elección; si no, UTF-8 cuando los bytes son UTF-8 válido; si no, Windows-1252. |
| Separador de columnas | El primero entre tabulador, punto y coma y coma que divide las primeras líneas en el mismo número de columnas; una primera línea sin ninguno de ellos es un archivo de una sola columna. |
| Separador decimal | La coma cuando más números del archivo llevan una coma que un punto entre sus dígitos; si no, el punto. Los números JSON siempre llevan el punto; el ajuste vale para los números escritos como texto. |
La tarjeta Escritura
Un dispositivo que lee un archivo lleva la tarjeta Escritura; una carpeta de entrada solo se lee y no la tiene.
| Campo | Se muestra | Significado | Por defecto |
|---|---|---|---|
| Permitir la escritura | siempre | Desactivado: "El dispositivo solo lee. Active la escritura para agregar líneas, reemplazar el archivo o cambiar a otro archivo mientras la estación se ejecuta." Activado: "Los tags de este dispositivo pueden escribir en el archivo. Cada tag sigue solo leyendo hasta que su acceso diga otra cosa." | desactivado |
| Texto de encabezado | escritura activada, CSV o texto libre | "Se escribe primero en un archivo que crea una escritura, como Time;Pressure." Una línea, sin salto de línea. | vacío |
| Fin de línea | escritura activada | Detectar en el archivo (el del propio archivo, CR LF en un archivo nuevo), CR LF, como en Windows o LF. | Detectar en el archivo |
La escritura solo se desactiva cuando ningún tag del dispositivo escribe. Mientras algún tag escribe, el interruptor sigue dibujado y en gris, y dice por qué: "2 tags de este dispositivo escriben en el archivo. Póngalos en solo lectura antes de desactivar la escritura." ("Un tag de este dispositivo escribe en el archivo. Póngalo en solo lectura antes de desactivar la escritura." para uno).
En línea, en espera y fuera de línea
| Situación | Lo que hacen el dispositivo y sus tags |
|---|---|
| Ninguna carpeta indicada | El dispositivo espera: "Carpeta aún sin indicar", punto gris, nada leído y ningún error. |
| Carpeta indicada, sin nombre de archivo | El dispositivo espera: "Nombre del archivo aún sin indicar", punto gris, nada leído y ningún error; su página dice "La estación no lee este dispositivo mientras no tenga un nombre de archivo, así que todavía no se lee nada de él y no hay ningún error que mostrar. Indique el nombre del archivo en la tarjeta Carpeta y archivo de abajo y la estación empieza a leerlo." |
| Carpeta de entrada, carpeta indicada, sin archivos que leer | El dispositivo espera: "Archivos que leer aún sin indicar", punto gris, nada leído y ningún error; su página dice "La estación no lee este dispositivo mientras no sepa qué archivos leer, así que todavía no se lee nada de él y no hay ningún error que mostrar. Indique los archivos en Archivos que leer, en la tarjeta Carpeta y archivo de abajo (como Test_*.csv), y la estación empieza a leerlos." |
| No se puede acceder a la carpeta (un recurso compartido caído, una unidad que desapareció, una cuenta sin acceso) | El dispositivo está fuera de línea y sus tags fallan la lectura; la carpeta se vuelve a mirar como mucho cada segundo, y el dispositivo se conecta en cuanto vuelve. |
| Se accede a la carpeta, el archivo aún no existe | El dispositivo sigue en línea. Los tags que leen valores no tienen lectura y esperan; El archivo existe lee falso. |
| Otro programa tiene el archivo sin compartirlo | Ninguna lectura esta vez; la lectura siguiente vuelve a intentarlo. El tag conserva su última lectura, y una más antigua que su intervalo de sondeo más 10 s cuenta como lectura fallida, como en cualquier driver. |
| Un valor no está, o no cabe en el tipo del tag | Lectura fallida de ese tag, con el motivo; el dispositivo sigue leyendo sus otros tags. |
Direccionamiento del tag
Lo que lee un tag
Un tag de este driver no tiene casilla de dirección propia: su tarjeta Fuente pregunta qué lee y, para un valor, dónde está el valor en el formato del dispositivo.
| Lee | Lo que muestra el tag | Tipo de dato |
|---|---|---|
| Valor | Un valor dentro del archivo, encontrado por los campos del formato del dispositivo de más abajo. | Boolean, Int32, Int64, Float, Double o String; Double en un tag nuevo |
| Archivo completo | Todo el contenido, sin los fines de línea del final: un archivo que solo contiene un código de lote o un estado. Como mucho 4 MiB. | los mismos; String en un tag nuevo |
| El archivo existe | Si el archivo en uso existe ahora. | Boolean |
| Tamaño del archivo | El tamaño del archivo en bytes. | Int64 |
| Último cambio | Cuándo se escribió el archivo por última vez: verlo cambiar es como Logic sabe que llegaron datos nuevos. | DateTime |
| Nombre del archivo | El nombre del archivo en uso, dentro de la carpeta. Escrito, nombra otro archivo (vea Escritura). | String |
| Conteo de líneas | "Cuenta todas las líneas del archivo, incluidas la fila de encabezado y las líneas vacías." | Int64 |
Un tipo en el que la fuente no se lee se rechaza con los tipos en que sí se lee: "Elija uno de los tipos de dato con los que se lee esto: Int64."
Elegir otra fuente trae su propio tipo. El texto tomado de un archivo se lee en el tipo del tag como el
driver Generic serial and TCP lee un mensaje, con el
separador decimal del archivo: un Boolean lee 1, true, on o yes y 0, false, off o no,
un entero lee un número entero, y un String toma los caracteres tal como están, así que un código como
0412 solo conserva su cero inicial como String.
Todo tag nace de Solo lectura, y en un dispositivo que no permite la escritura el campo Acceso no ofrece otra cosa. Cuando el dispositivo permite la escritura, un tag que lee Valor o Archivo completo puede ser de Lectura y escritura o de Solo escritura, y un tag que lee Nombre del archivo de Lectura y escritura; los datos del archivo (existencia, tamaño, último cambio, conteo de líneas) nunca se escriben: "Un dato del archivo no se puede escribir. Deje el tag en solo lectura."
CSV y texto en columnas
| Campo | Se muestra | Significado | Por defecto |
|---|---|---|---|
| Columna | Lee Valor | "El nombre de la columna en la fila de encabezado, o su número contado desde 1." Un texto solo de dígitos es un número; un nombre no distingue mayúsculas ni los espacios que lo rodean. En un archivo sin fila de encabezado: "El número de la columna, contado desde 1. El archivo no tiene fila de encabezado, así que sus columnas no tienen nombre." | vacío |
| Fila que leer | Lee Valor | Última, Por número o Por su contenido. "Las filas se cuentan después de la fila de encabezado. Por su contenido lee la última fila cuya columna clave contiene el valor clave." | Última |
| Número de fila | Por número | La fila de datos, contada desde 1 después del encabezado. | vacío |
| Columna clave | Por su contenido | La columna cuyo valor elige la fila, por nombre o por número. | vacío |
| Valor clave | Por su contenido | El valor que contiene la columna clave en la fila que se lee, como 0412. |
vacío |
Un campo entre comillas dobles puede contener el separador; un campo que contiene un salto de línea no se lee. Un tag cuyos campos no pueden funcionar no se guarda, y su página dice lo que le falta:
| Usted deja vacío o escribe | La página del tag dice |
|---|---|
| Ninguna columna | "Ingrese la columna, por su nombre en la fila de encabezado o por su número." |
| La columna 0 | "Las columnas se cuentan desde 1." |
| Una columna por nombre en un archivo sin fila de encabezado | "El archivo no tiene fila de encabezado, así que una columna se indica por su número." |
| Por número, sin número de fila | "Ingrese el número, contado desde 1." |
| Por su contenido, sin columna clave | "Ingrese la columna clave: la columna cuyo valor elige la fila." |
| Por su contenido, sin valor clave | "Ingrese lo que contiene la fila o la línea." |
La línea de solo lectura Dirección de origen (bus) muestra lo que recibe el driver:
column?name=Force para el Force de la última fila, column?number=3&row=number&rowNumber=5 para la
tercera columna de la quinta fila, column?name=Force&row=match&key=Sample&equals=0412 para la fila de
la muestra 0412.
Texto libre
| Campo | Se muestra | Significado | Por defecto |
|---|---|---|---|
| Línea que leer | Lee Valor | Última (la última línea que no está en blanco), Por número o Por su contenido. "Las líneas se cuentan desde el principio del archivo. Por su contenido lee la última línea que contiene el texto." | Última |
| Número de línea | Por número | La línea, contada desde 1 al principio del archivo. | vacío |
| La línea contiene | Por su contenido | Un texto que contiene la línea que se lee, como Result. |
vacío |
| El valor es | Lee Valor | "Las mismas opciones que el driver Generic serial and TCP: la línea completa, una posición fija, un campo entre separadores o una expresión regular." Sus opciones son las de ese driver, con la primera nombrada por la línea: La línea completa, Posición fija (Primer carácter y Longitud), Campo entre separadores (Separador y Número de campo) y Grupo de captura de un patrón (Patrón). | La línea completa |
Las posiciones y los campos se cuentan desde 1, un patrón es una expresión regular de .NET con
exactamente un grupo de captura alrededor del valor, y una línea que tarda más de 250 ms en leerse no se
lee. Los rechazos son los del propio driver genérico, como "Indique el primer carácter del valor, contando desde 1." o "El patrón necesita exactamente un grupo de captura, alrededor del valor."
La dirección de bus se escribe line seguido de lo que corresponda, por ejemplo
line?row=match&contains=Result&extract=regex&pattern=....
JSON y XML
| Campo | Formato | Significado |
|---|---|---|
| Ruta JSON | JSON | "Miembros separados por puntos y posiciones entre corchetes desde 0, como result.force o items[0].value." Un miembro cuyo nombre contiene un punto se escribe ['flow.rate']. |
| Ruta XML | XML | "Elementos desde la raíz separados por barras, una posición desde 1 donde un elemento se repite, y un atributo al final, como Result/Force o Result/@unit." Los nombres se comparan por su nombre local, sin el prefijo de espacio de nombres. |
Un número JSON, true o false se toma tal cual, y una cadena se lee en el tipo del tag; un objeto o
una lista solo se leen como String, su JSON. Un documento JSON o XML se lee completo cuando cambió, como
mucho 4 MiB, y no se lee ninguna DTD. La dirección de bus es json?path=result.force o
xml?path=Result%2FForce.
| Usted deja vacío o escribe | La página del tag dice |
|---|---|
| Ninguna ruta | "Ingrese la ruta al valor. Para leer el archivo completo, elija Archivo completo." |
| Una ruta JSON que no se puede leer | "Esto no es una ruta JSON: miembros separados por puntos y posiciones entre corchetes, como result.items[0].value." |
| Una ruta XML que no se puede leer | "Esto no es una ruta XML: elementos separados por barras, una posición como Item[2] y un atributo al final, como @unit." |
Lectura
En cada lectura el driver pregunta a Windows el tamaño y las horas del archivo, lo que funciona en un recurso compartido de red, donde los avisos de cambio de Windows no funcionan, y solo abre el archivo cuando alguno de ellos cambió. Siempre lo abre compartiendo la lectura, la escritura y la eliminación, así que el programa que escribe el archivo nunca queda bloqueado.
| El archivo | Lo que hace la lectura |
|---|---|
| Creció, y sigue empezando y terminando donde lo hacía | Solo se lee lo agregado, nunca otra vez el archivo completo: un registro de muchos megabytes cuesta lo que cuestan sus líneas nuevas. |
| Se hizo más corto, se escribió de nuevo o se creó de nuevo | Se vuelve a leer desde el principio. |
| Termina con una línea que ningún fin de línea cierra todavía | Esa línea espera, para que nunca se lea un valor a medio escribir; cuando el archivo lleva 2 s sin cambiar, se lee como la última línea. |
| JSON, XML, o un tag que lee el archivo completo | Se lee completo cuando cambió, como mucho 4 MiB; un documento que no se puede leer y cambió hace menos de 2 s se toma como aún en escritura, y los tags esperan. |
| Tiene una línea de más de 1 MiB | No es texto en líneas: sus tags fallan la lectura. |
Toda lectura lleva la fecha del último cambio del archivo, no la del momento en que se hizo, así que el registro de la corrida coloca una muestra cuando el otro programa la escribió.
La carpeta de entrada
Leer de Carpeta de entrada es para la máquina que escribe un archivo por muestra
(Test_0412.json, Test_0413.json...): cada archivo nuevo que coincide con el patrón se lee una vez,
por orden de llegada.
| Paso | Lo que ocurre |
|---|---|
| Llega un archivo | Se toma cuando lleva 1 s con el mismo tamaño y la misma hora y ningún programa lo tiene abierto para escribirlo. |
| Cuál primero | El creado primero, luego el escrito primero, luego por nombre. Dos archivos que llegan juntos se leen en dos pasadas: ninguno se salta. |
| Su lectura | Todos los tags del dispositivo leen ese archivo, y el archivo es una lectura, con la fecha del archivo: el registro de la corrida graba cada una. Nombre del archivo dice de qué archivo vinieron los valores. |
| Cuando todos los tags lo han leído | Se mueve a la subcarpeta Processed, que el driver crea y cuyo nombre es el mismo en todos los idiomas, porque otros programas pueden buscarla; un nombre ya ocupado allí pasa a name (2).json. Sus valores siguen siendo la lectura de los tags hasta el archivo siguiente. |
| Un movimiento que falla | Se reintenta en cada lectura; el archivo no se vuelve a leer mientras tanto. |
| La estación se reinicia antes del movimiento | El archivo se vuelve a leer: una lectura contada dos veces en lugar de una perdida. |
Nunca se elimina nada: la subcarpeta Processed crece hasta que alguien la vacía. En una carpeta de
entrada nunca se escribe.
Escritura
En un dispositivo que lee un archivo y permite la escritura, un tag que lee Valor o Archivo completo y cuyo acceso escribe dice lo que hace una escritura:
| Campo | Se muestra | Significado | Por defecto |
|---|---|---|---|
| Una escritura | el tag escribe | Agregar una línea: "Agrega una línea al final del archivo. Cada escritura cuenta: ninguna se descarta por otra más reciente." Reemplazar el archivo: "Reemplaza el archivo completo por el valor, a través de un archivo temporal, para que ningún programa lo lea a medio escribir." | Agregar una línea |
| Plantilla de línea | Agregar una línea | "Vacía: el valor escrito es la línea completa. es el valor y el momento de la escritura, cada uno con un formato tras dos puntos si hace falta, como ." La casilla muestra {datetime};{value} como sugerencia. |
vacío |
| La plantilla | Escribir 12.5 agrega |
|---|---|
| vacía | 12.5 |
{datetime};{value} |
2026-10-03 14:05:12;12.5 |
{datetime:dd/MM/yyyy HH:mm};{value:0.00} |
03/10/2026 14:05;12.50 |
{value:FORMAT} admite un formato numérico de .NET, {datetime:FORMAT} un formato .NET de fecha y
hora, en el reloj de la estación, yyyy-MM-dd HH:mm:ss cuando no se da ninguno. Un número se escribe con
el separador decimal del archivo, así que la misma plantilla escribe 12,50 en un archivo que usa la
coma. La plantilla de un tag Boolean puede omitir {value}: al escribirlo como verdadero, agrega la
línea, como una orden. Una plantilla que el driver no puede rellenar se rechaza en la página del
tag:
| Usted escribe | La página del tag dice |
|---|---|
Una parte que no es {value} ni {datetime}, o una llave sin cerrar |
"La plantilla admite y , cada uno con un formato tras dos puntos si hace falta. {{ y }} son llaves de la línea." |
Ningún {value} en un tag que no es Boolean |
"La plantilla no tiene , así que el valor escrito nunca llegaría al archivo. Solo un tag booleano puede omitirlo: al escribirlo como verdadero, agrega la línea." |
| Un salto de línea | "La plantilla es una sola línea, sin salto de línea." |
| Un tag que escribe, en un dispositivo que no permite la escritura | "El dispositivo no permite la escritura. Active la escritura en el dispositivo o deje el tag en solo lectura." |
| Una escritura | Cómo se hace |
|---|---|
| Agregar una línea | La línea va en una sola escritura y se vuelca al disco antes de que la escritura cuente como hecha. Un archivo que crea la escritura recibe primero el Texto de encabezado, y un archivo cuya última línea no tiene fin de línea recibe uno antes, para que la línea quede completa. Un valor que contiene un salto de línea se rechaza. Cada escritura cuenta: una escritura que aún espera en la cola del dispositivo nunca se descarta por otra más reciente al mismo tag, como nunca se descarta una orden. |
| Reemplazar el archivo | El valor va a un archivo temporal junto al archivo, volcado al disco, que ocupa el lugar del archivo en un solo paso. Un valor más reciente que aún espera reemplaza a uno más antiguo, como para cualquier consigna. |
| El nombre del archivo | Un tag que lee Nombre del archivo, de Lectura y escritura, escrito con otro nombre, apunta el dispositivo a ese archivo de la misma carpeta a partir de entonces: "Escribir aquí un nombre hace que el dispositivo lea y escriba a partir de entonces ese archivo de la misma carpeta. Un nombre fuera de la carpeta se rechaza." Una ruta completa, .., : o un nombre que Windows reserva se rechaza. Cuando el dispositivo se vuelve a conectar, reinicio incluido, vuelve a leer su archivo configurado. |
| Texto | En la codificación, el fin de línea y el separador decimal del propio archivo, leídos de él donde el dispositivo los deja en detectar. Un archivo nuevo es UTF-8 sin marca de orden de bytes, con CR LF y el punto decimal, salvo que el dispositivo diga otra cosa. |
| Respuesta | Hecha, o rechazada con la causa: el dispositivo no permite la escritura, la cuenta no tiene permiso, el archivo está marcado como de solo lectura (quitar ese atributo deja pasar la próxima escritura), el disco está lleno, o el archivo está abierto en otro programa. Un reemplazo se rechaza mientras cualquier programa tenga el archivo abierto, y una línea agregada solo mientras un programa lo tenga sin compartirlo; en cuanto ese programa cierra el archivo, la próxima escritura pasa. |
La carpeta y las subcarpetas a las que apunta un nombre se crean cuando una escritura las necesita, siempre dentro de la carpeta del dispositivo.
Descubrimiento
La tarjeta Alcance del escaneo
Para Configurar el conector, la página del driver lleva su tarjeta Alcance del escaneo, bajo la línea "Lee un archivo y ofrece un tag por cada columna o campo que encuentra, y por los datos del archivo. Elija un dispositivo para leer su archivo, o escriba una carpeta, un archivo y un formato."
| Campo | Significado | Por defecto |
|---|---|---|
| Archivo que escanear | Un archivo escrito aquí, o un dispositivo del driver por su nombre. El archivo de un dispositivo se lee con los ajustes del dispositivo tal como están guardados, y una edición del dispositivo que aún espera para guardarse se guarda antes. | Un archivo escrito aquí |
| Ruta de la carpeta | Un archivo escrito: la carpeta, como en un dispositivo. | vacío |
| Nombre del archivo o Archivos que leer | Un archivo escrito: el nombre, o el patrón de una carpeta de entrada. | vacío |
| Leer de | Un archivo escrito: Un archivo o Carpeta de entrada. | Un archivo |
| Formato del archivo | Un archivo escrito: el formato. Todo ajuste de texto de un archivo escrito se detecta, la fila de encabezado incluida: la primera línea es un encabezado cuando ninguno de sus campos es un número y la línea siguiente tiene uno. | CSV y texto en columnas |
Lo que aún le falta al alcance se dice en rojo bajo la tarjeta, y Descubrir sigue en gris hasta que está completo:
| El alcance | La tarjeta dice |
|---|---|
| Un archivo escrito sin carpeta | "Escriba la carpeta en la que está el archivo." |
| Una carpeta escrita que no es una ruta completa | "'Logs' no es una carpeta que esta estación pueda leer. Escriba una ruta completa, por ejemplo C:\Test o \server\tests." |
| Un nombre escrito que no es un archivo de la carpeta | "'..\last.csv' no es el nombre de un archivo dentro de la carpeta." |
| Un dispositivo que ya no existe | "El dispositivo elegido para escanear ya no existe. Elija otro archivo que escanear." |
| Un dispositivo sin su carpeta o sin su archivo | "El dispositivo 'Tensile tester' aún no tiene carpeta o archivo, o tiene un ajuste que su driver no puede usar. Complete primero su tarjeta Carpeta y archivo." |
Cuando el dispositivo que se va a escanear tiene una edición que no se puede guardar, el escaneo no empieza: "El descubrimiento no se inició porque no se pudo guardar la edición del dispositivo que se va a escanear."
Lo que ofrece el escaneo
El escaneo lee el archivo que un dispositivo de un archivo lee ahora, o el archivo más reciente de una carpeta de entrada, que no mueve; un archivo que no está, una carpeta a la que no se puede acceder y un documento que no se puede leer terminan el escaneo con el motivo. Ofrece un candidato, con los valores encontrados como tags candidatos, todos de Solo lectura:
| Formato | Tags candidatos |
|---|---|
| CSV | Uno por columna, que lee la última fila, con el nombre de su encabezado (por su número dondel encabezado no le da nombre o se lo da dos veces), con el tipo que dan los valores de sus primeras filas: Double cuando todos los valores son números, Boolean cuando todos son true o false, String en otro caso. Un código con un cero inicial, como 0412, sigue siendo String. |
| Texto libre | La última línea, un String. |
| JSON, XML | Uno por valor, con nombre y dirección dados por su ruta, como mucho 500; una lista JSON ofrece sus 20 primeros elementos, y el recorrido baja 8 niveles. |
| Todo formato | Los datos del archivo: El archivo existe, Tamaño del archivo, Último cambio, Nombre del archivo y Conteo de líneas. |
Un escaneo ofrece como máximo 500 valores, incluidas las columnas de un archivo CSV. Un escaneo cortado ahí lo dice en la línea que lo cierra y sobre sus resultados: "El escaneo de result.json se detuvo antes de tiempo. Un escaneo ofrece como máximo 500 valores: agregue los demás como tags por su columna, su ruta JSON o su ruta XML."
El candidato de un archivo escrito lleva el nombre del archivo (run para run.csv), o el de la carpeta
para un nombre con una parte de fecha o una carpeta de entrada. Un candidato cuya carpeta, nombre y
Leer de ya lee un dispositivo del driver (el dispositivo escaneado, u otro igual) aparece como
Ya configurado: su tarjeta solo lista los valores que ningún tag de ese dispositivo lee todavía,
marcados, y Agregar tags, antes de Abrir, agrega los marcados a ese dispositivo, de solo lectura.
El resto del comportamiento de el escaneo está en Descubrimiento.
La propia página de un dispositivo hace lo mismo sin la página de su driver: Descubrir tags, en el encabezado de su tarjeta de tags, lee el archivo de ese dispositivo tal como está guardado y ofrece solo los valores para los que todavía no tiene tag (vea Descubrir los tags de un dispositivo).
Ejemplo: el CSV diario de una máquina de ensayo
Una máquina de tracción escribe un CSV al día en C:\TestMachine\Logs, llamado Log_2026-10-03.csv,
con una fila de encabezado Sample;Force;Elongation y una fila como 0412;12,5;3,1 después de cada
muestra. Léalo por el camino sencillo:
- En la página del driver, Agregar dispositivo; llámelo
Tensile tester. - En la tarjeta Carpeta y archivo escriba Ruta de la carpeta
C:\TestMachine\Logsy Nombre del archivoLog_{yyyy-MM-dd}.csv; mantenga Un archivo y CSV y texto en columnas. La tarjeta muestra "Hoy: Log_2026-10-03.csv", y cuando el dispositivo lo lee, "Leyendo ahora: Log_2026-10-03.csv". Deje la tarjeta Texto del archivo en Detectar en el archivo: encuentra el punto y coma y la coma decimal. - En la página del driver, elija
Tensile testeren Archivo que escanear y Descubrir. El candidato aparece como Ya configurado y listaSample(String, que conserva el cero de0412),ForceyElongation(Double), y los datos del archivo. Agregar tags.
Cada tag lee la última fila; Último cambio se mueve con cada muestra nueva, y así sabe una acción de Logic que llegó una. A medianoche el dispositivo pasa al archivo del día siguiente, y hasta que la máquina lo escribe, los valores no tienen lectura y El archivo existe lee falso. Un agente hace lo mismo con las herramientas:
device_upsert name="Tensile tester" driver=File fileFolder="C:\TestMachine\Logs" fileName="Log_{yyyy-MM-dd}.csv" fileFormat=Delimited
device_discover driver=File fileDevice="Tensile tester"
tag_upsert device="Tensile tester" name=Force address=Force opcUaType=Double
tag_upsert device="Tensile tester" name=Sample address=Sample opcUaType=String
tag_upsert device="Tensile tester" name="Last change" fileSource=Modified
Ejemplo: una carpeta de entrada de archivos de resultado JSON
Una celda de ensayo deja un archivo de resultado por muestra en C:\Results\Inbox, como
Test_0413.json con {"sample":"0413","result":{"force":12.5,"ok":true}}:
- Agregar dispositivo; llámelo
Results, Ruta de la carpetaC:\Results\Inbox, Leer de Carpeta de entrada, Archivos que leerTest_*.json, Formato del archivo JSON. - Agregar tag
Force, Ruta JSONresult.force, Double; Agregar tagPass, Ruta JSONresult.ok, Boolean; Agregar tagSample, Ruta JSONsample, String. - Agregar tag
Source file, Lee Nombre del archivo: muestra de qué archivo vinieron los valores.
Cada archivo se lee una vez, después de quedarse quieto 1 s y sin que ningún programa lo tenga abierto
para escribirlo, en el orden en que llegaron los archivos; cada uno es una lectura propia, con la fecha
del archivo; cuando todos los tags lo han leído, pasa a C:\Results\Inbox\Processed. No se elimina
nada. Con las herramientas:
device_upsert name=Results driver=File fileFolder="C:\Results\Inbox" fileName="Test_*.json" fileMode=Inbox fileFormat=Json
tag_upsert device=Results name=Force address=result.force opcUaType=Double
tag_upsert device=Results name=Pass address=result.ok opcUaType=Boolean
tag_upsert device=Results name=Sample address=sample opcUaType=String
tag_upsert device=Results name="Source file" fileSource=Name
Ejemplo: agregar una línea para otro programa
Otro programa lee D:\Records\run.csv, una línea por segundo con la hora y la presión:
- Agregar dispositivo; llámelo
Run log, Ruta de la carpetaD:\Records, Nombre del archivorun.csv. - En la tarjeta Escritura active Permitir la escritura y escriba Texto de encabezado
Time;Pressure. - Agregar tag
Line, Double, Acceso Solo escritura, Una escritura Agregar una línea, Plantilla de línea{datetime};{value:0.00}.
Escribir 12.5 en Line agrega 2026-10-03 14:05:12;12.50, con la coma donde el archivo ya usa una o
donde Separador decimal dice Coma decimal (12,5); un archivo que crea la escritura recibe
primero Time;Pressure. Las escrituras que se suceden rápido se conservan todas, en orden. Para escribir
un archivo por corrida, agregue un tag File, Lee Nombre del archivo, de Lectura y escritura:
Logic escribe el número de serie con .csv cuando empieza una corrida, y las líneas van a ese archivo.
Con las herramientas:
device_upsert name="Run log" driver=File fileFolder="D:\Records" fileName=run.csv fileFormat=Delimited fileWrites=true fileHeaderText="Time;Pressure"
tag_upsert device="Run log" name=Line opcUaType=Double accessType=WriteOnly fileWriteMode=AppendLine fileLineTemplate="{datetime};{value:0.00}"
tag_upsert device="Run log" name=File fileSource=Name accessType=ReadAndWrite
Herramientas del agente
driver_capabilities describe este driver en file: el camino sencillo, cada campo del
dispositivo, la regla de la carpeta y el confinamiento a ella, las formas del nombre del archivo, las dos
maneras de leer, los formatos con la gramática de dirección de cada uno, las fuentes y sus tipos, los
ajustes de texto, cómo se comportan las lecturas y las escrituras, el descubrimiento y tres ejemplos
completos. device_upsert driver=File admite fileFolder, fileName, fileMode (SingleFile, el
predeterminado, o Inbox), fileFormat (Delimited, el predeterminado, Text, Json o Xml),
fileEncoding (Automatic, Utf8 o Windows1252), fileSeparator (Automatic, Semicolon,
Comma o Tab), fileDecimal (Automatic, Point o Comma), fileHeaderRow (de 0 a 1000),
fileWrites y, con la escritura activada, fileHeaderText y fileLineEnd (Automatic, CrLf o
Lf); un dispositivo que devuelve lleva file, con fileStatus, lo que encontró el driver en
marcha: el archivo en uso, si existe, la codificación, los separadores y el fin de línea que leyó, y los
archivos en espera en una carpeta de entrada. tag_upsert admite fileSource (Value, WholeFile,
Exists, Size, Modified, Name o Lines), fileRow (Last, Number o Matching),
fileRowNumber, fileKeyColumn, fileMatchText, fileWriteMode (AppendLine o ReplaceFile) y
fileLineTemplate; la columna o la ruta es el address, un valor de texto libre usa los
valueExtraction, valueStart, valueLength, valueSeparator, valueField y valuePattern del
driver genérico, y un tag nuevo es de solo lectura y toma el tipo propio de la fuente, salvo que
opcUaType diga otra cosa. device_discover driver=File lee o bien fileDevice, el nombre de un
dispositivo del driver, o bien fileFolder, fileName, fileMode y fileFormat escritos para la
escaneo; los tags que le faltan a un dispositivo configurado se agregan con tag_upsert.
connector_browse devuelve fileFolder, fileName, fileMode y fileFormat de cada dispositivo. Las
demás herramientas están en Herramientas del agente.
Límites que conviene conocer
- Los libros de Excel no se leen: un libro se lee cuando su programa lo guarda como CSV.
- El driver nunca elimina un archivo. Una carpeta de entrada mueve lo que leyó a
Processed, y solo el archivo temporal de un reemplazo que falló se quita alguna vez. - "El archivo más reciente de la carpeta" no es una manera de leer: pierde archivos que llegan juntos y puede mostrar los valores de la muestra anterior. Una máquina que escribe un archivo por muestra se lee con una carpeta de entrada.
- Un valor no se cambia en su sitio dentro de un archivo (una celda de un CSV, un miembro del JSON de otro programa): una escritura agrega una línea o reemplaza el archivo completo, porque dos programas que escriben el mismo archivo pueden perder el cambio del otro.
- A un recurso compartido de red se accede con los permisos de Windows de la cuenta con la que se ejecuta la estación: el dispositivo no guarda usuario ni contraseña, así que el recurso compartido tiene que dejar entrar a esa cuenta (para leer, y para escribir y mover en un dispositivo que escribe o una carpeta de entrada).
- El driver nunca toca nada fuera de su carpeta: un nombre que apunta a otro sitio se rechaza donde se escribe en el formulario y donde lo escribe un tag.
- El archivo se mira en cada lectura: un cambio se ve en la lectura siguiente, nunca en el instante en que el otro programa lo escribe.
- Un campo CSV que contiene un salto de línea no se lee, y un tag JSON, XML o de archivo completo lee como mucho 4 MiB.