Logo Studenta

Aplicacion-de-vision-artificial-en-plataformas-volcadoras-Cardozo-Cuccioletta-Isidro-Manavella-2021

¡Este material tiene más páginas!

Vista previa del material en texto

UNIVERSIDAD TECNOLÓGICA NACIONAL 
FACULTAD REGIONAL SAN NICOLÁS 
 
INGENIERÍA ELECTRÓNICA 
 
 
 
 
Problema de Ingeniería: 
 
TÉCNICAS DIGITALES III 
 
 
 
 
APLICACIÓN DE VISIÓN ARTIFICIAL EN 
PLATAFORMAS VOLCADORAS 
 
Integrantes: 
 
Cardozo, Blas E. 
Cuccioletta, Federico G. 
Isidro, Marco J. 
Manavella, Nicolás J., 
 
Docentes: 
 
- Profesor: Poblete Felipe 
- Auxiliar: González Mariano 
 
 
 
AÑO 2021
ÍNDICE 
 
Objetivo 2 
Materias Integradoras 2 
Problema 3 
Propuesta y Alcance 3 
Estrategia de Desarrollo 4 
Fundamentos Teóricos 5 
Visión artificial 5 
Proceso de descarga en plataformas volcadoras 6 
Librerías de Python 7 
OpenCV 7 
Python-Snap7 7 
Entornos Virtuales 8 
SQLServer 8 
Funcionamiento 8 
Servicios, herramientas y ediciones de SQL Server 9 
RGB y HSV 10 
Protocolos que intervienen en el proyecto 12 
ProfiBus 12 
TCP/IP 13 
Modelo OSI 16 
RTSP 19 
Desarrollo 20 
Introducción 20 
Conexión con el proceso 20 
Iluminación de la zona de análisis 21 
Introducción al desarrollo del código 22 
Pruebas anteriores a la implementación final 23 
Detección de Color 23 
Detección de Movimiento 24 
Visión general del código y diagramas en bloques 25 
Hilo de comunicación con la cámara 26 
Hilo de comunicación con el PLC 28 
Hilo principal 30 
Detalles del Multiprocesamiento 32 
Problema de Ingeniería- Técnicas Digitales III 
1 
Estimación categórica del caudal 32 
Comunicación con la base de datos 36 
Conclusiones 38 
Posibles mejoras y extensiones 38 
Seguridad 39 
Seguridad en el proceso 39 
Seguridad en el código 39 
Anexos 40 
Código detección de color 40 
Código detección de movimiento 41 
Código Completo 42 
Hoja de datos del inclinómetro 48 
Bibliografía 49 
 
 
Problema de Ingeniería- Técnicas Digitales III 
2 
Objetivo 
 
El objetivo del trabajo es la resolución de un problema real de ingeniería. Para 
ello, también es necesario utilizar los conocimientos adquiridos tanto en la materia de 
Técnicas Digitales III como en el resto de las materias de Ingeniería Electrónica. En 
nuestro caso se optó por resolver un problema que tenía una empresa en su sistema de 
descarga de camiones. 
Luego de analizar el problema, se determinó el alcance del proyecto de ingeniería. 
Para resolverlo fue necesario utilizar, investigar y estudiar conceptos de programación, 
visión artificial, redes de comunicación, protocolos de comunicación, seguridad, 
iluminación y electricidad. 
El objetivo principal es resolver el problema que tiene la empresa: la detección de 
la descarga de granos en los camiones cuando están siendo inclinados por las plataformas 
volcadoras. 
 
● Resolver el problema de ingeniería. 
● Adquirir los conocimientos técnicos necesarios para la resolución del proyecto. 
● Aprender a resolver un problema en conjunto con los compañeros. 
 
Materias Integradoras 
 
Dicho proyecto, además de los fundamentos matemáticos, físicos y de 
programación adquiridos en los primeros años de la carrera, se integran principalmente 
los conocimientos de la materia electiva “Inteligencia Artificial Aplicada a la Ingeniería” 
y la materia en la que se desarrollara el proyecto “Técnicas Digitales III”. 
En cuanto a la materia de Técnicas digitales se hace uso de los conceptos 
desarrollados en la unidad 5 del apunte de cátedra, es decir, la arquitectura de las 
computadoras personales, más específicamente los temas relacionados con el video y las 
tarjetas gráficas. Por otro lado, de la materia de Inteligencia Artificial Aplicada a la 
Ingeniería, se van a obtener todos los conceptos básicos relacionados con la inteligencia 
artificial, ya sea para el posible uso de redes neuronales como de otros métodos utilizados 
en la industria actualmente. 
Por otro lado, se utilizaron los conocimientos sobre PLC desarrollados en la 
materia de “Tecnologías Electrónicas” y los principios de programación dados en las 
materias “Informática I y II”, además de los conocimientos adquiridos en el ámbito 
laboral. 
 
Problema de Ingeniería- Técnicas Digitales III 
3 
Problema 
 
Para el presente trabajo se optó por resolver una problemática presentada por la 
empresa Bunge Argentina en su complejo industrial de Ramallo. Bunge LTD es una de 
las principales compañías de agronegocios en el país. 
La problemática presentada por la empresa consiste en la necesidad de un sistema 
de detección para la descarga de granos (soja, maíz, girasol o sorgo) en los camiones 
ubicados sobre las plataformas volcadoras. En caso de que el camión esté posicionado en 
la plataforma, la misma comience a inclinarse y la puerta trasera del acoplado permanezca 
cerrada como consecuencia de una fallà mecánica o un error del operador, se corre el 
riesgo de que se rompan las trabas de seguridad y colapse el acoplado debido al peso 
generado por la carga, produciendo grandes pérdidas económicas y generando la 
posibilidad de que ocurra un accidente grave con los operadores y camioneros. 
Para evitar y aumentar las medidas de seguridad en las operaciones con las 
plataformas volcadoras, se desarrollará un sistema de detección que le pueda avisar al 
operario de la plataforma, si el proceso está en condiciones de accionarse. 
Propuesta y Alcance 
 
Debido a que Bunge, mediante un servicio tercerizado, probó varias alternativas 
para la detección de granos desde los camiones y resultaron no tener resultados 
satisfactorios, se optó por el desarrollo de un sistema de visión artificial, buscando 
mejorar los resultados previos y resolver la problemática. 
Luego de ponernos en contacto con Bunge, identificamos nuevas problemáticas 
dentro del mismo proceso, que de resolverse se conseguiría un aumento de productividad 
y eliminación de posibles gastos futuros. En base a estas problemáticas, el sistema de 
visión artificial integrará las siguientes funcionalidades: 
 
● Detección de la caída de granos, siendo este el punto central del proyecto y la 
problemática inicial. 
● Estimación categórica del caudal de grano que se está depositando. 
● Medición del tiempo de descarga de los camiones. 
 
 Cabe aclarar, que nuestra solución va a ser funcional solamente para 
camiones con acoplados, ya que aquellos que no cuenten con uno van a posicionarse más 
lejos de la cámara siendo necesaria la utilización de una red neuronal que identifique la 
puerta trasera de los camiones. Ya que un camión sin acoplado no ejerce la misma fuerza 
en posición suspendida y no se cuenta con el material necesario para entrenar la red 
neuronal, se optó por limitar la funcionalidad del software de visión artificial 
implementado. 
 
Problema de Ingeniería- Técnicas Digitales III 
4 
Estrategia de Desarrollo 
 
 
Para la realización del trabajo se debe realizar las siguientes tareas que se pueden 
dividir en los temas de investigación, desarrollo y pruebas. 
En tareas de investigación se pueden destacar el aprendizaje de los conceptos 
básicos de python orientados a la visión artificial, más específicamente de la librería 
OpenCV, así como la composición de imágenes y propiedades de los videos. Además, se 
investigará en temas de iluminación, ya que la misma juega un papel fundamental en la 
visión artificial. 
Una vez terminada la investigación previa necesaria para el desarrollo del trabajo, 
se abordará el problema de forma segmentada con el objetivo de lograr un flujo de trabajo 
equilibrado entre los integrantes del proyecto. En un principio se harán pruebas en los 
conceptos básicos de detección, como lo pueden ser el color o el movimiento; 
posteriormente se optara por la mejor combinación de los mismos teniendo en cuenta la 
problemática con la que se trata. Además, se destinará un tiempo al mejoramiento de la 
experiencia de usuario del sistema desarrollado. 
Finalmente, se implementarán pruebas en el sistema desarrollado para determinar 
el grado de exactitud con el que opera, y de ser insuficiente parala aplicación, se volverá 
a la etapa de desarrollo hasta lograr resultados satisfactorios. 
 
Cabe destacar que en una etapa anterior al desarrollo del proyecto, y a lo largo del 
proyecto se llevarán a cabo reuniones virtuales con el encargado del sector en Bunge 
Argentina, con el objetivo de tener material de trabajo (videos del proceso 
principalmente) y resolver posibles conflictos que se puedan presentar. 
 
 
Problema de Ingeniería- Técnicas Digitales III 
5 
Fundamentos Teóricos 
 
En esta sección vamos a desarrollar los conceptos básicos de los fundamentos 
teóricos utilizados para la resolución del problema de ingeniería en la descarga de 
plataformas volcadoras. 
Visión artificial 
 
Es una pequeña parte de la inteligencia artificial. La visión artificial se centra 
básicamente en técnicas que permiten a los dispositivos poder ver, identificar y procesar 
imágenes similar o igual a como lo hace la visión humana, esto puede ser tanto de manera 
automática como asistida por una persona. Estas técnicas por medio de software y 
hardware, pueden ser tales como la iluminación, la captación y digitalización de la 
imagen, el pre-procesamiento, el procesamiento y la comunicación de los resultados. 
En pocas palabras, la tecnología de visión artificial proporciona a los equipos 
industriales la capacidad de "ver" lo que están haciendo y tomar decisiones rápidas en 
función de lo que ven. Los usos más comunes de la visión artificial son la inspección 
visual y la detección de defectos, la colocación y medición de piezas, además de 
identificar, clasificar y rastrear productos. 
La visión artificial es una de las tecnologías fundacionales de la automatización 
industrial. Ha ayudado a mejorar la calidad de los productos, a acelerar la producción y a 
optimizar la fabricación y la logística durante décadas. Y ahora, esta tecnología 
contrastada, se fusiona con la inteligencia artificial para liderar la transición hacia la 
industria 4.0. 
Los principales componentes de un sistema de visión artificial incluyen la 
iluminación, los lentes, el sensor de imagen, el procesador de visión y las 
comunicaciones. La iluminación ilumina la pieza a inspeccionar o el proceso sobre el cual 
se quiere trabajar, y permite que sus características sobresalgan para que la cámara las 
pueda ver claramente. El lente captura la imagen y se la presenta al sensor en forma de 
luz. El sensor en una cámara de visión artificial convierte esta luz en una imagen digital 
que, luego, se envía al procesador para ser analizada. 
El procesador de visión consta de algoritmos que controlan la imagen y extraen la 
información necesaria, ejecutan la inspección correspondiente y toman una decisión. 
Finalmente, la información generada es enviada a un dispositivo que registra y/o utiliza 
la misma. 
 
