VisualKB ChangeLog 2.8.3 Modificaciones: - Added windows Event Logging (WinXP version and up) to highlight on the application/VisualKB source main VisualKB events. Supports multiple instances running with a (PID) message prefix. Bugs: - Fixed AlwaysUp restarting problem that may leave VisualKB stopped. When multiple VisualKB instances are detected and there is no user interacting, such as an AlwaysUp restart, VisualKB prompts user another instance is running and has a timed graceful application exit (set @ 80 secs). - Ethernet IP Driver can use High Priority nodes 2.7.4 Modificaciones: - Nodo Advanced/GroupGenerator: + Se agrega Weighted average a los centros de masa de las salidas 2.7.3 Modificaciones: - Se agregó mensaje que avisa al usuario que no se encontró RPH, cuando se está simulando y se intenta modificar la lista de variables de Logging - Nodo Advanced/GroupGenerator: + Nuevo algoritmo de hash para seleccionar el groupID, este algoritmo no desperdicia espacios, por lo cual es más difícil causar un overflow Bugs: - Nodo Advanced/GroupGenerator: + Se resolvió el problema que generaba -1.#IND en algunas Std Dev + Calculo más exacto de la desviación estándar + Corrección de tipos de datos en el id de grupos + Corrección de error que causaba que los grupos fixed siempre aprendieran, aunque estuvieran fuera de rango 2.7.2 Modificaciones: - Se agrega la lectura de argumentos desde consola, en especial “Test” y “Convert” para facilitar pruebas y conversión respecto al nuevo VisualKB - Nodo System/Arguments + Los argumentos leidos desde consola podrán ser consultados desde este nuevo nodo - Nodo Advanced/GroupGenerator: + Se agrega clasificación por tipo fixed + Se agrega la posibilidad de borrar results sin borrar los grupos generados, siempre y cuando quede al menos un result + Se agrega la posibilidad de modificar los bottom y top limit sin borrar los grupos generados + Se agrega la posibilidad de modificar las granularidades sin borrar los grupos generados + Se agrega la posibilidad de migrar entre grupos fixed y dynamic regenerando los grupos en caso de ser necesario + Se agrega la funcionalidad de mandar a csv la información de los grupos Bugs: - Se actualizo el dll mfc42.dll a una versión más reciente debido a que la utilizada estaba causando problemas - Nodo Advanced/GroupGenerator: + Se corrige error que causaba crash al borrar un input cuando el sortconfig estaba en Results o inputs 2.7.1 Modificaciones: - Nodo Advanced/GroupGenerator: + Se mejoró la eficiencia al ordenar los elementos Bugs: - Se corrigió error que dejaba colgado el sistema, debido a que un thread nunca acababa - Nodo Advanced/GroupGenerator: + Ya se pueden mostrar grupos de más de 32,767 sin que borre ningún elemento + El sort solo se hacía con los números enteros, se modificó para que ordene con los decimales. + Aunque en la pestaña de "Sorting order" daba la posibilidad de ordenar ascendente y descendente por cada columna, solo se tomaba en cuenta la configuración del primer elemento. En esta versión ya es posible realizar el orden correctamente + Cuando se tenía un input o result seleccionado en la ventana de "Group View" y se abría la pestaña de "Sorting order", al modificar el orden no se refrescaban los valores de Inputs y Std. Dev. 2.7.0 Modificaciones: - Nodo Advanced/GroupGenerator: + Se agrega el sort por GroupID. + Se agrega un contador de grupos. + Cuando no está aprendiendo y no hay HitOnGroup busca el grupo con menos distancia. + Se agregó la salida de GroupHits. + Se optimizo la creación de nuevos grupos, principalmente en la selección del próximo GroupID. - Se agrega el prefijo "S_" a todos los logs generados en simulación . - Se permite abrir múltiples instancias del VisualKB pero solo una se puede comunicar. Las instancias que corren en modo de simulación no cuentan como instancia comunicándose. Bugs: - Nodo Advanced/GroupGenerator: + Se corrigió error que no actualizaba las desviaciones estándar cuando el grupo estaba aprendiendo y tenía un HitOnGroup. - Arithmetic/Formula: + Se corrigió error en la función abs, que truncaba los datos flotantes a enteros. 2.6.8 Bugs: - Se corrige error en el nodo de “Advanced/Group Generator”, que generaba que al crear una nueva variable de entrada se corrompieran las conexiones de salida al grabar el archivo, cerrarlo y volverlo a abrir. 2.6.7 Modificaciones: - Se agrega licencia para las máquinas virtuales - Nueva función para no iniciar las comunicaciones aunque la opción este encendida - Los encabezados de las tablas 4D ya pueden modificarse en cualquier índice, no solo en el inicial - Modificación de la lógica para escribir el archivo .OK cuando se tiene configurado autostart Bugs: - Se verifican retornos de algunas funciones en Advanced/PBGroupGenerator (CID 11892 y 11958) - Se quita la llamada de LoadInputs en la función de calculate, ya que no corresponde con su comportamiento en Generic/PBVectorTable (CID 11895) - Se verifican retornos de algunas funciones en OutputNodeDlg (CID 11897) - Se verifican retornos de algunas funciones en OutputViewDlg (CID 11905) - Se verifica que una variable no sea nula antes de usarla en Generic/ScaleHWnd (CID 11917) - Se agregó una verificación de un objeto nulo antes de usarse en OutputNodeDlg (CID 11938) - Se corrigió una comparación entre diferentes arreglos en Advanced/SortConfig (CID 11954) - Se corrigió un posible overrun en la función de RequestData de Ddestrng (CID 11963) - Se quitó una condición ya que en ambos casos hacia la misma acción en Advanced/PBSGA(CID 11964) - Se inicializaron variables en ConfigurelnputsDlg (CID 12004) - Se inicializaron variables en Generic/ExtendedTableDlgOptimizer (CID 12009) - Se inicializaron variables en CommandSNodeDelVar (CID 12013) - Se inicializaron variables en Generic/4DTableDlgOptimizer (CID 12014) - Se inicializaron variables en MainFrm (CID 12020) - Se inicializaron variables en OptPropertyPages (CID 12026) - Se inicializaron variables en Advanced/PBSGA (CID 12034) - Se inicializaron variables en Generic/PBFuzzySelect (CID 12036) - Se inicializaron variables en Generic/MultipleTableSettingsDlg (CID 12046) - Se inicializaron variables en Loglnput (CID 12048) - Se verifica que una variable no sea nula antes de usarla en Generic/PBSimpleFifo (CID 12050) - Se verifica que una variable no sea nula antes de usarla en Generic/PBFuzzySelect (CID 12053) - Se mandaba a llamar una función con una sola variable que era asignada a dos variables de retorno en GlobalHandler(CID 12531) 2.6.5b Cambios hechos al instalador (VStudio 2010 Installshield) - Bug: Llave corrupta en el registro, se agregaba para ligar la extensión .dgn con el programa (InstallShield Bug) - Fix: Ahora se agrega la misma llave a registro manualmente sin utilizar el feature de InstallShield 2.6.5 - Se corrigen multiples problemas de comunicaciones Se incluye ayuda de muchos de los nodos Fix de Transitional Transfer que desconectaba sus entradas Fix de race condition que podía hacer crashear al arrancar con AutoStart=true Al fallar un nodo de lectura bajo ciertas condiciones, los datos de nodos que no marcaron error podrían no loguearse. Previene algunos crashes en la escritura Mensaje Connected OK se cambió a Connecting… El contador de fallas no se resetea hasta que el nodo lee o escribe (antes lo hacía al conectarse exitosamente) El sistema se reconecta después de 10 lecturas fallidas o 3 escrituras fallidas Los mensajes de TOO MANY ERRORS se envían cada vez menos frecuentemente para evitar spam Se corrigen muchos problemas de pérdida de precisión, excepto en Tables.Fifo. Los nodos corregidos son: Transfer.Transfer Transfer. Transfer Delay Transfer. Transfer Transitional Transfer. Transfer Conditional Selector.Bool Selector Selector.Numeric Selector Tables.Indexed Fifo Tables.Indexed Table El Composite While tiene límite de 1000 iteraciones y ya no desconecta el nodo. Nueva función de Watchdog que trabaja con el Sanity Check de AlwaysUp para poderse recuperar de estados donde se congela. Corrige algunos crashes y lock-ups. Save As Component ya funciona bien. Corrige un problema de orden en los diálogos de OPC Read y OPC Write que podrían causar que se “crucen” los nodos. Escribe un archivo de watchdog al lado del DGN con el mismo nombre pero extensión .DGN.OK El AlwaysUp lo podrá consultar para saber si está siendo actualizado y reiniciar el VKB en caso negativo. El archivo watchdog se actualiza al terminar el ciclo de Read-Eval-Write en caso de que las escrituras sean exitosas. El archivo watchdog se borra al parar las comunicaciones, el AlwaysUp no hace nada si el archivo no está presente, esto para que pueda funcionar en modo Stopped. Anexo el procedimiento que envió Fer Benitez para la instalación y configuración del Sanity Check (VisualKB_SanityCheck.7z). 2.6.4a - Se corrige un problema al crear variables en "Configure Internal Outputs" del nodo Composite, el nombre ya no incluye el tipo 2.6.4 - Versión de emergencia a solicitud de Willie durante comisionamiento de PX3/SA en Timken. Se corrige un memory leak en la lectura Se corrige una corrupción de los datos causados por un RACE 2.6.3 - Versión de emergencia a solicitud de Willie durante comisionamiento de PX3/SA en Timken. Se reincorporaron locks que se habían quitado en la versión 2.6.2 y ahora causaban corrupción Se evitó un Memory Access violation en el código de Autoscroll de los mensajes. En ambientes virtualizados es posible hacer bypass de la llave HASP (Caso Contrecoeur) En ambientes de Terminal Services ya no se permite correr más de una instancia global al server (Caso AKSteel) 2.6.2 - Se reescribió la lógica de comunicaciones para el manejo de MultiThread. Se modificaron los mensajes en la consola, al haber un error no crítico en la comunicación, se cambia el foco de la conexión en la parte inferior derecha. El aviso de scan rate lagging es progresivo, es decir que el evento tiene que suceder en 10 muestras consecutivas. El reinicio (start/stop) de conexiones en los nodos se eliminó por completo. Se modificó el driver de ModBusEth.dll porque no validaba cuando la conexión se cerraba del lado del servidor. Se modificaron los mensajes para ser más entendibles. Se eliminó el deadlock que generaba al escribir en la consola mientras se abrían los nodos. 2.5.6 - Se corrigió una mala inicialización creada en la 2.5.5 que provocaba leaks de handles, threads y memoria. Se corrigió toda la conectividad en las interfaces de los drivers. Se modificó el tiempo de R/W en los nodos que utilizan ModbusEth. Se robusteció la concurrencia para evitar data races y deadlocks. Se cambió la prioridad de los threads en los nodos de alta prioridad. Se eliminó el bug de agregar variables después de haber corrido una vez el dgn o de haberlo cargado y cambiar el número de variables inmediatamente. Este último bug fue introducido en la 2.5.4 2.5.5 - Se corrigió la funcionalidad de Nodos condicionales. Se eliminó la espera individual de cada nodo al terminar la lectura de todos los nodos. Se eliminó la lectura y escritura de nodos como un bloque, ahora se realiza de manera individual. Se corrigió la conectividad en el driver Modbus Ethernet. Se evitó el "congelamiento" de la interfaz de usuario al esperar la conexión exitosa de los nodos. Se corrigió un bug en la copia de tablas.Se corrigió los cuadros de diálogo de "modify node" en el botón "wizard" de los nodos fuzzy. 2.5.4 - Funcionalidad extra añadida: Nodos condicionales. Ahora todos los nodos tanto de escritura como lectura tienen un parámetro más llamado "Conditional variable" que es algo parecido al "ComputerNode" que previene la escritura en el VisualKB, esa última funcionalidad se sigue manteniendo sin cambio. Ahora los nodos de comunicaciones escuchan una variable del mapa de salidas o entradas y si su valor es verdadero (true) entonces procederá a realizar la operación lectura o escritura dependiendo de la naturaleza del nodo, de otra forma se previene el que se realice esa operación. 2.5.3 - El modo LoggerKB sólo consideraba "aldebaran" como llave para obtener "Full control" no importando la programación de la HASP. - El driver ModbusEthernet limitaba el rango de direcciones de cero a 9999 debido seguramente al diseño original de comunicación con el Digitarc, lo cual ha sido extendido para usar 999999 como máximo. 2.5.2 - El driver de EtherNetIP necesitaba un parámetro de "Controller slot" al que pertenece la tarjeta de red Ethernet sin el cual el VisualKB sólo identifica una tarjeta Ethernet. 2.5.1 - Resuelto bug introducido en la 2.5.0 que alteraba un valor de la estructura compartida de los protocolos cuando el valor excedía 120, sólo es para ModbusEthernet donde significa "connection timeout", esto modificaba la mac address de algunos protocolos como Simens Sinec H1. 2.5.0 - Los drivers de comunicaciones han sido reestablecidos para tener la menor cantidad de cambios en comparación como a como usualmente estaban. Sólo los códigos de error han sido ampliados para reconocer nodos de alta prioridad. - Han sido corregidos algunos mensajes de diagnóstico que tenían su ortografía errónea. - Sólo un mensaje de error por cada ciclo aparecía en la ejecución con lo que se perdían muchos, ahora cada nodo escribe su mensaje de error. - Leak de handles ha sido corregido. Siempre ha existido este leak, sucedía cuando se reiniciaban los threads de comunicación, el thread del timer no era cerrado como correspondería hacer se usaba _endthreadex en vez de AfxEndThread. - Cambio a sockets no bloqueantes en ModbusEthernet. Ha sido añadido "Connect timeout" al protocolo de comunicaciones ModbusEthernet debido a la arbitrariedad de los valores de espera del "connect". Típicamente se tomará el valor de quince segundos, siendo el mínimo 10 y máximo 120. Este cambio no representa ninguna pérdida de compatibilidad tanto del driver como del archivo dgn. El timeout "RW" está en milisegundos y está sujeto a la saturación de la red en la que correo el VisualKB, a mayor carga de red, mayor debería ser el tiempo asignado, valores de cinco segundos deberían estar bien. - EH1Driver ha sido compilado para usar Wmknt.dll y no SA5PNT.dll y H1DllNT.dll, esto ocasionaba que no se encontrara el driver. - Solucionado un fix de leak de sockets en el GeEthernetDriver. - Los mensajes de diagnóstico de la consola ya se pueden exportar a un archivo de texto mediante click derecho en la consola. - Modo DEMO espera ahora quince segundos de buscar la HASP y no encontrarla. Antes esperaba dos segundos y medio y podía ocasionar race-conditions. - Los nodos del driver de EtherNetIP ya no iteran buscando el tag sino que se tuvo que añadir esa funcionalidad a la librería que se compró porque no la tenía. El ahorro de tiempo en la conexión inicial es dramático. Pero es un cambio todavía experimental debido a la documentación de la misma librería que se compró. Ahora los tags tienen la forma: TagName[index] donde index es el índice del elemento del arreglo del tag al que se quiere acceder. por esto mismo hay que especificar los offsets en el nombre del tag en dgns pasados de ahora en adelante, se quitó el campo "Tag offset" o "Address". si no se especifica el índice se da por entendido que es cero. El nombre del tag sigue siendo "case-sensitive" y EtherNetIPApp ha sido probado exitoso solamente con un "1756-L55/A 1756-M12/A LOGIX5555" y una tarjeta "1756-ENET/B". El driver sólo puede acceder tags en el controlador, no en programas. - Resuelto bug en opciones de "Logging" al usar una variable para la opción de "Name the logs based on:" muy parecida a otras del set de variables sucedía que seleccionaba la primer instancia que cumpliera con los caracteres de la variable cuando se necesitaba encontrar exactamente la variable. 2.4.9a - Nodos pertenecientes a Bits y Fuzzy no estaban siendo actualizados por error en IDE a nivel compilación dando errores al borrar variables de entrada. 2.4.9 - Ha sido corregido el principal error de comunicación que ocasionaba retardos excesivos sin mensaje de error en la consola del VisualKB, lo más probable es que afecte árboles (dgn´s) con muchos nodos de comunicación sin importar el tipo de driver. - Cambio de paradigma en la notificación (DuplicateEvent en vez de OpenEvent) parece dar mejor desempeño. - Se añadió nombre de cada nodo cuando falla lectura/escritura a nivel notificación (anteriormente siempre mensajes en azul), ahora esos mismos mensajes respetan la prioridad del nodo y diferencian uno de otro con color rojo de error para alta prioridad y amarillo de advertencia para baja prioridad. - El driver de siemens tenía una inconsistencia en los tiemouts, en un lado eran milisegundos y en otro segundos. También la sincronización de entradas/salidas no había sido implementada para este driver, ahora lo está. 2.4.8 - Corregido error que ocultaba algunas veces errores en las comunicaciones al tratarse de nodods de alta prioridad. - Corregido error que no reconectaba el driver GE Ethernet. 2.4.7 - Versión Demo implementada. Si la HASP no es encontrada en cinco segundos, VisualKB correrá en modo Demo por 2400 scans que dependiendo del scan time puede ser entre 20 min - 2 hr. Después habrá que reiniciarlo para obtener otros 2400 scans. - Corregido error en el objeto Transitional Transfer introducido desde la versión 2.4.5 que agregaba las entradas en orden en una parte pero en la serialización lo hacía de otra manera obteniendo variables enlazadas incorrectamente. 2.4.6 - Corregido error que no permitía que nodos de alta prioridad se comunicaran cuando otros nodos de distinto protocolo fallaban aún cuando éstos eran de baja prioridad. - Protecciones de sincronización añadidas para operaciones comunes de los protocolos (Open, Read, Write, entre otros). - Corregido error que no permitía agregar/quitar el checkbox de HighPriority en el nodo de MBX. 2.4.5 - Corregido error que en casos de buffers de tamaño cero, los hilos de escritura no reseteaban su estado por lo que dejaban de operar indefinidamente. 2.4.4 - Los timeouts de los nodos de comunicaciones ya no están limitados y su máximo valor fue extendido de 10 s a 50 s. - Han sido eliminados los valores predefinidos de timeouts para recv/send de ModbusEthernet, estos estaban haciendo fallar algunas veces las operaciones de IO con timeouts, dejaremos que los timeouts lo maneje internamente el VisualKB y no los sockets. - El manejo de las notificaciones internas de los hilos de comunicaciones ha sido optimizado para evitar bloqueos inecesarios obteniendo más seguridad en las operaciones de lectura/escritura. 2.4.3 - Compatibility for 64 bits in the Hasp driver has been added. 2.4.2 - Primera versión liberada de tabla de cuatro dimensiones. - Driver de EthernetIP ahora puede leer y escribir no sólo a registros tipo palabra en el PLC. - Corregido bug que sólo comparaba primeros once caracteres de los tags al buscarlos en el driver de EthernetIP. - Corregido bug que se presentaba en contadas ocasiones y al parecer en escenarios de baja memoria del sistema disponible que hacía "crashear" el VKB al intentar abrir algunos programas. Se cambió el uso de un objeto de sincronización tipo CRITICAL_SECTION por uno CCriticalSection con el mismo fin. - Timeouts de los nodos habiltado. 2.4.0 - Corregido un bug muy importante en el que el nodo de EtherNetIP no se daba cuenta de la desconexión. 2.3.9 - Cambios sugeridos por coverity. - Cambio en el diálogo de configuración del protocolo de comunicación EtherNetIP. El campo "Address" y la inscripción "4xxxx" legado de ModbusEthernet fueron cambiados por "PLC Offset" junto con una leyenda que especifica las unidades (word) y el primer elemento que es uno, esto para eliminar la ambigüedad que significaba establecer el offset en el tag a leer o escribir. - LoggerKB liberado. Es el mismo VisualKB sólo que limitado únicamente concebido con propósitos de Logueo. Requiere programación especial de la hasp usando el KeyGenerator actualizado para este propósito. - Nodos de tablas de cuatro dimensiones en modo experimental. 2.3.8 - Leak de handles arreglado. Este bug estaba presente desde la versión 2.2.4 sólo que necesitaba más tiempo para verse. Sucede cuando se tienen nodos que usan ModbusEthernet y el target no está presente, se crean sockets sin cerrar los que ya se han creado debido a la manera de operar (Open/Read, Open/Write). El mismo esfuerzo se ha hecho en los protocolos EthernetIP y Level2 para evitar esa misma situación. 2.3.7 - Solucionado bug que no permitía la operación normal de nodos de escritura cuando los de lectura estaban deshabilitados esto debido a una validación incompleta cuando el buffer de lectura estaba vacío y se intentaba ejecutar el ciclo principal de evaluación protegiendo contra fallos en la lectura, pero dejaba de lado cuando la lectura se deshabilitaba y se cortaba la ejecución con consecuencia que los threads de escritura no eran notificados para trabajar. 2.3.6 - Solucionado bug que no permitía escribir archivos de logs cuando la opción "Use the next variable to form a DWORD based name" estaba habilitada. 2.3.5 - Ahora los defaults para los timeouts de los protocolos en los que antes de la version 2.3.x no se usaban no se inicializan con 2000 ms sino con el scan time, esto es para actuar en conformidad con el buen desempeño de los nodos de lectura/escritura. - El número de errores acumulados antes de reiniciar el sistema ha sido incrementado de cuatro a diez, esto para "suavizar" el efecto negativo que pudieran tener nodos cuyo Open sea lento y también para ayudar a los nodos cuyo timeout ha sido establecido al del scan time y éste es pequeño. - Los timeouts de los nodos de lectura por default serán establecidos en 90% del scan time. - Ambos tipos de nodos (lectura/escritura) tienen sus timeouts limitados en operación acorde con el scan time. 2.3.4 - Nueva forma de usar threads por nodo, antes eran CThread, ahora son WinThread, esto nos permite que no tengamos que "esperar" a que cada nodo termine la ejecución y por lo tanto que el GUI se "trabe". - También el tiempo de espera de entre cada reinicio ha sido eliminado puesto que ahora ya se puede interrumpir la operación con el botón "disconnect". - También ha sido solucionado el bloqueo indefinido que sucedía con el protocolo DHX cuando fallaba su open, esperamos que todos los protocolos que pueden fallar en el open también se beneficien de esto. 2.3.3 - Existía una situación de interrupción de operación cuando se reiniciaba (ciclo de 10 segundos) dado 4 errores consecutivos, una flag se quedaba encendida cuando debía apagarse, eso hacía que las siguientes peticiones fueran ignoradas. (CAMBIO PRIORITARIO) - También los nodos de lectura ya no son esperados cuando los threads clientes están "ocupados". Esto brinda mayor dinamismo en operación (De tener que esperar ~11 minutos para un reinicio, ahora con sólo uno es suficiente). 2.3.2 - En los logs sólo las variables internas se guardan bien, esto es debido a que el arreglo de variables no se estaba agregando correctamente en el concatlink. (CAMBIO PRIORITARIO) 2.3.1 - Agregar SCaler en vez de PLCLink únicamente. Esto ocasiona que en las lecturas no se escale. (CAMBIO PRIORITARIO) 2.3.b -Algunas operaciones (OnDoneWriting, OnDoneMultithreadedStart, etc) no deben ejecutarse si hay un startup en progreso, esto causaba un error fatal (violación de memoria, dereferencia de nulo). - Aumento de límite máximo de timeout para protocolos, de 1s a 10 s. Esto va acorde al punto 1. 2.3.a - Validar timeout de protocolos que no lo usaban y que vienen de una version anterior (1003,1004,1005) Establecimiento del timeout en 2s. - Quitar establecimiento máximo del timeout de nodos de escritura hardcoded 1000 ms.