Mensajes recientes

Páginas: 1 2 3 [4] 5 6 ... 10
31
STX8180 / Re:Creación de archivo bin de log con fecha en el nombre
« Último mensaje por Miguel Gomez julio 04, 2022, 21:51:22 pm »
Gracias por el soporte acerca de como extraer en archivo csv, sin embargo aún no hemos hecho esta cambio o mejora, ya que nos detuvimos en lo siguiente, son 2 puntos:

1. probamos sólo el archivo samplelog3B (con la modificación del nombre del archivo log con la fecha) y observamos que  no crea el nuevo archivo con la fecha siempre. Realizamos el log, por ejemplo hoy y todo ok, le adelantamos la hora al equipo para que cambie la fecha...nos esperamos unos instantes y hacemos un nuevo log  pero observamos que no aparece el nuevo archivo con la nueva fecha...no siempre lo hace  y cuando lo hace vamos adelantando la fecha y van apreciendo los archivos con la fecha nueva...mañana quitaremos  la opción de sincronización a traves de la red, ¿puede ser esto algo que afecte a que el equipo tome la hora de la compu aunque modifiquemos la hora directamente?

2. El equipo se va a dejar trabajando 5 dias (5 muestrasxseg) para unas pruebas con el usuario, por lo que 1ero lo pusimos a trabajar nosostros de esa manera el viernes 1 de julio  solo activando el log (el timeout lo comentamos // para que no tuviera efecto),  y el sabado vimos que sólo guardo lo del viernes hasta las 11:59:59 pm. Creemos que deberia poder guardar lo de los 5 dias en un sólo archivo o que en cada termino de día realice un corte y continue guardando datos en el siguiente nuevo archivo del siguiente dia.

Se retraso un poco las pruebas con ususario por otro tema pero al indicarnos que es lo que van hacer quisimos probarlo así. Hablando de la aplicación en un modo tendría sentido la prueba, pues si un temblor iniciara a las 11:59:40 pm (es algo remoto verdad) grabando por 30 segundos, deberia creo, continuar el resto delos 10 seg en los 1eros segundos del dia siguiente , ya sea en el mismo archivo o en uno nuevo.

gracias por los consejos o correcciones
32
El ejemplo DiskSamplerLog1 vemos que imprime las muestras en formato csv pero en la paginaweb, no como archivo descargable. Queremos usar el DiskSamplerLog4 (por ser configurable) con la habilidad de escribir a un archivo descargable csv  ya que  las muestras  necesitadas ahora son de 5  veces por segundo.

Podrian ilustrarnos sobre como usar el DiskLogAddString, porque tenemos en la compilación un error en la última fila (el ultimo canal. Logrmos descargar archivo csv pero contenido en formato distinto, binario.

Buenos días Miguel,

Le paso el link al ejemplo DiskSamplerLog1 modificado para que tenga las opciones de DiskSamplerLog4 :

www.slicetex.com/docs/an/an036/files/examples/DiskSamplerLog1B.zip

Si bien, al ser algo tan genérico el ejemplo, es recomendable que en su proyecto lo optimice.

En este caso se ha modificado en función SamplersInit() de archivo Samplers.p para que los archivos del log tengan extensión CSV.

Código: (Pawn) [Seleccionar]
DiskLogInit(1, "vin", "csv", "/web", 36000, 500, DISKLOG_OPT_PPPPPXXX|DISKLOG_OPT_SEMICOLON|DISKLOG_OPT_CIRCULAR|DISKLOG_OPT_FAST_WRITE)

También, como le expliqué en otro ejemplo, puede modificarlo en este lugar para que tengan en el nombre de archivo la fecha YYYYMMDD.csv, si es necesario.

En el evento @OnVinBufFullA() se utiliza el código original del ejemplo DiskSamplerLog1, prácticamente sin cambios, siendo la parte fundamental DiskLogAddString() que escribe texto en el archivo CSV.

Código: (Pawn) [Seleccionar]
@OnVinBufFullA()
{   
   new TimeStart
   
   //
   // Guardar estampa de tiempo del inicio del evento.   
   //
   
   TimeStart = TimeGetMillis()   
   
   //
   // Copiar todas las muestras desde el buffer interno del "sampler" al array temporales.
   //
   // Nota: Las muestras de cada canal son colocadas en una dimensión del array por vez.
   // Como el array tiene dos dimensiones, utilizamos solo un índice para seleccionar el canal,
   // ver definición del array en Samplers.inc.
   //
   
   for(new Ch=0; Ch < SAMPLERS_CH; Ch++)
   {
      VinGetBuf(Ch+1, VinBuf[Ch], 0, SAMPLERS_BUF_SIZE)
   }
   
   //
   // Guardar todas las muestras VIN en la entrada del log de tarjeta Micro-SD.
   //
   
   for(new i=0; i < SAMPLERS_BUF_SIZE; i++)
   {         
      //
      // Atención: El siguiente códígo es para SAMPLERS_CH=5, si es diferente, debe adaptar la función
      // DiskLogAddString() para que tome más o menos argumentos de acuerdo a la cantidad de canales.
      //
     
      if(SAMPLERS_CH == 5)
      {
         // Agregar una entrada con formato de cadena de texto al canal 1 del DiskLog de la tarjeta Micro-SD.
         // Nota[1]: Separamos cada valor con ";" para que cumpla con el formato de archivo CSV.
         // Nota[2]: Los valores analógicos son "float" y llevan punto decimal. En Excel debe especificar si un número tiene "." o "," para el decimal.
         // Nota[3]: Puede convertir a voltaje con VinToVoltage() en una variable intermedia y luego aplicar la función MathScale() para converir a unidades de ingeniería.
         DiskLogAddString(1, "%f;%f;%f;%f;%f",  \
                             VinToVoltage(1, VinBuf[0][i], 12),     \
                             VinToVoltage(2, VinBuf[1][i], 12),     \
                             VinToVoltage(3, VinBuf[2][i], 12),     \
                             VinToVoltage(4, VinBuf[3][i], 12),     \
                             VinToVoltage(5, VinBuf[4][i], 12))
      }
      else
      {
         // Error!... Si SAMPLERS_CH es distinto a 5, debe adaptar este código
         // para que imprima en el archivo CSV más/menos canales.
         DiskLogAddString(1, "Adaptar codigo en @OnVinBufFullA!")
      }
   }
   
   //
   // Calcular tiempo insumido de procesamiento por el evento para mostrar en la página web.
   //
   
   SamplerEventTimeMS = TimeGetMillis() - TimeStart
}


Notar como la función DiskLogAddString() se encarga de imprimir las muestras al archivo de texto en formato CSV:

Código: (Pawn) [Seleccionar]
         DiskLogAddString(1, "%f;%f;%f;%f;%f",  \
                             VinToVoltage(1, VinBuf[0][i], 12),     \
                             VinToVoltage(2, VinBuf[1][i], 12),     \
                             VinToVoltage(3, VinBuf[2][i], 12),     \
                             VinToVoltage(4, VinBuf[3][i], 12),     \
                             VinToVoltage(5, VinBuf[4][i], 12))

Es lo logra con la cadena de formato "%f;%f;%f;%f;%f", donde cada código %f indica que debe remplazarse por un valor float del argumento variable de la función. Colocamos punto y coma ";" como separador, ya que así es el formato CSV.

Por ejemplo, el primer código %f corresponde a VinToVoltage(1, VinBuf[ 0 ][ i ], 12), que convierte a voltaje la muestra almacenada en el array VinBuf[][] del canal 1 a voltaje (ver manual). Ya que las muestras almacenadas por los SAMPLER están en formato binario, por lo que primero se convierten a voltaje y luego lo imprimimos a texto.

También puede colocar el valor de voltaje en una variable intermedia, por ejemplo, en el array Voltage[] y luego imprimir con DiskLogAddString():

Código: (Pawn) [Seleccionar]

new Float: Voltage[6]

Voltage[1] = VinToVoltage(1, VinBuf[0][i], 12)
Voltage[2] = VinToVoltage(2, VinBuf[0][i], 12)
Voltage[3] = VinToVoltage(3, VinBuf[0][i], 12)
Voltage[4] = VinToVoltage(4, VinBuf[0][i], 12)
Voltage[5] = VinToVoltage(5, VinBuf[0][i], 12)

DiskLogAddString(1, "%f;%f;%f;%f;%f",  Voltage[1] , Voltage[2] , Voltage[3], Voltage[4], Voltage[5])

Entonces, si quiere convertir a unidades de ingeniería, puede utilizar la función MathScale(InValue, InMin, InMax, OutMin, OutMax) de forma simple. Esta función, escala el valor InValue entre los límites InMin e InMax a los valores OutMin y OutMax.

Por ejemplo, supongamos que 0V representan 10 °C, mientras que 5V representan 85 °C, hacemos:

MathScale(InValue, 0, 5, 10, 85)

Cualquier valor de InValue entre 0 y 5 será escalado proporcionalmente entre 10 y 85.

Si fuera corriente, por ejemplo supongamos que 4 mA representan 10 °C, mientras que 20 mA representan 85 °C, hacemos:

MathScale(InValue, 4, 20, 10, 85)

Cualquier valor de InValue entre 4 y 20 será escalado proporcionalmente entre 10 y 85.

Entonces, yendo a DiskLogAddString(), podemos remplazar como:

Código: (Pawn) [Seleccionar]

new Float: Sensors[6]

Sensors[1] = MathScale(VinToVoltage(1, VinBuf[0][i], 12), 0, 5, 10, 85)
Sensors[2] = MathScale(VinToVoltage(2, VinBuf[0][i], 12), 0, 5, 10, 85)
Sensors[3] = MathScale(VinToVoltage(3, VinBuf[0][i], 12), 0, 5, 10, 85)
Sensors[4] = MathScale(VinToVoltage(4, VinBuf[0][i], 12), 0, 5, 10, 85)
Sensors[5] = MathScale(VinToVoltage(5, VinBuf[0][i], 12), 0, 5, 10, 85)

DiskLogAddString(1, "%f;%f;%f;%f;%f",  Sensors[1] , Sensors[2] , Sensors[3], Sensors[4], Sensors[5])

Obviamete, si son 6 canales, debés agregar una %f más al código de formato:

Código: (Pawn) [Seleccionar]
DiskLogAddString(1, "%f;%f;%f;%f;%f;%f",  Sensors[1] , Sensors[2] , Sensors[3], Sensors[4], Sensors[5], Sensors[6])

Es cuestión de que lo dejes optimizado y prolijo para tu proyecto específico.

Los códigos de formato admisibles para DiskLogAddString() son los mismos que para la función nLcdPrintf(), por ejemplo %f para float, y %d para enteros, podés ver una explicación de lo códigos en el Manual de Programación, buscar nLcdPrintf(), sección 9.2.

Saludos!

33
Hola que tal.
El ejemplo disksampler1 vemos que imprime las muestras en formato csv pero en la paginaweb, no como archivo descargable. Queremos usar el disksampler4 (por ser configurable) con la habilidad de escribir a un archivo descargable csv   ya que  las muestras  necesitadas ahora son de 5  veces por segundo.

Podrian ilustrarnos sobre como usar el disklogaddstring, porque tenemos en la compilación un error en la última fila (el ultimo canal. Logrmos descargar archivo csv pero contenido en formato distinto, binario.

gracias
34
Kinco / Re:Que no muestre "PLC No Response"
« Último mensaje por Soporte junio 30, 2022, 10:44:25 am »
Buenos días.

No, no se puede deshabilitar la notificación de errores.

Al menos no aparece ninguna opción en el software ni en el manual para hacerlo.

Solo se puede cambiar el contenido del mensaje de error o aumentar el tiempo de espera antes de mostrar el error.

Quizás, lo que podés hacer, es mostrar la información de cada PLC en ventanas separadas. Si mal no recuerdo, el HMI solo corrobora la conexión de los elementos de la ventana que está activa o mostrándose en el momento.

Saludos!
35
Kinco / Que no muestre "PLC No Response"
« Último mensaje por Jose junio 29, 2022, 14:30:26 pm »
Hola y gracias de antemano, el tema es que tengo conectada la HMI kinco a dos PLCs, uno al COM0 y el otro al COM1 pero no siempre están los dos PLCs encendidos, y si conecto solo uno me sale el mensaje de PLC 2 no response.
Quería saber si se puede deshabilitar esta función
Gracias
36
STX8180 / Re:Log combinado de entrada analógica voltaje y corriente
« Último mensaje por Soporte junio 28, 2022, 21:07:49 pm »
Puede combinarse en un log las muetras de digamos 4 canales VIO como entrada 4-20 y 3 como entrada de voltaje? es decir, conociendo que los canales del 1 al 4 serán usados en corriente y del 5 al 7 como voltaje.

Buenas tardes Miguel.

Si, puede combinarse en este caso.

En el ejemplo mencionado, DiskSamplerLog4, se configura por defecto los canales VIO como entradas de voltaje.

Pero esto no impide, que los canales VIO1:4 se configuren como entradas de corriente 4-20 mA (CIN), y los canales VIO5:7 sea entradas de voltaje (VIN). Esto lo hacés en la función SamplersInit() del ejemplo.

Entonces, podés remplazar:

Código: (Pawn) [Seleccionar]
   for(new Ch=1; Ch <= SAMPLERS_CH; Ch++)
   {
      VioInitVin(Ch, VIO_TYPE_VIN_SINGLE, VIO_VIN_RANGE_N5V_5V, VIO_VIN_SAMPLES_NONE)
   }

Por:

Código: (Pawn) [Seleccionar]

      // Configurar canales VIO1:4 como entradas analógicas CIN de corriente 4-20 mA.
      VioInitCin(1, VIO_TYPE_CIN, VIO_CIN_RANGE_DEFAULT, VIO_CIN_SAMPLES_NONE)
      VioInitCin(2, VIO_TYPE_CIN, VIO_CIN_RANGE_DEFAULT, VIO_CIN_SAMPLES_NONE)
      VioInitCin(3, VIO_TYPE_CIN, VIO_CIN_RANGE_DEFAULT, VIO_CIN_SAMPLES_NONE)
      VioInitCin(4, VIO_TYPE_CIN, VIO_CIN_RANGE_DEFAULT, VIO_CIN_SAMPLES_NONE)

      // Configurar canales VIO5:7 como entradas analógicas VIN de voltaje simple.
      VioInitVin(5, VIO_TYPE_VIN_SINGLE, VIO_VIN_RANGE_N5V_5V, VIO_VIN_SAMPLES_NONE)
      VioInitVin(6, VIO_TYPE_VIN_SINGLE, VIO_VIN_RANGE_N5V_5V, VIO_VIN_SAMPLES_NONE)
      VioInitVin(7, VIO_TYPE_VIN_SINGLE, VIO_VIN_RANGE_N5V_5V, VIO_VIN_SAMPLES_NONE)


Nota: Recordar luego desde la página Web del ejemplo, especificar muestrear 7 canales analógicos.

Como el ejemplo utiliza los "SAMPLERS" para muestrar a una tasa fija, lo que lee es voltaje, y eso es lo que se graba en el archivo binario, independiente de como esté configurado el canal VIO.

Por ello, luego en la aplicación de Visual C# cuando hacés el procesamiento de datos, al obtener el voltaje de los canales VIO1:4 (que son de corriente de acuerdo al PLC), debés dividir el valor de voltaje por "84.1945", que es la resistencia en Ohms utilizada para la medición de corriente internamente (ver figura 85, página 110 en la hoja de datos, allí se muestra el resistor "Rcs" utilizado cuando se configura como entrada de corriente tipo CIN).

Resumiendo, en C# para los canales VIO1:4, hacés la siguiente división:

Voltaje / 84.1945 = Corriente en amperes

Notar que la corriente resultante está en amperes, si la querés en mili-amperes, para que se represente mejor, debés multiplicar por 1000.

(Voltaje / 84.1945) * 1000 = Corriente en mili-amperes

Y ese nuevo valor, es el que podés colocar en el archivo CSV o escalarlo a unidades de ingeniería.

Para los canales VIO5:7 no le aplicás la conversión a corriente, ya que son voltaje.

Eso es todo, avísame si lo podés realizar o no se entiende algo.

Saludos!

Atención: Al utilizar canales VIO como entradas de corriente 4-20 mA (CIN), no aplicar voltajes directos mayores a +/- 4.21 V al terminal VIO, ya que puede generar excesiva corriente y dañar la entrada (por el resistor que se activa internamente). Se recomienda leer hoja de datos para conexionado con sensores de 4-20 mA, sección 11.25.7, página 110. Si hay dudas, consulte.
37
STX8180 / Log combinado con entrada analógica de voltaje y corriente
« Último mensaje por Miguel Gomez junio 28, 2022, 18:18:26 pm »
Hola que tal,
Puede combinarse en un log las muetras de digamos 4 canales VIO como entrada 4-20 y 3 como entrada de voltaje? es decir, conociendo que los canales del 1 al 4 serán usados en corriente y del 5 al 7 como voltaje, hemos visto con ejemplos las funciones para setear como 4-20, pero para combinar en un log, el ejemplo disklog4  supone en voltaje  todos los canales que se requieran muestrear. Tienes ejemplo al respecto? 


saludos y gracias por comentarios.
38
STX8180 / Re:Establecer voltaje en salida analógica
« Último mensaje por Soporte junio 24, 2022, 20:06:28 pm »
Nuevamente. Implemente el siguiente script  y funciona bien a nivel VirtualHMI..pero no veo voltaje en la salida VOUT1, leí por ahí que hay un jumper, esto es así para el STX8081? para poder ver voltaje de 1 a 5 V en el canal. Intentamos otras funciones que vienen en el manual pero de igual forma no vemos la tensión que queremos.

Hola Miguel.

Los canales VIO tienen función múltiple, pueden ser entradas o salidas de diversos tipos, por lo tanto, antes hay configurarlos por software.

En el caso del modelo STX8180 no hace falta manipular ningún jumper.

Para que un canal VIO sea salida de voltaje (no corriente, eso es una función diferente) de 0 a 10V, lo podés configurar con la siguiente función antes de utilizarlo:

Código: (Pawn) [Seleccionar]
   
   // Canal VIO1: Salida de voltage, alias VOUT1.
   // Rango: 0 a 10V.
   // Voltaje inicial: 0V
   
   VioInitVout(1, VIO_TYPE_VOUT, VIO_VOUT_RANGE_0V_10V, 0)

La constante VIO_VOUT_RANGE_0V_10V indica rango 0 a 10V.
Mientras que el primer argumento es el número de canal VIO (en este caso 1) y el último argumento es el voltaje inicial (en este caso 0V).
Los canales VIO que pueden ser salida de voltaje son todos, desde VIO1 a VIO11.

Las constantes para rango válidos son:

Código: (Pawn) [Seleccionar]
VIO_VOUT_RANGE_0V_10V      // Output range: 0V to 10V
VIO_VOUT_RANGE_N5V_5V      // Output range: +/-5V
VIO_VOUT_RANGE_N10V_0V    // Output range: -10V to 0V

Luego de inicializar el canal VIO como salida analógica de voltaje VOUT, podés utilizar la función VoutWriteVolt() para escribir o establecer el voltaje de salida. Por ejemplo:

Código: (Pawn) [Seleccionar]
//
// Escribir salida analógica número 1 (VOUT1) con voltaje de 5.5V.
//

VoutWriteVolt(1, 5.5)

Notar que el voltaje pasado a la función (en este caso 5.5) debe estar dentro del rango de voltaje, sino, se recorta el voltaje al límite.

Para medir este voltaje con el voltímetro, debés hacerlo entre el canal VIO seleccionado y el terminal A1G (masa analógica).

En la página de ejemplos del modelo STX8180 hay ejemplos para las salidas analógicas, buscar "Escribir salidas analógicas de voltaje (VOUT)" en la página de ejemplo, lo podés encontrar en el siguiente link:

www.slicetex.com/hw/stx8180/examples.php

El ejemplo que pasaste, también esta disponible adaptado para el modelo STX8180 en la página mencionada, el link directo es:

www.slicetex.com/hw/stx8180/examples/VoutPawn1.zip

Este ejemplo, utiliza el canal VIO5 en vez del VIO1, pero podés modificarlo fácilmente cambiando el número de canal 5 por 1.

Saludos y buen fin de semana!





39
STX8180 / Establecer voltaje en salida analógica
« Último mensaje por Miguel Gomez junio 24, 2022, 18:51:08 pm »
Hola que tal

Nuevamente. Implemente el siguiente script  y funcina bien a nivel VirtualHMI..pero no veo voltaje en la salida VOUT1, leí por ahí que hay un jumper, esto es así para el STX8081? para poder ver voltaje de 1 a 5 V en el canal. Intentamos otras funciones que vienen en el manual pero de igual forma no vemos la tensión que queremos.

saludos

Código: (Pawn) [Seleccionar]
PlcMain()
{

   // Inicializar rutinas Virtual-HMI.
   VirtualHmiInit()


   new Float:Volts
   // Loop principal.

   for(;;)
   {
     
   // Generar una rampa lineal entre 0 y 5
   
   if(Volts < 5)
   {
   Volts += 0.5
   }
   else
   {
   Volts = 0
   }
   
   //
// Escribir salidas analogicas.
//

VoutWriteVolt(1, Volts)
 
//
// Pausar 2000 mS.
//
// Mostrar lectura en el display de VirtualHMI.
            nLcdPrintf(0, 5, LCD_CLRLINE, "VoltajeCh1 = %f", Volts)
           
           
DelayMS(2000)
LedToggle()
   }

   // Retorno.
   return 0
}
40
STX8180 / Re:Relación SAMPLER BUFF SIZE con segundo de adquisición en DiskSamplerLog4
« Último mensaje por Soporte junio 23, 2022, 12:08:43 pm »
quedó claro! ya vimos como controlar este tema.

Perfecto. Tener en cuenta que para muestreos rápidos, como este, conviene tener el tamaño de SAMPLERS_BUF_SIZE al máximo, es decir en 127. Esto permite que entre cada evento @OnVinBufFullA() donde se escribe la tarjeta, esté más espaciado en el tiempo, por ejemplo 0.635 segundos para 200 muestras/s. Entonces, nos aseguramos tener todo ese tiempo disponible extra para otras operaciones del PLC. Por ejemplo, la operación de escritura de esas muestras tarda entre 0.010 a 0.030 segundos en promedio, pero si por algún motivo se retrasa, estamos sobrados de tiempo hasta la próxima escritura, que debe ser cada 0.635 segundos para no perder últimas muestras adquiridas (sino serán remplazadas o mezcladas por nuevas muestras).

Si bajamos el el valor de SAMPLERS_BUF_SIZE  el tiempo entre eventos @OnVinBufFullA() será menor, con lo cuál dispondremos de menos tiempo extra para cualquier retraso no contemplado en la escritura de las muestras.

Es a criterio del programador, se puede bajar el valor, pero cuando tenemos tiempos muy pequeños o muestreos a alta velocidad, conviene el mayor valor.

Saludos!
Páginas: 1 2 3 [4] 5 6 ... 10