Figura 1: Componentes principales de un sistema de visión artificial 
Problema de Ingeniería- Técnicas Digitales III 
6 
Proceso de descarga en plataformas volcadoras 
 
El área de logística en la planta de Bunge cuenta con un sector techado donde se 
encuentran cuatro plataformas volcadoras en paralelo. El proceso comienza formando una 
fila de camiones a la espera de su turno. Una vez que un camión debe ingresar a descargar 
sus granos, un operador se encarga de darle aviso para que se posicione sobre una 
plataforma volcadora. El operador y sus asistentes se aseguran que el camión esté 
colocado en la posición adecuada dependiendo del tamaño del mismo. 
 Luego, el conductor se retira del vehículo y los operadores ponen en posición los 
tacos de traba de las ruedas del camión. Otro operador se encarga de abrir todas las 
compuertas laterales y traseras de los acoplados para que, una vez inclinado, todo el 
producto caiga por estas aperturas. 
 Todo este proceso es monitoreado por otro operador ubicado en una cabina. Esta 
cabina cuenta con un gabinete tipo consola donde se ubica la botonera para operar la 
plataforma, también posee una pantalla HMI Siemens donde visualiza el scada con los 
valores de los sensores pertinentes a la plataforma (Inclinómetro de la plataforma, 
desplazamiento de los pistones, corriente de los motores y otros) y, además, otra pantalla 
donde observa una imagen de vídeo panorámica de toda la plataforma volcadora. 
 Cuando todo está en posición, los operadores se retiran y se da la orden de elevar 
la plataforma volcadora. La misma se inclina hasta unos 50º aproximadamente, 
permitiendo que todo el grano descienda de los acoplados. El grano cae en dirección a 
unas rejillas donde es redireccionado a una cinta transportadora que se encuentra en el 
subsuelo de las plataformas. Luego, según el tipo de grano, se hace una combinación de 
cintas para que el material se dirija a la celda o silo que corresponda. 
 El proceso exige la participación de un grupo de 6 o 7 operadores que son los 
encargados de hacer el paso a paso de este. No hay ninguna automatización. 
 
 
Problema de Ingeniería- Técnicas Digitales III 
7 
Librerías de Python 
OpenCV 
 
OpenCV (Open Source Computer Vision Library) es una biblioteca de software 
de visión artificial y aprendizaje automático de código abierto. OpenCV se creó para 
proporcionar una infraestructura común para aplicaciones de visión por computadora y 
para acelerar el uso de la percepción de la máquina en los productos comerciales. Al ser 
un producto con licencia BSD, OpenCV facilita que las empresas utilicen y modifiquen 
el código. 
Tiene interfaces C ++, Python, Java y MATLAB y es compatible con Windows, 
Linux, Android y Mac OS. 
 
Python-Snap7 
 
Snap7 es un software multi plataforma para comunicarse de igual manera que lo 
harían de forma nativa PLCs del fabricante SIEMENS empleando tecnología Ethernet y 
protocolo S7. 
Con Snap 7 podremos imitar ciertas comunicaciones y comportamientos de igual 
modo que lo hicimos con Modbus en la entrada “Simulador de Protocolo MODBUS”. 
 
Entre sus características principales destacan: 
 
● Arquitectura diseñada para 32 y 64 bits. 
● Software Open Source. 
● Soporte para varios sistemas operativos, Windows, Linux, MacOSX, etc. 
● Soporte para varios tipos de CPU. 
● No son necesarios librerías de terceros. 
● No es necesaria su instalación. 
● Modelos de transmisión de información síncrona como asíncrona. 
● Se incluyen algunas demos para su uso directo. 
 
 
Problema de Ingeniería- Técnicas Digitales III 
8 
Entornos Virtuales 
 
 
Las aplicaciones en Python usualmente hacen uso de paquetes y módulos que no 
forman parte de la librería estándar. Las aplicaciones a veces necesitan una versión 
específica de una librería, debido a que dicha aplicación requiere que un bug particular 
haya sido solucionado o bien la aplicación ha sido escrita usando una versión obsoleta de 
la interfaz de la librería. 
Esto significa que tal vez no sea posible para una instalación de Python cumplir 
los requerimientos de todas las aplicaciones. Si la aplicación A necesita la versión 1.0 de 
un módulo particular y la aplicación B necesita la versión 2.0, entonces los requerimientos 
entran en conflicto e instalar la versión 1.0 o 2.0 dejará una de las aplicaciones sin 
funcionar. 
La solución a este problema es crear un entorno virtual, un directorio que contiene 
una instalación de Python de una versión en particular, además de unos cuantos paquetes 
adicionales. 
Diferentes aplicaciones pueden entonces usar entornos virtuales diferentes. Para 
resolver el ejemplo de requerimientos en conflicto citado anteriormente, la aplicación A 
puede tener su propio entorno virtual con la versión 1.0 instalada mientras que la 
aplicación B tiene otro entorno virtual con la versión 2.0. Si la aplicación B requiere 
actualizar la librería a la versión 3.0, ésto no afectará el entorno virtual de la aplicación 
A. 
El script usado para crear y manejar entornos virtuales en python es pyvenv. 
Pyvenv normalmente instalará la versiónmas reciente de Python que tengas disponible; 
el script también es instalado con un número de versión, con lo que si tienes múltiples 
versiones de Python en tu sistema puedes seleccionar una versión de Python específica 
ejecutando python3 o la versión que desees. 
 
SQLServer 
 
Microsoft SQL Server es un sistema de gestión de bases de datos relacionales 
(RDBMS), desarrollado por la empresa Microsoft. El mismo, se basa en SQL, un lenguaje 
de programación estandarizado que los administradores de bases de datos (DBA) y otros 
profesionales de TI utilizan para gestionar las bases de datos y consultar los datos que 
contienen. 
 
Funcionamiento 
 
SQL Server se construye principalmente en torno a una estructura de tablas basada 
en filas que conecta los elementos de datos relacionados en diferentes tablas entre sí, 
evitando la necesidad de almacenar datos de forma redundante en varios lugares dentro 
de una base de datos. El modelo relacional también proporciona integridad referencial y 
otras restricciones de integridad para mantener la exactitud de los datos. Estas 
comprobaciones forman parte de una adhesión más amplia a los principios de atomicidad, 
consistencia, aislamiento y durabilidad, conocidos colectivamente como propiedades 
ACID, y están diseñadas para garantizar que las transacciones de la base de datos se 
Problema de Ingeniería- Técnicas Digitales III 
9 
procesen de forma fiable. 
El componente principal de Microsoft SQL Server es el motor de base de datos 
de SQL Server, que controla el almacenamiento, el procesamiento y la seguridad de los 
datos. Incluye un motor relacional que procesa los comandos y las consultas y un motor 
de almacenamiento que gestiona los archivos de la base de datos, las tablas, las páginas, 
los índices, los búferes de datos y las transacciones. El motor de base de datos también 
crea y ejecuta procedimientos almacenados, desencadenantes, vistas y otros objetos de la 
base de datos. 
Debajo del motor de base de datos se encuentra el sistema operativo de SQL 
Server, o SQLOS. SQLOS se encarga de las funciones de nivel inferior, como la gestión 
de la memoria y la E/S, la programación de trabajos y el bloqueo de datos para evitar 
actualizaciones conflictivas. Por encima del motor de base de datos se encuentra una capa 
de interfaz de red que utiliza el protocolo Tabular Data Stream de Microsoft para facilitar 
las interacciones de solicitud y respuesta con los servidores de base de datos. Y a nivel 
de usuario, los administradores de bases de datos y desarrolladores de SQL Server 
escriben sentencias T-SQL para construir y modificar estructuras de bases de datos, 
manipular datos, implementar protecciones de seguridad y realizar copias de seguridad 
de las bases de datos, entre otras tareas. 
Servicios, herramientas y ediciones de SQL Server 
 
Microsoft también incluye una variedad de herramientas de gestión de datos, 
inteligencia empresarial (BI) y análisis con SQL Server. Además de la tecnología R 
Services y ahora Machine Learning Services, que apareció por primera vez en SQL Server 
2016, las ofertas de análisis de datos incluyen SQL Server Analysis Services, un motor 
analítico que procesa los datos para su uso en aplicaciones de BI y visualización de datos, 
y SQL Server Reporting Services, que admite la creación y entrega de informes de BI. 
En cuanto a la gestión de datos, Microsoft SQL Server incluye SQL Server 
Integration Services, SQL Server Data Quality Services y SQL Server Master Data 
Services. El SGBD también incluye dos conjuntos de herramientas para administradores 
de bases de datos y desarrolladores: SQL Server Data Tools, para el desarrollo de bases 
de datos, y SQL Server Management Studio, para el despliegue, la supervisión y la 
gestión de bases de datos. 
 
Problema de Ingeniería- Técnicas Digitales III 
10 
RGB y HSV 
 
RGB (sigla en inglés de red, green, blue, en español «rojo, verde y azul») es la 
composición del color en términos de la intensidad de los colores primarios de la luz. 
 
 
Figura 2: Distribución de color RGB 
 
