Mensajes recientes

Páginas: 1 ... 6 7 [8] 9 10
71
Kinco / LECTURA DE CADENA A MEDIDA EN PUERTO SERIE ASCII
« Último mensaje por Alexnch noviembre 09, 2022, 10:38:34 am »
Hola buenos días a todos, soy nuevo con el tema de HMI y me encuentro intentando resolver algo y no se como por eso quería hacerles una consulta:
Tengo una HMI Kinco MT4434TE la cual necesito leer en el puerto serie del HMI un String o cadena de datos de un equipo que envía permanentemente valores.
Ejemplo: "<STX>000025<CR>"
luego mostrarlo por pantalla.

Vi en algunos ejemplo que se puede escribir en el puerto serie, pero en ninguno explica bien como leer.

Desde ya muchas gracias y ojala puedan ayudarme

Saludos

72
STX8180 / Re:Escribir cadenas de log y método para enviar un valor float como entero por red
« Último mensaje por Soporte noviembre 03, 2022, 20:25:02 pm »
Extra, si necesitás agregar Logs, pero solo para pruebas, y no en el código de producción, podés utilizar directivas de preprocesamiento para incluir código opcionalmente de acuerdo al valor de una constante, y evitar crear dos proyectos diferentes.

Ejemplo:

Definimos en un archivo de cabeceras, por ejemplo Globals.inc, la constante DEBUG_LOG:

Código: (Pawn) [Seleccionar]
#define DEBUG_LOG    (1)
Luego, en un archivo Pawn, por ejemplo, DebugLog.p, las funciones para hacer entradas de log, por ejemplo:

Código: (Pawn) [Seleccionar]
stock DebugLogInit()
{
   DiskMount()
   DiskLogInit(1, "log", "txt", "/", 100000, 9, DISKLOG_OPT_PPPPPPPX|DISKLOG_OPT_CIRCULAR|DISKLOG_OPT_FAST_WRITE)
}

stock DebugLogFuncName(const FunctionName[])
{
   DiskLogAddString(1, FunctionName)
}

Finalmente, desde el código del proyecto escribimos en cada llamada a función que queramos añadir su nombre al log lo siguiente:

