Wuolah-Free-Examen Julio - 22 - 23
Wuolah-Free-Examen Julio - 22 - 23
noe_sanroman
Informática Industrial
Una solución:
Interfaz de usuario:
lampara1
pasteurizador1
etiquetaTemperatura1
etiquetaTiempo1
editorTemperatura1
editorTiempo1
editorPeso1
botonPasteurizar1
Para el primer pasteurizador se utilizan los siguientes componentes con identificadores terminados en 1 (para los demás
pasteurizadores se utilizan componentes similares con identificadores terminados en 2, 3, 4 o 5):
- lampara1 es un QLabel donde se muestra el estado del pasteurizador en imágenes de lámparas de varios colores.
- pasteurizador1 es un QLabel donde se muestra una imagen del pasteurizador con la puerta abierta o cerrada.
- etiquetaTemperatura1 es un QLabel donde se muestra la medida de la temperatura con un sensor.
- etiquetaTiempo1 es un QLabel donde se muestra en tiempo transcurrido de pasteurización.
- editorTemperatura1, editorTiempo1 y editorPeso1 son QLineEdit donde se introducen la temperatura, tiempo y Kg de carga para
la siguiente pasteurización.
- El operario arranca una pasteurización pulsando en el botón botonPasteurizar1.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-8568303
class PasteurizadorOPC:
DESCARGADO = 0
CARGADO = 1
PASTEURIZANDO = 2
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
FINALIZADO = 3
@property
def puertaAbierta(self):
return self.__clienteOPC.leeTag(self.__tags["PuertaAbierta"])
@property
def estado(self):
return self.__clienteOPC.leeTag(self.__tags["Estado"])
def arrancar(self):
if self.estado == PasteurizadorOPC.CARGADO:
self.__clienteOPC.escribeTag(self.__tags["Arranque"], 1)
@property
def progTemperatura(self):
return self.__progTemperatura
@progTemperatura.setter
def progTemperatura(self, temperatura):
if self.estado != PasteurizadorOPC.PASTEURIZANDO:
self.__clienteOPC.escribeTag(self.__tags["ProgTemperatura"], temperatura)
self.__progTemperatura = temperatura
@property
def progTiempo(self):
return self.__progTiempo
@progTiempo.setter
def progTiempo(self, tiempo):
if self.estado != PasteurizadorOPC.PASTEURIZANDO:
self.__clienteOPC.escribeTag(self.__tags["ProgTiempo"], tiempo)
self.__progTiempo = tiempo
@property
def temperatura(self):
return self.__clienteOPC.leeTag(self.__tags["Temperatura"])
@property
def peso(self):
return self.__peso
@peso.setter
def peso(self, kg):
self.__clienteOPC.escribeTag(self.__tags["Peso"], kg)
Abre tu Cuenta NoCuenta con el código WUOLAH10 y llévate 10 € al hacer tu primer pago
Informática Industrial
Banco de apuntes de la
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-8568303
numPasteurizadores = 5
def botonPasteurizarClick(num):
p[num]["OPC"].progTemperatura = int(p[num]["editorTemperatura"].text())
p[num]["OPC"].progTiempo = int(p[num]["editorTiempo"].text())
p[num]["OPC"].peso = int(p[num]["editorPeso"].text())
p[num]["OPC"].arrancar()
def actualizaVisualizacion():
for i in range(1, numPasteurizadores+1):
p[i]["etiquetaTemperatura"].setText(str(p[i]["OPC"].temperatura) + "ºC")
abierta = p[i]["OPC"].puertaAbierta
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
p[i]["pasteurizador"].setPixmap(imagenPasteurizador[abierta])
estado = p[i]["OPC"].estado
p[i]["lampara"].setPixmap(imagenLampara[estado])
p[i]["botonPasteurizar"].setEnabled(estado == PasteurizadorOPC.CARGADO and not abierta)
if estado == PasteurizadorOPC.PASTEURIZANDO:
p[i]["tiempo"] += 1
else:
p[i]["tiempo"] = 0
p[i]["etiquetaTiempo"].setText(str(p[i]["tiempo"]) + "s.")
try:
clienteOPC = OPC_UA("opc.tcp://Administrator:lagoasmarcosende@localhost:49320")
except Exception as e:
sys.exit()
aplicacion = QApplication()
imagenLampara = {PasteurizadorOPC.DESCARGADO: QPixmap("LamparaGris.png"),
PasteurizadorOPC.CARGADO: QPixmap("LamparaAzul.png"),
PasteurizadorOPC.PASTEURIZANDO: QPixmap("LamparaAmbar.png"),
PasteurizadorOPC.FINALIZADO: QPixmap("LamparaVerde.png")}
imagenPasteurizador = {True: QPixmap("pasteurizadorAbierto.png"),
False: QPixmap("pasteurizadorCerrado.png")}
ventana = leeInterfaz("interfaz.ui")
p = {}
for i in range(1, numPasteurizadores + 1):
si = str(i)
p[i] = {
"OPC": PasteurizadorOPC(i, clienteOPC),
"tiempo": 0,
"lampara": ventana.findChild(QLabel, "lampara" + si),
"pasteurizador": ventana.findChild(QLabel, "pasteurizador" + si),
"etiquetaTemperatura": ventana.findChild(QLabel, "etiquetaTemperatura" + si),
"etiquetaTiempo": ventana.findChild(QLabel, "etiquetaTiempo" + si),
"editorTemperatura": ventana.findChild(QLineEdit, "editorTemperatura" + si),
"editorTiempo": ventana.findChild(QLineEdit, "editorTiempo" + si),
"editorPeso": ventana.findChild(QLineEdit, "editorPeso" + si),
"botonPasteurizar": ventana.findChild(QPushButton, "botonPasteurizar" + si)
}
exec("def botonPasteurizar" + si + "Click():\n" +
" botonPasteurizarClick(" + si + ")\n")
exec("p[" + si + "][\"botonPasteurizar\"].clicked.connect(botonPasteurizar" + si + "Click)")
temporizador = QTimer()
temporizador.timeout.connect(actualizaVisualizacion)
temporizador.start(1000)
ventana.show()
sys.exit(aplicacion.exec())
2) En una instalación industrial de producción de zumos naturales (de piña, de naranja, de tomate, o mezclas como zumos de frutos
rojos, cítricos, etc) existen 5 pasteurizadores donde se tratan estos productos para eliminar patógenos y aumentar su vida útil. Cada
tipo de zumo tiene una denominación comercial y se elabora con el zumo de una o varias frutas en determinadas proporciones,
necesita una cierta temperatura y tiempo de pasteurización y el producto es apto para el consumo durante una cierta cantidad de días
una vez pasteurizado. Estos productos se manejan en contenedores metálicos, cada uno de una cierta capacidad máxima. Cada
contenedor tiene un código numérico diferente escrito en un código de barras y una vez utilizado para tratar una cierta cantidad de un
producto fabricado en un lote de producción, se lava y esteriliza y se reutiliza para tratar una cierta cantidad de producto del mismo
lote o de otro. Los lotes de producción tienen un identificador (ej. A273), una fecha de creación, una fecha de caducidad y en él se
fabrica una cierta cantidad total de un determinado producto. Diseña y describe una base de datos donde se puedan indicar los tipos de
productos con sus datos y composición, los lotes de producción con sus datos, donde se pueda indicar el estado actual de los
contenedores y donde se registren las pasteurizaciones ejecutadas, cada una realizada dentro de un lote de producción, en un
pasteurizador en un instante determinado. Programa una clase de forma que con un objeto se pueda:
Abre tu Cuenta NoCuenta con el código WUOLAH10 y llévate 10 € al hacer tu primer pago
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-8568303
- comprobar si las composiciones de los productos son correctas, ya que los porcentajes de fruta tienen que sumar 100, y de forma que
se pueda obtener en una colección qué productos y composiciones (con sus datos) son incorrectas.
- reservar un contenedor para tratar una cierta cantidad del producto fabricado en un lote de producción, o liberarlo para poder
reutilizarlo, generando una excepción cuando se detecte algún error, como indicar un contenedor o lote no registrados previamente
en la base de datos, intentar reservar un contenedor que ya está reservado o liberar un contenedor que ya está vacío, reservar una
cantidad de producto para un contenedor mayor que la capacidad total del contenedor, o reservar una cierta cantidad de producto de
un lote para un contenedor con la que se supera la cantidad total de producto que hay que tratar en ese lote.
No hay que indicar instrucciones de importación de paquetes. Se utilizará un objeto para la comunicación con el servidor MySql
obtenido mediante conexionMySql = mysql.connector.connect(user='usuario', password='clave', host='127.0.0.1',
database='db').
Una solución:
import sys
import mysql.connector
class Produccion:
def compruebaComposiciones(self):
comprobacion = {}
self.__cursor.execute("SELECT id, nombre FROM productos")
resultadosProductos = self.__cursor.fetchall()
for (id, nombre) in resultadosProductos:
self.__cursor.execute("SELECT fruta, porcentaje FROM composiciones WHERE idProducto=" + str(id))
resultadosComposicion = self.__cursor.fetchall()
total = 0
for (fruta, porcentaje) in resultadosComposicion:
total += porcentaje
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-8568303
if total != 100:
porcentajes = []
for (fruta, porcentaje) in resultadosComposicion:
porcentajes.append((fruta, porcentaje))
comprobacion[nombre] = porcentajes
return comprobacion
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
(loteActual, capacidadContenedor) = resultado
if loteActual is None:
if cantidad > capacidadContenedor:
raise Exception("Error reservando contenedor " + str(contenedor) + ": se está reservando " +
str(cantidad) + " y su capacidad es " + str(capacidadContenedor))
self.__cursor.execute("SELECT cantidad, procesado FROM lotes WHERE lote='" + lote + "'")
(cantidadLote, procesadoLote) = self.__cursor.fetchone()
if cantidad > cantidadLote - procesadoLote:
raise Exception("Error reservando contenedor " + str(contenedor) + ": se esstá reservando " +
str(cantidad) + " y en el lote " + lote + " falta por procesar " +
str(cantidadLote - procesadoLote))
self.__cursor.execute("UPDATE contenedores SET idLote='" + lote + "', cantidad=" + str(cantidad) +
" WHERE id=" + str(contenedor))
self.__cursor.execute("UPDATE lotes SET procesado=" + str(procesadoLote + cantidad) +
" WHERE lote='" + lote + "'")
self.__conexion.commit()
else:
raise Exception("Error reservando contenedor: el contenedor " + str(contenedor) + " no está vacío")
try:
conexionMySql = mysql.connector.connect(user='root', password='marcosende', host='127.0.0.1',
database='ej2')
except Exception as ex:
print(ex)
sys.exit()
produccion = Produccion(conexionMySql)
errores = produccion.compruebaComposiciones()
try:
produccion.reservaContenedor(12, "A1", 100)
produccion.liberaContenedor(12)
except Exception as e:
print(e)
conexionMySql.close()
Abre tu Cuenta NoCuenta con el código WUOLAH10 y llévate 10 € al hacer tu primer pago