Este sistema se basa principalmente en el modo en que los colores aditivos se 
representan en las pantallas que emiten luz (no se relaciona con la pigmentación, como 
impresoras, que utilizan la codificación de colores sustractivos CMYK), ya que estas se 
componen de píxeles, que son pequeñas fracciones de la pantalla que emiten luz roja, 
verde y azul en diferentes intensidades. 
La intensidad de cada una de las componentes se mide según una escala que va 
del 0 al 255 (ya que por estándar se utilizan 8 bits), y cada color es definido por un 
conjunto de valores escritos entre paréntesis (correspondientes a valores "R", "G" y "B") 
entre comillas y separados por comas. 
De este modo, el rojo se obtiene con (255,0,0), el verde con (0,255,0) y el azul 
con (0,0,255), obteniendo, en cada caso un color resultante monocromático. La ausencia 
de color, es decir el color negro, se obtiene cuando las tres componentes son 0: (0,0,0). 
La combinación de dos colores a su máximo valor de 255 con un tercero con valor 0 da 
lugar a tres colores intermedios. De esta forma, aparecen los colores amarillo (255,255,0), 
cian (0,255,255) y magenta (255,0,255). El color blanco se forma con los tres colores 
primarios a su máximo valor (255,255,255). 
 
Por otro lado, el modelo HSV (del inglés Hue, Saturation, Value – Matiz, 
Saturación, Valor), también llamado HSB (Hue, Saturation, Brightness – Matiz, 
Saturación, Brillo), define un modelo de color en términos de sus componentes. 
 
Figura 3: Distribución de color HSV 
Problema de Ingeniería- Técnicas Digitales III 
11 
MATIZ: 
Se representa como un grado de ángulo cuyos valores posibles van de 0 a 360° 
(aunque para algunas aplicaciones se normalizan del 0 al 100%). Cada valor corresponde 
a un color. 
Disponemos de 360 grados dónde se dividen los 3 colores RGB, eso da un total 
de 120º por color, sabiendo esto podemos recordar que el 0 es rojo RGB(1, 0, 0), 120 es 
verde RGB(0, 1, 0) y 240 es azul RGB(0, 0, 1). Para colores mixtos se utilizan los grados 
intermedios, el amarillo, RGB(1, 1, 0) está entre rojo y verde, por lo tanto 60º. 
● 0º = RGB(1, 0, 0) 
● 60º = RGB(1, 1, 0) 
● 120º = RGB(0, 1, 0) 
● 180º = RGB(0, 1, 1) 
● 240º = RGB(0, 0, 1) 
● 300º = RGB(1, 0, 1) 
● 360º = 0º 
SATURACIÓN: 
Se representa como la distancia al eje de brillo negro-blanco. Los valores posibles 
van del 0 al 100%. A este parámetro también se le suele llamar "pureza" por la analogía 
con la pureza de excitación y la pureza colorimétrica de la colorimetría. Cuanto menor 
sea la saturación de un color, mayor tonalidad grisácea habrá y más decolorado estará. 
VALOR: 
Representa la altura en el eje blanco-negro. Los valores posibles van del 0 al 
100%. 0 (cero) siempre es negro. Dependiendo de la saturación, 100 podría ser blanco o 
un color más o menos saturado. 
 
Problema de Ingeniería- Técnicas Digitales III 
12 
Protocolos que intervienen en el proyecto 
ProfiBus 
 
PROFIBUS (Process Field Bus) es un estándar de red digital de campo abierto 
(bus de campo) que se encarga de la comunicación entre los sensores de campo y el 
sistema de control o los controladores. 
La primera idea durante su desarrollo fue la de implementar soluciones 
PROFIBUS en industrias de automatización de fábricas, luego en industrias de procesos, 
fabricación, etc. Esta red de comunicación es adecuada tanto para aplicaciones rápidas y 
sensibles como para tareas de comunicación complejas. 
En cuanto al desarrollo, la tecnología Process Field Bus es estable y está en 
constante evolución de desarrollo. 
 
La tecnología de la información desempeñó un papel decisivo en el desarrollo de 
la automatización industrial y cambió las jerarquías y estructuras de las empresas. En la 
actualidad, ha llegado al entorno industrial y a sus diversos sectores, desde las industriasde proceso y fabricación hasta los edificios y sistemas logísticos. 
La posibilidad de comunicación entre los dispositivos y el uso de mecanismos 
estandarizados, abiertos y flexibles son componentes esenciales del concepto de 
automatización actual. La comunicación se expande rápidamente en la dirección 
horizontal a nivel de campo, así como en la dirección vertical integrando todos los niveles 
jerárquicos de un sistema de automatización. 
 De acuerdo con las características de la aplicación y el coste máximo a alcanzar, 
una combinación gradual de diferentes sistemas de redes de comunicación industrial 
como Ethernet Industrial, PROFIBUS y AS-Interface son las condiciones de red abierta 
ideales para los procesos industriales. 
 En cuanto a los actuadores/sensores, el AS-Interface es el sistema de 
comunicación de datos perfecto, ya que las señales de datos binarias se transmiten a través 
de un bus de datos extremadamente sencillo y de bajo coste, junto con la fuente de 
alimentación de 24Vdc necesaria para alimentar dichos sensores y actuadores. 
Otra característica importante es que los datos se transmiten en ciclos, de forma 
muy eficiente y rápida. 
A nivel de campo, los periféricos distribuidos, como módulos de E/S, 
transductores, accionamientos, válvulas y paneles de operación funcionan en los sistemas 
de automatización, a través de un eficiente sistema de comunicación en tiempo real, el 
PROFIBUS DP o PA. 
La transmisión de datos de proceso se realiza en ciclos, mientras que las alarmas, 
los parámetros y los diagnósticos se transmiten sólo cuando es necesario, de forma no 
cíclica. 
En lo que respecta a las células, los controladores programables como los PLC y 
los ordenadores de ingeniería necesitan comunicarse entre sí, por lo tanto requieren que 
se transfiera un gran paquete de datos en varias y potentes funciones de comunicación. 
Además, la integración eficiente en los sistemas de comunicación corporativos 
existentes, como Intranet, Internet y Ethernet es absolutamente obligatoria. Esta 
necesidad se satisface mediante el protocolo PROFINET. 
La revolución de la comunicación industrial en la tecnología juega un papel 
fundamental en la optimización de los sistemas de proceso y ha hecho una valiosa 
contribución para mejorar el uso de los recursos. 
 
Problema de Ingeniería- Técnicas Digitales III 
13 
TCP/IP 
 
Los protocolos son conjuntos de normas para formatos de mensaje y 
procedimientos que permiten a las máquinas y los programas de aplicación intercambiar 
información. Cada máquina implicada en la comunicación debe seguir estas normas para 
que el sistema principal de recepción pueda interpretar el mensaje. El conjunto de 
protocolos TCP/IP puede interpretarse en términos de capas (o niveles). 
 
El modelo TCP/IP describe la funcionalidad de los protocolos que forman la suite 
de protocolos TCP/IP. Estos protocolos, que se implementan en los hosts emisores y 
receptores, interactúan para brindar una entrega extremo a extremo de las aplicaciones a 
través de la red. 
 
 
Figura 4: Capas del protocolo TCP/IP 
 
 
Problema de Ingeniería- Técnicas Digitales III 
14 
Capa de aplicación: Representa datos para el usuario más el control de la 
codificación y de dialogo. Ofrece a las aplicaciones la capacidad de acceder a los servicios 
de las otras capas y define los protocolos que utilizan las aplicaciones para intercambiar 
datos. Los protocolos de la capa de aplicación más conocidos son HTTP, FTP, SMTP, 
Telnet, DNS, SNMP y el Protocolo de información de enrutamiento (RIP). 
 
Capa de transporte: Admite la comunicación entre distintos dispositivos de 
distintas redes. Se encarga de proporcionar comunicación de sesión y datagrama a la capa 
de aplicación de servicios . Los protocolos principales de esta capa son TCP y UDP. TCP 
proporciona un servicio de comunicaciones individual, fiable y orientado a la conexión. 
Es responsable de la secuenciación y detección de los paquetes enviados y de la 
recuperación de los paquetes perdidos en la transmisión. UDP proporciona un servicio de 
comunicaciones individual o grupal, sin conexión y poco fiable. Este se utiliza 
normalmente cuando la cantidad de datos a transferir es pequeña, como por ejemplo 
cuando estos caben en un solo paquete. 
 
Capa de internet: Determina la mejor ruta a través de la red, es responsable de las 
funciones de direccionamiento, empaquetado y enrutamiento del host. Los protocolos 
centrales de la capa de Internet son IP, Protocolo de resolución de direcciones (ARP), 
Protocolo de mensajes de control de Internet (ICMP) y Protocolo de administración de 
grupos de Internet (IGMP). En esta capa, el IP agrega la cabecera a los paquetes, lo que 
se conoce como dirección IP. En la actualidad existen tanto dirección IPv4 (32 bits) como 
dirección IP IPv6 (128 bits). 
 
Capa de acceso a la red: La capa de acceso a la red (o capa de enlace) es 
responsable de colocar los paquetes TCP/IP en el portador de datos de la red y recibir los 
paquetes TCP/IP situados fuera del mismo. El protocolo TCP/IP está diseñado para ser 
independiente del método de acceso a la red, el formato de la trama de red y el potador. 
En otras palabras, este protocolo es independiente de cualquier tecnología de red 
específica, lo que hace que este se pueda utilizar para conectar diferentes tipos de red, 
como Ethernet, Token Ring y Modo de transferencia asíncrono (ATM). 
 
 
TCP/IP define cuidadosamente cómo se mueve la información desde el remitente 
hasta el destinatario. En primer lugar, los programas de aplicación envían mensajes o 
corrientes de datos a uno de los protocolos de la capa de transporte de Internet, UDP (User 
Datagram Protocol) o TCP (Transmission Control Protocolo). Estos protocolos reciben 
los datos de la aplicación, los dividen en partes más pequeñas llamadas paquetes, añaden 
una dirección de destino y, a continuación, pasan los paquetes a la siguiente capa de 
protocolo, la capa de red de Internet. 
La capa de red de Internet pone el paquete en un datagrama de IP (Internet 
Protocol), pone la cabecera y la cola de datagrama, decide dónde enviar el datagrama 
(directamente a un destino o a una pasarela) y pasa el datagrama a la capa de interfaz de 
red. 
La capa de interfaz de red acepta los datagramas IP y los transmite como tramas 
a través de un hardware de red específico, por ejemplo redes Ethernet o de Red en anillo. 
 
 
Problema de Ingeniería- Técnicas Digitales III 
15 
Protocolos principales de TCP/IP 
 
 
 