Código: (Pawn) [Seleccionar]
#if DEBUG_LOG  == 1
DebugLogFuncName("NombreFuncion1)
#endif

// ... CÓDIGO DEL PROYECTO ...

#if DEBUG_LOG  == 1
DebugLogFuncName("NombreFuncion2)
#endif

Si DEBUG_LOG  == 1 se agregan entradas al log, si es 0, directamente no se incluye en el código.

En en log aparecerán las entradas con los textos NombreFuncion1, NombreFuncion2, etc
73
STX8180 / Re:Escribir cadenas de log y método para enviar un valor float como entero por red
« Último mensaje por Soporte noviembre 03, 2022, 20:06:48 pm »
Buenas tardes Cristian,

La forma más simple de hacer un log es mediante la función:

DiskWriteLogString(Options, PathStr[], FormatStr[], ...)

Donde:

  • Options: Opciones para el log, usar DISK_WRITELOG_OPT_DEFAULT para opciones por defecto.
  • PathStr: Ruta al archivo, por ejemplo "log.txt"
  • FormatStr: Cadena con formato, por ejemplo "Hola Mundo!" o "Temperatura %f" (%f será remplazado por un valor float de la lista de argumentos variables.
  • ...: Argumentos con variables separadas por coma (opcional).

Ejemplo:

Código: (Pawn) [Seleccionar]
// Agregar mensaje de log con la temperatura del sistema.
DiskWriteLogString(DISK_WRITELOG_OPT_DEFAULT, "/log.txt", "Sistema listo, temperatura %f [C]", SysTempRead())

El código anterior creará una entrada similar a la siguiente si la temperatura es de 25.4 °C:

03/11/2022 19:45:03 Sistema listo, temperatura 25.4 [C]

Para que el ejemplo funcione, se debe montar una sola vez la tarjeta Micro-SD antes de utilizarla, por ejemplo al iniciar el PLC con el siguiente código:

Código: (Pawn) [Seleccionar]
   // Montar disco Micro-SD.
   DiskMount()

Ejemplo completo:

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



El método anterior no define la longitud del archivo, ni su tamaño máximo, lo cual, para log extensos, puede llenar la memoria o hacer archivos gigantes. Una forma más eficiente es utilizar las funciones DiskLog.

Primero montamos el disco como vimos antes:

Código: (Pawn) [Seleccionar]
DiskMount()
Luego inicializamos el canal número 1 de DiskLog (este número lo usaremos luego para loguear cada entrada) para que permita hasta 9 archivos de log, con un máximo de 100000 entradas cada uno, con un prefijo "log" de nombre y extensión "txt". El archivo se almacena en la raiz del disco "/".

Código: (Pawn) [Seleccionar]
DiskLogInit(1, "log", "txt", "/", 100000, 9, DISKLOG_OPT_PPPPPPPX|DISKLOG_OPT_CIRCULAR|DISKLOG_OPT_FAST_WRITE)
Los archivos resultantes serán: log1.txt, log2.txt y así hasta log9.txt. Cuando se llega a log9.txt, se vuelve a log1.txt porque está colocada la opción DISKLOG_OPT_CIRCULAR. Cada archivo tendrá un máximo de 100000 entradas.

Finalmente, para agregar una entrada de texto al log, utilizamos la función DiskLogAddString() pero especificando el canal 1 del DiskLog:

Código: (Pawn) [Seleccionar]
// Agregar mensaje de log con la temperatura del sistema.
DiskLogAddString(1, "Sistema listo, temperatura %f [C]", SysTempRead())

El código anterior creará una entrada similar a la siguiente si la temperatura es de 25.4 °C:


1 03/11/2022 19:45:03 Sistema listo, temperatura 25.4 [C]
2 03/11/2022 19:46:03 Sistema listo, temperatura 25.4 [C]
3 03/11/2022 19:47:03 Sistema listo, temperatura 25.4 [C]


Notar como al comienzo de cada entrada está el número de entrada.

Usar DiskLog con la opción DISKLOG_OPT_FAST_WRITE es más rápido para escribir en memoria que la función DiskWriteLogString() vista anteriormente.

Ejemplo completo:

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



Finalmente, contestando a tu consulta para enviar un valor float como entero por la red, sin usar desplazamientos, es sencillo. Utilizamos un entero como si tuviera un punto fijo y no flotante. Si multiplicamos por 100 antes de enviar, es como mover la coma dos posiciones hacia la derecha.

Por ejemplo:

Código: (Pawn) [Seleccionar]
new Float: Temperatura = 25.59
new Entero
new DataBytes[4]

// Multiplicamos temperatura por 100 para preservar dos decimales y luego convertimos a entero.
Entero = FloatToInt(Temperatura * 100.0)

// Enviamos el valor "Entero" por la red, byte a byte desde el array DataByte[].
DataByte[0] = Entero & 0xFF
DataByte[1] = (Entero >> 8) & 0xFF
DataByte[2] = (Entero >> 16) & 0xFF
DataByte[3] = (Entero >> 24) & 0xFF

Al recibir en Visual Basic armamos el entero (sugerido):

Código: (VB .Net) [Seleccionar]
Dim Entero As Integer
Dim DataByte(3) As Byte  ' Array de 4 bytes

' Opción #1
Entero = (DataByte(0)) Or (DataByte(1) << 8) Or (DataByte(2) << 16) Or (DataByte(3) << 24)

' Opción #2
Entero = BitConverter.ToInt32(DataByte, 0)



Posteriormente, en Visual Basic el valor "Entero" lo convertimos a "float" y dividimos por 100 para obtener los dos decimales, es decir, movemos la coma decimal hacia la izquierda.
74
STX8180 / Escribir cadenas de log y método para enviar un valor float como entero por red
« Último mensaje por Soporte noviembre 03, 2022, 19:36:19 pm »
Cristian nos consulta:

Cita de: Cristian C.
Hola Boris, quiero pedirte si me podes pasar los comandos para poder grabar un LOG con entradas de cadenas de texto en un archivo de la memoria Micro-SD, para que pueda ser utilizado en laboratorio y que nos permita identificar qué rutina es la que se bloquea. Por otro lado pedirte también como hacer para enviar por red la temperatura del PLC como número entero que no recuerdo bien lo que hablamos (te lo pido como entero ya que en vb no tengo la función >>).

Desde ya muchas gracias.
75
Kinco / Quitar Menu Task Bar y emitir sonidos al pulsar pantalla
« Último mensaje por Soporte septiembre 30, 2022, 20:51:45 pm »
Desde el menú "View > Attribute" seleccionamos las siguientes pestañas, señaladas en color amarillo en las capturas de pantalla, y tildamos o destildamos las opciones indicadas:

Quitar Menu Task Bar:



Emitir sonidos al pulsar pantalla:



76
Kinco / Re:REMANENCIA Y RTC
« Último mensaje por Soporte septiembre 28, 2022, 12:04:59 pm »
Buenos días Angelo,

Estoy con unos problemas que no le estoy pudiendo encontrar solucion, tengo un panel KINCO HMI-PLC HP043-20DT

No trabajamos ese modelo, no le podría indicar. En este foro damos soporte para ayudar a conectar los HMI con los PLC de Slicetex Electronics, operaciones básicas para comenzar a utilizarlos, o también responder dudas para otras marcas si sabemos la repuesta. Para soporte más complejo o profundo, conectar a otras marcas de PLC, debería contactar con el fabricante o revisar el manual.

1) Como pudo hacer para que una un boton (bit state setting o bit state switch usandolo como MARCA) tenga remanencia ? osea si se corta la luz que mantenga el estado en el que estaba

En el manual de usuario de la pantalla Kinco, ver link a continuación:

http://slicetex.com/hmi/kinco/files/Kinco_HMIware_User_Manual_EN_1506.pdf

Bucar capitulo 16, página 461. Allí se detallan los registros internos de la pantalla para uso general y cuales mantienen la información luego de quitar la energía. Para bits son los RB (no mantienen si batería está agotada) y FRB (mantienen siempre, pero tienen límites de escritura, ya que es FLASH). Para registros o words, son RW  (batería) y FRW (en memoria FLASH).



Debe tener en cuenta que si solo lee el bit o registro, no se guarda, también debe hacer una operación de escritura.

2) No se como usar el RTC_R y RTC_W para mostrar el horario actual, ya intente varias formas pero no lo logre

No los encuentro en el manual, pero en la página 91, da un ejemplo. Los registros asociados al RTC son LW10000 a LW10006:



Estos registros los puede leer y mostrar en pantalla.

3) Me gustaria hacer un contador de horas de marcha o por ejemplo una alerta de mantenimiento a las 6000 hs de uso, pero no se como !!