Problema de Ingeniería- Técnicas Digitales III 
16 
Modelo OSI 
El modelo OSI fue desarrollado en 1984 por la organización ISO (International 
Organization for Standarization). Este estándar perseguía el ambicioso objetivo de 
conseguir interconectar sistema de procedencia distinta para que esto pudieran 
intercambiar información sin ningún tipo de impedimentos debido a los protocolos con 
los que estos operaban de forma propia según su fabricante. 
 
El modelo OSI está conformado por 7 capas o niveles de abstracción. Cada uno 
de estos niveles tendrá sus propias funciones para que en conjunto sean capaces de poder 
alcanzar su objetivo final. Precisamente esta separación en niveles hace posible la 
intercomunicación de protocolos distintos al concentrar funciones específicas en cada 
nivel de operación. 
 
Otra cosa que debemos tener muy presente es que el modelo OSI no es la 
definición de una topología ni un modelo de red en sí mismo. Tampoco especifica ni 
define los protocolos que se utilizan en la comunicación, ya que estos están 
implementados de forma independiente a este modelo. Lo que realmente hace OSI es 
definir la funcionalidad de ellos para conseguir un estándar. 
 
 
Niveles que componen el modelo OSI 
 
Problema de Ingeniería- Técnicas Digitales III 
17 
La capa de aplicación: proporciona los servicios utilizados por las aplicaciones 
para quelos usuarios se comuniquen a través de la red. Es el nivel más cercano al usuario. 
 
La capa de presentación: define el formato de los datos que se van a intercambiar 
entre las aplicaciones, ofreciendo un conjunto de servicios para la transformación de 
datos. 
 
La capa de sesión: proporciona los mecanismos para controlar el diálogo entre las 
aplicaciones de los sistemas finales: abre, mantiene y cierra la sesión entre dos sistemas. 
 
La capa de transporte: permite intercambiar datos entre sistemas finales, 
dividiendo el mensaje en varios fragmentos. El servicio de transporte puede ser orientado 
o no orientado a conexión, tomando en cuenta la unidad de transferencia máxima (MTU). 
 
La capa de red: se encarga de definir el camino que seguirán los datos desde el 
origen hasta su destino a través de una o más redes conectadas mediante dispositivos de 
enrutamiento (router). 
 
La capa de enlace: se ocupa del direccionamiento físico dentro de cualquier 
topología de red, esta capa nos permite activar, mantener y deshabilitar la conexión, así 
como la notificación de errores. 
 
La capa física: controla las señales por donde viajaran los datos (cable de par 
trenzado, fibra óptica, radio frecuencia). 
 
 
Nombres y funciones básicas de cada una de las capas 
 
Problema de Ingeniería- Técnicas Digitales III 
18 
Capas con el modelos TCP/IP y OSI 
 
Ambos modelos son de gran importancia al momento de estudiar las comunicaciones en 
redes, ya que definen la comunicación por medio de una arquitectura basada en capas. 
Sin embargo, existen algunas características entre uno y otro que los hacen diferentes, 
aunque el propósito para el que fueron creados sea el mismo. 
 
 
 
En lo que se refiere al modelo OSI, se trata de un conjunto de siete capas, siendo la capa 
de aplicación la más cercana al usuario y la capa física la más alejada a él. En cada una 
de sus capas se ofrece un servicio que contribuye con una parte de la comunicación, dicho 
servicio es implementado a través de un protocolo y la manera de comunicarse con sus 
capas adyacentes es llevada a cabo mediante el establecimiento de una interfaz, es decir, 
la capa n solo puede comunicarse con las capas n-1 y n+1, siendo la capa física la que 
realmente conecta a ambas máquinas, ya que es a través de esta donde fluyen los mensajes 
en forma de bits. 
 
 Durante el envío de un mensaje desde una máquina A hacia otra máquina B, el mensaje 
debe iniciar su viaje desde la capa de aplicación de la maquina A, hacer un descenso en 
cada una de sus capas hasta llegar a la capa física (encapsulamiento). Una vez que esto 
sucede, el mensaje debe viajar por el medio (en forma de señales eléctricas o 
electromagnéticas) hasta llegar a la maquina B, donde será recibido por la capa física y 
transferido a sus capas superiores para llevar a cabo el proceso inverso 
(desencapsulamiento), la transmisión concluye cuando el mensaje llega a la capa de 
aplicación en B. 
 
 Sin embargo, aunque OSI es un excelente modelo, solo ha servido como referente teórico 
por lo general y detallado que es; mientras que en términos prácticos se opta por TCP/IP 
debido a que los protocolos para este último son más adecuados a la realidad. 
 
 
Problema de Ingeniería- Técnicas Digitales III 
19 
Comparación de los modelos: 
 
 
 La semejanza mas importante las encontramos en los paralelos de las capas de red y las 
capas de transporte. La principal ventaja de los modelos en capas es su modularidad. 
 
RTSP 
 
Real Time Streaming Protocol (RTSP) es un protocolo de nivel de aplicación para 
la transferencia de datos de medios en tiempo real. Utilizado para establecer y controlar 
sesiones de medios entre puntos finales, RTSP es un protocolo de canal de control entre 
el cliente de medios y el servidor de medios. La comunicación típica es entre un cliente 
y un servidor multimedia de streaming. 
La transmisión de medios desde una red privada a una red pública requiere 
traducir direcciones IP y números de puerto a través de la red. La funcionalidad Citrix 
ADC incluye una puerta de enlace de capa de aplicación (ALG) para RTSP, que se puede 
utilizar con NAT de gran escala (LSN) para analizar la secuencia de medios y realizar los 
cambios necesarios para garantizar que el protocolo continúe funcionando a través de la 
red. 
La forma en que se realiza la traducción de direcciones IP depende del tipo y la 
dirección del mensaje y del tipo de medios admitidos por la implementación cliente-
servidor. Los mensajes se traducen de la siguiente manera: 
 
● Solicitud saliente: Dirección IP privada a la dirección IP pública propiedad de 
Citrix ADC denominada dirección IP de grupo LSN. 
● Respuesta entrante: Dirección IP de grupo LSN a dirección IP privada. 
● Solicitud entrante: Sin traducción. 
● Respuesta saliente: Dirección IP privada a la dirección IP del grupo LSN. 
Problema de Ingeniería- Técnicas Digitales III 
20 
Desarrollo 
Introducción 
 
En esta sección se llevará a cabo el desarrollo del proyecto teniendo en cuenta las 
conexiones con el proceso, el código utilizado y detallado, las diferentes detecciones que 
se implementan, las comunicaciones con los dispositivos, entre otras cosas, todo 
representado por diagramas en bloques. 
Conexión con el proceso 
 
 La cámara IP estará conectada a un servidor donde correrá el programa 
desarrollado en este proyecto. 
 El servidor está conectado a través de una red ethernet al PLC que controla el 
proceso de descarga de camiones en la plataforma volcadora. 
 El PLC tiene una conexión a un panel HMI que utiliza el operador para controlar 
la plataforma y a una ET200 en campo donde se conectan las señales que se utilizan en 
el proceso. 
 En el módulo de entradas analógicas de la ET200 está conectado un sensor de 
inclinación que enviará una señal de 4-20 mA escalado a un ángulo de 0-90°. 
 A modo de seguridad, en el módulo de salidas digitales, se agrega una alarma y 
en el módulo de entradas digitales una parada de emergencia en campo para que actúen 
en caso de que el programa detecte una falla. 
En caso de requerirse, la empresa puede automatizar la plataforma de inclinación 
para que la misma minimice su ángulo de inclinación en caso de que se detecte que no 
está cayendo granos de los camiones. 
 
 
Figura 5: Diagrama de conexión con el proceso 
Problema de Ingeniería- Técnicas Digitales III 
21 
Iluminación de la zona de análisis 
 
 Debido a que se realiza una preselección de pixeles por color en el código 
implementado y que la configuración RGB de los mismos varía considerablemente según 
la iluminación con la que cuenta, se optó por la utilización de HSV pero como se seguia 
notanto una dependencia con la iluminación del medio se concluyo que la mejor solución 
era el uso de iluminación artificial. 
Se dimensionó el reflector necesario para independizar el sistema de los cambios 
de iluminación por el clima, hora del día u otros factores. 
 Para esto se estandarizó una distancia de seis metros entre el reflector y la 
plataforma volcadora. Se tuvo en cuenta que el reflector debe estar al costado de la calle 
por la cual circulan los camiones. 
 Luego se tuvo en cuenta un promedio de una superficie de 3m de ancho por 3 
metros de alto correspondiente a la parte trasera del acoplado a la cual estará apuntando 
la cámara. 
 
Figura 6: Diagrama de colocación de ilumunación 
 
Por tabla, se sabe que para un área de trabajos especializados se necesitan 2000 
lux. 
 
 
Tabla 1: Lux en función de la actividad 
 
Como tenemos un área de (3m x 3m) = 9 metros cuadrados para iluminar: para 
obtener el número de lúmenes que necesitamos que tenga nuestro reflector, multiplicamos 
los lux necesarios por el área a iluminar. 
 
2000x9=18000 lm 
 
Por lo tanto, viendo el catálogo (Flow | Lumenac Iluminación Led) de Lumenac 
flow, concluimos en que se debe colocar el modelo FLOW 180 (iluminaciónled - 180w) 
 
 
Tabla 2: Sección del catálogo de Lumenac flow 
https://lumenac.com.ar/product/flow/
Problema de Ingeniería- Técnicas Digitales III 
22 
Introducción al desarrollo del código 
 
Para el desarrollo del código se usó principalmente el IDE PyCharm, el cual es 
una herramienta que facilita la programación debido a sus herramientas de desarrollo 
incorporadas y a las sugerencias de optimización de código. 
Dicho IDE cuenta con una versión gratuita, cuyas prestaciones fueron más que 
suficientes para el desarrollo del proyecto. A continuación se puede observar la interfaz 
del mismo y algunas de sus formas de ayuda. 
 
 
Figura 7: IDE PyCharm 
 
Una vez que teníamos instalada dicha herramienta, se inició un proyecto en la 
misma, y debido a que dicha aplicación crea entornos virtuales para cada proyecto, se 
debieron instalar las librerías que se utilizaron. 
Si bien ya se hicieron mención de las librerías principales en el marco teórico, nos 
gustaría mencionar brevemente para que se utilizan cada una de las librerías importadas, 
en las siguientes líneas de código. 
 
import queue 
import threading 
import cv2 
import numpy as np 
import math 
import time 
import snap7 
import pyodbc 
 
A continuación se describe el uso que se les día a las mismas en el desarrollo: 
 
● queue: se utilizó para la creación de una pila tipo FIFO con posibilidad de 
comunicación entre distintos hilos de ejecución. 
● threading: se utilizó para la creación de los diferentes hilos que se inicializan en 
Problema de Ingeniería- Técnicas Digitales III 
23 
el código. 
● cv2: es la librería de OpenCV descrita anteriormente. 
● numpy: se utilizó para la creación de matrices 
● math: es una librería con funciones matemáticas. 
● time: es una librería que nos permite saber el tiempo actual, entre muchas otras 
funciones. 
● snap7: es la librería python-snap7 descrita anteriormente. 
● pyodbc: es una librería para la comunicación con la base de datos SQLServer. 
 
Nos gustaría aclarar que la comunicación con el PLC, si bien está presente el 
código en el práctico, no se pudo probar debido a que no contamos con un PLC Siemens 
(Como el que tiene la planta donde se implementará en un futuro) y se debieron crear 
simulaciones del mismo para poder testear las demás partes de la IA desarrollada. 
Pruebas anteriores a la implementación final 
 
Como se comentó anteriormente, antes de empezar el desarrollo final se empezó 
con la realización de diversas pruebas las cuales sirvieron de base y agilizaron la 
programación del proyecto. Las principales pruebas que se desarrollaron fueron en base 
a la detección del caudal, empezando con pruebas de detección de color y siguiendo con 
pruebas de detección de movimiento. Posteriormente se realizaron pruebas de 
comunicación con las cámaras, bases de datos y el PLC pero para una mejor explicación 
de dichos procesos se van a desarrollar durante la explicación final. 
Detección de Color 
 
Como se puede observar en el código presente en los anexos, para la realización 
de la detección de color se crea una máscara con todos los pixeles cuya configuración 
HSV este dentro de los limites preestablecidos. Para llevar a cabo dichas pruebas, estos 
límites fueron tomados en tiempo real a partir de barras deslizantes como se puede 
observar en la siguiente figura. 
 
 
Figura 8: Detección de color con python 
Problema de Ingeniería- Técnicas Digitales III 
24 
Se llegó a la conclusión de que esta técnica se puede implementar sin mayores 
problemas, sin embargo hay que considerar los temas de iluminación detallados 
anteriormente ya que debido a la misma la configuración de HSV puede variar. Otro de 
los problemas, es que con esta técnica se detecta todo el grano, pero para la detección de 
caudal se necesita detectar solamente lo que está cayendo del camión y no aquello que ya 
está en la superficie de la plataforma volcadora. 
Detección de Movimiento 
 
Para la detección de movimiento, como se puede observar en el código presente 
en la sección de anexos, se utiliza una técnica que realiza una diferencia entre dos frame 
consecutivos obteniendo solamente los píxeles que son diferentes entre ambas imágenes. 
 
 
Figura 9: Detección de movimiento con python 
 
El problema que se encontró con esta técnica fue que detecta todo el movimiento 
en la imagen, por lo que nos encontramos con la necesidad de crear alguna máscara que 
preseleccione un único sector de interés. 
 
 
Figura 10: Detección de operario no buscada 
Problema de Ingeniería- Técnicas Digitales III 
25 
Visión general del código y diagramas en bloques 
 
 
Para el desarrollo del programa de visión artificial, se optó por un proceso en 
múltiples hilos de procesamiento, esto se logra mediante la librería “threading” que 
divide la ejecución del código en diferentes núcleos del procesador. Cabe destacar que 
dicha decisión se tomó por los temas de seguridad detallados en la sección 
correspondiente. 
 
 
 
 
Figura 11: Comunicación entre los hilos del programa. 
 
 
Como se puede observar en la figura anterior se optó por dividirlo en 3 hilos que 
se comunican entre sí mediante determinadas variables y/o procesos. A continuación se 
van a detallar la funcionalidad de cada hilo en particular mediante diagramas de flujo, 
para poder comprender en profundidad el funcionamiento de la visión artificial. 
Se van a describir el código final de implementación, sin embargo en el código 
que se encuentra en anexos se puede encontrar una simulación del proceso mediante un 
video del proceso que nos facilitó la empresa de Bunge para realizar las pruebas. 
 
Problema de Ingeniería- Técnicas Digitales III 
26 
Hilo de comunicación con la cámara 
 
En el presente hilo de comunicación con la cámara, se sigue la lógica de la 
siguiente figura. En la misma se puede observar que como medida de seguridad se le 
podría agregar que en caso de que la cámara no funcione se le mande una señal de alarma 
al PLC, aunque para el alcance de este trabajo nos limitamos a mostrar un mensaje por 
pantalla. 
A continuación pasamos a explicar las líneas principales de este hilo de 
procesamiento. Como se puede observar en las siguientes líneas, este hilo está 
representado en la función “Receive”. 
 
def Receive(): 
 global finalizar 
 print('Inicializando la cámara...') #muestra en pantalla 
 cap = cv2.VideoCapture("rtsp://usuario:contraseña@ip:554") 
 ret, frame = cap.read() 
 q.put(frame) 
 while True: 
 if ret: 
 ret, frame = cap.read() 
 if not q.full(): 
 q.put(frame) 
 if finalizar: 
 cap.release() #libera la cámara 
 break 
 else: 
 print('Error. Reconectando...') 
 #mandar señal de alarma al PLC 
 cap = cv2.VideoCapture("rtsp://usuario:contraseña@ip:554") 
 
En un primer momento, se especifica que la variable “finalizar” es de tipo global, 
esto se hace para que si en el hilo principal se da la orden de terminar el proceso, se pueda 
simultáneamente terminar adecuadamente este hilo, en otras palabras liberar la cámara 
para evitar posibles errores futuros de conexión. 
 
 cap = cv2.VideoCapture("rtsp://usuario:contraseña@ip:554") 
 ret, frame = cap.read() 
 q.put(frame) 
 
En la librería de OpenCv hay definida una función llamada VideoCapture que nos 
facilita la conexión a una cámara mediante ip, solamente pasándole como parámetro el 
enlace para la conexión por el protocolo rtsp. En dicha línea de código se le deben 
modificar el usuario, contraseña e ip según corresponda a la cámara en el lugar a 
implementar. y Posteriormente con el método read() se toma un frame de la cámara, 
devolviendo además en la variable ret, si se capturó de manera adecuada.; y con q.put() 
se guarda el frame en la pila tipo FIFO cuya creación se va a detallar en la explicacióndel hilo principal. 
 
Luego, de realizado esta inicialización, la lógica entra en un bucle infinito dentro 
del cual se van a ir guardando nuevos frame en la pila a medida que el hilo principal los 
va retirando, siempre y cuando la cámara siga en funcionamiento y que no se especifique 
la orden de terminar con el proceso. 
 
 
Problema de Ingeniería- Técnicas Digitales III 
27 
Para un mayor entendimiento se muestra un diagrama en bloques de este proceso 
en particular. 
 
 
Figura 12: Flujo de funcionamiento del hilo de comunicación con la cámara 
 
 
Problema de Ingeniería- Técnicas Digitales III 
28 
Hilo de comunicación con el PLC 
 
El hilo de la comunicación con el PLC es la parte más importante del programa, 
ya que es el medio por el cual le comunicamos a los usuarios la detección del problema 
para evitar lo antes posible los daños potenciales. 
Por tal motivo, vimos en la necesidad de agregar en el caso de que falle su 
conexión una forma de avisarle al usuario de dicho estado, si bien no está implementada 
esta parte se nos ocurrió que podría realizarse mediante el envió de un SMS y/o correo a 
los usuarios finales del programa. 
Como se puede observar en las siguientes líneas, la implementación de dicha 
comunicación se realiza dentro de la función angulo y al igual que en el hilo de 
comunicación con la cámara se utilizan las variables globales “angulo_estatus”, 
“finalizar” y “alarma” para la comunicación con el hilo principal. 
 
def angulo(): 
 global angulo_estatus, finalizar, alarma 
 #desabilitar el acceso optimizado al bloque en el PLC 
 IP = '192.168.1.10' 
 RACK = 
 SLOT = 
 DB_NUMBER_lec = 
 DB_NUMBER_esc = 
 START_ADDRESS_lec = #colocar direccion en bytes donde esta el dato bool 
 START_ADDRESS_esc = #colocar direccion en bytes donde guardar el dato bool 
 SIZE = 1 
 plc = snap7.client.Client(lib_location="snap7.dll") 
 plc.connect(IP, RACK, SLOT) 
 while plc.get_connected(): 
 db = plc.db_read(DB_NUMBER_lec, START_ADDRESS_lec, SIZE) 
 angulo_estatus = bool(db[START_ADDRESS]) 
 if alarma: 
 db1 = plc.db_read(DB_NUMBER_esc, START_ADDRESS_esc, SIZE) 
 snap7.util.set_bool(db1,0,0,True) 
 plc.db_write(DB_NUMBER_esc, START_ADDRESS_esc,db1) 
 alarma = False 
 if finalizar: 
 break 
 print('Error de conexcion con el plc') 
 #en este punto se podría mandar un correo al usuario para informarle que no funciona la 
 #comunicación con el PLC 
 
Antes de entrar en el while, se deben completar los datos de las variables según 
se tenga configurado el PLC Siemens utilizado en el proceso. Dichos datos consisten en 
una IP, para comunicarse mediante ethernet, en el RACK y el SLOT para ubicarlo 
físicamente, así como variables para ubicar en el software del PLC los datos guardar o 
leer. 
 
 plc = snap7.client.Client(lib_location="snap7.dll") 
 plc.connect(IP, RACK, SLOT) 
 while plc.get_connected(): 
 