Ese contador debería hacerlo en la lógica del PLC, no en la pantalla. Y luego desde la pantalla acceder a los registros del PLC para leer algún bit o flag que se ponga en "1" cuando llegue a las 6000 hs y dar la alerta.

Alternativamente hay formas de hacer scripts (con cierta lógica) en la pantalla para incrementar y comprobar el valor de una variable, le puede servir porque es simplemente un contador, aunque no es igual de versátil que hacerlo desde el PLC.

Hay un en el foro un proyecto donde se utiliza un script en la pantalla, puede mirarlo para orientarse:

foro.slicetex.com/index.php?topic=543.0

Saludos!
77
Kinco / REMANENCIA Y RTC
« Último mensaje por Angelo septiembre 27, 2022, 17:25:13 pm »
Estoy con unos problemas que no le estoy pudiendo encontrar solucion, tengo un panel KINCO HMI-PLC HP043-20DT
1) Como pudo hacer para que una un boton (bit state setting o bit state switch usandolo como MARCA) tenga remanencia ? osea si se corta la luz que mantenga el estado en el que estaba
2) No se como usar el RTC_R y RTC_W para mostrar el horario actual, ya intente varias formas pero no lo logre
3) Me gustaria hacer un contador de horas de marcha o por ejemplo una alerta de mantenimiento a las 6000 hs de uso, pero no se como !!

Muchas gracias por la ayuda, tambien compre un panel HMI kinco de 10" y me gustaria implementarle lo mismo
78
STX8140 / Re:Node-red
« Último mensaje por Soporte septiembre 15, 2022, 16:49:50 pm »
Si la cadena puede tener como maximo 9 digitos y puede contener letras y numeros como por ejemplo A01001001 o 180180180 o X1180

¿Entonces estás trabado en cómo leer la cadena del HMI en el PLC?.

Mirá el siguiente link para entender cómo la envía el HMI y cómo debés procesarla en el PLC:

http://foro.slicetex.com/index.php?topic=256.msg1370#msg1370

Avísame cualquier duda.
79
STX8140 / Re:Node-red
« Último mensaje por Esteban E septiembre 15, 2022, 12:29:41 pm »
Si la cadena puede tener como maximo 9 digitos y puede contener letras y numeros como por ejemplo A01001001 o 180180180 o X1180

Le envío como se ha pensado.
80
STX8140 / Re:Node-red
« Último mensaje por Soporte septiembre 15, 2022, 11:39:03 am »
Hola Ing. Boris, no, el tema es con el HMI y el PLC, yo necesito pasar un nombre del HMI al PLC para que luego el PLC haga un http get con el nombre que le pase del HMI.

Bien, ¿ya tenés la cadena que le pasás del HMI al PLC? ¿Cuál sería el problema?. Ejemplificar, así logro entender qué necesitás hacer con la cadena.

Gracias.
Páginas: 1 ... 6 7 [8] 9 10