Una vez configurada la conexión, se pasa a realizar la conexión para lo cual se 
necesita un archivo “snap7.dll” el cual es condición de la librería y se puede obtener desde 
su página oficial. Finalmente entramos en un bucle, siempre y cuando el PLC siga 
conectado. Dentro de dicho while, leeremos constantemente el db con el dato sobre el 
Problema de Ingeniería- Técnicas Digitales III 
29 
ángulo de la plataforma volcadora y en caso de que se deba mandar una alarma, la misma 
se guarda en el PLC y se coloca la variable global alarma en 0 para informar el hilo 
principal que ya se notificó. Cabe destacar que el PLC no informa el grado de inclinación 
que tiene la plataforma, sino un dato booleano con un 1 o 0 dependiendo de si la misma 
está por encima o no, respectivamente, del ángulo crítico. 
 
Para un mayor entendimiento en la siguiente figura se puede observar el diagrama 
en bloques de la lógica detallada. 
 
Figura 12: Flujo de funcionamiento del hilo de comunicación con el PLC 
 
Problema de Ingeniería- Técnicas Digitales III 
30 
Hilo principal 
 
 
En el hilo principal ocurre la lógica principal del programa, además de la 
comunicación con la base de datos, la estimación categórica del caudal y la inicialización 
y finalización de los hilos de comunicación con PLC y la cámara. Por tal motivo, se va a 
dar una presentación general y posteriormente se detallarán ciertos bloques más 
específicos. A continuación se muestra de forma resumida el código del hilo, obviando 
las partes de código que se detallarán más adelante. 
 
 
finalizar = 0 #variable para comunicar los hilos de procesamiento 
angulo_estatus = False 
a=0 
font = cv2.FONT_HERSHEY_SIMPLEX 
alarma = False 
caudal = False 
bandera = 0 
bandera1 = 0 
bandera2 = 0 
tiempo_descarga = 0 
tiempo_inicial_riesgo = 0 
tiempo_inicial = 0 
tiempo_riesgo = 0 
 
#CONEXION A BASE DE DATOS 
 
#me conecto a la base de datos 
#INICIO DE LA LOGICA# 
 
#Creó la pila 
#Inicializo los subprocesos 
 
while True: 
 
 #Cálculo del caudal 
 
 if caudal: 
 if bandera == 0: 
 bandera = 1 
 tiempo_inicial = time.time() 
 if bandera2 == 0 and bandera == 1 and angulo_estatus: 
 tiempo_inicial_riesgo = time.time() 
 bandera2 = 1 
 else: 
 if bandera == 0: 
 if angulo_estatus: 
 alarma = True 
 if bandera == 1: 
 if bandera1 == 0: 
 tiempo_descarga = time.time() - tiempo_inicial 
 bandera1 = 1 
 if not angulo_estatus: 
 if not bandera2: 
 bandera = 0 
 bandera1 = 0 
 bandera2 = 0 
 #logica envio de datos al SQL Server 
 else: 
Problema de Ingeniería- Técnicas Digitales III 
31 
 tiempo_riesgo = time.time() - tiempo_inicial_riesgo 
 bandera = 0 
 bandera1 = 0 
 bandera2 = 0 
 #logica envio de datos al SQL Server 
 
 
Para explicar en más detalle la lógica principal del programa nos vamos a basar 
en el siguiente diagrama en bloques simplificado, ya que como comente, solo es una 
fracción del código. 
 
 
Figura 13: Flujo de funcionamiento del hilo principal 
 
A partir del diagrama anterior, nos gustaría dejar claro en el proceso se podía dar 
en dos ocasiones el caso de que la plataforma está arriba del ángulo crítico y que no esté 
descargando. Dichos casos se dan cuando el camión todavía no descargo, es decir en la 
situación de peligro ya que se considera que el mismo está cargado y puede colapsar en 
cualquier momento, y cuando el camión ya descargo y esta por terminar el proceso. Por 
ende en la lógica se tuvo que tener en cuenta esta problemática, para no mandar un falso 
positivo al PLC. También se pensó, que se podría avisar al operario que el proceso 
terminó para que baje la plataforma y se reanude el proceso con otro camión. 
Si bien con lo visto hasta ahora, se puede entender el funcionamiento principal, 
todavía quedan partes del mismo que no están muy claras; por ende se va a pasar a 
explicar algunos puntos, que si bien no son claves, son pilares del código programado. 
Entre ellos se encuentran: 
● La lógica de comunicación con la base de datos SQLServer 
● La lógica de multiprocesamiento 
● La estimación del caudal categórica. 
 
 
Problema de Ingeniería- Técnicas Digitales III 
32 
Detalles del Multiprocesamiento 
 
Para lograr una independencia entre los procesos críticos del sistema se optó por 
usar la librería “threading” que nos permite ejecutar el sistema en múltiples hilos, 3 para 
ser exactos en este caso. 
En el mismo hilo principal, se definen las variables “finalizar” y “angulo_estatus” 
con valores lógicos 0/1 o True/False, dichas variables se llaman como globales dentro de 
las funcionescorrespondientes a los restantes subprocesos. Por ende, al modificarse las 
mismas en cualquier subproceso, el valor de la misma se actualiza de forma inmediata en 
los restantes. 
 
q = queue.Queue(maxsize=5) #pila tipo fifo 
p1 = threading.Thread(target=Receive) 
p2 = threading.Thread(target=angulo) 
p1.start() #empiezo a capturar la cámara 
p2.start() #conecto con el PLC 
 
Posteriormente, se crea una pila de tamaño máximo 5, dicho tamaño se debe a que 
es el que encontramos óptimo para compensar el retardo por la reconexión de la cámara 
en caso de fallar la misma. Además, se definen los subprocesos mediante las funciones 
explicadas anteriormente y con el método start() se inicializan. 
 
if cv2.waitKey(1) & 0xFF == ord('q'): 
 finalizar = 1 
 break 
 
Más adelante en el código, específicamente al final del bucle principal del hilo 
principal, se observa la anterior condición if. En dicha condición, en el caso de que el 
usuario teclee la letra ‘q’ en el teclado, se setea la variable finalizar en 1, con lo que los 
subprocesos de comunicación finalizarán y además sale del bucle principal en que se 
encuentra. 
Una vez que sale está terminando el sistema, con los métodos join() se espera que 
se terminen de cerrar los restantes subprocesos para un correcto final de ejecución. 
 
Estimación categórica del caudal 
 
En base a las pruebas realizadas antes de empezar el desarrollo del sistema, nos 
encontrábamos con los siguientes problemas: 
● La detección de color detecta todo el grano, pero para la detección de caudal se 
necesita detectar solamente lo que está cayendo del camión y no aquello que ya 
está en la superficie de la plataforma volcadora. 
● La detección de movimiento detecta todo el movimiento en la imagen, incluyendo 
operarios. 
 
Para solucionar estos problemas, se optó por combinar ambas técnicas con lo que 
se logró detectar el movimiento únicamente del grano, pero al no funcionar sólo sobre el 
grano que se está descargando además se tuvo que aplicar una máscara, es decir, 
preseleccionar únicamente la sección donde se encuentra dicho caudal. 
A continuación se pueden visualizar los diferentes estados del caudal que se 
detectan con el sistema. 
 
Problema de Ingeniería- Técnicas Digitales III 
33 
 
 
 
 
Figura 14: Detección categórica del caudal y toma del tiempo de descarga al finalizar el 
proceso 
 
Los pasos que se realizan para la estimación categórica del caudal se resumen en 
el siguiente diagrama en bloques. 
 
 
Figura 15: Flujo de funcionamiento de la estimación del caudal. 
Problema de Ingeniería- Técnicas Digitales III 
34 
Como se puede observar, en un primer momento se toman dos frame consecutivos 
mediante las siguiente líneas de código 
 
while True: 
 if q.empty() != True: # si no está vacía la pila 
 frame1 = q.get() 
 a=1 
 if q.empty() != True and a==1: # si no esta vacia la pila 
 frame2 = q.get() 
 break 
 
Se hace de esta forma porque la detección de caudal se realiza mediante la 
cantidad de movimiento que se detecta en el área seleccionada, y dicho movimiento se 
realiza haciendo la diferencia entre dos frame. El método get de la pila, recupera el un 
frame de la pila tipo FIFO y lo elimina de la misma, liberando el espacio para el agregado 
de uno nuevo mediante el hilo correspondiente. 
 
dim = frame1.shape #calculo las dimensiones 
img1 = mascara(imag=frame1, dimen=dim) # aplico la mascara 
img2 = mascara(imag=frame2, dimen=dim) # aplico la mascara 
 
Posteriormente, se aplican las máscaras a los frame tomados anteriormente, esto 
se realiza mediante una función que desarrollamos que consiste en crear una matriz de las 
dimensiones de la imagen capturada, con 0 en los pixeles que no se quieren analizar y 1 
en los que sí; para posteriormente aplicar una operación entre dicha matriz y el frame para 
obtener los resultados de las figuras al inicio de esta sección. Dicha función se puede 
encontrar en la sección de anexos. 
Una vez que se tienen los dos frame, ya dentro del bucle, se crea una nueva 
máscara con el rango de colores que se definió, dejando en este caso todo el grano dentro 
de la primera máscara que se creó. Cabe destacar que dicha operación se realiza en dos 
frames consecutivos. Además, con la función findContours() se buscan los contornos de 
dicha máscara creada. 
 
while True: 
 l_hsv = np.array([2, 75, 104]) # Defino el valor bajo de hsv 
 h_hsv = np.array([28, 255, 255]) # Defino el valor alto de hsv 
 
 hsv1 = cv2.cvtColor(img1, cv2.COLOR_BGR2HSV) 
 mask1 = cv2.inRange(hsv1, l_hsv, h_hsv) # Creo una máscara 
 res1 = cv2.bitwise_and(img1, img1, mask=mask1) # Hago el filtrado 
 
 hsv2 = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV) 
 mask2 = cv2.inRange(hsv2, l_hsv, h_hsv) # Creo una máscara 
 res2 = cv2.bitwise_and(img2, img2, mask=mask2) # Hago el filtrado 
 
 contornos_soja, _ = cv2.findContours(mask1, cv2.RETR_EXTERNAL, 
cv2.CHAIN_APPROX_NONE) 
 
Una vez que se tienen los frame en las condiciones descritas, se realiza la 
diferencia en busca del movimiento, y posteriormente a dicha diferencia se le aplican 
diferentes filtros y/o transformaciones para mejorar la detección y se grafican sobre el 
frame tomado como realimentación alternativa al usuario. 
 
 diff = cv2.absdiff(res1, res2) 
 gris = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY) 
 difuminado = cv2.GaussianBlur(gris, (3, 3), 3) 
Problema de Ingeniería- Técnicas Digitales III 
35 
 _, binario = cv2.threshold(difuminado, 30, 255, cv2.THRESH_BINARY) 
 limpio = cv2.dilate(binario, (3, 3), iterations=3) 
 contornos, _ = cv2.findContours(limpio, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 
 cant = 0 
 for contorno in contornos: 
 (x, y, w, h) = cv2.boundingRect(contorno) 
 if cv2.contourArea(contorno) > 50: 
 continue 
 cv2.circle(img1, ((int)(x + w / 2), (int)(y + h / 2)), (int)(math.sqrt(w * h)), (0, 255, 0), -1) 
 cant += 1 
 cv2.putText(img1, 'Estado: {}, {}'.format('Movimiento', cant), (10, 20), font, 0.7, (255, 0, 0), 2) 
 
Si bien, para una estimación más precisa del caudal se necesita mezclar la cantidad 
de movimiento y el área que se detectó, para una estimación categórica nos bastó con el 
cálculo del área a partir de los contornos calculados. Sin embargo, en las líneas anteriores 
mostramos una base de cómo se podría calcular el movimiento para que con una lógica 
extra se pueda estimar el caudal de forma continua ya dejando de lado la estimación 
categórica que se implementó. 
Como se comentaba, para el cálculo del área se utiliza la función contourArea 
para cada contorno que se había encontrado, y posteriormente según su valor final se 
estima cuánto caudal hay actualmente. 
 
 area = 0 
 for contorn in contornos_soja: 
 area += cv2.contourArea(contorn) 
 
 if (area > 11000): 
 cv2.putText(img1, 'Caudal: {}'.format('Mucho'), (10, 50), font, 0.7, (0, 0, 255), 2) 
 caudal = True 
 elif (area < 11000) and (area > 8000): 
 cv2.putText(img1, 'Caudal: {}'.format('Medio'), (10, 50), font, 0.7, (0, 0, 255), 2) 
 caudal = True 
 elif (area < 8000) and (area > 4000): 
 cv2.putText(img1, 'Caudal: {}'.format('Bajo'), (10, 50), font, 0.7, (0, 0, 255), 2) 
 caudal = True 
 elif (area < 4000): 
 cv2.putText(img1, 'Caudal: {}'.format('Nulo'), (10, 50), font, 0.7, (0, 0, 255), 2) 
 caudal = False 
 
Finalmente, se guarda el segundo frame en el frame 1 y se toma un segundo frame, 
con el objetivo de repetir el bucle. 
 
 img1 = img2 
 while True: 
 if q.empty() != True: 
 frame2 = q.get() 
 img2 = mascara(imag=frame2, dimen=dim) # aplico la mascara 
 break 
 
Nos gustaría hacer una mención especial a la resolución de la cámara que se utilizó 
para las pruebas. Si bien la única parte del código que sufrirían modificaciones,de utilizar 
otra resolución serían los límites de áreas que estiman el caudal, según pruebas que se 
realizaron una resolución de 640x480 (resolución utilizada en las capturas al comienzo de 
la sección) es suficiente para un correcto funcionamiento. No se optó por una resolución 
más alta, porque no aportaba una mejora significativa y estaríamos produciendo un 
cómputo innecesario, además de que se necesita una mejor conexión con la cámara ip 
(para evitar pérdida de frame en la comunicación). 
Problema de Ingeniería- Técnicas Digitales III 
36 
Comunicación con la base de datos 
 
El usuario final, como ya se comentó, además de las alarmas precisaba conocer 
los tiempos en que el camión estaba descargando y el tiempo en que la plataforma estaba 
en suspensión, si bien este último dato se podría guardar directamente desde el PLC, el 
guardarlo desde el programa no le agrega un error ya que para el mismo se utiliza solo la 
comunicación con el PLC 
Antes de pasar a explicar la comunicación con la base de datos, se muestra a 
continuación la estructura de la misma, cabe destacar que la columna “Fecha_carga” ya 
guarda por defecto la fecha y hora en que se ejecuto la query de inserción de datos, por 
lo que no es necesario mandar la fecha. 
 
ID Cámara Tiempo_descarga Tiempo_riesgo Fecha_carga 
 
Tabla 3: Estructura de la tabla utilizada en la base de datos. 
 
A continuación se va a explicar la comunicación con la base de datos SQLServer, 
la misma tiene tres partes principales: la conexión, la obtención de la estructura, el envío 
de datos a la base. 
 
server = '' 
bd = '' 
user = '' 
passw = '' 
tabla = '' 
try: 
 conexion = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL server};SERVER=' + 
 server + ';DATABASE=' + bd + ';UID=' + user + ';PWD=' + passw) 
 print('Conexion exitosa con la base de datos.') 
 est_tabla = SQL_estructura(tabla, conexion) 
 print(est_tabla) 
except: 
 print("Error al conectar con la base de datos.") 
 
Para la conexión con la base de datos, es necesario definir el servidor, el nombre 
de la misma, el usuario y contraseña con el que se va a acceder, y el nombre de la tabla 
con la que se va a trabajar. Posteriormente, se realiza la conexión con la base de datos y 
a través de la función “SQL_estructura” se obtiene la estructura de la misma para 
posteriormente realizar la query para guardar los datos. Cabe destacar que en caso de 
fallar la conexión, la misma se informa, pudiendo agregarse una nueva alarma en el PLC 
para dicho caso. 
La función “SQL_estructura”, se puede buscar en los anexos, pero sintetizando 
realiza la siguiente query en lenguaje SQL: exec sp_columns ? , devolviendo la estructura de 
la tabla, además de que columnas tienen datos por defectos (en este caso en particular la 
columna “Fecha_carga”). 
Finalmente, el envío de los datos se realiza en el hilo principal por las siguientes 
líneas donde se crea una lista “datos” con los datos ordenados correspondientes a cada 
columna que se necesita y posteriormente con la función “SQL_Insertar” los mismos se 
guardan en la base de datos. 
 
 
Problema de Ingeniería- Técnicas Digitales III 
37 
datos = [1, Seg_Transformacion(tiempo_descarga), Seg_Transformacion(tiempo_riesgo)] 
SQL_Insertar(tabla, est_tabla, datos, conexion) 
 
A continuación se muestra la función “SQL_Insertar”, pero al igual que con la 
función que nos devuelve la estructura de la tabla, la misma consiste en la creación de la 
query para insertar datos la cual tiene la siguiente forma: “INSERT INTO table_name 
(column1, column2, column3, ...) VALUES (value1, value2, value3, ...);”. 
 
#inserta datos en la base de datos 
def SQL_Insertar(tabla, db_tabla, datos, conexion): 
 cursor = conexion.cursor() 
 columnas = "" 
 variables = "" 
 datos = tuple(datos) 
 for row in db_tabla: 
 if not row[3]: 
 columnas += '[' + str(row[1]) + '],' 
 variables += "?," 
 variables = variables[:-1] 
 columnas = columnas[:-1] 
 consul = f"""INSERT INTO [dbo].[{tabla}] ({columnas}) VALUES ({variables})""" 
 cursor.execute(consul, datos) 
 cursor.commit() 
 cursor.close() 
 print('Datos cargados.') 
 
 
Problema de Ingeniería- Técnicas Digitales III 
38 
Conclusiones 
 
Por medio de este proyecto, se ha podido aprender muchos conceptos nuevos de 
diversos temas, como así también, se ha podido refrescar conceptos de materias de años 
anteriores e incluso de este mismo. 
Por otro lado, también muy importante, fué el hecho de haber trabajado en grupo, 
ya que constantemente se aprende uno del otro y además ayuda mucho para trabajos 
grupales posteriores. 
A la hora del trabajo en sí, se han presentado varios problemas que se han podido 
llevar a cabo con pruebas y errores, además de soluciones alternativas para llevar al 
objetivo. 
Posibles mejoras y extensiones 
 
 Como posibles mejoras se pueden señalar dos puntos principalmente, uno de ellos 
es el uso de una red neuronal (la cual puede ser Yolo v4) para detectar la compuerta 
trasera de los camiones y ampliar el rango de uso del software, principalmente evitando 
errores de detección en caso de camiones de un solo acoplado. La principal función de 
dicha red sería crear la máscara de detección, comentada durante la explicación del 
código, en una posición específica según cada camión en particular, en vez de que la 
misma se establezca de manera predeterminada. 
 Otra mejora a tener en cuenta, en el caso de necesitar, es una estimación continua 
del caudal que desciende del camión. Si bien ya se explicó durante el desarrollo del 
informe una posible solución a esta alternativa, hay que tener en cuenta que de 
implementarse se debería contar con por lo menos 30 fps en velocidad de procesamiento 
con el objetivo de estimar mejor el movimiento de los granos durante la descarga en el 
proceso. 
 
 
Problema de Ingeniería- Técnicas Digitales III 
39 
Seguridad 
Seguridad en el proceso 
 
Este proyecto aporta mucha seguridad en cuanto al proceso en sí, ya que, previene 
tanto los accidentes laborales como así también los daños materiales. 
Ambas situaciones van a reducir su probabilidad de ocurrencia debido a que el 
proyecto tiene ese fin como objetivo. Esto se logra partiendo de la base de que el camión 
no estará elevado y con carga, por lo tanto, no proporcionará riesgos en cuanto a los 
accidentes laborales y a los daños estructurales, por ende, aumenta la seguridad en el 
proceso. 
 
Hay que tener en cuenta, que el proceso será más eficiente en cuanto a la seguridad 
si hay un buen complemento entre el proyecto en sí, y la empresa en la cual se coloca el 
mismo. 
En un primer momento, si se configura el sistema como se desarrolló en el 
apartado de “Conexión con el proceso”, la seguridad va a depender del operario que esté 
presente en la sala de control, ya que el mismo es el que debería accionar el descenso de 
la plataforma en caso de alarma. Sin embargo, si además de dicha parada de emergencia 
se opta por automatizar el descenso de la plataforma en caso de que el PLC recibiera la 
señal de alarma, se podría reforzar la seguridad del proceso considerablemente ya que se 
independizara de un posible error humano. 
 
Seguridad en el código 
 
Si bien el proyecto surgió en torno a la seguridad del proceso, principalmente la 
de los operarios que se encuentran en el proceso, es necesario que el software tenga 
medidas de seguridad ante posibles fallas, ya que si el software fallará sin notificar a los 
operarios sería aún más riesgoso para los mismos la situación. 
Las medidas de seguridad que se tuvieron en cuenta durante el desarrollo del 
código fueron las siguientes: 
● Falla de comunicación de la cámara: en el software en caso de fallar la 
comunicación con la cámara es necesario que se mande una señal al PLC 
para que los operarios estén al tanto de la situacióny a continuación el 
software trata de reconectar la cámara, para continuar con el proceso. 
● Comunicación lenta con la cámara: para solucionar este problema es que 
se optó por el uso de una pila que independiza los procesos de captura de 
la cámara de la análitica del video, de esta forma se tiene un mayor tiempo 
para obtener el frame. 
● Falla de comunicación con el PLC: este tipo de fallas es más complejo de 
comunicar con los operarios ya que es la vía de comunicación con los 
mismos, sin embargo se podría optar por el envío de un correo. 
Problema de Ingeniería- Técnicas Digitales III 
40 
Anexos 
Código detección de color 
 
import numpy as np 
import cv2 
def nothing(x): 
 pass 
cap = cv2.VideoCapture(r'Muestra04.mp4') 
cv2.namedWindow('Tracking') 
cv2.createTrackbar('LHue','Tracking',0,255,nothing) 
cv2.createTrackbar('HHue','Tracking',255,255,nothing) 
cv2.createTrackbar('LSat','Tracking',0,255,nothing) 
cv2.createTrackbar('HSat','Tracking',255,255,nothing) 
cv2.createTrackbar('LVal','Tracking',0,255,nothing) 
cv2.createTrackbar('HVal','Tracking',255,255,nothing) 
while True: 
 _, frame = cap.read() 
 #Creo una matriz de la imagen en colores HSV 
 hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV) 
 l_hue = cv2.getTrackbarPos('LHue', 'Tracking') 
 h_hue = cv2.getTrackbarPos('HHue', 'Tracking') 
 l_sat = cv2.getTrackbarPos('LSat', 'Tracking') 
 h_sat = cv2.getTrackbarPos('HSat', 'Tracking') 
 l_val = cv2.getTrackbarPos('LVal', 'Tracking') 
 h_val = cv2.getTrackbarPos('HVal', 'Tracking') 
 l_hsv = np.array([l_hue,l_sat,l_val]) #Defino el valor bajo de hsv 
 h_hsv = np.array([h_hue,h_sat,h_val])#Defino el valor alto de hsv 
 mask = cv2.inRange(hsv, l_hsv, h_hsv) #Creo una máscara 
 res = cv2.bitwise_and(frame,frame,mask = mask) #Hago el filtrado 
 cv2.imshow('Frame',frame) 
 cv2.imshow('Mask', mask) 
 cv2.imshow('Result', res) 
 key = cv2.waitKey(1000) & 0xFF 
 if key == 27: 
 break 
cap.release() 
cv2.destroyAllWindows() 
 
 
 
Problema de Ingeniería- Técnicas Digitales III 
41 
Código detección de movimiento 
 
import numpy as np 
import cv2 
cap = cv2.VideoCapture(r'Muestra04.mp4') 
ret, frame1 = cap.read() 
ret, frame2 = cap.read() 
font = cv2.FONT_HERSHEY_SIMPLEX 
while cap.isOpened(): 
 diff = cv2.absdiff(frame1, frame2) 
 gris = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY) 
 difuminado = cv2.GaussianBlur(gris, (3, 3), 3) 
 _, binario = cv2.threshold(difuminado, 30, 255, cv2.THRESH_BINARY) 
 limpio = cv2.dilate(binario, (5,5), iterations=3) 
 contornos, _ = cv2.findContours(limpio, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 
 #cv2.drawContours(frame1,contornos,-1,(0,255,0),2) 
 for contorno in contornos: 
 (x, y, w, h) = cv2.boundingRect(contorno) 
 if cv2.contourArea(contorno) < 500: 
 continue 
 cv2.rectangle(frame1,(x,y),(x+w,y+h),(0,255,0),2) 
 cv2.putText(frame1,'Estado: {}'.format('Movimiento'), (10, 20), font, 0.7, (255,0,0), 2) 
 cv2.imshow('diferencia',diff) 
 cv2.imshow('binario', binario) 
 cv2.imshow('difuminado', difuminado) 
 cv2.imshow('limpio', limpio) 
 cv2.imshow('frame1', frame1) 
 frame1 = frame2 
 ret, frame2 = cap.read() 
 if (cv2.waitKey(40) & 0xFF)== 27: 
 break 
cap.release() 
cv2.destroyAllWindows() 
 
 
 
Problema de Ingeniería- Técnicas Digitales III 
42 
Código Completo 
 
 
########################LIBRERIAS######################### 
 
import queue #controlar la pila lifo 
import threading #trabajar con multiprocesamiento 
import cv2 #vision 
import numpy as np 
import math 
import time 
#import snap7 #comunicación con el plc 
#import pyodbc #comunicación con la base de datos SQLServer 
 
# #######################FUNCIONES Y CLASES################ 
 
#proceso paralelo de captura de cámara, mantiene 5 tomas en pila tipo lifo 
#si la pila está llena no carga el frame 
#si la variable global pasa a 1 termina y libera la cámara 
def Receive(): 
 global finalizar 
 print('Inicializando la cámara...') #muestra en pantalla 
 #cap = cv2.VideoCapture("rtsp://usuario:contraseña@ip:554") 
 cap = cv2.VideoCapture(r'Muestra05.mp4') 
 ret, frame = cap.read() 
 q.put(frame) 
 while True: 
 if ret: 
 time.sleep(0.02) 
 ret, frame = cap.read() 
 if not q.full(): 
 q.put(frame) 
 if finalizar: 
 cap.release() #libera la camara 
 out.release() #grabo el video 
 break 
 else: 
 #simulación 
 cap.release() 
 print('Error conexion con la camara') 
 break 
 #real 
 #manda un señal booleana al PLC para informar falla de comunicación con la cámara 
 #esta parte no está programada pero consistiría en el agregado de otra variable global 
que se 
 #comunique con 
 #el hilo de comunicación al PLC 
 #print('Error. Reconectando...') 
 #cap = cv2.VideoCapture("rtsp://usuario:contraseña@ip:554") 
 
def angulo(): 
 global angulo_estatus, finalizar, alarma 
 #real 
 """ 
 #desabilitar el acceso optimizado al bloque en el PLC 
 IP = '192.168.1.10' 
 RACK = 
 SLOT = 
 DB_NUMBER_lec = 
Problema de Ingeniería- Técnicas Digitales III 
43 
 DB_NUMBER_esc = 
 START_ADDRESS_lec = #colocar direccion en bytes donde esta el dato bool 
 START_ADDRESS_esc = #colocar direccion en bytes donde guardar el dato bool 
 SIZE = 1 
 plc = snap7.client.Client(lib_location="snap7.dll") 
 plc.connect(IP, RACK, SLOT) 
 while plc.get_connected(): 
 db = plc.db_read(DB_NUMBER_lec, START_ADDRESS_lec, SIZE) 
 angulo_estatus = bool(db[START_ADDRESS]) 
 if alarma: 
 db1 = plc.db_read(DB_NUMBER_esc, START_ADDRESS_esc, SIZE) 
 snap7.util.set_bool(db1,0,0,True) 
 plc.db_write(DB_NUMBER_esc, START_ADDRESS_esc,db1) 
 alarma = False 
 if finalizar: 
 break 
 print('Error de conexcion con el plc') 
 #en este punto se podría mandar un correo al usuario para informarle que no funciona la 
 #comunicación con el PLC 
 #creemos que esta funcionalidad no se va a usar mucho ya que el PLC es un dispositivo 
prioritario en 
 #el proceso 
 #pero esta bueno asegurarse 
 """ 
 #simulación 
 cont=0 
 angulo_estatus = False 
 while True: 
 cont += 1 
 time.sleep(0.02) 
 print(angulo_estatus) 
 if cont == 10: 
 angulo_estatus = True 
 
 if alarma: 
 print('Mandar señal al PLC') 
 alarma = False 
 if finalizar: 
 break 
 
#funciones para la comunicación con la base de datos SQLServer y guardar los tiempos de 
descarga y 
#de riesgo para 
#temas de logistica 
#pasa los segundos a hh:mm:ss en formato string 
def Seg_Transformacion(segundos): 
 horas = int(segundos / 3600) 
 segundos -= horas * 3600 
 minutos = int(segundos / 60) 
 segundos -= minutos * 60 
 segundos = int(round(segundos, 2)) 
 TimerTiempo = f'{horas:02d}:{minutos:02d}:{segundos:02d}' 
 print('Segundos convertidos al formato hh:mm:ss.') 
 return TimerTiempo 
 
#obtiene la estructura de la tabla solicitada 
def SQL_estructura(tabla, conexion): 
 db_tabla = list() 
 cursor = conexion.cursor() 
 consul = """exec sp_columns ?""" 
 cursor.execute(consul, tabla) 
Problema de Ingeniería- Técnicas Digitales III 
44 
 rows = cursor.fetchall() 
 for row in rows: 
 db_tabla.extend([[row.ORDINAL_POSITION, row.COLUMN_NAME, row.TYPE_NAME, 
row.COLUMN_DEF, row.IS_NULLABLE]]) 
 cursor.commit() 
 cursor.close() 
 print('Estructura obtenida.') 
 return db_tabla 
 
 
#inserta datos en la base de datos 
def SQL_Insertar(tabla, db_tabla, datos, conexion): 
 cursor = conexion.cursor() 
 columnas

Otros materiales