TESIS MAQUINA SEMIAUTOMATICA PARA DOSIFICADO Y EMPAQUE DE LIQUIDOS EN BOLSA PRESENTADO POR JUAN CARLOS VIZCAINO APONTE UNIVERSIDAD DE LA SALLE ING. DISEÑO Y AUTOMATIZACION ELECTRONICA BOGOTA, OCTUBRE 2007 MAQUINA SEMIAUTOMATICA PARA DOSIFICADO Y EMPAQUE DE LIQUIDOS EN BOLSA PRESENTADO POR JUAN CARLOS VIZCAINO APONTE UNIVERSIDAD DE LA SALLE ING. DISEÑO Y AUTOMATIZACION ELECTRONICA BOGOTA, OCTUBRE 2007 TABLA.DE.CONTENIDO INTRODUCCION 1 PLANTEAMIENTO.DEL.PROBLEMA 1 1.1 ALCANCE.DEL.PROYECTO 3 1.2 FORMULACION.DEL.PROBLEMA 4 2 JUSTIFICACION.DEL.PROYECTO 5 3 OBJETIVOS 6 3.1 OBJETIVO.GENERAL 6 3.2 OBJETIVOS.ESPECIFICOS 6 4 PRESENTACION.PRELIMINAR.ESQUEMATICA. DEL.SISTEMA 7 SISTEMAS.MECANICOS 9 5 SISTEMA.DE.ALIMENTACION.DE.MATERIAL 9 5.1 DESCRIPCION.DEL.PROCESO 9 5.2 TANQUE.DE.ALIMENTACION.PRINCIPAL 9 5.3 CALCULO.DE.LA.BOMBA.(MOTOBOMBA) 10 5.3.1 MATERIALES 10 5.3.2 PRESION 11 5.3.3 FLUJO 11 5.3.4 CAUDAL 12 5.3.5 POTENCIA.DEL.MOTOR 12 6 SISTEMA.DE.AIRE.A.PRESION 13 6.1 CALCULO.DEL.COMPRESOR 13 6.1.1 CONDUCCION.DE.AIRE 13 6.1.2 CAUDAL 13 6.1.3 PRESION 15 6.1.4 POTENCIA 16 7 ACTUADORES 17 7.1 ACTUADORES.ELECTRICOS 17 7.2 ACTUADORES.NEUMATICOS 17 7.3 VÁLVULA.3/2.PARA.LOS.ACTUADORES 17 8 VALVULAS.PARA.EL.PASO.DE.LÍQUIDO 19 8.1 ELECTROVALVULA.PARA.SALIDA.Y.ENTRADA. DE.LÍQUIDO.AL.DOSIFICADO 19 8.2 CHEQUES 20 8.2.1 CHEQUE.VENTANA 20 8.2.2 CHEQUE.RESORTE 22 8.3 VALVULAS.DE.EMBOLO 23 8.3.1 VALVULAS.DE.EMBOLO.2.VIAS 23 8.3.1.1 ESQUEMA.DE.FUNCIONAMIENTO 23 8.3.2 VÁLVULA.DE.TRES.VIAS 24 8.3.3 MARIPOSA 25 8.3.4 ANALISIS.DINAMICO.VALVULA.DE.EMBOLO 26 8.4 CORTINA 27 8.4.1 ANALISIS.DINAMICO 28 8.5 TIPO.AGUJA 28 8.5.1 ANALISIS.DINAMICO 29 9 SISTEMA.DE.DOSIFICACION 30 9.1 JERINGA.INDUSTRIAL.(ESTRUCTURA.BASICA. DE.DOSIFICADOR) 30 ENVASE.DE.DOSIFICACION 30 9.1.1 9.1.2 VÁSTAGO.DE.EMPUJE 31 9.1.3 DOSIFICACION.POR.SUCCION 32 9.2 MODELOS.DE.SALIDA.Y.ENTRADA.DE.LIQUIDO. AL.DOSIFICADOR 32 9.2.1 CHEQUE./.CHEQUE 32 9.2.2 CHEQUE./.VALVULA 33 9.2.3 VALVULA.DE.TRES.VIAS 34 9.2.4 VALVULA./.VALVULA 34 9.2.5 VALVULA.MECANIZADA.3/2 35 10 UBICACIÓN.DOSIFICADOR 37 10.1 ESTRUCTURA.DE.SOPORTE.DEL.DOSIFICADOR 37 10.2 UBICACIÓN.HORIZONTAL 37 10.3 UBICACIÓN.VERTICAL 38 11 SISTEMA.DE.SELLADO 39 11.1 SELLADO.VERTICAL 39 11.2 SELLADO.HORIZONTAL 41 11.3 RESISTENCIAS.DE.SELLADO 42 SISTEMAS.DE.CONTROL 44 CIRCUITOS.CONTROL.Y.POTENCIA.PARA.CARGA. DEL.TANQUE.SUPERIOR 44 12.1 CONTROL 45 12.2 POTENCIA 46 13 SENSOR.DE.NIVEL 47 13.1 FLOTADOR 47 13.2 SENSOR.OPTICO.INFRAROJO 47 13.2.1 ESQUEMA.REFERENTE 48 12 13.2.2 CIRCUITO.DE.CONTROL 49 13.3 FENOMENO.RESISTIVO 49 13.3.1 ESQUEMA.REFERENTE 49 13.3.2 CIRCUITO.DE.CONTROL.Y.ACONDICIONAMIENTO 50 13.4 MODELO.DE.SALIENTE 51 13.4.1 ESQUMA.REFERENTE 51 13.5 TIPO.REED.SWITCH 52 13.5.1 ESQUEMA.REFERENTE 52 13.5.2 CIRCUITO.DE.CONTROL 52 13.6 EFECTO.MAGNETICO 53 13.6.1 ESQUEMA.REFERENTE 54 13.6.2 ACONDICIONAMIENTO 54 13.6.3 CIRCUIO.DE.CONTROL 54 13.7 EFECTO.CAPACITIVO 55 13.7.1 ESQUEMA.REFERENTE 55 13.7.2 ACONDICIONAMIENTO 55 13.7.3 CIRCUITO.DE.CONTROL 56 13.8 SENSOR.DE.ULTRASONIDO 56 13.8.1 ESQUEMA.REFERENTE 56 13.8.2 ACONDICIONAMIENTO 57 13.8.3 CIRCUITO.DE.CONTROL 58 13.8.4 PROBLEMAS.CON.LOS.ULTRASONIDOS 58 13.9 SENSORES.COMERCIALES.DIGITALES 59 13.9.1 CONEXIONADO 60 13.9.2 IMPLEMENTACION.AL.CIRCUITO.DE.CONTROL 61 13.9.2.1 TIPO.PNP 61 13.9.2.2 TIPO.NPN 61 13.9.3 61 INDUCTIVOS.Y.CAPACITIVOS 13.9.3.1 ESQUEMA.INDUCTIVO 62 13.9.3.2 ESQUEMA.CAPACITIVO 63 13.9.4 63 AUTOREFLEX.Y.ULTRASONICO 13.9.4.1 SISTEMA.AUTOREFLEX 64 13.9.4.2 ESQUEMA.DE.INSTALACION 64 13.10 SENSOR.ANALOGO.DE.PESO.(CELDA.DE.CARGA) 65 13.10.1 ACONDICIONAMIENTO 66 13.10.1.1 AMPLIFICADOR.DE.INSTRUMENTACION 66 13.10.2 CIRCUITO.DE.CONTROL 67 14 CICLO.DE.MAQUINA 69 14.1 CONTROL.DEL.PROCESO.DE.ABASTECIMIENTO. DE.PRODUCTO.HACIA.EL.DOSIFICADO 69 14.1.1 ESQUEMA.REFERENTE 70 14.2 SENSOR.DE.PAPEL 70 14.2.1 ACONDICIONAMIENTO 70 14.2.2 CIRCUITO.DE.CONTROL.E.INTERFASE.PARA.SENSOR. DE.PAPEL.Y.DE.LIQUIDO.(PARO.DEL.PROCESO) 71 FUENTE.DE.ALIMENTACION.PARA.CIRCUITO.DE. CONTROL 71 15 ACONDICIONAMIENTO.PARA.ACTUADORES 73 15.1 INVERSOR.DE.GIRO.MOTOR.DC 73 15.2 ELECTROVALVULA.PARA.CONTROL 73 15.2.1 ACCIONAMIENTO.DE.LA.ELECTROVÁLVULA.D.C.y.A.C 74 15.2.2 ACCIONAMIENTO.DE.LA.ELECTROVÁLVULA.POR.PC 75 14.2.3 15.3 ACCIONAMIENTO.PARA.VALVULAS.DE.EMBOLO 76 15.3.1 ACCIONAMIENTO.MECANICO 76 15.3.2 ACCIONAMIENTO.CON.ACTUADOR.NEUMÁTICO. ROTATIVO 76 15.3.3 ACCIONAMIENTO.LINEAL.NEUMATICO 77 15.3.4 ACTUADOR.LINEAL.ELECTRICO.PIÑON-CREMALLERA 78 15.3.5 ACTUADOR.ROTATIVO.ELECTRICO 78 15.3.5.1 CONTROL.POR.TIEMPO 78 15.3.5.2 CONTROL.POR.FIN.DE.CARRERA 79 15.3.5.3 MOTOR.PASO.A.PASO 80 15.4 ACCIONAMIENTOS.PARA.VALVULA.CORTINA 81 15.5 ACCIONAMIENTO.PARA.VALVULA.AGUJA 83 16 CONTROL.DE.DOSIFICACION 84 16.1 DOSIFICACION.POR.VALVULA.DE.EMBOLO.Y/O. GUAYA.DE.TRANSMISION 85 16.2 DOSIFICACION.POR.TIEMPO 86 16.2.1 SISTEMA.DE.DOSIFICACION.POR.TIEMPOS.DISCRETOS 86 16.2.2 SISTEMA.DE.DOSIFICACION.POR.TIEMPO.Y.PESO 86 16.3 SISTEMA.DOSIFICADO.POR.SUCCION 88 16.4 CONTROL.DE.DOSIFICACION.POR.FINAL.DE.CARRERA 88 16.4.1 PISTON.DOBLE.EFECTO 90 16.4.2 PISTON.DE.DOBLE.EFECTO.Y.DOBLE.VÁSTAGO 91 16.4.3 CONTROL.Y.MANDO.DEL.PISTON 91 16.4.4 VELOCIDAD.SISTEMA.DOSIFICADOR.POR.SUCCION 92 16.4.5 CIRCUITO.DE.CONTROL.PARA.EL.DOSIFICADOR. COMO.PRODUCTO.INDEPENDIENTE 92 16.5 DOSIFICADO.POR.SOPORTE.Y.TORNILLOS.SIN.FIN 93 16.5.1 CONTROL.Y.MANDO 93 16.6 SISTEMA.DE.CONTROL.INDEPENDIENTE.PARA. EL.DOSIFICADOR.COMO.PRODUCTO.UNICO 94 16.6.1 SALIDA.DEL.DOSIFICADOR 95 16.6.2 SOLUCION.CON.PIC 96 16.6.2.1 DIAGRAMA.DE.FLUJO.PARA.EL.PROGRAMA.EN.EL.PIC 96 16.6.3 97 DISEÑO.DE.LA.ELECTRONICA.DE.INTERFASE.AL.PIC 16.6.3.1 DISEÑO.DE.LA.FUENTE 97 16.6.3.2 INVERSORES.DE.GIRO 97 16.6.3.3 ACTIVACION.DE.ELECTROVALVULAS 98 16.6.4 CIRCUITO.FINAL 98 16.6.5 MODELO.FISICO.DE.INTERFASE.CON.EL.USUARIO 99 17 SISTEMA.DE.CONTROL.PARA.EL.SELLADO 102 17.1 RESISTENCIA.DE.CALENTAMIENTO.RAPIDO 103 17.2 RESISTENCIA.DE.CALENTAMIENTO.LENTO 104 17.3 ACONDICIONAMIENTO.DE.TEMPERATURA 104 17.4 SENSOR.DE.BOLSA.PARA.SELLE.AUTOMATICO 105 17.5. CONTROL.DE.TEMPERATURA.PARA.LAS.SELLADORAS 106 17.5.1 CIRCUITO.ELECTRONICO.DE.CONTROL 110 17.5.2 IMPLEMENTACION.RESULTANTE.PARA.EL.SISTEMA 112 17.5.3 INTERFASE.AL.USUARIO 113 17.5.4 LOGICA.DEL.PROGRAMA.DEL.PIC 113 18 CONTROL.E.INTEGRACION.DE.PROCESOS 114 18.1 DESCRIPCIÓN.DEL.PC.UTILIZADO 114 18.2 INTERFASE.PARA.SALIDAS.PC 115 18.2.1 ACONDICIONAMIENTO.PARA.NIVELES.DC 116 18.2.2 ACONDICIONAMIENTO.PARA.SEÑALES.A.C 116 18.2.3 CONTROL.ELECTROVALVULA.DE.LÍQUIDO 116 18.3 DIAGRAMA.DE.FLUJO.DE.LA.LOGICA.SEL.SISTEMA 117 18.4 PROGRAMAS 119 18.4.1 PROGRAMA.DE.VERIFICACION.DE.ACCIONAMIENTOS. DEL.SISTEMA 119 18.4.2 PROGRAMA.PARA.CONFIGURACION.DE.LA.MAQUINA 120 18.4.3 PROGRAMA.PRINCIPAL 123 19 SISTEMA.DE.INFORMACION 130 20 PRESUPUESTOS 132 21 ANEXOS 134 21.1 PROBLEMAS.CON.EL.LÍQUIDO.A.EMPACAR 134 21.2 ERGONOMIA.DEL.AMBIENTE.DE.TRABAJO.ASOCIADO 135 21.3 RECOMENDACIONES PARA EL MANEJO DE BOMBAS 142 21.4 RECOMENDACIONES PARA EL MANEJO DE AIRE A PRESION Y LA CORRECTA FORMA DE INSTALAR UNA RED DE AIRE 142 ASPECTOS BASICO DE INSATLACION PARA LA RED DE AIRE 144 21.5 TRANSMISIONES 145 21.6 RACORES 146 21.7 CODIGO DE PROGRAMA PIC CONTROL DE DOSIFICADOR 147 CODIGO DE PROGRAMA PIC CONTROL DE TEMPERATURA 159 CODIGO.FUENTE.DEL.SOFTWARE.CONTROL.DE.LA. MAQUINA 166 21.4.1 21.8 21.9 21.9.1 21.9.2 21.9.3 21.10 21.10.1 PROGRAMA.PARA.PROBAR.LOS.DIFERENTES. ACCIONISMOS.DEL.SISTEMA 166 PROGRAMA.PARA.MANEJO.DE.TIEMPOS. CONFIGURACION.DE.LA.MAQUINA 167 PROGRAMA.PRINCIPAL.CON.ARREGLOS.PARA.UNA. SIMULACION 172 MANUAL DE TRABAJO PARA SOFWARE DE INVENTARIOS DE FACTURACION 176 PROGRAMA.ACTUALIZACIONES,.NUEVOS.PRODUCTOS,. ELIMINACION.DE.PRODUCTOS 176 21.10.1.1 INGRESAR.NUEVOS.PRODUCTOS 177 21.10.1.2 ACTUALIZAR.PRODUCTO 180 21.10.1.3 ELIMINAR.PRODUCTO 181 21.10.1.4 OPCIONES.AVANZADAS 181 21.10.1.4.1 CAMBIO.DE.CLAVES 181 21.10.1.4.2 RECUPERACION.POR.FALLOS 182 21.10.1.4.3 GUARDAR.LA.INFORMACION 183 21.10.2 CAMBIO.DE.FECHA 184 21.10.3 FACTURACION/CONSULTAS 184 21.10.3.1 CONSULTAS 184 21.10.3.2 FACTURACION 186 21.10.4 INGRESAR.DATOS.A.INVENTARIOS 191 21.10.5 INVENTARIO 194 21.10.6 RECUPERACION.DE.INVENTARIOS 199 21.10.7 LISTADO.GENERAL 201 21.10.8 CODIGO.FUENTE.DEL.SOFTWARE 201 22 LABORATORIO.DE.DISEÑO 256 23 CONCLUSIONES 266 24 BIBLIOGRAFIA 269 TABLA DE FIGURAS FIG 1 ESQUEMA GENERAL DE LA MAQUINA 7 FIG 2 SISTEMA DE ALIMENTACION MATERIAL 7 FIG 3 ESQUEMA GENERAL DEL SISTEMA 8 FIG 4 TANQUE DE ALIMENTACION PRINCIPAL Y SECUNDARIO 10 FIG 5 MEDIDAS DEL CILINDRO NEUOMATICO 13 FIG 6.1 SIMBOLO VALVULA 3/2 17 FIG 6.2 VALVULA 3/2 PISTON SIMPLE EFECTO 18 FIG 6.3 VALVULA 3/2 PISTON DOBLE EFECTO 18 FIG 7 CHEQUE VENTANA 20 FIG 8 FUNCIONAMIENTO CHECHE VENTANA 21 FIG 10 CHEQUE RESORTE 22 FIG 9 ANALISIS FUERZAS CHEQUE VENTANA 22 FIG 11 FUNCIONAMIETO VALVULA EMBOLO 23 FIG 12 VALVULA TRES VIAS 24 FIG 13 FUNCIONAMIENTO VALVULA TRE VIAS 25 FIG 14 RESPUESTA POSICION PROPORCIONAL AL TORQUE 27 FIG 15 VALVULA CORTINA 27 FIG 16 VALVULA TIPO AGUJA 28 FIG 17 ANALISIS DINAMICO VALVULA AGUJA 29 FIG 18 ENVASE DE DOSIFICACION 30 FIG 19 ESTRUCTURA QUE EMPUJA EL LIQUIDO ADAPTADA AL CILINDRO 30 O RINGS EMPAQUES ACOPLADOS PARA EVITAR ESCAPE 30 FIG 21 JERIGA DOSIFICADORA 31 FIG 22 DOSIFICACION POR SUCCION 32 FIG 23 MODELO CHEQUE CHEQUE 32 FIG 24 MODELO CHEQUE VALVULA 33 FIG 25 MODELO VALVULA DE TRES VIAS 34 FIG 26 MODELO VALVULA VALVULA 34 FIG 27 VALVULA MECANIZADA 3/2 35 FIG 28 UBICACIÓN DOCIFICADOR Y TANQUE DE ALMACENAMIENTO 37 FIG 29 UBICACIÓN HORIZONTAL 37 FIG 30 UNION DOCIFICADOR Y TANQUE 38 FIG 31 UNBICACION VERTICAL 38 FIG 32 SELLADO VERTICAL 39 FIG 33 DIFERENTES VISTA EN SOLID EDGE 40 FIG 34 SELLADO HORIZONTAL 41 FIG 35 ADPATACION DE PISTON 42 FIG 36 ESQUEMA DE SENSORES EN SISTEMA DE ALIMENTACION 44 CIRCUITO DE CONTROL SISTEMA DE ALIMENTACION 45 CIRCUITO DE POTENCIA SISTEMA DE ALIMENTACION 46 FIG 39 ESQUEMA REFERENTE SENSOR INFRAROJO 48 FIG 40 CIRCUITO DE CONTRO SENSOR INFRAROJO 48 FIG 20 FIG 37 FIG 38 FIG 41 ESQUEMA REFERENTE SENSOR RESISTIVO 49 FIG 42 CIRCUITO CONTROL SISTEMA RESISTIVO 50 FIG 43 PRINCIPIO DE PASSCAL 51 FIG 44 MODELO SALIENTE 51 FIG 44 TIPO REED SWITCH 52 FIG 45 CIRCUITO CONTROL TIPO REED SWITCH 52 FIG 46 EFECTO MAGNETICO 54 FIG 47 ACONDICIONAMIENTO MAGNETICO 54 FIG 48 CIRCUITO DE CONTROL EFECTO MAGNETICO 54 FIG 49 EFECTO CAPACITIVO 55 FIG 50 ACONDICIONAMIENTO EFECTO CAPACITIVO 55 FIG 51 CIRCUITO DE CONTROL EFECTO CAPACITIVO 56 FIG 52 SENSOR ULTRASONIDO 56 FIG 53 FORMA DE ONDA ULTRASONICA 57 FIG 54 ACONDICIONAMIENTO SENSOR ULTRASONIDO 58 FIG 55 FIGURA DE CONTROL SENSOR ULTRASONIDO 58 FIG 56 PROBLEMAS DE ULTRASONIDOS 59 FIG 57 SIMBOLO SEGÚN DIN 4007 60 FIG 58 CONEXIONADO PNP Y NPN 61 FIG 59 TIPO PNP 61 FIG 60 TIPO NPN 62 FIG 61 UBICACIÓN SENSOR INDUCTIVO 62 FIG 63 UBICACIÓN SENSOR CAPACITIVO 63 FIG 64 MODELO AUTOREFLEX 64 FIG 65 ESQUEMA DE INSTALACION AUTOREFLEX 64 FIG 66 CELDA DE CARGA 65 FIG 67 UBICACIÓN DE CELDA 65 FIG 68 AMPLIFICADOR.DE.INSTRUMENTACION 66 FIG 69 CIRCUITO DE CONTROL APLICANDO A.I 68 FIG 70 UBICACIÓN SENSORES PARA EL DOSIFICADO 70 FIG 71 ACONDICIONAMIENTO SENSOR DE PAPEL 70 FIG 72 CONTROL E INTERFASE SENSOR PAPEL Y LIQUIDO 71 FIG 73 FUENTE ALIMENTACION 72 FIG 74 FUENTE ALIMENTACION ALTAS CORRIENTES 72 FIG 55 INVERSOR DE GIRO DE MOTOR 73 FIG 56 ACCIONAMIENTO ACONDICIONADO 75 FIG 57 ACCIONAMIENTO POR PC 75 FIG 58 ACTUADOR EUMATICO ROTATIVO ACOPLADO 76 FIG 59 ACCIONAMIENTO.LINEAL.NEUMATICO 77 FIG 60 ACCIONAMIENTO.LINEAL.CON GUAYA 77 FIG 61 CONTROL POR TIEMPO 79 FIG 62 CONTROL POR FINAL DE CARRERA 79 FIG 63 MOTOR.PASO.A.PASO 80 FIG 64 MOTOR.PASO.A.PASO ACONDICIONADO 80 FIG 65 ACCIONAMIENTOS.PARA.VALVULA.CORTINA 82 FIG 66 ACCIONAMIENTO.PARA.VALVULA.AGUJA 83 FIG 67 DOSIFICACION.POR.VALVULA.DE.EMBOLO.Y/O. GUAYA.DE.TRANSMISION 85 FIG 68 DOSIFICACION.POR.TIEMPO 86 FIG 69 VARIAS DOSIS POR DOSIFICACION 86 FIG 70 SISTEMA.DOSIFICADO.POR.SUCCION 88 FIG 71 CONTROL.DE.DOSIFICACION.POR.FINAL.DE. CARRERA 88 FIG 72 PISTON.DOBLE.EFECTO 90 FIG 73 PISTON.DE.DOBLE.EFECTO.Y.DOBLE.VÁSTAGO 91 FIG 74 CONTROL.Y.MANDO.DEL.PISTON 91 FIG 75 CIRCUITO.DE.CONTROL.PARA.EL.DOSIFICADOR. COMO.PRODUCTO.INDEPENDIENTE 92 DOSIFICADO.POR.SOPORTE.Y.TORNILLOS. SIN.FIN 93 FIG 77 CONTROL.Y.MANDO DOSIFICADOR 93 FIG 78 SALIDA DEL DOSIFICADOR 95 FIG 79 SOLUCION.CON.PIC DOSIFICADOR 96 FIG 80 DISEÑO.DE.LA.FUENTE 97 FIG 81 INVERSORES.DE.GIRO 97 FIG 83 ACTIVACION.DE.ELECTROVALVULAS 98 FIG 84 CIRCUITO FINAL CONTROL DE DOSIFICADOR 98 FIG 85 MODELO.FISICO.DE.INTERFASE.CON.EL. USUARIO 99 FIG 86 SISTEMA.DE.CONTROL.PARA.EL.SELLADO 102 FIG 87 CONTROL RESISTENCIA DE CALENTAMIENTO RAPIDO 103 FIG 88 UBICACIÓN MICROSWITCH 103 FIG 89 PUNTO DE CORTE EN BOLSA 105 FIG 90 ACONDICIONAMIENTO SENSOR BOLSA 105 FIG 91 CONTROL.DE.TEMPERATURA.PARA.LAS. SELLADORAS 106 OSILACION ON/OFF ALREDEDOR DE PUNTO DE EQUILIBRIO 107 FIG 76 FIG 92 FIG 93 CONTROL ON/OFF 108 FIG 94 ERROR EXECIVO 109 FIG 95 FUNCION PWM 110 FIG 96 CIRCUITO.ELECTRONICO.DE.CONTROL 110 FIG 97 CIRCUITO.ELECTRONICO.DE.CONTROL Y CORTADO POR PC 111 FIG 98 VISUALIZACION DE CODIFICADOR 111 FIG 100 CIRCUITO ELECTRONICO DE CONTROL DE TEMPERATURA 112 FIG 99 MODELO CON VISUALIZACION DINAMICA 112 FIG 101 INTERFASE AL USUARIO 113 FIG 102 ACONDICIONAMIENTO DB25 DEL PC 116 FIG 103 ACONDICIONAMIENTO PARA NIVELES DC 116 FIG 104 ACONDICIONAMIENTO PARA NIVELES AC 116 FIG 105 CONTROL DE ELECTRO VALVULA LIQUIDO 117 INTRODUCCION La creciente tasa de desarrollo científico y tecnológico alcanzada por las sociedades del tercer milenio, ha permitido un notable aumento del nivel de vida de los habitantes satisfaciendo las necesidades mas básicas, pero a la vez aumentando la brecha económica y social entre estas y las sociedades mas pobres del planeta, muchas de las cuales no han logrado aun salir del mismo estado de atraso en el que se encontraban ya hace siglos. El estudio, desarrollo y aplicación de las técnicas de mando y control a los mas variados tipos de maquinas y procesos es factor fundamental para el crecimiento tecnológico como fuente de conocimiento, para la generación de riqueza al mejorar la calidad de bienes y servicios con incrementos de la producción y la reducción de costos, así como, para la comodidad y bienestar del ser humano al liberarlo de tareas peligrosas, monótonas y repetitivas. La creciente complejidad lleva a que surja una disciplina aun más dinámica, que integra diversos campos de la ingeniería como son la mecánica, la electrónica, el control, la automatización, la robótica y los sistemas de información lo que incluye software de programación y aplicación. El presente proyecto aplica en forma practica los conocimientos adquiridos presentando fundamentalmente un ejemplo de los aspectos conceptuales técnicos y de ingeniería que ofrece el campo de la dosificación de productos y que pueden ser fácilmente adaptados a las necesidades del país con el fin de mejorar la eficiencia y calidad de los procesos productivos, especialmente en la pequeña y mediana industria que cuenta con menores recursos técnicos, humanos y de capital. Igualmente, la ejecución del proyecto representa para mí la ocasión de materializar mis conocimientos con el ánimo de contribuir directa o indirectamente, con un aporte para el progreso académico, tecnológico, social y económico de la comunidad. Este trabajo presenta de manera discretizada cada uno de los pasos y opciones que se tomaron en cuenta para el correcto diseño del proyecto. Especificando con claridad en cada uno de los aspectos, sus posibilidades de cambio y posterior funcionamiento de las diferentes partes en función de los requerimientos de un cliente final. Además se hacen los anexos pertinentes con información investigativa de los temas, de modo que la persona que lea este documento tendrá mas herramientas con las cuales justificar los resultados y conclusiones. Cabe anotar que el proyecto pretende sustentar toda la investigación e implementación de los temas propuestos como finalidad. Se tiene como propósito dar a conocer los desarrollos que se han tenido en cuenta durante el diseño de la maquina y los respectivos sistemas de control, así como el software aplicado que se ha generado con la realización del mismo. También se plantean algunas soluciones a los distintos problemas que surgieron durante este período de investigación. Así mismo estoy exponiendo teóricamente el proceso de desarrollo lo que incluye paso a paso todo el perfeccionamiento de una máquina empacadora y selladora y todo el conjunto que la compone dada una determinada necesidad. Es decir que no necesariamente todos los subsistemas deban implementarse y que muchos de ellos son simplemente sugerencias documentadas y explicativas que proveen un mayor grado de entendimiento del porque. Sistemas que en ocasiones resultaría más conveniente en términos de eficiencia del sistema total en toda su complejidad. 1. PLANTEAMIENTO DEL PROBLEMA Se tiene un material líquido en un tanque que esta ubicado en la parte superior de una estructura de soporte. Este tanque puede ser llenado manualmente o en su defecto se diseña el sistema de bombeo para la carga del mismo. Luego de que ya tenemos el líquido en la parte superior optamos por implementar la dosificación. Inicialmente se piensa que la gravedad es suficiente para que con el simple hecho de abrir una válvula el líquido fuese entregado a la sección de empaque y de manera eficiente la dosificación sería controlada por el tiempo de apertura de la válvula dosificadora, tomando claro está, factores implícitos como el nivel de liquido, la presión, velocidad de salida para el liquido logrando dosis de gran exactitud. Este sistema resultaría eficiente con líquidos de baja viscosidad con el fin de lograr un dosificado rápido. Es evidente que en el proceso de dosificación, además de los factores implícitos ya nombrados, exigirá el conocimiento de la viscosidad del material a procesar que es altamente relevante; ya que en productos de alta viscosidad como el arequipe o el bocadillo en su estado de no compactación (en altas temperaturas esta en estado liquido), la gravedad no es suficiente para realizar un trabajo de manera eficiente y se hace necesario cambiar el sistema de dosificado. Se plantea así el problema el cual indiferentemente del tipo de líquido que se tenga en el tanque y sus condiciones de estado, proporciona una dosificación de exactitud y sin alterar los factores de control en el dispositivo encargado. Consiste en implementar una dosificación por succión. En este tipo de dosificación se pretende hacer una jeringa industrial (acero inoxidable) de modo que se succiona el producto líquido para luego ser expulsado de manera dosificada y con una velocidad controlada. Luego de esta etapa del dosificado, el material se direcciona por medio de una tubería adaptada en la parte de salida de la dosificación hacia la zona de empaque. En esta dicha tubería previamente el usuario ha metido un tubo de papel de empaque. Esta parte del proceso debe hacerse manualmente ya que ese punto de investigación no se ha plasmado en los objetivos de este proyecto; aunque se procurara que un sistema existente para realizar el empaque automáticamente pueda ser fácilmente adaptable aislando este punto de la maquina como elemento adicional. Además esta tubería debe ser fácilmente adaptable a tamaños distintos de empaque en cuanto a diámetro y longitud. Dependiendo del tamaño y la cantidad de estos se permitirá el control del numero de ciclos de empacado que puede realizarse sin detención. Podemos dividir en 2 partes lo ya expuesto: sistema de dosificado y proveer papel al sistema (proceso manual). Por ultimo una parte 3 que se refiere al área de selle y corte. Esta parte de la maquina es un mecanismo similar al de una guillotina tal que al bajar presiona el papel de empaque y con un elemento adicionado que se calienta realizando el selle por efecto de temperatura e inmediatamente después el corte. Es importante tener en cuenta en este punto que las diferentes densidades y propiedades del material del papel implican diferentes temperaturas por lo que debe desarrollarse un sistema de control para esta variable, que se pretende más eficiente que los implementados en la actualidad (de bajo costo y mayor eficiencia). También se debe tener en cuenta que el tipo de material exigirá no solo temperaturas específicas sino que en ocasiones el proceso requiere selle en caliente y posteriormente selle en frió, este factor debe tenerse en cuenta en la etapa de control. El sistema de corte es parte de la estructura de selle dado que la experiencia del experto proporciona una sencilla, eficiente y económica solución que funciona actualmente para este tipo de empaque. Por ultimo el proyecto pretende el control de la maquina por medio de un software lo mas sencillo y eficiente posible, que permita el control de la maquina para efectos de hacer cambios en su comportamiento y los parámetros que la empresa requiere para el correcto proceso. La computadora utilizada debe ser de un perfil lo más bajo posible de modo que la economía de este elemento es un factor de mercadeo que genera una visión más alta al proyecto. El software debe guardar alguna información del proceso así como ayudar en algunos procesos básicos que pueden eventualmente utilizar el usuario como procesos de venta, consulta y manejo de inventarios y producción que se tiene en planta. Si exceder las necesidades de un cliente promedio ni generar dificultades en el manejo del programa haciendo que el sistema total sea moderno, actual y llamativo a un usuario final por la flexibilidad y el tipo de tecnología que puede implementar El proyecto plantea que cada uno de los sistemas ya expuestos sea adaptable a las necesidades de modo que serán en su defecto sistemas diferentes que pueden integrarse al acomodo del cliente y los recursos económicos asociados. 1.1 ALCANCE DEL PROYECTO La finalidad de elaborar este proyecto es poder solucionar los problemas que tienen las pequeñas y medianas empresas de la industria alimenticia en cuanto a dar un dosificado exacto en el empacado de líquidos en bolsa, ya que utilizan sistemas no utomatizados que hacen que los dosificados sean inexactos y dependan de la mano de obra utilizada. A su vez los tiempos de empaque dependen exclusivamente del usuario y no da la oportunidad de planificar la producción con altos grados de certeza, ya que existen factores ergonomicos y emocionales que impiden tal planificación. Por otro lado esta dedicado a empresas que no cuentan con el capital para adquirir dosificadores de alta tecnología que en el mercado se encuentran a costos muy elevados Por eso se trata de hacer un prototipo económico pero que su funcionamiento sea viable y nos de un grado aceptable de exactitud para la buena realización de las labores de dosificación de líquidos alimenticios. Se tratara al máximo de solucionar cada uno de los problemas que se conocen en el proceso de dosificación de líquidos, sin embargo se deja claro que de no ser posible llegar a la meta con la construcción física del proyecto en su totalidad, lo hecho será aporte suficiente para culminar el proyecto inmediatamente los presupuestos sean suplementados. 1.2 FORMULACION DEL PROBLEMA Como generar sistemas de dosificación económicos que permitan un desarrollo de la industria del país. A su vez generar bases de conocimiento que permitan al empresario atacar puntos críticos de la producción implementando algunas o sino todas las soluciones planteadas en este documento. 2. JUSTIFICACION DEL PROYECTO El propósito de realizar este proyecto es dar una solución sencilla y económica a las pequeñas y medianas empresas de la industria que laboran con líquidos alimenticios. La industria “H y C” por su parte en compromiso verbal, pretende comercializar el producto y/o los productos que la elaboración de este proyecto han generado. El proyecto abarca lo temas suficientes, como para establecerlo como proyecto de tesis aplicado en la industria del país como solución a aquellas empresas que dosifican líquidos alimenticios creando un producto llamativo y tecnológico que se acomode mucho mejor al bolsillo y las necesidades; A la vez se sienta un precedente, dada la elaboración basada en una buena eficiencia y la notable reducción de costos que pretenden plasmarse, referentes a los que el mercado genera actualmente en sistemas con las mismas características del proyecto. Se plasman conocimientos adquiridos que han sido puestos en practica en cuanto a electro neumática, electrónica general, electrónica de interfase y acondicionamiento, mecanismos, la programación de bajo y medio nivel para el manejo de señales de control y una amplia investigación sobre el tema de dosificado que permitió establecer los puntos críticos de diseño a fin de lograr los objetivos. 3. OBJETIVOS 3.1 OBJETIVO GENERAL Diseñar y construir un sistema semiautomático para el dosificado de líquidos, a su vez el empaque en bolsa, selle y corte. 3.2 OBJETIVOS ESPECIFICOS Diseñar el sistema de alimentación de material Diseñar el sistema de dosificación de líquido. Diseñar un sistema para el sellado y corte. Diseñar un sistema de control para la temperatura del selle Diseñar un sistema de software que permita manejar información para el control de producción e inventarios. 4. PRESENTACION PRELIMINAR ESQUEMATICA DEL SISTEMA Fig 1.Esquema general de la maquina Un tanque de alimentación principal (1) y un tanque mayor (2) el cual carga el tanque principal por medio de un sistema de bombeo (3). Fig 2.Sistema de alimentación de material El tanque principal (1) alimenta por gravedad el sistema de dosificación (4) el cual por medio de un acople, a una jeringa industrial (5), un pistón neumático (6) se encarga de dosificación proporcionando succión para luego generar empuje. Al dosificar el liquido este se dirige por entre un tubo al punto de selle y corte (7). El papel de empaque es de forma tubular y se encuentra alrededor del tubo por el que viaja el líquido. De tal modo que el usuario debe cargar la maquina con el papel de empaque. Este en la zona de sellado detecta la bolsa y sincroniza para proporcionar el selle por temperatura y el seguido corte. El control de sellado se hace por medio de un pistón neumático (8) el cual proporciona el cierre y apertura de las resistencias de sellado (9). Fig 3.Esquema general del sistema El sistema debe ser controlado por medio de un PC el cual debe proporcionar ayuda en el proceso de cuadre de maquina, es decir que permite que la maquina trabaje de forma distinta según los requerimientos de cantidad de dosificación y tipo de material de empaque. Adicionalmente el PC posee un pequeño sistema de información que le permite manejar su producción y ventas. SISTEMA MECANICOS 5. SISTEMA DE ALIMENTACION DE MATERIAL 5.1 DESCRIPCION DEL PROCESO Un tanque tan grande como se desee alimenta un tanque con dimensiones más pequeñas. Este pequeño tanque (30, 40, 50 litros) alimenta por gravedad el liquido (producto a empacar) al sistema de dosificación. De tal modo que nuestro gran tanque suministra por medio de una bomba (eléctrica) el liquido al tanque menor. Este sistema de los tanques y su correspondiente alimentación son un proceso que se plantea como opcional al cliente. Este decide si quiere o no implementarlo. Si el comprador no desea utilizar bomba, puede hacer el llenando talvez el tanque menor con escalera, el costo es menor y no interfiere esto en la lógica del control del sistema principal dado que el circuito de control de este subsistema se diseño con miras en que el control fuese al control propio del sistema general de maquina. 5.2 TANQUE DE ALIMENTACION PRINCIPAL El tanque de alimentación principal hace referencia a todo el conjunto en el que se deposita el líquido ya listo para el seguido empaque. Este sistema consiste en una motobomba que debe cargar un tanque mas pequeño ubicado en la parte superior de la maquina que proporciona la entrada del liquido al punto dosificador por gravedad. Fig 4. Tanque de alimentación principal y secundario. Bomba de alimentacion 5.3 CALCULO DE LA BOMBA (MOTOBOMBA) La bomba es la encargada de suministrar un impulso al líquido para ser transportado automáticamente hacia un nivel de potencial mas elevado. Es decir subir nuestro líquido al tanque pequeño superior. En este proceso investigativo para la correcta adquisición de la bomba, es evidente que existe gran variedad de modelos funcionales en cuanto al tema. Lo más recomendable será obviamente acogerse a la oferta comercial existente. En la sección de anexos encontraremos una breve información acerca de los tipos de bombas que existen y un referido a la eficiencia de estas. La bomba o motobomba que utilizamos para este proyecto debe cumplir con algunos requisitos específicos del sistema los cuales se nombran a continuación. 5.3.1 Las partes que entran en contacto con el líquido deben ser de acero inoxidable ya que es el único que cumple con las características técnicas de durabilidad, resistencia y sanidad. Ya que resulta un tanto costoso su fabricación por parte nuestra, el mandarla fabricar resulta ser un tanto más económico y mas aun acceder a la oferta comercial. 5.3.2 La presión ofrecida por la bomba no ha de ser muy elevada, mas sin embargo debe proporcionar la fuerza al fluido para empujarlo unos 2 metros arriba. Por lo tanto para el calculo de la potencia necesaria debemos tener en cuenta la altura a la que se lleva el liquido y el diámetro de la tubería con lo cual obtendremos la cantidad máxima de liquido que en un momento dado puede estar alojado en la tubería. Con ello podeos encontrar el peso (fuerza) que tendrá el liquido y también la presión que esta columna de liquido genera en contra presión a la presión y fuerza que ejerce la bomba sobre el liquido. P = F / A ; F = mg ; A = Área de tubería. Un tubo de 1” = 2,5cm de diámetro y una altura de más o menos 2 metros. La fuerza es proporcional a la viscosidad del líquido. En laboratorio más o menos un litro de agua pesa 1kg. Decimos A = pi * D² / 4 = 4, 9 cm² ; Volumen = 4,9 cm² * 200 cm = 981 cm³ El volumen es casi igual a 1 Lt es decir que su peso es mas o menos 1 Kg. para el caso de una densidad similar al agua. F = m g = mas o menos 10 N ; A= 4,9 cm² * 10 mm * 10 mm / cm² = 490 mm² Por lo tanto Presión = 10 * 10 / 490 mm² = 0.2 bar Así que 1 bar = 14.7 psi la bomba es de 14,7 * 0.2 = 3 psi como mínimo. Tomamos comercialmente 5 a 10 psi como la presión máxima que debe soportar la bomba. 5.3.3 Referente al flujo de liquido podemos decir que necesitaremos una bomba de flujo constante ya que se supone un proceso de encendido y apagado. De igual modo el uso de una reguladora de presión tampoco es necesario en vista que se utiliza un punto abierto a la entrada del líquido (sin válvula controladora de paso). Lo que garantiza a la vez que no va ha existir la posibilidad de una ruptura en la estructura y en el peor de los casos el liquido se va a derramar. Esto implica que de la señal de los sensores dependerá el encendido y apagado de la bomba. 5.3.4 En cuanto al caudal que depende directamente del diámetro de la tubería y el flujo proporcionado en la bomba. Este caudal debe ser suficiente para no detener en ningún momento el trabajo realizado con la maquina así que queda este punto relevado al calculo en función del tiempo. Q = V / t en el que teniendo el tiempo deseado para el llenado del tanque superior y el volumen calculamos el factor Q caudal. En nuestro sistema inicial trabajamos un tanque de 50 Lt y requerimos empacarlos en bolsas de 500 mLt así que son 100 bolsas. Con una velocidad de llenado que dependerá del liquido a empacar y el sistema de dosificado. Con 7 segundos por empaque obtenemos un total de 700s lo que significa que la bomba debe cargar el tanque de 50Lt en menor tiempo para que el sistema trabaje sin necesidad de detenerse. Optamos por la mitad del tiempo aproximada a 360s = 6 minutos. Para decir así pues que Q = 50lt/6m lo que mas o menos aproxima a un caudal de 9 litros por minuto. 5.3.5 La potencia del motor para la bomba. P * Q /15 = 0.2 bar * 9Lt/m = KW. La potencia del motor es como mínimo 120 W. 1/4H.P Recuerde que un H.P = 745W. lo que aproxima a 6. SISTEMA DE AIRE A PRESION 6.1 CALCULO DEL COMPRESOR El compresor es el encargado de suministrar el aire a presión necesario para manejar nuestro circuito neumático. Existen gran variedad de modelos funcionales en cuanto al tema. Lo más recomendable será obviamente acogerse a la oferta comercial existente. El compresor que se utiliza para este proyecto debe cumplir con algunos requisitos específicos del sistema los cuales se nombran a continuación. 6.1.1 La transmisión de aire se hace por medio de manguera flexible y se procura que las distancias entre el punto de distribución de aire y el elemento que la necesita sea lo mas corta posible. 6.1.2 Calculo del caudal. Para el cálculo del consumo de aire se deben sumar uno a uno el consumo de los elementos de trabajo que estarán presentes. Dado que en este caso el sistema de control se hace eléctricamente los únicos elementos que consumen aire a presión serán los cilindros utilizados que básicamente serán 2. Las válvulas de paso (electrovalvulas) no son tomadas en cuenta ya que la pérdida es mínima y se tienen más en cuenta en el referido a las caídas de presión. Suponiendo que no posemos información de consumo estimada por el fabricante podemos realizar el cálculo de consumo neumático (el caudal) de la siguiente manera. Fig 5 .Medidas del cilindro neumatico Sea V = volumen. PI = 3.1416. L = longitud D = diámetro. Q = V/t =L * D² / 4 * PI * t donde t = tiempo. Es el tiempo deseado de trabajo. Sea =velocidadv A área trasversal * A = velocidad * D² / 4 * PIQ = v donde la velocidad es la deseada de trabajo. Desde este punto de vista bastaría con calcular los volúmenes, áreas, velocidades de trabajo deseadas o en su defecto el tiempo de ciclo requerido. Por otro lado podemos tener 2 casos básicamente. Uno en el que el compresor se encuentra justo al lado de la maquina por lo que las perdidas de caudal que se presenten en tuberías de distribución no se tiene en cuenta. Pero en el caso dos en el que la planta dispone propiamente de una red de aire las distancias de tubería deben ser tenidas en cuenta ya que por efectos de condensación habrá un flujo que es desfogado del sistema y que en su defecto representara perdidas las cuales deben ser aumentadas en los requerimientos de caudal que se maneja. En siguiente sección se explica un poco más a fondo el caso en que una red de aire proporciona el aire a presión en el punto deseado y los factores que debemos tener en cuenta para la elaboración de dicha red. Para un mismo caudal el área del pistón es inversamente proporcional a la velocidad lo que implica que en el deseo de un aumento de la velocidad podríamos proceder con disminuir el diámetro utilizado para el pistón lo que generara un aumento en la velocidad de desplazamiento. 6.1.3 La presión de trabajo se maneja a nivel de estándares. Generalmente se utilizan 6bar o 10bar. Para nuestro caso la presión requerida no es muy alta y se puede trabajar sobre el estándar. Mas sin embargo en la red de aire se incluye un regulador de presión el cual puede graduarse manualmente a la presión que se desee de trabajo. Dado que los niveles de trabajo son estandarizados los elementos de paso como las válvulas y los pistones deben incluir en la hoja técnica los niveles máximos de presión a los que pueden ser sometidos. El tipo de líquido entre más viscoso mas peso genera el mismo volumen por lo tanto se requiere de una mayor fuerza. Dado que P= F / A es importante tener en cuenta el área de los pistones y la fuerza requerida de trabajo. Asi que una cantidad de un litro de agua pesa algo asi como 1k, para materiales mas densos supongamos 5kg asi que es una fuera de 50N. Para un radio de 1’’ es decir un área de (2.5)² pi = 20cm² = 0.002m² Así que la presión para el pistón de dosificación será P = 50N / 0.002m² = 25000 Pa = 25000/10000 bar = 0.4bar como presión mínima requerida. Para el pistón de sellado la fuerza es algo mayor es decir unos 25kg. Así que la fuerza será de unos 250N y tomando un área de 1”. P = 250N / 0.002m² =125000Pa =125000 /100000 = 1.25bar como presión mínima requerida. Para la presión que utiliza el sistema aparte del cálculo para requerimientos de presión en los distintos puntos de accionamiento debemos tener en cuenta unas pequeñas caídas de presión originadas en el camino de distribución así como en los elementos de conmutación para el paso del aire. Por lo tanto y teniendo en cuenta nuestro sistema agregamos algo menos de 1bar como caídas máximas de presión y es teórico el uso de esta cantidad para caídas de presión en líneas principales lo que incluye el FRL que se explica mas adelante. Para un cálculo exacto nos podemos remitir a las tablas que ofrecen los fabricantes en donde encontramos detallado el factor caída de presión que presentan los diferentes elementos. 6.1.4 Calculamos la potencia requerida del motor del compresor. Para el piston del dosificador tenemos D = 8.5cm y L = 15.5cm es decir un volumen de 880 cm³ y para el piston de sellado D =3.71cm y L = 12cm un volumen de 130cm³. V1 + V2 = 1010cm³. Tomamos un tiempo rapido de 2s asi el caudal aproximado es 1Lt/2s y una presión de 6bar. La potencia sera asi de P * Q /15 = 6 bar * 1 Lt/ 2s / 15 = 0.2KW = 200W La potencia del motor es como mínimo 30 W. recuerde que un H.P =745W lo que implica un motor de menos de 1/4 H.P. 7 ACTUADORES 7.1 ACTUADORES ELECTRICOS Los actuadores eléctricos son básicamente los motores. Para el caso en cuestión se ha tomado la decisión de utilizar motor D.C ya que estos en relación al motor de tipo A.C proporcionan un mayor torque con una mayor robustez, es decir que se logra la misma potencia con un motor más pequeño físicamente. Por otro lado el control de velocidad, sentido de giro y posición resultan más sencillos. 7.2 ACTUADORES NEUMATICOS Los actuadores neumaticos utilizados en el proyecto seran de doble y simple efecto asi como de vastago unico y doble vastago. Para una clara comprensión de el diseño de este tipo de actuadotes consulte el anexo seccion 16. 7.3 VÁLVULA 3/2 PARA LOS ACTUADORES La aplicación de válvula 3/2 es básicamente en los actuadores ya que al aplicar fuerza con aire a presión el aire se inyecta dentro de los elementos de modo que al conmutarlos o retornar al punto inicial es necesario permitir la salida de aire de esta dichas cavidades. Al observar la válvula 3/2 vemos como el aire en una posición puede fluir en una dirección y en la otra posición puede fluir en la dirección contraria de modo que unimos un punto con 2 posibilidades. En un momento entrara aire al actuador y en otro momento el aire saldrá desfogado al ambiente. Fig.6.1Simbolo válvula 3/2 Fig 6.2.Valvula 3/2 piston simple efecto Fig 6.3.Valvula 3/2 piston doble efecto Como parámetros técnicos debemos conocer la potencia neumática soportable en la electroválvula para lo que debemos conocer la presión y el caudal de trabajo a la que va a someterse. Tenga en cuenta que la ficha técnica nos da la presión máxima que la válvula soporta y en función a ello podemos hallar el caudal máximo que tendremos por el elemento. El consumo de energía es referido a la potencia neumática, lo que nos da un equivalente en dinero del recurso energético que se consume. Así que la eficiencia del elemento se refiere precisamente a la caída de presión que el elemento proporciona al circuito y la velocidad de flujo perdida por efectos de rozamiento en el elemento. 8. VALVULAS PARA EL PASO DE LÍQUIDO. Para la selección de las válvulas se deben tener en cuenta 2 aspectos importantes. Tipo de válvulas existentes y la forma de conmutación. En cuanto al tipo de válvulas tenemos las electrovalvulas las cuales se conmutan con señales eléctricas, encontramos también las válvulas de embolo 2 vías y 3 vías, las válvulas de cortina, mariposa y aguja. Estos últimos tipos de válvulas comercialmente presentan accionamientos de tipo manual, aunque muchas de las empresas proveedoras de esto productos ofrecen sistemas para la conmutación adaptables al tipo de necesidad y condición preestablecida por el cliente. A fin de clarificar en este aspecto se hace referencia explicita de los diferentes tipos de válvula para el control de paso de liquido y así mismo los distintos sistemas propuestos de conmutación que son viables a implementar. 8.1. ELECTROVALVULA PARA SALIDA Y ENTRADA DE LÍQUIDO AL DOSIFICADO. El funcionamiento y accionamiento de la electroválvula es presentado posteriormente en el capitulo relacionado a los sistemas de control para actuadores neumáticos en los que por medio de la electroválvula una señal eléctrica se traduce en una conmutación de válvula. Esta válvula se consigue en el mercado. Inicialmente se pensó en trabajar directamente con electro válvulas elaboradas en acero inoxidable de modo que su implementación resultaba realmente sencilla. Producto del trabajo de campo realizado al cotizar los materiales que se encuentran en el mercado de electro válvulas en acero inoxidable y los requerimientos de diámetro para el paso de liquido deseados, se llego a la conclusión que los costos son muy elevados de modo que se pretende implementar un sistema distinto que pueda suplir la necesidad que se presenta. Mas sin embargo si se desea implementar las consideraciones pertinentes serian las mismas que en otro tipo de electroválvula es decir su activación será por causa de una señal de voltaje que se debe aplicar a la bobina del elemento y que permite la conmutación. Las cavidades para el paso de fluido que las electrovalvulas ofrecen son muy pequeñas y por lo general es complicado conseguir una válvula eléctrica que presente el sistema de electroválvula común utilizado para el paso de aire a presión en donde los efectos un electroimán posibilitan el taponamiento del paso pero de un espacio muy reducido ya que de lo contrario la bobina de electroimán requerirá mucha mas fuerza lo que implica los costos se eleven desfavoreciendo el sentido costo-beneficio. Es por esta misma razón, que comercialmente cuando se requieren diámetros grandes para el paso de líquido se remiten a un sistema de activación acoplado a las válvulas comerciales que poseen un sistema manual de activación. Siendo así, se debe comprar una válvula de acción manual en acero inoxidable he implementarle a ella un sistema especial que permite el cierre y apertura de la misma, lo que resulta mas económico. 8.2 CHEQUES 8.2.1 CHEQUE VENTANA El cheque tiene su equivalente eléctrico que en el diodo. Así que solo permite flujo en una sola dirección así como un diodo solo permite el paso de corriente en un solo sentido. Fig 7.Cheque ventana De la misma forma podemos hacer su análisis partiendo de esta analogía. Las referencias técnicas de un cheque nos deben decir la presión que soporta al dar paso. La presión máxima que soporta en sentido inverso de conducción de flujo y el diámetro de acople para adaptar algún punto especifico. De igual forma ofrece caídas de presión y velocidad pero en general estas pérdidas son muy pequeñas y en la mayoría de ocasiones despreciable. Así que la ecuación para el fluido que representa la presión mínima para vencer la inercia del cheque será Ff (fuera del fluido) > Tr (torque de la bisagra rotora); Ff = P * A así que P= presión A = area, la presión debe ser tal que vensa dicho torque que es muy pequeño. Fig 8.Funcionamiento cheque ventana Note que en el punto de máximo taponamiento el torque producido por el flujo tiene un máximo así que el punto critico es en los puntos intermedios de recorrido para el elemento tapón. Es decir que en cierto caso el cheque podría quedar en puntos intermedios es decir ni totalmente abierto ni totalmente cerrado. Dado que la fuerza sobre la superficie se distribuye unifórmenle encontramos el punto de mayor torque en la parte mas alejada, dado matemáticamente generamos una sumatoria podemos encontrar el punto intermedio equivalente dada la linealidad que representa la ecuación T = d * F (d = distancia). Así que la distancia media puede multiplicarse por la fuerza total obteniendo el torque producido. Fig 9.Analisis fuerzas cheque ventana 8.2.2 CHEQUE RESORTE Existe en el mercado otro tipo de cheque que es el modelo resortado. Este modelo aunque muy eficiente posee el problema que por un lado es muy complicado de conseguir en acero inoxidable y por otro lado las partes como resorte y empaque entran en contacto con el liquido de modo que en el caso de alimentos no resulta muy optimo. Mas sin embargo se expone el modelo a fin de poder ser utilizado si el caso lo requiera. Fig 10. Cheque resorte En el sentido de no paso es claro que se produce un taponamiento, los resorte se encuentran en su estado de reposo por lo que la fuerza kX = 0 ya que el resorte se encuentra en su punto X=0. Los empaques mantienen la hermeticidad impidiendo el paso de líquido. Para el ciclo en que si pasa el agua debemos tener las consideraciones de mínima presión necesaria. Los resortes poseen cada uno su constante de resorte k. así que la ecuación P*A > 2kX nos dice que la presión debe tener un umbral mínimo tal que vensa la resistencia que oponen los resortes en el sentido de conducción (2kX suponemos que los resortes son totalmente iguales). Note que este modelo de cheque nos provee de un flujo de líquido menor y el mantenimiento sanitario es mucho mas complicado. 8.3 VALVULAS DE EMBOLO 8.3.1 VALVULAS DE EMBOLO 2 VIAS Es una válvula 2/2, dos vías, dos posiciones. La válvula de embolo es de uso común en la vida cotidiana. Una esfera hueca se aloja en una cavidad esférica también hueca que posee un par de adaptaciones a lado y lado para ser puesta como interruptor de paso y no paso de un fluido. También las hay del tipo cilindro con la misma funcionalidad uno dentro de otro. La válvula esférica en su comportamiento puede verse como una cilíndrica ya que las ranuras son únicamente laterales y en la parte superior es totalmente maciza. 8.3.1.1 ESQUEMA DE FUNCIONAMIENTO Fig 11.Funcionamiento válvula embolo La válvula comercial de estudio tiene una articulación rotacional que por medio de un acople tipo poligonal, permite que una fuerza externa aplicada en el eslabón acoplado produzca un torque sobre el embolo que le permite girar para producir la conmutación. Así que se comporta como una transmisión tipo palanca. El giro que debe proporcionarse para la conmutación es de 90º, girando nuevamente los mismos 90º en sentido inverso para la reconmutación. La válvula presenta el inconveniente del desgaste de los empaques por lo que los expertos recomiendan utilizar otro sistema más eficiente. Con esta válvula tenemos pues el inconveniente del cambio de esta en periodos de 6 a 8 meses. Otro inconveniente es el torque exigido por la válvula para ser conmutada. La fuerza que un actuador externo debe ejercer resulta ser muchas veces mas elevada de lo que otro tipo de válvula solicita. Cabe resaltar que el torque máximo se realiza en los puntos de máxima conmutación, es decir totalmente abierta (para cerrarla) o totalmente cerrada (para abrirla), es en donde se presentan los puntos de máximo esfuerzo para el mecanismo. 8.3.2 VÁLVULA DE TRES VIAS Es una válvula 3/2 tres vías dos posiciones. La válvula de tres vías es una válvula de embolo con el mismo mecanismo que la nombrada anteriormente, solo que para este caso el la válvula posee tres orificios por lo que la válvula es capaz de conectar una vía con las otras dos pero no al mismo tiempo. El usuario selecciona el orifico a conectar empleando el mismo mecanismo aunque el embolo internamente posee una construcción diferente porque el embolo posee tres orificios. Igualmente el giro de conmutación es de 90º Fig 12.Válvula tres vias (catalogo corbeta) Es posible que al mover el embolo encontraremos una tercera posición que es cuando las vías quedan taponadas impidiendo el paso de fluido, esta es una posición intermedia que puede ser también utilizada si el caso lo requiera. Así que permitirá direccionar un fluido en dos direcciones (1 entrada 2 salidas) o permitirá que dos fluidos puedan fluir hacia una dirección (2 entradas 1 salida) o el caso en que una vía se utiliza de entrada y salida. Mientras que las otras dos vías son una entrada y una salida. (1 entrada, 1 salida, 1 salida/entrada). Fig 13.Funcionamiento válvula 3 vias 8.3.3 MARIPOSA Fig 14.Valvula mariposa(catalogo corbeta) La válvula de mariposa aunque no posee embolo como tal, presenta el mismo sistema de accionamiento para la conmutación que las válvulas de embolo. Así que los circuitos de control son los mismos y son igualmente 90º de giro para conmutar la válvula de mariposa.Tenga en cuenta que en este caso el torque de operación es mucho mas bajo y es por esto que la válvula es mas recomendable. Aunque resulta algo complicado de conseguir en el mercado y es mas costosa que la válvula anterior. Los análisis dinámicos presentan la misma ecuación aunque en este caso el factor de rozamiento que afectaba notablemente el rozamiento no esta presente de manera tan significativa. 8.3.4 ANALISIS DINAMICO VALVULA DE EMBOLO Decimos que el Torque es proporcional a la fuerza aplicada por la ecuación T=F*d*cos ((k * Inercia) También podemos afirmar que el torque aplicado debe ser mayor al torque generado por la inercia del elemento en conjunto con la fricción que ofrecen los materiales con que se realiza el empaque de la válvula (elemento que no permite escapes de fluido) T(t) - Fr =k*I(t) T(t)=[ k*I(t)+ Fr(t) ] Donde k es básicamente la constante de inercia que posee el movimiento y donde Fr es la fuerza de rozamiento producida por la fricción que se opone al torque ejercido y a la vez es función de la velocidad en el diagrama dinámico que representa al sistema. T(t) =kI(t)+bV(t). = k* dV(t)+b* V(t). b es la viscosidad quien en conjunto a la velocidad producen la fuerza de oposición. La función de transferencia de la velocidad y el torque es del tipo V(s)/T(s)=1/(kS+b) = (1/k)/S+b/k. Por medio de la función de transferencia obtenida podemos analizar la parte transitoria en la señal de salida que nuestro punto de interés ya que lo que buscamos es encontrar la relación entre la velocidad de apertura y el torque ejercido por el elemento actuador de la válvula. Suponiendo que el torque aplicado es constante podemos también afirmar que la respuesta es del tipo: V(t)=T * (1/k) * (1 – Ε -(kt/b)) La ecuación nos muestra varias cosas: La velocidad es directamente proporcional al torque aplicado. Las constantes k y b son inversamente proporcionales a la velocidad de modo que entre mas fuerte sean los empaques la velocidad será mucho menor e igualmente la inercia del elemento dependerá del material asi que para el caso de este tipo de válvulas los factores y especialmente el de rozamiento es elevado y por lo tanto el elemento actuador consume mas energía. Fig 14.Respuesta posición proporcional al torque De tal modo que para una rápida estabilización en un punto dado debemos proporcionar un alto torque logrando así que la grafica llegue a su punto de equilibrio lo más rápidamente posible. La aceleración que debemos proporcionar al sistema debe ser también controlada con el fin de optimizar el consumo de energía. 8.4 CORTINA Fig 15.Valvula cortina (manual corbeta) 8.4.1 ANALISIS DINAMICO En este caso de la cortina tenemos una transmisión tipo tornillo sin fin de modo que por medio de un movimiento circular producimos un movimiento lineal en el elemento actuador. El paso de la rosca nos dará el desplazamiento lineal en relación con el número de vueltas. En la practica se pudo concluir que para válvula de este tipo en ½ pulgada en sus acoples se produce el taponamiento total de la válvula con 5 o 6 vueltas. En válvulas mas grandes, como las utilizadas en tubería de alcantarillado este numero de vueltas aumenta mas o menos proporcionalmente al tamaño del acople. Mas sin embargo se puede analizar que el torque ejercido por el operario para abrirla o cerrarla es muchísimo mas bajo que el que aplicábamos en las válvulas de embolo. Además este torque se presenta constante en todo el proceso de apertura y cierre. La potencia requerida por los acondicionamientos mecánicos que se puedan hacer se reduce a mas 10 veces en relación con el otro tipo de válvulas. Eventualmente la válvula de cortina se presta para controlar el flujo de paso ya que pude ser abierta parcialmente, es decir que no trabajamos la válvula en los puntos máximos sino que los puntos intermedios nos permitirán controlar el caudal reduciendo el área de paso a nuestro gusto. Es decir comportándose como una válvula proporcional. 8.5 TIPO AGUJA Fig 16. Válvula tipo aguja (manual corbeta) 8.5.1 ANALISIS DINAMICO La válvula tipo aguja como nos mostró la grafica anterior posee un estado normalmente. Es decir que en estado de reposo esta cerrada completamente. Su mecanismo muestra un resorte interno que se encuentra en compresión de modo que ejerce la fuerza necesaria para vencer la inercia del selle y mantener la válvula cerrada la estructura de la válvula se opone al desplazamiento de este resorte generando una fuerza que constantemente existe y se opone al desplazamiento en la dirección de apertura del selle. Al conmutar la válvula este desplazamiento X se hace mayor por lo tanto la fuerza ejercida por el resorte aumenta. Esta fuerza del resorte aunque se opone a la fuerza ejercida para abrir la válvula y dar paso al fluido, resulta pequeña realmente por lo que la energía que debe ser suministrada en la conmutación es baja. Fig 17.Analisis dinamico válvula aguja Dado que realmente la fuerza de apertura es mínima, este sistema es muy recomendable por la fácil implementación del accionamiento con actuadores neumáticos. Aunque el hecho de trabajar un resorte en estas condiciones puede resultar perjudicial dado que venzamos la zona elástica generando una deformación permanente en el. 9. SISTEMA DE DOSIFICACION 9.1 JERINGA INDUSTRIAL (ESTRUCTURA BASICA DE DOSIFICADOR) 9.1.1 ENVASE DE DOSIFICACION El envase de dosificación esta hecho en acero inoxidable. El mercado de acero inoxidable tiene en el mercado tubería en este material. Esta tubería la encontramos en los distintos estándares a lo que referimos una comodidad en cuanto a la elaboración ya que basta con adquirir el pedazo de tubo requerido y ponerle tapa con adaptaciones. Existe un gravísimo inconveniente y radica en que la tubería en su proceso de almacenaje y transporte tiende a pandearse aunque muy poco. El sistema a implementar requiere una alta redondez del perímetro del tubo para evitar el escape de líquido que se pudiese presentar si no se sucede esta condición. Por estos motivos resulta más conveniente mecanizar esta estructura a fin de que el grosor del pistón sea tal que impida el pandeo con facilidad. Fig 18.Envase dosificación VOLUMEN = 8.5 * 8.5 * 3.1416 /4 *15.5 = 880cm³ 9.1.2 VÁSTAGO DE EMPUJE El pistón encargado de proporcionar el empuje lleva consigo el elemento que deberá empujar el líquido y a su vez generar el vacío capas de succionarlo. Fig 19.Estructura que empuja el líquido adaptada al cilindro. El diámetro externo de la sección de empuje debe ser milésimas mas pequeño el diámetro interno del cilindro dosificador. Fig 20.O RINGS. Empaques acoplados para evitar escape de líquido De modo que finalmente estas 2 estructuras se unen formando la jeringa dosificadora. Fig 21.Jeringa dosificadora 9.1.3 DOSIFICACION POR SUCCION Fig 22.Dosificacion por succion El sistema de dosificación consiste en un envase de dosificación que tiene una capacidad de un litro. El envase tiene dos orificios, por uno entra el líquido del tanque y por el otro sale líquido dosificado. La entrega de la dosis se hace tipo jeringa y por medio de un actuador (cilindro) neumático que es controlado en el sistema. Este cilindro a su vez lleva una adaptación especial que permite empujar el líquido y su vez impide que el líquido se salga del envase dosificador. Para la salida y entrada de liquido se manejan electro válvulas tipo 3/2 de retorno por fuelle. Para poder utilizar diferentes dosificaciones se implementa un elemento deslizable sobre el vástago de pistón que hace posible actuar un final de carrera para detener el circuito y succionar la cantidad que se desea únicamente (elemento seleccionador de cantidad de dosificación). 9.2 MODELOS DE SALIDA Y ENTRADA DE LÍQUIDO AL DOSIFICADOR 9.2.1CHEQUE / CHEQUE FIG 23. Modelo cheque/cheque Teóricamente el sistema debe funcionar, es evidente que el sistema depende de varios factores mecánicos. En este caso es importante que el ciclado sea adecuado ya que la apertura en el cheque de entrada puede suceder antes de que el cheque de salida este completamente cerrado. En este caso el líquido hace un paso directo impidiendo que se realice el ciclo adecuadamente, ya que el flujo impide que el cheque se cierre y el sistema queda pasando líquido de forma directa. 9.2.2 CHEQUE / VALVULA Fig 24.Modelo cheque válvula El sistema cheque, válvula resulta económico y en este caso se controla el punto de salida. El cheque cumple la función de permitir el llenado de la jeringa dosificadora y evitar que en el momento del empuje el líquido se devuelva hacia el tanque almacenador. Este sistema no presenta inconvenientes relevantes de modo que funciona adecuadamente. Para el circuito de control es necesario únicamente el control de una válvula lo que reduce el numero de accionamientos controlados necesarios para la manipulación del dosificador. 9.2.3 VALVULA DE TRES VIAS Fig 25.Modelo válvula de tres vias La válvula de tres vías es una solución óptima, ya que en este caso se controla por medio de válvula la entrada y salida del líquido de forma alternativa. La válvula de tres vías exige el mismo sistema de control que implica el sistema cheque- válvula de modo que solo se controlara una válvula. La válvula en forma alternativa conecta el dosificador con la entrada para la succión y luego la salida para el empuje. El inconveniente de esta válvula radica en lo complicado para conseguirla en el mercado y más aun en acero inoxidable. Su funcionamiento no presenta más recomendaciones y es considerado el más óptimo de todos por su etapa de control, implementación y fiabilidad. Claro esta adicionalmente los problemas que presentan las válvulas de embolo y que ya fue mencionado en la sección 8.3. 9.2.4 VALVULA / VALVULA FIG 26. Modelo válvula / válvula El sistema válvula-válvula es tan óptimo como el sistema de tres vías. En este caso el sistema de control debe permitir el accionamiento de 2 válvulas. Esto implica que el montaje resulta mas complejo al igual que el sistema de control por lo implica a su vez costos mas elevados. A nivel de optimización resulta mucho mas llamativo ya que en este sistema podemos plantear cualquiera de los sistemas recomendados para el control de paso de liquido por lo que los diferentes modelos de válvula. En el proceso de control debemos tener en cuenta que el sistema puede presentar varios estados como por ejemplo las dos válvulas abiertas. Algunos estados no son deseados, problema que no se presenta con la válvula de tres vías. Aunque resulte un tanto mas complejo el control el sistema en su funcionamiento adecuado presenta el comportamiento que se desea por lo q ue puede ser este el sistema mas recomendado para implementar. Para este modelo se recomienda la implementación de válvulas cortina dado que se consiguen fácilmente en el mercado en material de acero inoxidable. Los accionamientos recomendados son motores de 12, 24 voltios que no tiene gran torque de modo que son económicos. Las estructuras de soporte son de igual forma de fácil implementación. 9.2.5 VALVULA MECANIZADA 3/2 Fig 27.Valvula mecanizada 3/2 Este sistema nos proporciona un sistema tipo válvula 4/2 cuatro vías 2 posiciones pero el caso es que es un conjunto de 2 válvulas 2/2 que se combinan en un único sistema por medio del cual se conmutan alternativamente con un único pistón que bien podría tratarse de un pistón de simple efecto o doble efecto lo que haría el control de igual forma que la válvula de 3 vías. Aunque presenta el inconveniente de tener que mecanizar la estructura que realizara la conmutación. 10. UBICACIÓN DOSIFICADOR 10.1 ESTRUCTURA DE SOPORTE DEL DOSIFICADOR Fig 28.Ubicación dosificador y tanque de almacenamiento La ubicación del dosificador será en la base del pequeño tanque de alimentación, ya que necesitamos adaptar el tanque al dosificador además que en el caso en cuestión se cae por gravedad y la bolsa se aplica alrededor del tubo de salida y por esta razón queremos que la salida del dosificador sea lo mas alta posible para una mayor cantidad de papel. Además claro esta que aprovechamos la estructura definida para el tanque en el dosificador con un requerimiento un poco más alto en cuanto a soporte de peso se refiere, sin ser este punto muy relevante. 10.2 UBICACIÓN HORIZONTAL Fig 29.Ubicacion horizontal Fig 30 Union dosificador-tanque (manguera pvc o tubo inoxidable) 10.3 UBICACIÓN VERTICAL Fig 31.Ubicacion vertical Igualmente la adaptación entre el tanque y el dosificador puede ser por medio de manguera o tubo inoxidable. 11. SISTEMA DE SELLADO 11.1 SELLADO VERTICAL Fig 32 Sellado vertical Luego de que el líquido ha sido dosificado, cae por gravedad a través del tubo de salida del dosificador. Este tubo se encuentra revestido por la bolsa en la cual se empacará el líquido. En el momento en que el líquido toca la bolsa, la desplaza en forma vertical obligándola a pasar por las resistencias de sellamiento. Un (sensor bolsita) está ubicado en un punto estratégico, de tal modo que indica al sistema cuando la bolsita pasa por su zona de sensado. Luego de esto el sistema espera un corto tiempo configurado por software de tal modo que la activación del sellado se produzca en el punto correcto. El sellado de las bolsas se hace por medio de unas resistencias que se encuentran unidas a dos laminillas de bronce, cuando estas dos laminillas de bronce se calientan (efecto de la resistencia) y se unen sobre la bolsa se produce el sellado. Para evitar que la bolsa se pegue al bronce, la laminilla debe ir recubierta de teflón. El desplazamiento de estas láminas (resistencias) para hacer unidas sobre la bolsa, se realiza por medio de un cilindro neumático. Este cilindro es un cilindro de simple efecto dado que únicamente se necesita control para producir la unión de las dos laminillas. El cilindro que se utiliza está normalmente abierto dada la estructura diseñada para el sello en el momento en que se recibe la señal, el cilindro se cierra produciendo la unión de las dos laminas sobre la bolsa. Se adiciona en este sistema una bandejita ubicada justo a la caída de la bolsa que nos ayuda a minimizar la velocidad de caída de la misma. La estructura de soporte de todo este sistema no exige una carga muy fuerte; por lo que no es relevante en cuanto a costos se refiere y ubica el punto de sellado más o menos a un metro del piso. Fig 33.1.vistas en solid edge Fig 33. vistas en solid edge 11.2 SELLADO HORIZONTAL Para el sistema de sellado horizontal tenemos el siguiente modelo en vista lateral. Fig 34.Sellado horizontal En este sistema un mecanismo es adaptado para bajar la selladora superior de modo que presiona la inferior produciendo el selle. Por medio de un resorte mantenemos las selladoras en forma abierta, para que por medio del mecanismo al aplicar una fuerza en la parte inferior producimos el desplazamiento de la estructura diseñada para producir el sellado. Al accionamiento del modelo podemos fácilmente adaptar un pistón neumático de simple efecto o doble efecto y controlarlo de igual forma que en caso de la selladora vertical. Fig 35.Adaptacion de piston Para ilustrar mejor este modelo se desarrollo un modelo a escala el cual es presentado en la sección 22 laboratorio de diseño. 11.3 RESISTENCIAS DE SELLADO La resistencia de sellado es un elemento muy comercial. Lo importante a tener en cuenta es la temperatura que va a manejarse para el sellado. Estas resistencias se consiguen en diferentes medidas de longitud, así como para el manejo de diferentes temperaturas. En el momento del sellado se presentan básicamente dos procesos. El primero consiste en un sellamiento de la bolsa en caliente. En este momento por medio de temperatura hacemos que la bolsa pase de su estado sólido a un punto de fácil fusión lo que permite que lado y lado de la bolsa se unan y queden unidos de igual forma como sucede con la soldadura para elementos metálicos. Un segundo paso es el sellado en frío o sea que luego de calentar, dejamos nuevamente que se produzca el enfriamiento manteniendo la forma del selle producido es decir presionando para impedir que la bolsa se arrugue en el proceso de solidificación. Los tiempos de selle en frío y caliente dependen del material y de la temperatura de trabajo así que el usuario debe graduar estos dos tiempo por parte separada. La resistencia de sellado puede ser colocada en una mordaza o en las dos. Utilizamos 2 resistencias básicamente con bolsas en material de alta densidad que lo requieren para producir la fusión. Generalmente con una sola es suficiente. Existen 2 clases o tipos básicos de resistencias: de calentamiento rápido y de calentamiento lento refiriéndonos a la velocidad en que alcanza la temperatura de sellado. La rápida podríamos decir que es instantánea y la lenta si toma mucho más tiempo relativamente (de 5 a 10 minutos). SISTEMAS DE CONTROL 12. CIRCUITOS CONTROL Y POTENCIA PARA CARGA DEL TANQUE SUPERIOR. Fig 36.Esquema de sensores en sistema de alimentación S1 = Sensor en la parte superior del tanque menor. S2 = Sensor en la parte inferior del tanque menor. S3 = Sensor en la parte inferior del tanque mayor. 1. El sistema de control debe cumplir las siguientes condiciones de funcionamiento 2. Si S3 no censa líquido la bomba no debe funcionar. 3. La activación de la bomba debe ser hecha en función al sensor S2 de manera que cuando S2 no detecte líquido debe prender la motobomba. Esta debe cargar el tanque hasta la altura indicada por el sensor S1 de modo que cuando S1 censa el líquido debe detener la bomba impidiendo que esta vuelva a trabajar hasta no cumplir la condición en el S2 para la nueva activación de bomba. 12.1 CONTROL Utilizamos reles activados directamente por los sensores S1, S2, S3 respectivamente. En el circuito de control se opta por nombrarlos de la misma forma S1, S2, S3 que el sensor asociado. Tenemos un pulsador para el mando manual, usamos un relé KX como relé de activación para la interfase a la bomba. En este punto el relé KB provee contactos para el manejo de alta corriente ya que KB es únicamente utilizado para el control. Fig 37 circuito de control para sistema de alimentación 12.2 POTENCIA Siendo KB un relé para la interfase al circuito de potencia. Este podría bien activar un contactor o un triac elementos que permitirán manejar la corriente y voltaje asociado a la bomba. Dado que el sistema no requiere alta velocidad de conmutación la utilización de un elemento u otro depende exclusivamente de los costos y su ubicación dentro del sistema por cuestiones de estética y espacio. En ambos casos se utiliza un pulsador de paro manual con enclavamiento mecánico tal que la maquina puede ser detenida en cualquier parte del proceso y a su vez la maquina puede quedar inactivada si el caso lo recomendara. Fig 38 circuito de potencia sistema de alimentacion 13. SENSOR DE NIVEL El sensor de nivel que necesita el sistema es de tipo digital (ON/OFF) ya que no vamos a utilizar la discriminación de la cantidad exacta de liquido en el tanque. Lo que si es relevante es que el líquido por ser un producto de consumo no debe entrar en contacto con materiales (que no cumplan normas sanitarias) que puedan afectarlo. Para el sensor de nivel podemos utilizar diferentes sistemas. 13.1 FLOTADOR Como primera opción se utiliza un sensor tipo flotador que nos da una señal en el que un micro switch tipo rele acciona el rele destinado para la entrada deseada al sistema de control que seria de 5V para un PC (p.ej). Este tipo de sensor se consigue fácilmente y a un costo relativamente muy bajo y aunque pudiese cumplir los requerimientos sanitarios deseados, el hecho de tocar el líquido implica un desacuerdo en el cliente quien a todo costo quiere mantener el líquido lo más posiblemente aislado del contacto con agentes externos. 13.2 SENSOR OPTICO INFRAROJO Un sensor tipo óptico o infrarrojo, en el que igualmente los bajos son relativamente bajos. El problema esta en la adaptación de este ya que el tanque superior debe tener en la zona de censado un orificio que permite al rayo de luz atravesar el tanque de lado a lado. En este caso la señal recibida es de tipo ON/OFF como optocoplador ya que un emisor de rayo emite una señal y un fotodiodo justamente al frente recibe o no la señal activando o no la conducción del fotodiodo de modo que este se coloca a un voltaje y así cuando se produce la conducción se mide un voltaje que es fácilmente el voltaje de activación para la entrada al PC. 13.2.1 ESQUEMA REFERENTE Fig 39.Esquema referente sensor infrarojo 13.2.2 CIRCUITO DE CONTROL Fig 40 Circuito de control sensor infrarojo Para esta opción se presenta el problema que debemos llevar a cabo un proceso adicional al mecanizar la estructura con los orificios deseados. Por otra parte la densidad del material y el color son relevantes en la calibración del sensor por lo que un único sistema no podría hacerse universal a manera de ser utilizado en forma indiscriminada para el distinto tipo de líquidos en densidad y color. 13.3 FENOMENO RESISTIVO Una tercera opción es introducir un par de varillas delgadas de acero inoxidable al tanque. Las varillas están unidas a un cable conductor de tal modo que al variar la cantidad de liquido tenemos una variación en la resistencia medida, así que por medio de un comparador podemos definir un SET POINT y disparar nuestro ON/OFF en la altura de liquido mínima o máxima requerida según sea el caso. Recordemos que utilizamos tres sensores de nivel: dos en el tanque pequeño (nivel máximo y nivel mínimo) y uno en el tanque grande (nivel mínimo). 13.3.1 ESQUEMA REFERENTE Fig 41.Esquema referente sensor resistivo 13.3.2 CIRCUITO DE CONTROL Y ACONDICIONAMIENTO Fig 42 Circuito contro sistema resistivo Este arreglo electrónico para el control debe ser hecho para cada uno de los tres valores de censado diferente S1, S2 Y S3., el nivel deseado es simplemente graduado por medio de mi valor de referencia (entrada negativa en el comparador. Los valores de alimentación para el operacional dependen del voltaje con que trabajan los reles de control S1, S2 Y S3 establecidos en el circuito de control para la carga de líquido al tanque menor. En estos primeros modelos alternativos para la solución en el censado de nivel lo requerimientos de no tener contacto alguno con el liquido no se han cumplido a cabalidad y a su vez se implica un mecanizado adicional en los tanques de almacenamiento. 13.4 MODELO DE SALIENTE Para las siguientes soluciones se propone un saliente en el tanque utilizando la ecuación fundamental de la estática de fluidos que afirma que la presión depende únicamente de la profundidad. El principio de pascall afirma que cualquier aumento de presión en la superficie de un fluido se transmite a cualquier punto del fluido. Fig 43 Prinsipio de Pascall Aplicando este fenómeno físico podemos asegurar que independiente del diámetro de un tubo saliente interconectado con el tanque el nivel de altura h1sera igual al nivel de altura h2. De esta manera podemos sensar el nivel de tanque en el punto saliente. Donde en el caso que se implemente el sistema de dosificación sin la implementación de la bomba automática, se puede simplemente observar por simple inspección el nivel de líquido alojado en el tanque. 13.4.1 ESQUMA REFERENTE Fig 44 Modelo saliente 13.5 TIPO REED SWITCH Podemos manejar reed switch los cuales por medio de propiedad magnéticas de atracción genera el contacto de 2 elementos conductores efectuando un contacto que inmediatamente permite el paso de una señal de control. Por medio de un par de reed switch se censan los niveles máximo y mínimo del tanque que son las medidas que el sistema debe controlar. 13.5.1 ESQUEMA REFERENTE Fig 45 Tipo reed swith 13.5.2 CIRCUITO DE CONTROL Fig 45 Circuito control tipo reed switch R1, R2 Y R3 son los reed switch correspondientes para el sitio de censado respectivamente y nos indican que simplemente el cierre del contacto nos permiten el paso de una señal de control que permita activar los reles correspondientes... 13.6 EFECTO MAGNETICO Otra solución corresponde al tema de efectos magnéticos es ubicando un arrollamiento de alambre sobre el tubo saliente para el censado el cual será bobina secundaria de un transformador reductor. Con un bobinado primario se induce un voltaje el cual varía según el valor de la inductancia que cambia con efectos de núcleo. Para este caso utilizamos el efecto transformador. Aplicando un voltaje AC en el bobinado primario, que bien puede ser los 120VAC que nos ofrece la red eléctrica, esperamos un voltaje mucho menor en el bobinado secundario. De manera que aplico un puente de diodos y un condensador con el fin de obtener una señal del tipo DC la cual ingresa al comparador. Esta señal debe proporcionar un voltaje que vaya desde unos 2 o 3 voltios hasta un valor no mayor a los 20 voltios. Si nos remitimos a la etapa de control el condensador resulta opcional ya que en el momento de la comparación aunque se presentara oscilación en la respuesta de salida en el amplificador, dada la variación de la señal que sale del bobinado, la corta activación de las señales es suficiente para proporcionar a los reles que activen las retenciones y los ciclos de trabajo se desarrollen normalmente. De igual manera el uso de un elemento flotador y un elemento metálico implican una variación mas abrupta en la inducción de voltaje presentada por lo que el acondicionamiento resulta un tanto mas sencillo que si utilizamos la variación en el núcleo como solamente por el liquido que este o no este. El uso de la rectificación de señal por medio del puente de diodos es necesario ya que es necesario referenciar nuestra señal de salida y de igual manera el comparador y el set point en un mismo punto. 13.6.1 ESQUEMA REFERENTE Fig 46 Esquema Efecto magnetico 13.6.2 ACONDICIONAMIENTO Fig 47.acondicionamiento magnetico 13.6.3 CIRCUIO DE CONTROL Fig 48 Circuito de control efecto magnetico 13.7 EFECTO CAPACITIVO En este tipo de sensor vamos a tener en cuenta la variación en la impedancia del condensador, producto de una variación en el dieléctrico que se da cuando el líquido se encuentra entre el par de placas paralelas. De igual forma que en nuestro sensor de efectos magnéticos la señal es acondicionada por medio de una rectificación que entra aun comparador que permite relacionar la señal recibida con el set point estipulado. 13.7.1 ESQUEMA REFERENTE Fig 49. Efecto capacitivo 13.7.2 ACONDICIONAMIENTO Fig 50 Acondicionamiento efecto capacitivo 13.7.3 CIRCUITO DE CONTROL Fig 51 Circuito de control efecto capacitivo 13.8 SENSOR DE ULTRASONIDO Como una cuarta opción tenemos el sistema por ultrasonido. Los sensores de ultrasonido existentes en el mercado poseen gran cantidad de aplicaciones, como costos elevados y por lo tanto no se tomaron en cuenta como posible solución. Aunque encontramos sensores de ultrasonido tanto digitales como análogos, para el caso se requería propiamente el digital, aunque un análogo podría también utilizarse. 13.8.1 ESQUEMA REFERENTE Fig 52.Sensor ultrasonido El principio físico de funcionamiento nos explica que por medio de un oscilador generamos una señal con una frecuencia de ultrasonido la cual es emitida con la ayuda de un transductor de ultrasonido el cual es un elemento piezoeléctrico interno que por medio de la señal eléctrica presenta oscilaciones en una membrana interna. Estas vibraciones mecánicas, emiten una onda con una determinada amplitud. Esta amplitud se atenúa conforme se desplaza en el medio. Al chocar con una superficie el rayo es reflejado hacia si mismo generando un eco que es direccionado hacia un Rx receptor de ultrasonido el cual esta sintonizado previamente a las frecuencia del transmisor. La amplitud de la señal que llega a recepción es proporcional a la distancia que la señal recorrió (eco), al medio por el que se desplazo y a factores referentes al ángulo de reflexión de la señal ultrasónica. Fig 53 forma de onda ultrasonica Para el caso en cuestión se expone el diseño del control por ultrasonido elaborando por completo e sistema de oscilación, y calibración de las y manipulación de las señales llegadas al receptor. Es posible adquirir sensores de ultrasonido sin acondicionamiento alguno, ni interfase de aplicaciones al usuario a costos mucho más bajos y realizar por medio de un sistema electrónico el control. 13.8.2 ACONDICIONAMIENTO El oscilador es diseñado con 555 oscilando en modo biestable a una frecuencia de 40KHz, con un ciclo útil del 50%, asumimos C = 1uF, así que utilizamos RA = RB = Ton / 0,69 / C ; Ton = 1 / 40KHz = 0,000025 = 25us ; RA = RB = 25us / 0,69 / 1uf = 25/ 0,69 = 36Ω Operacional LM339 Fig 54. Acondicionamiento sensor ultrasonido 13.8.3 CIRTCUITO DE CONTROL Fig 55. Circuito control sensor ultrasonido 13.8.4 PROBLEMAS CON LOS ULTRASONIDOS El ultrasonido presenta el inconveniente de la angulación del rayo incidente. De tal modo que agitaciones prolongadas o abruptas pueden generar un movimiento del líquido, que si es tal, pude inferir una variación en la reflexión del as ultrasónico que al ser desviado no genera información. En estos casos el sistema podría recibir señales incorrectas, haciendo trabajar a la maquina en momentos incorrectos. Fig 56.Problemas de ultrasonidos La ubicación de los sensores resulta de alguna manera practica aunque las estructuras de soporte para el sensor podría generar corrosión y por consiguiente desprendimiento de material, a su vez contaminando el liquido que se esta empacando. El hacer estas estructuras en acero inoxidable en su totalidad resultaría algo costoso, podríamos utilizar PVC como elemento alternativo procurando conservar la estética. Tenga en cuenta que en caso de tanques muy profundos el sensor su parte Tx debe tener mas potencia para producir una señal ultrasónica con mayor alcance. También tenga en cuenta que este tipo de sensor maneja una histéresis producto de sus propias características físicas de construcción y por lo tanto el factor sentido de flujo de liquido en la carga va ha generar diferencias de señal en el receptor. También un espacio cercano en el que el sensor no alcanza a recibir el eco producido por la señal, este espacio cercano de trabajo también presenta el fenómeno de histéresis dando diferentes señales según el caso se hacer o se aleje al liquido. 13.9 SENSORES COMERCIALES DIGITALES Como su nombre lo dice estos sensores entregan una señal. Aunque encontramos con diferentes propiedades físicas de respuesta de los distintos modelos que pueden ser capacitivos, inductivos, autoreflex y de ultrasonido los cuales debemos calibrar a un set point deseado y utilizando el modelo adecuado de conexionado podemos implementarlos rápida y fácilmente. Igualmente para la ubicación en el sistema estos poseen ayudas mecánicas con las cuales puedo fijar el sensor implementando soporte sencillos que se atornillan y se fijan a la maquina en la posición deseada. Una última solución mas practica pero a la vez la mas costosa aunque nos brindan confiabilidad y dan solución al problema planteado. Es importante hacer claridad que el sensor tipo posee características técnicas de construcción en la que se incluye una referencia de protección. Para el caso en cuestión necesitamos que dicha protección sea IP67. Que significa un nivel alto de protección. Puntualmente contra polvo y agua. 13.9.1 CONEXIONADO Con esta simbología y tipo de conexionado vamos a encontrar los sensores inductivos, capacitivos, ultrasónicos. Fig 57.Símbolo según DIN 4007 Color de los hilos según DIN 50044: Marrón: Terminal (+); Azul: Terminal (-); Negro: Salida NA; Blanco: Salida NC La conexión depende del tipo de la salida del sensor la que puede ser PNP o NPN. Fig 58.Conexionado PNP y NPN Las distintas clases de sensores de posible utilización son descritas a continuación. Los sensores de fibra óptica resultan de muy costosa implementación por lo que no fueron tenidos en cuenta para análisis en este proyecto. 13.9.2 IMPLEMENTACION AL CIRCUITO DE CONTROL Para el uso de este tipo comercial de sensor se establece su correcto conexionado el cual debe ser como se muestra a continuación en conjunto al circuito de control pertinente a la energización de motobomba. 13.9.2.1 TIPO PNP Fig 59.Tipo PNP 13.9.2.2 TIPO NPN Fig 60.tipo NPN 13.9.3 INDUCTIVOS Y CAPACITIVOS Para el caso de los sensores capacitivos o inductivos debemos tener en cuenta si dichos sensores son del tipo PNP o NPN para su conexionado como se dijo anteriormente. La ubicación e implementación del sistema de sensor con este tipo, se lleva a cabo con el simple hecho de colocar los sensores de forma cercana al punto en donde se observa el nivel de liquido que quiere ser detectado. De igual forma una saliente al tanque es el punto donde tomar el sensado. Para el sensor magnético se requiere un elemento con propiedades metálicas de modo que sea detectable. 13.9.3.1 ESQUEMA INDUCTIVO Fig 61 Ubiccion sensor inductivo En el caso del sensor capacitivo no es necesario implementar ningún elemento adicional y el solo líquido producirá el efecto de dieléctrico necesario para afectar la respuesta del sensor. E inclusive no se hace necesario la implementación de la saliente en el tanque de almacenamiento. 13.9.3.2 ESQUEMA CAPACITIVO Fig 62 Ubicación sensor capacitivo En cuanto al alcance de respuesta la practica permite ver que el sensor de tipo inductivo es de mucha menor sensibilidad que el sensor tipo capacitivo. 13.9.4 AUTOREFLEX Y ULTRASONICO Otro tipo de posible utilización es el sensor autoreflex o de ultrasonido comercial en el que el emisor y el Receptor se hallan alojados dentro de un mismo cuerpo. El objeto a detectar en este caso el líquido refleja directamente un porcentaje de la luz emitida, activando el receptor muy similar a lo que ocurre en el sensor ultrasónico solo que en este caso es una señal de distinta frecuencia pero con el mismo principio. Los sistemas que ofrece el mercado son compactos y además de ello vienen en diferentes valores nominales de trabajo siendo así el problema al adquirirlos la distancia que debe sensar. Este dato lo da el fabricante y bastara con remitirse a las fichas técnicas de los modelos. 13.9.4.1 SISTEMA AUTOREFLEX Fig 64 Modelo autoreflex El acondicionamiento y ubicación de este sensor procede de la misma manera que en el sensor de ultrasonido y su diseño para el control. A su vez los problemas presentados en el tema de la reflexión competen también a este tipo de sensor. 13.9.4.2 ESQUEMA DE INSTALACION Fig 65 esquema de instalacion autoreflex Recuerde que la frecuencia con que desplaza una onda magnética es inversamente proporcional a la atenuación de la señal. Paralelo a ello los diferentes tipos de material tendrán una absorbancia diferente así que de igual forma los ecos serán una función del líquido que aloja el tanque. Este tipo de sensores son algo más costosos que los capacitivos y más aun que los inductivos pero mantiene las condiciones del problema y puede llegar a ser útil la referencia si el presupuesto de desarrollo lo permite. El conexionado es exactamente como se planteo teniendo presente el sistema PNP o NPN. 13.10 SENSOR ANALOGO DE PESO (CELDA DE CARGA) Fig 66.Celda de carga Una común solución es hacer el sensado de nivel por medio del peso ya que dado que el peso P = mG la masa es proporcional al volumen contenido en el recipiente de modo que una medida de peso nos dará la cantidad de masa, por lo tanto el volumen y por lo tanto el nivel del liquido. Fig 67.Ubicacion de celda Esta nos brinda las ventajas de no estar en contacto con el material de ninguna manera además de, la medición de masa (peso) con alta precisión y más aun proporciona mediciones de tipo análogo. Pero las desventajas son que usualmente requiere estructura independiente; Solamente mide peso y no mide nivel de modo que si el material cambia la densidad del liquido produce una alteración en el peso sensado y debe hacerse una recalibración en la etapa de acondicionamiento. Además es propenso a afectarse por la intemperie, hielo, nieve, vientos y temperatura. 13.10.1 ACONDICIONAMIENTO Para el acondicionamiento de la celda debemos en primera instancia amplificar la señal ya que son milésimas de voltaje las que se perciben, importante que dicho amplificador sea de instrumentación a fin de eliminar ruido ya que en señales tan pequeñas una mínima variación de las condiciones del sistema puede ocasionar mediciones erráticas. En esta ocasión, aunque se cumple a cabalidad la condición del no contacto con el liquido, la solución resulta un tanto costosa y en realidad se desperdicia la utilización del sensor a causa de que este es de gran utilidad para conocer la cantidad exacta que posee el tanque en cualquier tiempo t. mas sin embargo si el caso lo amerita se presenta un acondicionamiento básico para la utilización de este tipo de sensor. 13.10.1.1 AMPLIFICADOR DE INSTRUMENTACION Fig 68. Amplificador de instrumentación La figura nos muestra el esquema electrónico del amplificador operacional y su esquema simplificado. La idea del amplificar operacional es utilizar la propiedad de entrada común en la que el ruido es eliminado por efectos de cancelación. Si por el positivo ingresa una señal de ruido que a su vez entra por el negativo esta automáticamente es cancelada por efectos de sustracción. El voltaje de salida será VO= - R2/R1 (V1’-V2’) donde podemos pensar en una ganancia R2/R1 que en general no viene en el amplificador comercial siendo así R1 = R2 y la ganancia es = 1. VA = V1 Y VB =V2 V1 – V2 = I*K*R V1’ – V2’ = I * (R +K*R+R) = I * R * (2+K) Así que sea R1 = R2 podemos afirmar que VO = -(V1’-V2’) VO = - ( VI - V2)* R *(2+K) / K*R Siendo VO = - (V1-V2)*(2/K + 1) Concluimos que el valor de K nos proporciona la ganancia del amplificador El factor resultante de ganancia será (2/K +)1 así que entre mas pequeño sea el valor de K mas grande es la ganancia. Para el caso de el amplificador de instrumentación de uso común la relación entre las resistencias R y la resistencia variable llamada KR es mucho mas pequeña en casi 100 veces de modo que el factor de ganancia se convierte en (200 /K + 1) es por esto que el amplificador de instrumentación es de alta utilidad para amplificar señales de voltaje muy pequeñas y el factor K nos permite graduar la ganancia. 13.10.2 CIRCUITO DE CONTROL Dado que en nuestro caso necesitamos conocer 2 niveles básicamente el máximo y el mínimo, por medio de potenciómetros es posible ubicar estas dos posiciones de tal modo que nuestro sistema quedara implementado de la siguiente manera Fig 69. Circuito de control aplicando A.I 14. CICLO DE MAQUINA 14.1 CONTROL DEL PROCESO DE ABASTECIMIENTO DE PRODUCTO HACIA EL DOSIFICADO Teniendo en cuenta que el operario debe introducir los tubos de bolsa a la máquina. Asumimos que el papel esta en el dispensador previamente listo para ser utilizado. Consiste nuestra tarea a seguir el desarrollo del dosificado del líquido. Retomemos rápidamente la situación que se nos presenta. Un pequeño tanque ubicado en la parte superior de la maquina permite el suministro de liquido. Este líquido entra a un dosificador que permite una cantidad definida previamente. Al tener el dispensador cargado se empuja el líquido por un orificio en la parte inferior del dispensador. Esta salida debe ser controlada impidiendo al líquido caer sin control. De modo que se manejan y controlan el empuje y la salida del líquido simultáneamente. Un tubo inoxidable adaptado al orificio en la parte inferior del dosificador esta previamente cargado con un tubo externo de plástico; así que el liquido al caer llena el pedazo de tubo plástico final, obligando al plástico a deslizarse un poco a través del tubo inoxidable y obligándolo a pasar a través del sistema de sellado y corte que esta listo y esperando para sellar luego que el plástico sobrepasa lo suficiente la selladora. El selle demora un tiempo presionando en caliente para el selle y a su vez justo después de un tiempo presionando en frió para el corte. Luego de esto el ciclo se repite mientras se cumpla que exista líquido en el tanque y plástico en el dosificador. Un sensor debe verificar que exista liquido en el tanque superior de lo contrario todo el sistema se detiene (aborta programa). De igual forma un sensor debe verificar que exista bolsa de lo contrario el sistema se detiene (aborta programa). El sistema procura garantizar la misma dosificación independientemente del líquido que esté en el tanque. 14.1.1 ESQUEMA REFERENTE Fig 70. Ubicación sensores de control para dosificado 14.2 SENSOR DE PAPEL El sensor de bolsa puede ser hecho con una fotorresistencia de modo que por medio de un comparador damos la señal necesaria para acondicionar al circuito de control que envía la señal al PC. 14.2.1 ACONDICIONAMIENTO Fig 71.Acondicionamiento sensor de papel 14.2.2 CIRCUITO DE CONTROL E INTERFASE PARA SENSOR DE PAPEL Y DE LIQUIDO (PARO DEL PROCESO) Fig 72. Control e interfase sensor de papel y liquido Los sensores deben activar un contacto acondicionado para dar 5 V al PC que se explica mas adelante en la seccion 18. 14.2.3 FUENTE DE ALIMENTACION PARA CIRCUITO DE CONTROL La fuente de alimentación nos provee de 5, 12 y 24 voltios con los que se podrá materializar los diferentes circuitos de control. La corriente entregada debe ser superior a 5A de tal modo que nos provea la corriente necesaria para actuar las interfases y a la vez dar corriente a los circuitos de control. Seria bueno implementar para una mayor alimentación de corriente y protección contra corto y sobrecarga. La corriente manejada depende del transistor driver y obviamente el transformador debe entregar y el puente de rectificación soportar la corriente total que se utiliza en los diferentes circuitos. Fig 73.Fuente de alimentacion Fig 74.Fuente de alimentación para altas corrientes 15. ACONDICIONAMIENTOS PARA ACTUADORES 15.1 INVERSOR DE GIRO MOTOR DC El uso de un servomotor no se hace necesario ya que las necesidades del proyecto no exigen un posicionamiento muy exacto y la velocidad de trabajo será la máxima. Por lo que únicamente nos debemos concentrar en el sentido de giro lo que simplemente logramos invirtiendo la polaridad de entrada en cada terminal. Fig 75 Inversor de giro motor dc 15.2 ELECTROVALVULA PARA CONTROL La válvula como tal permite el paso y no de flujo. En nuestro caso nos referimos a aire a presión. Este tipo de válvula debe ser conmutada con algún tipo de accionamiento aunque existen de muchos tipos las que se controlan eléctricamente son mas conveniente ya que los circuito de control son mas sencillos y económicos, además permite que un sistema de control digital pueda maniobrarla. Una señal eléctrica permite la conmutación de la válvula y en este sentido de control encontramos también 2 clasificaciones. Las monoestables que son válvulas que al sentir la presencia de señal eléctrica conmutan a otra posición, al quitar dicha señal la válvula retorna a su estado de reposo. La otra clasificación es la biestable, válvula que tiene 2 puntos diferentes en donde recibir señales eléctricas de tal modo que una señal la conmuta en una dirección y la otra señal es necesaria para hacerla conmutar nuevamente a su posición inicial. Estas electrovalvulas se caracterizan por el número de vías que manejan y el número de posiciones posible que puede tener. A nuestro sistema podemos adaptar básicamente el tipo de eletroválvula 3/2 que en el punto especifico de este proyecto, se especificaran los circuitos de control pertinentes El hecho de que sea biestable o monoestable no nos interesa aunque una electroválvula monoestable es mas económica que la biestable y el en el circuito de control nos es mas útil la monoestable ya veremos porque. Por norma para las válvulas en la simbología, el estado normal de la válvula sin accionamiento se da en la parte derecha. 15.2.1 ACCIONAMIENTO DE LA ELECTROVÁLVULA D.C y A.C El accionamiento de la válvula DC se hace por medio de un transistor como lo muestra la figura. Para este caso debemos calcular la máxima resistencia necesaria que colocamos en la base. Sabiendo que la bobina interna de la electro válvula consume por catalogo alrededor de 50mA. Así que sea la ecuación del transistor. Ic = B Ib = 50mA donde B (hfe) que utilizamos en el diseño de drivers es de 100. Decimos que Ib = 50mA / 100 = 0.5mA. Sabiendo que disparamos con señal de 5v entonces la R <= (5v - 0.7) / 0.5mA = 8,8 KΩ. El disparo de una electroválvula A.C se hace por medio del mismo circuito de accionamiento del D.C aunque en este caso debemos adicionar un rele, el cual no requiere máxima corriente por lo que podemos usar un rele pequeño para 1 o 2 Amperios. Fig 76.Accionamiento acondicionado electrovalvula 15.2.2 ACCIONAMIENTO DE LA ELECTROVÁLVULA POR PC Esta es accionada por medio del PC en modo automático y en modo manual se acciona exactamente con el mismo pulso utilizado por el cilindro que empuja el líquido en el dosificador. De modo que estas dos operaciones (dosificar y abrir la válvula) sean simultáneas. Por lo tanto los mandos manuales del dosificador y electro válvula deben estar enclavados mecánicamente o bien accionarse de alguna manera al mismo tiempo. La electroválvula requiere que su parte interna sea en acero inoxidable ya que tendrá contacto directo con el líquido. Fig 57 Accionamiento por PC 15.3 ACCIONAMIENTOS PARA VALVULAS DE EMBOLO 15.3.1 ACCIONAMIENTO MECANICO El acople que se hace al embolo procura ser una barra lo mas larga posible de modo que el usuario aplique el torque mas grande posible al girarla. 15.3.2 ACCIONAMIENTO CON ACTUADOR NEUMATICO ROTATIVO La primera de ella consiste en implementar un actuador neumático rotativo que actúa de igual modo que un actuador pero produciendo un desplazamiento angular. De modo que de manera simple se adapta la válvula de acero inoxidable (de embolo) al mismo para así abrirla y cerrarla. El actuador neumático rotativo podría se fácilmente remplazado por un motor eléctrico en el cual controlemos el desplazamiento máximo en un sentido y máximo en el otro para así no llevarlo a un sobreesfuerzo que podría dañarlo o desgastarlo fácilmente. Otra implantación podría hacerse utilizando la válvula de embolo en acero inoxidable y adaptando a ella un pistón lineal como lo muestra la figura. Fig 58.Actuador neumatico rotativo acoplado (catalo corbeta) El elemento es un actuador de doble efecto de modo que a partir de una señal se encuentra totalmente en un lado o totalmente en el otro 15.3.3 ACCIONAMIENTO LINEAL NEUMATICO El accionamiento de la válvula se realiza por medio de un pistón neumático. El sistema resulta eficiente en cuanto a torque. Puede ser trabajado tanto de simple como de doble efecto y es evidente que resulta más económico utilizando un pistón de simple efecto. Fig 59 Accionamiento lineal neumatico (www.actuadoreslineales.com) El siguiente modelo plantea una transmisión un poco mas alejada del cuerpo de la válvula. Este sistema puede ser implementado si la ubicación en forma cercana resulta complicada. La transmisión se hace por medio de una guaya similar al sistema empleado para los frenos de una bicicleta en el que se transmite la fuerza de forma directa. Fig 60 Accionamiento lineal con guaya 15.3.4 ACTUADOR LINEAL ELECTRICO (PIÑON – CREMALLERA) El sistema permite que por medio de una transmisión de circular a lineal produzcamos el mismo efecto de movimiento que los actuadores lineales neumático. En este caso utilizamos un motor eléctrico y por medio de la transmisión tipo cremallera conseguimos el movimiento. El mecanizado de este elemento resulta algo complicado aunque existen varias microempresas y talleres mecánicos que las fabrican con rapidez y su costo es relativamente un poco más costoso que el neumático. Solo que en este caso la energía es proporcionada directamente de la red eléctrica. A nivel de potencia que se consigue con este sistema, es evidente que la relación costo beneficio no es favorable para este tipo de mecanismo. El mecanismo esta expuesto en la sección de actuadores. 15.3.5 ACTUADOR ROTATIVO ELECTRICO Los actuadores rotativos eléctricos son básicamente los motores los cuales pueden ser de corriente continua o corriente alterna. A fin de lograr un torque necesario para producir la conmutación de la válvula usamos preferiblemente el motor D.C además que el control de giro y velocidad es mucho mas fácil que si trabajamos con los motores A.C. en cuanto a costos aunque el motor D.C es relativamente mas costoso, la diferencia entre precios no es tan alta y al implementar todo el sistema de control la inversión de giro para un motor A.C resultaría mucho mas cara. 15.3.5.1 CONTROL POR TIEMPO El elemento 555 (temporizador) permite establecer un pulso temporizado por medio del cual podemos definir un tiempo de giro suficiente para apertura o cierre de la válvula. Fig 61. Control por tiempo 15.3.5.2 CONTROL POR FIN DE CARRERA Fig 62 Control por final de carrera El circuito posee los pulsadores Pd y Pi para mover el motor a derecha (abrir) o izquierda (cerrar). Los sensores s1 y s2 respectivamente nos indican la posición final del recorrido, que será un sensor tipo microswitch. Y utilizamos dos reles k1 y k2 que utilizan la retención para realizar el ciclo completo hasta que el sensor de la apertura del circuito. Si los dos reles se activan a la vez el moto queda a un potencial de 0 voltios entre sus dos terminales ya que recibe la misma señal en ambos puntos es decir Va-Vb = 0 y no se moverá. 15.3.5.3 MOTOR PASO A PASO El motor paso a paso nos ofrece la ventaja del posicionamiento ya que puede resultar mas fácil el control de la posición de este con el simple hecho de contar pasos. A fin de lograr el máximo torque posible utilizamos el modelo de ½ paso en donde se activan 2 bobinas a la vez. Fig 63 Motor paso a paso Las secuencias para mover a derecha e izquierda serán respectivamente las presentadas en la figura. Para el motor paso a paso debemos conocer el número de pasos que posee para con ello conocer con exactitud el número de pasos necesarios para producir un giro controlado. El sistema de control es definitivamente más fácil, práctico y económico de realizar con un pic ya que por medio de este puedo controlar la velocidad (tiempo entre paso y paso) y el número de pasos a realizar. La interfase seria la siguiente. Fig 64 Motor paso a paso acondicionado Sea W = numero de pasos del motor; tendremos que: 360º/W = grados por paso =Gp; para un giro de 90º daría 90º/Gp = numero de pasos que debe dar; por tanto 90º / 360º * W = W / 6; 0 < (W / 6) – (Numero de pasos) < 1 Este sistema implica una transmisión de potencia ya que el motor paso a paso posee menor torque y es aun más costoso que los otros dos tipos de motores nombrados, se ha optado por no tenerlo en cuenta. 15.4 ACCIONAMIENTOS VALVULA DE CORTINA Dado que el cierre de la válvula requiere un movimiento circular nos remitimos propiamente al accionamiento por motor. Dicho motor es escogido del tipo eléctrico ya que un motor neumático nos resulta muy costoso e ineficiente por la mismas razones. Es por esto que se escoge el motor D.C fíjese que dicho motor debe dar mas de un giro aunque en este caso el torque es muchísimo menor que en caso de embolo. La practica nos ha permitido observar que 5 o 6 vueltas son suficientes con bajo torque. Así que un motor muy económico nos resultara útil para efectuar el cierre y apertura de la válvula. Al desear un punto máximo y mínimo de apertura el control resulta mas sencillo, pero esta el inconveniente en los topes máximo y mínimo el motor sufrirá una sobrecarga producto del alto torque que se produce al tener la válvula completamente cerrada y tratar de cerrarla aun mas y viceversa. Otra desventaja grande es el hecho de no poder sensar de alguna manera esta posición ya que la mariposa que desplaza al embolo no se mueve realmente sino que es el mecanismo interno. Por estas razones se ha determinado que la mejor solución es utilizar un voltaje bajo, al 50% de la referencia del motor de modo que en estos topes vamos a evitar que el motor se queme por sobrecarga. De modo que con el calculo del tiempo adecuado podemos abrir y cerrar e inmediatamente eliminar la alimentación del motor para evitar la sobrecarga pero siempre garantizando la completa apertura y cierre (principalmente) de la válvula. El sistema empleado es la adaptación del motor y un circuito controlador de tiempo por medio del cual generamos la conmutación. Fig 65 Accionamiento válvula de cortina La implementación con un motor paso a paso resulta también apropiada generando el número de pasos suficiente para producir el giro. Pero es considerable que resultaría un poco más costoso control. El problema de cortina es que el tornillo con el uso se puede ir desgastando, así que requiere de todos modos el mantenimiento de engrase de las partes aunque estas no entren en contacto con el líquido. 15.5 ACCIONAMIENTO PARA VALVULA TIPO AGUJA Utilizar una válvula en la que el sistema de cierre y apertura es de tipo lineal. Estas válvulas son frecuentes en sistemas de sellado para gas y es muy posible encontrarlas en acero inoxidable con el fin de poder utilizarlas. Para este caso simplemente por medio de un pistón de corta carrera y poca fuerza producimos el desplazamiento lineal abriendo y cerrando la válvula. Este sistema seria mejor pensando en la eficiencia del sistema y el desgaste de las piezas que en el trabajan. La durabilidad de esta válvula para trabajo continuo es mayor, pero así mismo los costos son mas elevados que la válvula de embolo en un 100%. Fig 66 Accionamiento para valvula tipo aguja Aunque en el circuito de control el sistema no cambia debemos tener en cuenta que la implantación de este sistema lleva un poco mas de tiempo pero los costos se reducen en un 80%. 16. CONTROL DE DOSIFICACION Elaborar el sistema de dosificado incluye el tanque de almacenamiento con su respectivo control y el mecanismo dosificador igualmente con el correspondiente control. Dado que en la industria, como se expone en el trabajo, existen empresas que ofrecen como único producto el sistema dosificador. La empresa con la cual se desarrolla el proyecto pretende impulsar este producto. Posteriormente el mismo se anexara a la maquina completa que incluye además de este el sistema de sellado y corte. En el sistema de dosificación se pretende proporcionar a la maquina la posibilidad de seleccionar una cantidad deseada en dosificación y que el dosificador sea capaz de realizar cargas con esa cantidad de manera exacta y a su vez que posea la precisión necesaria para cumplir con los requerimientos del cliente. La viscosidad del liquido es el aspecto mas relevante para el diseño de este sistema por lo que se trajo a colación 2 modelos base para el sistema de dosificado. 1. dosificación por tiempo y trabajo semiautomático en líquidos de baja viscosidad con caída por gravedad. 2. dosificación por succión para líquidos con viscosidades un poco más elevadas. 16.1 DOSIFICACION POR VALVULA DE EMBOLO Y/O GUAYA DE TRANSMISION En la actualidad, en los sistemas de tipo manual, el operario abre una válvula generalmente de bola o embolo por medio de una operación manual. A esta operación se puede agregar un mecanismo tal que el operario puede abrir la válvula por medio de un pedal como lo muestra la siguiente figura. Fig 67. Dosificacion por valvula de embolo y/o guaya de transmision Así mismo se hace posible implementar para la válvula alguno de los modelos presentados para apertura y cierre de la válvula de tal manera que el usuario posea los controles pertinentes de apertura y cierre de la válvula. Para realizar un trabajo de dosificación plenamente manual. 16.2 DOSIFICACION POR TIEMPO Fig 68 Dosificacion por tiempo Este sistema puede implementarse de dos maneras diferentes. 16.2.1 SISTEMA DE DOSIFICACION POR TIEMPOS DISCRETOS. Varias dosis por dosificación. En este modelo el usuario determina el ritmo de trabajo ya que se presenta el sistema para una dosis Fig 69 Sistema para una dosis 16.2.2 SISTEMA DE DOSIFICACION POR TIEMPO Y PESO. Dosis exactas. Para la implementación de este sistema se hace necesario la implementación de un sistema sensor de nivel en el tanque de almacenamiento que provee de liquido al sistema de dosificado. A fin de lograr dosificaciones exactas es importante entender que la velocidad con que el fluido sale de tanque al caer por gravedad dependen de la masa de líquido que existe sobre el punto mas bajo del líquido ya que la presión ejercida cambia en función al nivel y es directamente proporcional de manera lineal. Por lo tanto la velocidad de salida cambiara según la cantidad de líquido alojada en el tanque para el instante de análisis. Por esta razón el simple hecho de manejar un tiempo de apertura no va a garantizar el dosificado de alta exactitud, a medida que el líquido desciende de nivel la velocidad disminuye y las dosis serán cada vez más pequeñas. Recordando que la presión depende exclusivamente de la altura podríamos pensar que en determinados casos dicha variación de dosificación puede llegar a no ser tan relevante lo que implica que el sistema por tiempo podría funcionar para la dosificación exacta. En tal caso procedemos a implementar el sistema anteriormente explicado. Para el caso en que si resulta relevante la altura del tanque y las dosis requieren alta exactitud debemos implementar un sensado análogo del nivel. Para ello implementamos un a celda de carga explicada en el numeral referido a sensor de nivel. Claro que en este caso un elemento controlador (PIC) deberá sensar el líquido en todo momento y así mismo determinar el tiempo que debe abrir la válvula para proporcionar la dosificación requerida. La ecuación que rige el comportamiento puede ser generalizada pero el factor de relación entre peso y el tiempo de dosificado debe ser ingresado por el usuario y deberá ser producto de la practica, por lo tanto el ensamble de este sistema requerirá que se hagan las pruebas pertinentes. Tenga en cuenta que este factor de relación es función de la viscosidad del fluido y a su vez del nivel de líquido alojado en el tanque. Tiempo = peso * (factor de relación). El peso puede ser variado por software de tal modo que se presente al usuario como la relación Tiempo = volumen * (factor de relación). 16.3 SISTEMA DOSIFICADO POR SUCCION Fig.70 Sistema dosificado por succion El sistema de dosificación consiste en un envase de dosificación que tiene una capacidad de un litro. El envase tiene dos orificios, por uno entra el líquido del tanque y por el otro sale líquido dosificado. La entrega de la dosis se hace tipo jeringa y por medio de un actuador (cilindro) neumático que es controlado en el sistema. Este cilindro a su vez lleva una adaptación especial que permite empujar el líquido y su vez impide que el líquido se salga del envase dosificador. Para la salida y entrada de liquido se manejan electro válvulas tipo 3/2 de retorno por fuelle. Para poder utilizar diferentes dosificaciones se implementa un elemento deslizable sobre el vástago de pistón que hace posible actuar un final de carrera para detener el circuito y succionar la cantidad que se desea únicamente (elemento seleccionador de cantidad de dosificación). 16.4 CONTROL DE DOSIFICACION POR FINAL DE CARRERA Cabe aclarar que el sistema funciona tanto vertical como horizontalmente. Fig 71.Control de dosificacion por final de carrera La dosificación por final de carrera hace que simplemente el pistón no entre más de la dosificación necesaria bloqueando el ingreso de aire en la dirección de entrada. Así que independiente de lo que pase en el control, el pistón neumático del cilindro no puede avanzar más de esa posición. 5 elementos básicos son empleados para controlar la salida y entrada de líquido al dosificador. 2 elementos son utilizados para la manipulación del actuador neumático que es del tipo doble efecto. Estos dos elementos son electro válvulas de bronce ya que no es un requerimiento el acero inoxidable en esta parte de la maquina y esto reduce inmensamente los costos. Como segunda estancia tenemos el sensor del tipo micro switch (final de carrera) por medio del cual se censa la cantidad de dosificación ubicándolo en una posición fija y desplazando un elemento deslizable sobre el pistón del actuador, este hace posible manipular su carrera o dicho de otra forma manipular el desplazamiento de ese pistón. Por ultimo tenemos los dos elementos faltantes que son electro válvulas de 3/8 de pulgada, estas electro válvulas son en acero inoxidable ya que entran en contacto con el liquido. El proceso de dosificado y empuje de liquido es el siguiente. El control exige que la dosis esta completa para proceder a empujar por tanto el switch del sensor deba abrir el circuito de empuje mientras la llena la dosis. Luego del llenado de la dosis es posible empujar líquido. Este empuje exige a su vez un tiempo suficiente para empujar todo el liquido por lo que un temporizador graduable esta presente en esta parte de control para asegurar el completo vaciado del dosificador. Paso por paso, a la vez que la válvula de entrada al dosificador se abre inmediatamente el actuador entra, proporcionando al sistema una succión que hace más rápido el llenado de la dosis. En este proceso el circuito de empuje esta abierto impidiendo que la válvula de salida se abra o que el actuador salga hasta que el sensor de llenado no indique la carga completa del dosificador (dosis deseada). En este punto el dosificador queda listo y abre el circuito de entrada de líquido al dosificador, por lo tanto cierra la válvula de entrada y para al actuador en la posición correcta. En este momento el dosificador esta listo para dar empuje a una dosis así que en el momento de aplicar la señal de dosificado, inicia el temporizador as la vez que abre la válvula de salida y proporciona la salida del pistón (secuencial mente). Estos dos electos están activados mientras el temporizador este activo. Al terminar el temporizador con su tiempo encendido la válvula se cierra y el actuador se detiene. Luego de esto el sistema esta listo esperando el pulso que le indique volver a cargar dosis. En este punto el circuito de empuje esta abierto por lo tanto no existe el riesgo de tratar de empujar produciendo un comportamiento erróneo al sistema. 16.4.1 PISTON DOBLE EFECTO Fig 72.Piston doble efecto Este nos proporciona una mayor fuerza en el empuje que en la succión entonces la velocidad de empuje es mayor a la de succión. 16.4.2 PISTON DE DOBLE EFECTO Y DOBLE VÁSTAGO. Fig 73 Piston doble efecto y vastago El inconveniente de este sistema es que la fuerza de empuje se reduce según el diámetro del vástago utilizado para el sensado. Pero nos genera un aumento de la velocidad lo que en ocasiones puede resultar más conveniente. 16.4.3 CONTROL Y MANDO DEL PISTON Fig 74.Control y mando del piston 16.4.4 VELOCIDAD SISTEMA DOSIFICADOR POR SUCCION En el capitulo referido a los cilindros neumáticos encontramos un apartado sobre la velocidad del actuador. La velocidad depende del caudal del compresor. Q = V / t = m³ / t A de esta manera calculamos la velocidad de avance de nuestro pistón.= v Sabiendo el diámetro de la camisa sabemos el área y por consiguiente la velocidad lineal de avance. Podemos calcular así el costo eléctrico que representa la velocidad del deseada relacionando la potencia neumática ejercida por el compresor P = Pr * Q con la potencia eléctrica. 16.4.5 CIRCUITO DE CONTROL PARA EL DOSIFICADOR COMO PRODUCTO INDEPENDIENTE Fig 75.Circuito de control para el dosificador como producto independiente El sensor S3 es del tipo micro swich y activa un relee en el circuito de control. Las electroválvulas de empuje, succión, entrada y salida de líquido son activadas por medio de reles que activan la correspondiente electro válvula. El control del temporizador se hace por medio del 555 con potenciómetro. 16.5 DOSIFICADO POR SOPORTE Y TORNILLOS SIN FIN Al utilizar tornillos o un mecanismo similar, hacemos un desplazamiento al “cilindro” de modo que las carreras del pistón son máximas de entrada y máxima de salida y la dosificación se ve limitada por la ubicación del cilindro que empuja. Entre mas cerca menos dosis. Fig 76.Dosificado por soporte y tornillos sin fin Aunque el dosificador puedes ser tanto usado verticalmente como de forma horizontal que es la más viable 16.5.1 CONTROL Y MANDO Fig 77 Control y mando dosificador Se pretende que la entrada del líquido que viene del tanque sea por un orificio grande que haga lo más rápido y eficiente el llenado del recipiente de modo que la cantidad en el tanque superior no tenga implicaciones en el tiempo deseado para la carga del dosificador. El liquido se carga rápidamente y como el dosificador tiene el espacio suficiente para la dosis no tiene problemas con que este abierto todo el tiempo. En la parte baja del dosificador el líquido sale por un orificio más pequeño. Este tamaño se debe al tamaño general de las bolsas para empacar este tipo de líquidos (refrescos). Por esta razón se utiliza el pistón de empuje para apresurar la salida del producto. La parte final del pistón de empuje tiene adaptado un cilindro del tamaño del dosificador para impedir que el líquido se salga por los bordes. A su vez esta adaptación tiene una altura suficiente para que por el orificio del costado no se salga líquido por la parte superior. Esta estructura no es necesariamente maciza pero el peso ayuda a dar un poco mas de presión al empuje pero no es necesario. Lo que si es necesario es que la parte baja del dosificador sea de forma algo cónica, esto ayuda a aminorar la fuerza de reacción que el liquido ejerce en contra (reacción) del empuje del pistón. Este sistema garantiza que el tiempo de dosificado y empuje es igual para cada ciclo 16.6 SISTEMA DE CONTROL INDEPENDIENTE PARA EL DOSIFICADOR COMO PRODUCTO UNICO Se ha diseñado un sistema de control solo para el dosificador con el fin de que este producto pueda ser comercializado en forma independiente. El sistema se adapta fácilmente al sistema completo en el que un PC tendrá el control del sistema. El modelo que se plantea a continuación funciono plenamente en la práctica (a nivel técnico). El acondicionamiento a la maquina completa se hará en el pulso de ciclo automático el cual se adapta fácilmente. Este diseño permite usar los diferentes modelos de dosificado planteados, cheque/cheque, cheque/válvula, válvula 3 vías, válvula/válvula, simplemente se adapta el sistema físicamente a los requerimientos. El sistema de control es realizado con PIC, la maquina requiere el uso de electrovalvulas activadora del pistón de empuje y succión. 16.6.1 SALIDA DEL DOSIFICADOR Sea cual sea el modelo utilizado el sistema se adapta a cada uno de ellos y basta con hacer una pequeño cambio en el conexiado de salidas en el sistema. Es decir que sin hacer ningún cambio en el diseño el usuario tiene la opción de conectar a su acomodo según sea el sistema que desee de salida y entrada de líquido al dosificador. Fig 78 Salida del dosificador Estas válvulas que deberán ser accionadas por medio del de señales de control en modo automático y en modo manual se acciona exactamente con el mismo pulso utilizado por el cilindro que empuja el líquido en el dosificador. De modo que estas dos operaciones (dosificar y abrir la válvula) sean simultáneas. Por lo tanto los mandos manuales del dosificador y electro-válvulas de control deben estar enclavados mecánicamente o bien accionarse de alguna manera en forma simultanea. Para el caso en que se utilizan motores se da un tiempo prudente tal que la apertura de la válvula se realice primero y luego se realice el empuje. Al no utilizar presiones muy elevadas es de entender que la ruptura de una válvula de estas difícilmente se va a presentar. Los diferentes sistemas de acondicionamiento se presentaron en el capitulo correspondiente a válvulas para el paso de liquido. 16.6.2 SOLUCION CON PIC Fig 79 Solucion pic dosificador Igualmente las salidas E1, E2, E3 Y E4 activan un correspondiente relee, que a su vez activa la correspondiente electro válvula. Este sistema permite manejar tiempos mas precisos y constantes (+/-) TIEMPO. Posee también el pulso de dosificar (P1) y el de empuje (P2). MANUAL 16.6.2.1 DIAGRAMA DE FLUJO PARA EL PROGRAMA EN EL PIC (Se utiliza la memoria EEPROM para almacenar datos de temporizador) 16.6.3 DISEÑO DE LA ELECTRONICA DE INTERFASE AL PIC 16.6.3.1 DISEÑO DE LA FUENTE Fig 80 Diseño de la fuente 16.6.3.2 INVERSORES DE GIRO Fig 81.Inversor de giro 16.6.3.3 ACTIVACION DE ELECTROVALVULAS Fig 82 Activacion de electrovalvulas 16.6.4 CIRCUITO FINAL Fig 84.Circuito final control de dosificador 16.6.5 MODELO FISICO DE INTERFASE CON EL USUARIO Fig 85 Modelo fisico de interfase con el usuario La interfase con el usuario es un panel como se presenta en la figura. El sistema permite cuadrar los tiempos de succión y empuje a fin de lograr la máxima eficiencia. Recuerde que el dosificado puede hacerse con final de carrera o por elementos fijos, en ambos casos el sistema es independiente, es decir que en el circuito de interfase a las electrovalvulas del pistón se interpone el sensor o en su defecto se manejan carreras completas. De modo que los tiempos que se cuadran aquí únicamente nos proporcionan un tiempo suficiente para que sucedan los acontecimientos. Estos tiempos son cuadrados de manera práctica y directamente en planta por el usuario. El margen de tiempo puede ser cambiado en software pero para la aplicación da la posibilidad de 0.0s a 5.0 segundos con una sensibilidad de 0.1s. El sistema nos brinda la posibilidad de manejar un ciclo único que consistirá en una succión y un empuje respectivamente. También nos brinda el ciclo automático el cual es realizar ciclos únicos indiscriminadamente mientras el pulsador de automático este encendido. Para esta operación automática se utiliza el tiempo de espera entre ciclos que es también graduable por medio de pulsadores. Este tiempo esta dado en segundos y nos da la posibilidad de 0 a 9s de espera entre ciclos. Una ayuda interesante del sistema es la memoria de procesos. El sistema es capaz de guardar en memoria 9 secuencias diferentes las cuales son programable y a la vez pueden ser cargadas. Siempre que se apaga la maquina la secuencia 1 guarda el estado actual de maquina así que un apagón de luz no permitirá que la secuencia cuadrada se nos pierda. Por medio de los pulsadores de secuencia puedo cargar una secuencia preestablecida, simplemente visualizo la secuencia deseada y pulsa cargar e inmediatamente la secuencia guardada en esa secuencia se carga en los valores de tiempo succión, empuje y espera. Para guardar una secuencia basta con designar en los visualizadores los tiempos deseados de empuje, succión y espera. Lugo varia la secuencia buscando la secuencia en la que se desea guardar su nueva combinación y pulsar el pulsador guardar e inmediatamente la combinación que se visualiza queda almacenada en esa secuencia. El sistema posee un par de pulsadores (empuje y succión) por medio de los cuales se puede manipular el dosificador al acomodo. Puede hacer la succión o bien el empuje indiscriminadamente. Tenga en cuenta que estos no aplican si el sistema se encuentra en estado de ciclo automático. Al igual que el pulsador de ciclo único estos poseen borneras adicionales por medio de las cuales puedo manipular los pulso desde un sitio mas remoto y no propiamente en el panel de manejo. Así que la persona desde la zona de trabajo podrá manipular los pulsadores de ciclo único, empuje, succión del dosificador. La secuencia del ciclo puede trabajar de 2 formas: la primera de ellas es realizar la succión y luego el empuje o realizar el empuje y luego la succión, en tal caso el sistema detenido tendrá una carga lista para empujar. La utilización de un modelo u otro dependerá del usuario ya que la utilización de una u otra puede ser relevante en cuanto a los tiempos de trabajo. El sistema se adapta fácilmente a ambos modelos y simplemente en la bornera de salida invertimos las conexiones de empuje y succión dejando así el sistema listo para trabajar en la forma deseada. Es importante tener en cuenta que las entradas están todas aseguradas en 0v de modo que se activan si reciben un 1. Para efectos del ejercicio práctico del software note que algunas de las entradas están negadas es decir que se activan con 0v y se aseguran 5v. esto se debe a que algunos pulsadores usados en la practica eran normalmente cerrados así que aunque el circuito es el mismo y no cambia la conexión el dato debe leerse negado. Simplemente cambiando la instrucción “btfss” por “btfsc” cambiamos esa lógica. 17. SISTEMAS DE CONTROL PARA EL SELLADO Fig 86 Sistemas de control para el sellado 17.1 RESISTENCIA DE CALENTAMIENTO RAPIDO Esta resistencia tiene la cualidad de manejar una resistencia baja. Así que de forma muy rápida llega a una alta temperatura. Esto implica una eficiencia alta en cuanto a la velocidad de trabajo manejada adicionalmente con un alto consumo de energía. Por este motivo el sistema se utiliza con temporizado de modo que producimos calentamiento rápido para sellar y luego de forma temporizada apagamos la resistencia para producir el sellado en frío. Para el manejo de esta resistencia utilizamos el siguiente modelo de control. Fig 87.Control resistencia calentamiento rapido En el momento de realizar el sellado la resistencia se encuentra fría. Al bajar la palanca se presiona un microswitch (S) que acciona el circuito inmediatamente calentando la resistencia y sellando en caliente. Al mismo tiempo el temporizador on-delay se activa con un tiempo predeterminado. Luego de este pasado este tiempo los contactos del temporizador actúan nuevamente abriendo el circuito a la resistencia selladora actúa se detiene momentáneamente hasta que la selladora sea abierta nuevamente. fig 88 ubicación microswitch El circuito de control es explicado de forma mas completa en la sección 11.5. Al hacer el control con PC podremos de forma sencilla controlar el encendido y apagado de la resistencia. Este tipo de sistema hace que el consumo de energía no sea tan alto en caso de que la frecuencia de trabajo no sea muy alta. Para procesos de alta velocidad utilizamos resistencias en calentamiento continuo o lento. 17.2 RESISTENCIA DE CALENTAMIENTO LENTO La resistencia de calentamiento lento es llamada así dado que el proceso de calentamiento es en forma lenta. Así que este tipo de resistencia se utiliza con un calentamiento continuo es decir a una misma temperatura durante todo el proceso. Así que inicialmente el usuario deja que las mordazas de selle lleguen a la temperatura de trabajo para luego comenzar con el trabajo de modo que las resistencias estarán calientes todo el tiempo. Los tiempos de calentamiento inicial que son alrededor de 30 minutos. De modo que todo el trabajo se hace con la resistencia en caliente. Esto produce un consumo mas elevado de corriente y por lo tanto mas costos de operación. Pero se utiliza básicamente cuando el proceso es de alta velocidad, es decir que la frecuencia de sellado es mucho mas elevada y el sistema de calentamiento rápido resultaría ineficiente ya que el incremento de la frecuencia haría que prender y apagar resultase en un alto consumo de elementos de control lo que incrementa costos y al vez hace ineficiente al sistema. 17.3 ACONDICIONAMIENTO DE TEMPERATURA Para dar forma al selle se utilizan unas mordazas a las que se acondicionan las resistencias de sellado. Estas mordazas son hechas en bronce ya que este material permite a la temperatura disolverse de forma mas uniforme sobre dicho material. además de esto en el momento de producir el selle el papel de la bolsa de empaque puede adherirse al bronce así que para ello se utiliza teflón como recubrimiento al bronce ya que este que es un material que soporta las altas temperaturas y a la vez impide que la bolsa se pegue a las mordazas. En la instalación de las mordazas es necesario que el bronce se aísle igualmente de la estructura de soporte ya que debemos impedir que la estructura de soporte se caliente evitando el riesgo para el usuario de quemarse con esta estructura que por su material disipara el calor de forma continua y resulta antiergonomico. 17.4 SENSOR DE BOLSA PARA SELLE AUTOMATICO El sensor a utilizar es una fotocelda ya que esta permite detectar variaciones del color. El tubo de bolsa previamente diseñado con todo y estampado lleva una raya, generalmente en azul. Esto garantiza que aunque una bolsa sea mas grande que otra existe un punto de referencia que toma en cuenta el sistema para actuar y sellar. Fig 89.Punto de corte en bolsa La fotocelda usada puede ser tipo digital que nos da un valor de 1/0 o bien análoga. En ambos casos el acondicionamiento se hace por medio de un comparador de modo que al PC llegue una señal de 5V o 0V. Fig 90.Acondicionamiento sensor bolsa 17.5 CONTROL DE TEMPERATURA PARA LAS SELLADORAS Existen varios sistemas para el control de la temperatura en las resistencias selladoras. También debemos tener en cuenta el modelo empleado. Si se utiliza en el sistema temperatura constante o calentamiento rápido. Para el caso de resistencias de calentamiento rápido, se efectúan ciclos de encendido y apagado. En el proceso del sellado se sella un tiempo en caliente y un tiempo en frío por que el control en este caso se hace por medio de temporizadores. Así que en el momento del sellado un sensor de algún tipo, que preferiblemente será final de carrera por su economía, dará inicio al calentamiento de la resistencia un tiempo para luego apagarla y permitir un espacio de sellado en frío. El circuito controlador seria básicamente el siguiente. Fig 91.Control de temperatura para las selladoras “S” nos indica el microswitch de activación del sistema. “T” es un temporizador on delay que al ser energizado acciona el contacto auxiliar asociado. Un rele “K” es el encargado de manejar la corriente en la resistencia de sellado por medio del contacto N.O normalmente abierto. Nótese que mientras S no sea soltado el sistema queda en inactividad por lo tanto la resistencia apagada. En el momento de soltar S el sistema queda nuevamente listo para empezar de nuevo. En la parte de la alimentación general se ha dispuesto un pulsador de enclavamiento mecánico para energizar o desenergizar el sistema por completo. Los sistemas de calentamiento rápido se utilizan en ciclos de trabajo no tan rápidos de modo que se da una disminución notable en el consumo de energía. Tener un sistema de calentamiento constante implicaría muchos mas gastos de luz. En este caso el operario debe hacer uso de su practica para determinar los tiempos correspondientes para el calentamiento a miras de no dañar el papel de empaque y proporcionar a su vez el selle correcto. En otro modelo podemos controlar por medio de la comparación como lo hace un pirometro. En este sistema de control, se sensa la variable a controlar (temperatura) y por medio de una comparación con un set point determinamos si se enciende o no la resistencia de sellado presentando una grafica como la siguiente en la que podemos analizar el comportamiento real de la temperatura sobre el resistor. Notamos una leve variación alrededor del valor deseado. Igualmente apreciamos como el circuito de control genera el on / off de encendido y apagado de la conmutación de corriente hacia la resistencia. Fig 92.Osilacion on/off alrededor punto equilibrio los elementos empleados para realizar el control conforme al especificado comportamiento de un control de este tipo utilizamos, una termoresistencia, un potenciómetro para el set point y un comparador que en su salida acopla una interfase de corriente para manejar una carga de mayor amperaje. Esta interfase por medio de un optocoplador optotriac y el triac correspondiente con la corriente de operación. Esta corriente generalmente no excede los 15Amp. El circuito sigue como lo muestra la siguiente figura. Fig 93.Control on/off En el circuito presentado vemos un termistor que será el encargado de actuar como sensor de temperatura. El termistior utilizado es tipo J ya que este tipo de termistor es el mas comercial y económicamente mas accesible. En este tipo de termistores encontramos que manejan temperaturas de 0º a más de 1000º lo que para nuestro caso es más que suficiente ya que manejamos temperaturas en el rango de los 50º a los 300º. El acondicionamiento es el descrito en la figura anterior. La variación de la temperatura proporciona un cambio en la resistencia del sensor lo que implica un cambio de voltaje en el punto “+” de entrada al comparador. En la entrada “-“ del comparador colocamos un set poitnt que puede ser proporcionado por medio de un potenciómetro el cual permitirá la selección de la temperatura deseada. Cabe resaltar que la termoresistencia puede tener un comportamiento positivo o negativo, es decir que del tipo positivo el incremento de temperatura proporciona un incremento en la resistencia. En el caso del tipo negativo, mientras la temperatura aumenta la resistencia baja. Recuerde que esta relación generalmente no es lineal lo que implica la selección de la termoresistencia para el trabajo en determinadas zonas de trabajo. De lo contrario exige un acondicionamiento adicional en el que se procede a linealizar la zona de trabajo con los diferentes métodos de linealizacion que existen. Este modelo presenta fallas referentes a la variación de la temperatura en el punto de sellado. Ya que en el momento en que la resistencia empieza a cambiar su temperatura dado que es un sistema on/off, es decir se aplica toda la corriente y no, sucede que en el momento en que el comparador sensa que se ha superado la temperatura deseada, auque inmediatamente desactiva la señal de contacto, el resistor se encontraba en proceso de calentamiento lo que hace no cambie inmediatamente sino que una especie de histéresis hace que se presente un sobrepico de temperatura al valor deseado y de igual forma en el momento del enfriamiento también se da esta histéresis de sobrepico indeseado. En la práctica se observa que en el proceso de calentamiento la histéresis es un poco más pronunciada. Mas sin embargo se da una variación de alrededor de 50 ºC lo que representa un mal funcionamiento del sistema de sellado y una cantidad considerable de empaque dañado. Fig 94.Error execivo Para mantener una temperatura más constante sobre la resistencia es necesario entonces hacer una variación en el nivel de voltaje que se aplica a la resistencia. Esto puede hacerse por medio de un sistema PWM que proporcione un voltaje promedio de modo que se mantiene una temperatura más constante y por consiguiente conseguimos una curva con mayor estabilidad. Fig 95 Funcion del pwm Note que al utilizar una corriente alterna de 60Hz es indispensable que tengamos el sincronismo con la red eléctrica. El control es diseñado con pic. Por medio de 2 entradas maneja el + - con los que se controla el nivel de voltaje promedio a la salida o bien el tiempo de activación y desactivación; Por medio de una entrada análoga puedo detectar el cruce por cero de la red que sincroniza mi pic con la misma. Los datos que se dan al sistema son en porcentaje de modo que de un voltaje máximo escalizamos una salida en porcentaje y así sabemos exactamente cuanto tenemos a la salida del sistema. 17.5.1 CIRCUITO ELECTRONICO DE CONTROL Fig 96.Circuito electronico de control Para generar una interfase al computador de modo que este sistema queda enlazado al sistema principal de control de la maquina se tiene las siguiente consideración. El tiempo de ciclo y tiempo de sellado se manejan con calentamiento un tiempo definido y enfriamiento otro tiempo dado. Para cumplir con este requisito alimentamos y no la resistencia por medio de un contacto controlable (TRIAC). Se impide y no el paso de corriente a la resistencia independientemente de la temperatura que este manejando. En nuestro circuito inicial adicionamos pues el TRIAC controlado por PC. Fig 97 Circuito electronico de control y cortado por pc Podemos incluir la visualización del porcentaje de potencia que suministramos a la resistencia con visualizadores de 7 segmentos. Dada la velocidad del pic (20MHz) el tiempo que emplea para visualizar es despreciable. Simplemente adherimos al circuito principal la visualización utilizando el puerto B como salida. Fig 98.visualizacion con decodificador Fig 99.Modelo con visualizacion dinamica 17.5.2 IMPLEMENTACION RESULTANTE PARA EL SISTEMA Fig 100.Circuito electronico de control de temperatura Es recomendable colocar un fusible en serie de 500 mA en serie a la entrada de la fase del transformador. En la etapa de potencia puede también manejar fusible a fin de evitar que se dañe el triac o algún elemento de la etapa de potencia como el relé o el optocoplador. 17.5.3 INTERFASE AL USUARIO Fig 101.Interfase al usuario La interfase al usuario brinda la posibilidad + - con la que se varia porcentualmente la salida referente a la salida máxima. El pulsador indicado como máximo permite que al utilizar resistencias de calentamiento lento ejecutemos 2 etapas en el proceso, en donde en la primera etapa llevamos la resistencia rápidamente a una temperatura calculada por el operario e inmediatamente después pone en off dando paso a que el sistema trabaje para lo que esta propuesto. 17.5.4 LOGICA DEL PROGRAMA DEL PIC 18 CONTROL E INTEGRACION DE PROCESOS El control central de la maquina es realizado por medio de una computadora. 18.1 DESCRIPCIÓN DEL PC UTILIZADO: Procesador 386 o 486 (166MHz) Pantalla monocromática 14 pulgadas 8 o 16 MHz de memoria RAM Entorno D.O.S (sistema operativo) Teclado estándar Se utiliza el puerto paralelo para la interfase con la maquina y los programas de operación hechos en lenguaje de programación C (Turbo C). Esta interfase se realiza con un DB25 utilizando 8 salidas y 5 entradas. La computadora posee hasta 3 puertos paralelos lo que triplica el número de entradas y salidas. El hecho que se utilice este tipo de computadoras ya descontinuadas da la ventaja que resultan muy económicas, al trabajar en entorno D.O.S se evitan los costos por licencias ya que Microsoft exige licencia de producto en sistemas operativos mas avanzados que Windows 98. La velocidad de operación es un punto tampoco relevante y la velocidad de la maquina es mas que suficiente para el sistema en cuestión. El programa desarrollado permite diferentes tipos de operación, desde un manejo puramente manual con elementos externos o si lo prefiere directamente con el teclado y permite a su vez el modo automático de dosificado y sellado. El software de trabajo permite la selección de modo discreto del tiempo de sellado y ciclo de sellado. También permite la visualización de un contador que indica el numero de ciclos de sellado realizados. Otra gran ventaja de utilizar el software es el hecho de manejar una base de datos que permite sacar algunos reportes especiales y algunos manejos contables que aunque muy sencillos, muy prácticos para el operador. 18.2 INTERFASE PARA SALIDAS PC Vamos a utilizar el puerto paralelo por lo tanto debemos implementar un driver de salida del puerto que se conectara a las interfases de salida correspondientes. De igual manera las interfases de entrada al PC ya han sido planteadas en el transcurso de este trabajo. Fig 102.Acondicionamiento DB25 del PC Dado que el PC arroja un nivel de voltaje de 0 y 5 V debemos acondicionar estos voltajes de salida para accionar elementos que requieren un voltaje mayor para su activación, por lo tanto es necesario hacer un circuito electrónico que permita cambiar estos voltajes de 5 V a los niveles de voltajes necesarios. 18.2.1ACONDICIONAMIENTO PARA NIVELES DC Fig 103.Acondicionamiento para niveles dc 18.2.2 ACONDICIONAMIENTO PARA SEÑALES A.C Fig 104.Acondicionamiento para niveles ac 18.2.3 CONTROL ELECTROVALVULA DE LÍQUIDO Asumimos que para el control de líquido vamos a utilizar una señal de control, independientemente del sistema implementado. En el software la aplicación de apertura puede ser para válvula de 3 vías manejada con pistón de simple efecto. Pero en el caso de dar solución con otro sistema simplemente en el software al momento de abrir o cerrar se plantean en forma de funciona si que en ella se realizan los cambios necesarios y nuestro circuito de control por PC puede ser fácilmente adaptable a cualquiera de los sistemas planteados. Fig 105.Control válvula de liquido 18.3 DIAGRAMA DE FLUJO DE LA LOGICA SEL SISTEMA En el circuito anterior, en el momento que se esta sellando se dosifica (entrega el liquido) entre el tiempo de selle y el tiempo de corte. Si el tiempo de selle (caliente) fuese muy corto y la maquina no lograra dosificar la cantidad necesaria debemos hacer el cambio en el algoritmo y dosificar después de todo el tiempo completo de ciclo como lo muestra el siguiente diagrama. 18.4 PROGRAMAS 18.4.1PROGRAMA DE VERIFICACION DE ACCIONAMIENTOS DEL SISTEMA Permite al usuario la manipulación de forma manual de los elementos controlados por el PC. Puede ser utilizado tanto para verificar el correcto funcionamiento de los actuadores, como para manejar la maquina en forma manual si fuese el caso (de no utilizar los pulsadores externos que la maquina tiene para dicha tarea). El programa muestra como el dato ingresado es llevado al puerto paralelo según la tarea que se realiza al ingresar por teclado los números 1,2,3,4 o 0 (otra información no produce efecto alguno). El software escribe el dato en la salida del puerto paralelo. Allí se tiene el dato de activación o no activación de la válvula, dosificador, sellador y resistencia. También es posible verificar el correcto funcionamiento de las entradas al sistema de control que son el sensor de líquido, sensor de papel, sensor bolsita y el switch externo. En la grafica vemos como al activarse una entrada nos muestra que esta en ON y si esta apagada muestra el OFF. 18.4.2 PROGRAMA PARA CONFIGURACION DE LA MAQUINA El programa permite configurar el funcionamiento de la maquina. Podemos configurar el sellado donde se sella un tiempo en caliente y luego permanece el sistema de sellado cerrado pero con la resistencia en frío. A esto lo llamamos tiempo de selle (en caliente) y el tiempo de ciclo es la suma del tiempo en caliente y el tiempo en frío. El tiempo de espera que nos ayuda a cuadrar el punto exacto donde el sellador debe cerrarse. Luego de que el sensor de bolsita detecta es posible que no inmediatamente debamos cerrar el selle, es por esto que este tiempo sirve para dar la exactitud del punto de selle. Si deseamos trabajar en caliente todo el tiempo, simplemente hacemos que el tiempo de selle sea el mismo tiempo de ciclo, de esta manera la resistencia permanecerá caliente todo el tiempo. El tiempo de espera es un tiempo que se emplea en caso de una falla externa. El sistema espera un tiempo la detección de la bolsita si después de un tiempo definido la maquina no detecta nada pone el sistema en estado inicial y sale abruptamente. El tiempo de calentamiento inicial es un tiempo en el que la resistencia debe calentarse y estar lista para trabajar correctamente. La opción de contador actual trabaja igual que las anteriores y permite al usuario cambiar el contador en caso de algún pequeño descuadre en el conteo que puede darse por causas externas. Tenemos también la opción 7 que nos permite visualizar configuraciones previamente definidas. Estas previas configuraciones podemos seleccionarlas y cargarlas al sistema o bien en caso dado podemos eliminar alguna de ellas. MENU SELECCIONAR ELIMINAR VISUALIZAR La opción 8 nos permite guardar la configuración actual la cual nos muestra en pantalla La opción 9 nos permite resetear el contador esta opción es restringida de tal modo que obligue al usuario a dar datos como la fecha de la cantidad pasada y esta información pueda guardarse en una base de datos. 18.4.3 PROGRAMA PRINCIPAL El programa principal es el que hace el control automático de la maquina. Para este caso al software se le anulan las partes del manejo de entradas al puerto simplemente dejándolas como comentarios para que podamos ver como trabajará el sistema. El programa lleva un acondicionamiento especial para la simulación. En la simulación damos un número inicial que simplemente es un número que define un dato aleatorio que hace que el proceso pare por falta de papel, líquido o simplemente una salida correcta del mismo por medio del switch externo. Vemos el contador, válvula que puede estar abierta o cerrada, dosificador (cilindro) que puede estar afuera (empujando) o adentro (succionando), el sellador que es el cilindro que esta esperando (afuera) o adentro (sellando) y la resistencia que puede estar caliente (ON) o fría (OFF). ESTADO INICIAL La maquina comienza a trabajar solo si el switch externo esta en modo automático y si se ha verificado correctamente que halla liquido y papel. Luego de esto viene el calentamiento inicial. El sistema muestra de manera decreciente el conteo. Luego de este tiempo comienza el programa a trabajar. Primero entrega una dosis Luego espera a que el sensor de bolsita sea activado Inmediatamente después de que sensa que la bolsa va en camino da un tiempo de espera que lo que hace es cuadrar el punto exacto del corte. Luego de este tiempo sella en caliente y a la vez entra el cilindro del dosificador produciendo una succión de líquido. También se produce el cierre de la válvula en el dosificador. Luego que ya se dio el tiempo de selle en caliente ahora se procede al ciclo de selle en frío. A su vez el dosificador que ya a tenido tiempo de cargar la dosis entrega líquido esto hace que se optimice el tiempo de proceso. Luego de esto el sistema verifica que hay papel y liquido y así puede continuar y realiza el proceso nuevamente El sistema continúa en su ciclo de trabajo. Pero existen dos maneras en que el ciclo puede ser interrumpido. Salida segura que es por medio de un switch externo en la que el operario al pulsar el switch el hace un ciclo y termina dejando la maquina en estado de reposo (estado inicial) FINALIZACION Y la otra manera en que el programa termina es por detectar que ya no hay líquido o papel en este caso igualmente realiza un último ciclo y termina. En todos los casos la maquina queda en estado inicial. 19. SISTEMA DE INFORMACION El proyecto como tal ofrece el servicio del sistema de información, lo que hace más llamativo el producto a nivel de comercialización. El usuario no cuenta en sus planes la implementación de un servicio que proporcione el manejo de base de datos de algún tipo de información que puede ser beneficiosa para el desarrollo de una pequeña o mediana empresa que pretende implementar automatización en el proceso de empaque para los diferentes productos. En el software presentado para el control de la maquina integrada el sistema ya nos permite guardar una pequeña información sobre el proceso de empacado. Así como lo es la producción que se realiza a diario y alguna programación especifica de maquina que pude ser recuperada según se desee. El sistema de información esta básicamente aislado de esa parte del proceso. El proceso de producción debe indicar al usuario el trabajo que se realiza y los ciclos de maquina que se han llevado a cabo. Por lo tanto lo que es el manejo del inventario y la facturación, aunque podrían integrarse, la practica en el manejo de inventarios y ventas permite justificar que no es un modelo eficiente ya que errores cometidos por el usuario podrían verse reflejados en un descontrol total de la información que se almacena y manipula por ello se plantea que este sistema esta aislado y solo se interrelaciona consigo mismo. El aplicar esta dosis de software al proyecto no representa incremento alguno en cuanto los costos de elaboración de un sistema y solo se remite al proceso inicial de desarrollo, siendo así que este es un producto agregado que no representa incremento en los costos para un cliente pero si hace que el producto dosificador sea mas llamativo e interesante para un pequeño o mediano empresario. Este software nos va a permitir manejar los procesos de inventario y facturación. De modo que el usuario tiene a su disposición un sistema que le permite realizar consultas de precios, cantidades en almacén, actualización de precios e inventarios. El sistema le da la posibilidad al cliente de manejar más de 20000 productos diferentes lo que en la vida diaria resulta muy extremo. Por otro lado el cliente maneja producto terminado y materia prima en la que necesita conocer por una parte el costo de materia prima y los costos resultantes de venta del producto. Dado que no es un producto único el que puede ser empacado se plantea un sistema que puede adaptarse fácilmente de una u otra forma al beneficio que el sistema en su totalidad ofrece. Para la implantación del sistema de información se recomienda utilizar un sistema operativo un poco mas robusto como Windows 95 que le perta al usuario una interfase mas amigable al manejo del software aunque si lo desea trabajar en D.O.S puede hacerlo sin ningún inconveniente solo que los programas deben llamarse por el nombre correspondiente asignado para el ejecutable. 20. PRESUPUESTOS Los presupuestos correspondientes a la maquina dependerán del sistema a implementar. En el transcurso de este trabajo se han especificado en cada uno de los referentes las ventajas económicas versus la eficiencia que cada uno de los modelos planteados presenta. Por esta razón solo algunas de las partes del proyecto básicas en su desarrollo se especifican en este ítem. Y no es un presupuesto como tal de un modelo específico sino una referencia económica a la fecha de los costos con los que cuenta el mercado y la oferta generada. De igual forma la mano de obra es un costo agregado que debe tenerse muy en cuenta ya que el grado técnico que esta alcanzando el país hace que cada vez esta mano de obra cueste aun menos cada día y los costos en materia prima de igual forma cada vez se compiten mas y por esta razón se considera que unos costos de referencia pueden ser minimizados en la medida en que se desarrolle el país. BOMBA ¼HP ACERO INOXIDABLE $200.000 TANQUE DE ALMACENAMIENTO 50LT ACERO INOXIDABLE $100.000 ESTRUCTURA DE SOPORTE $ 40.000 ESTRUCTURA DE SELLE $50.000 MANO DE OBRA ESTRUCTURAS $70.000 RESISTENCIA SELLADO $10.000 X 2 MORDAZAS EN BRONCE PARA SELLE $35.000 X 2 VALVULAS ACERO INOXIDABLE ½” EMBOLO 2 VIAS $30.000 X 2 MOTOR D.C $20.000 X 2 CONTROL TEMPERATURA $70.000 RELES INDUSTRIALES $10.000 X 5 COMPUTADOR NECESARIO $100.000 DRIVER DE COMUNICACIÓN AL PC $30.000 PISTON NEUMATICO $100.000 X 2 MANGUERA FLEXIBLE X METRO $1.500 X 20 ELCTROVALVULA CONTROL 3/2 $50.000 X 3 COMPRESOR 1/4 HP $150.000 FRL $120.000 SENSORES NIVEL $20.000 MANGUERA PARA LIQUIDOS ½ “ X METRO $10000 TOTAL $ 1.580.000 21. ANEXOS 21.1 PROBLEMAS CON EL LÍQUIDO A EMPACAR Teniendo en cuenta que como los líquidos que serán utilizados están compuestos por azúcar, anilina, colorante, saborizante y demás ingredientes, se hace necesario que en el tanque grande exista una especie de gancho en acero inoxidable que haga la función de batidor, con el fin de que las sustancia esté siempre homogénea y sus componentes no se retengan en el fondo del tanque, debido a que algunos de estos componentes no solamente son líquidos sino también sólidos. Este batidor esta compuesto por un motor al que se añade un gancho con aspas de acero inoxidable que se encargarán de batir la sustancia constantemente. Básicamente para el diseño de este batidor debemos tener en cuenta el torque y velocidad que proporciona. Podemos especificar que el torque no es muy alto pero la velocidad se recomienda que si. Por lo tanto debe utilizarse un motor de corriente alterna ya que estos son los indicados para proporcionar altas velocidades y bajos torques. Así mismo el motor A.C es más económico y resulta más fácil de conseguir en el comercio. Otra consideración importante es que en el momento de mantener constantemente el líquido en movimiento de forma circular se produce el efecto de una centrifuga que implicaría que el liquido se mantuviese en la parte alrededor del gancho batidor por lo tanto aunque se requiere una buena velocidad, no debe excederse los limites necesarios para evitar que esto suceda además que es claro que podemos generar derramamiento del liquido por la parte superior. Específicamente las aspas deberán ser del diámetro del tanque contenedor y así proporcionar una mezcla uniforme y no generar un centro vacío de líquido. Además la batidora deberá alojar las aspas en forma intercalada ya que de esta manera resultara mas económica la estructura a realizar. Con 2 aspas es más que suficiente. Además recuerde que en la parte inferior del tanque las aspas no deben evitar que el líquido caiga. A groso modo la estructura será de la siguiente manera. Fig 107.Modelo de aspas batidoras 21.2 ERGONOMIA DEL AMBIENTE DE TRABAJO ASOCIADO DISEÑO DE PUESTOS DE TRABAJO. Es conveniente colocar soportes colgantes para suspender las herramientas de uso frecuente en un mismo lugar, ya que el operador debe aplicar menos fuerza para cargarlas, y requiere de menos tiempo para tomarla y dejarla. Es conveniente que el puesto de trabajo permita su ajuste, con el fin de que la altura de trabajo sea la misma o ligeramente menor que la del codo de cada trabajador que opera en el área. La altura de trabajo es la de la superficie donde se realizan las operaciones; si esta es demasiado alta, es común identificar incomodidad, cansancio y lesiones en cuello, hombros y brazos; si es demasiado baja, se puede presentar lesiones y molestias en la espalda baja Es conveniente limitar el número de pedales en las operaciones cotidianas del trabajo; sin embargo, cuando sea necesario su utilización, es conveniente considerar en su diseño que: Su nivel sea lo más cercano posible al nivel del piso y sean del largo suficiente para su fácil operación, y que permita ser operados con cualquiera de los dos pies. Minimice la distancia entre el trabajador y su objeto de trabajo Asegúrese de proporcionar un soporte adecuado para mano y antebrazo cuando se realicen operaciones de precisión, ya que es importante la estabilidad de la mano para realizar adecuadamente las operaciones que se ven afectadas por ligeros movimientos de la mano. En algunas operaciones también es conveniente proporcionar un soporte para la herramienta, lo que reduce la necesidad de aplicación de fuerza por parte del usuario y le permite un mejor control. Proteja a los trabajadores de sustancias químicas para que puedan desarrollar su trabajo de forma segura y eficiente; la exposición a pinturas, solventes, limpiadores, ácidos, pesticidas y gases daña su salud y disminuye su desempeño y precisión en el trabajo. Al trabajar sentado, asegúrese de que sus brazos bajen en forma vertical o lo más cercana a esta, mientras que sus antebrazos queden en forma horizontal, formando un ángulo recto entre el brazo y el antebrazo. Es importante que los codos queden a la altura de la superficie de trabajo, o ligeramente arriba de esta, siempre con los hombros relajados. En caso de no cumplir estas condiciones, se debe ajustar la altura del asiento, procurando también que los pies queden bien apoyados en el piso o en alguna superficie de soporte adecuado. Las rampas con poca inclinación, entre el 5 y 8%, y con superficie antiresbalante representan una mejor opción en los sitios de trabajo que pequeñas escaleras; las escaleras, aunque sean de pocos escalones, incrementan el riesgo de accidentes de los usuarios y no permiten utilizar equipo auxiliar con ruedas en el manejo de materiales. Así mismo, las escaleras dificultan el acceso de personas en sillas de ruedas, bastones o muletas. Asegúrese de que la altura de los tableros de control, indicadores y botones de emergencia estén a una altura y distancia adecuada para ser operados por todos los trabajadores. Asegúrese de que los pasillos sean lo suficientemente anchos para permitir el paso en los dos sentidos al mismo tiempo y que permanezcan libres de objetos que obstruyan o limiten el paso. MAQUINAS, HERRAMIENTAS Y EQUIPOS MANUALES La maquina no deben forzar al usuario a adquirir una posición inadecuada, como tener que mantener el codo elevado y el hombro en posiciones no naturales. Las herramientas y equipos manuales demasiado pesados provocan que el usuario se fatigue rápidamente y resultan difíciles de controlar; en estos casos lo más recomendable es utilizar la herramienta con las dos manos, una para soportar el peso de la herramienta y la otra para controlarla. Las herramientas que son diseñadas para utilizarse con cualquiera de las dos manos permiten que el usuario las utilice con la mano que más se acomode, además de que permiten alternar el trabajo con ambas manos, lo que disminuye la fatiga y el riesgo de lesiones al permitir el descanso alternado de manos y brazos. Por la seguridad de los usuarios, las herramientas manuales donde se aplique fuerza para su cierre deben contar con topes para proteger la mano de pellizcos; también deben contar con un mango aislante de la electricidad y el calor, además de reducir las vibraciones que se puedan transmitir a la mano y brazo. Los músculos que cierran la mano son más fuertes que los que la abren, por lo que es conveniente contar con resortes o dispositivos que ayuden a abrir las herramientas y las mantengan abiertas. ILUMINACION. La iluminación suficiente mejora el confort y desempeño de los trabajadores, además de reducir la posibilidad de errores y el riesgo de accidentes. El nivel de iluminación depende de la actividad que se realice y el tiempo para observar los objetos; debe habe un mayor nivel de iluminación cuando la actividad sea minuciosa o deba realizarse en forma muy rápida. Para lugares donde se realizan tareas finas, delicadas o con piezas muy pequeñas, es conveniente utilizar dos tipos de iluminación: Una para el alumbrado general, y una específicamente para el área de trabajo. Un aspecto importante a cuidar es que la iluminación para el área de trabajo no deslumbre o moleste al trabajador, por lo que debe contar con pantallas y permitir el ajuste de su altura para adecuarse a las características de cada usuario. Es importante verificar que el alumbrado en las áreas de trabajo no incida directamente en los ojos del usuario, o que esté a sus espaldas de tal forma que él mismo se provoque sombra sobre el área de trabajo. También es conveniente cuidar que la luz natural de las ventanas no provoque reflejos ni incida sobre los ojos del usuario No utilice superficies reflejantes en el área de visión del trabajador, ya que el reflejo provoca distracción, incomodidad y fatiga visual. La iluminación que proporcionan las ventanas no debe provocar reflejos sobre las pantallas; no es conveniente que el usuario trabaje de frente a la ventana ni de tal forma que la luz provoque reflejos sobre el monitor. En caso de no peder tener la disposición del mobiliario adecuada con respecto a la ubicación de la ventana, esta debe contar con cortinas o persianas que permitan evitar reflejos y molestias al usuario. AMBIENTE TERMICO Se requiere de un clima adecuado para realizar un trabajo de forma eficiente. La temperatura ambiente de confort en verano es entre los 20 y 22 ºC, ya que temperaturas mayores pueden provocar cansancio y somnolencia. La condición de humedad relativa ambiental más cómoda para el ser humano es cercana al 50%; cuando es muy elevada, es difícil la evaporación del sudor y la resistencia del ser humano a altas temperaturas se reduce. Para evitar esta situación es conveniente mejorar la ventilación del lugar de trabajo. Así mismo, cuando la humedad relativa es muy baja, hay una excesiva evaporación del sudor y se resecan las membranas mucosas, como las de nariz y boca; en esta situación es conveniente incrementar artificialmente la humedad del lugar. El propósito principal de la ventilación es proveer aire fresco, remover los gases contaminantes y mantener una temperatura adecuada en el sitio de trabajo. Para que la velocidad del aire sea confortable en las áreas de trabajo debe ser entre 0.2 y 0.5 metros por segundo, aunque depende de la temperatura y humedad del ambiente. La temperatura ambiental adecuada para el sitio de trabajo depende del tipo e intensidad de la tarea que se desarrolle en él; para un tipo de trabajo como el de oficinas, donde la demanda física es ligera, la temperatura ambiente debe estar entre los 19 y 21 °C, pero para un trabajo industrial de gran demanda física se recomienda una temperatura ambiente entre los 12 y 16 °C. AMBIENTE SONORO. Aísle las fuentes de ruido para que no resulte molesto a los trabajadores que realizan sus labores en el área cercana y disminuya el nivel del ruido ambiental. Revise que las cubiertas de los equipos estén bien colocadas y ajustadas para evitar el ruido que provoca su vibración. Los pisos deben ser de materiales que resulten seguros para transitar y proporcionen el soporte adecuado para la actividad que se realiza, pero su diseño y el material no deben generar elevados niveles de ruido al transitar por ellos. Las conchas para protección auditiva representan una mejor protección a los niveles elevados de ruido que los tapones para oídos, y permiten su combinación además para los supervisores es fácil monitorear su uso y no se mueven fácilmente de su lugar. Aunque el oído presenta una forma de protección natural cuando se le somete a niveles elevados de ruido continuo, se debe evitar los ruidos de impacto, ya que representan un gran riesgo al no permitir que accione su mecanismo de protección. Coloque barreras para contener el sonido y que no afecte a personas sin protección auditiva en otras áreas de trabajo o pasillos cercanos lo que resultara muy útil en el caso del uso de compresores. CONTROLES E INDICADORES. Asegúrese que los controles e indicadores importantes estén al frente del operador para que no tenga que girar los brazos, cabeza, cuello o espalda para verlos y alcanzarlos. Es conveniente colocar dentro del área primaria los controles de mayor importancia, y los demás en dentro del área secundaria. La lectura incorrecta de los indicadores en los tableros de control puede resultar crítica y peligrosa para los usuarios, el proceso y los productos. Asegúrese que los controles e indicadores sean fáciles de distinguir y que la visibilidad de sus indicadores (punteros, caracteres o números) sea adecuada para las condiciones de trabajo. En algunas ocasiones es conveniente seleccionar la posición "normal" de los indicadores de tal forma que queden alineados, lo que facilita la identificación de situaciones "fuera de lo normal". Asegúrese que las señales, controles y apagadores sean fáciles de ver, de leer y de entender. Asegúrese que los controles de encendido sean difíciles de accionar por accidente, y que los controles de apagado sean fáciles de localizar y accionar. En los indicadores se debe evitar escalas múltiples o no-lineales. Los números, marcas de escala y unidades deben ser claramente distinguibles desde la distancia a la que el operador normalmente realiza la lectura, además debe ser fácilmente distinguible el apuntador y la lectura que indica. Es conveniente reforzar con otro color la información que recibe el usuario sobre situaciones críticas o peligrosas. Los indicadores analógicos son más fáciles de interpretar por el usuario cuando no se requiere una lectura precisa del valor indicado; la posición de la aguja y el color de la zona donde se encuentra permiten identificar rápidamente la situación sin tener que interpretar el significado de la medición; por el contrario, si se requiere una lectura precisa de la medición indicada, es más conveniente utilizar uno digital. La mejor ubicación para los controles manuales e indicadores es a una altura entre la cadera y el hombro, así como a una distancia máxima de la longitud del brazo del usuario, desde su posición normal de trabajo. Asegurese que los elementos de control sean del tamaño, forma y diseño adecuados para las condiciones en que van a ser utilizados, considerando que el usuario pueda utilizarlos con el equipo de seguridad y protección personal requerido para la tarea que desarrolla. Asegúrese de que los trabajadores conozcan el significado de las señales de los tableros de control y que estén capacitados para actuar ante ellas. También es importante no saturar de información por medio de estas señales al operador. Si el control únicamente responde a dos opciones, como apagado y encendido, un botón de pulsación, pedal o interruptor de dos posiciones es el tipo de control indicado; si se requiere de control gradual o existen más opciones no es conveniente utilizar este tipo de controles. MOVIMIENTO MANUAL DE CARGAS. Evite flexionar o rotar la espalda cuando desarrolle actividades de manejo manual de cargas, ya que estos movimientos incrementan la fatiga y el riesgo de lesión en cuello, hombros y espalda. Asegúrese que los paquetes y contenedores que van a manejarse y transportarse manualmente cuenten con puntos adecuados de agarre, tanto en dimensiones como en acabado. El movimiento manual de cargas resulta más fácil, rápido y seguro si los objetos cuentan con una forma adecuada de agarre y sujeción. Representa menos riesgo de lesiones en la espalda baja el empujar o jalar horizontalmente los objetos a mover, que cargarlos para levantarlos y bajarlos en forma vertical. El movimiento horizontal de objetos es más eficiente y permite un mejor control del trabajo, ya que el trabajador no necesita aplicar tanta fuerza como al cargar el objeto. Así mismo, el empujar o jalar cargas es más seguro y efectivo si el movimiento se realiza enfrente del cuerpo y no en forma lateral. Sin embargo, se debe reducir al mínimo posible el movimiento manual de cargas pesadas. Indique de forma clara, explicita y redundante cuando el peso de los elementos represente un riesgo de lesión al tratar de cargarlos o moverlos en forma manual. Es conveniente revisar que los contenedores para movimiento manual de cargas no presenten bordes afilados o que puedan lastimar, cortar o lesionar a quien los utiliza. Este aspecto debe ser cuidado durante el diseño de los contenedores, pero también deben realizarse revisiones periódicas para evitar utilizar contenedores maltratados o desgastados por el uso, y que puedan lesionar a sus usuarios. En el diseño de contenedores hay que considerar que sus dimensiones no sean excesivas para que lo transporte una persona. En caso de que el contenedor sea mayor a 75 centímetros de largo o 50 centímetros de ancho, se debe considerar en el diseño que va a ser transportado por más de una persona, contando con los suficientes medios de agarre para varios operadores distribuidos adecuadamente alrededor del contenedor. Al cargar objetos en forma manual, acérquese al objeto lo más posible y apoye los pies separados para mantener un buen equilibrio. Es preferible en el movimiento manual de cargas repartir simétricamente el peso entre ambos brazos y mantener las cargas lo más cercano posible al cuerpo. Evite girar cargando objetos pesados cuando se encuentre sentado. Asegúrese que el diseño y tamaño de las agarraderas permiten un adecuado agarre por parte del usuario, incluso cuando utiliza guantes. EQUIPOS DE PROTECCION PERSONAL. Es importante que el equipo de protección personal sea del tamaño adecuado del usuario; en el caso de los guantes de trabajo, el trabajador tiene que aplicar hasta 20% más de fuerza si no son de su tamaño. El equipo de protección personal debe ser de fácil mantenimiento y limpieza por parte del usuario; también se debe realizar inspecciones periódicas y frecuentes de sus condiciones, para renovarlos en caso de deterioro que represente algún riesgo para el trabajador. Asegurese que el personal utilice el equipo de protección regularmente proporcionándole una adecuada información y entrenamiento sobre su uso, la forma de ajustarlo, inspeccionarlo, limpiarlo y mantenerlo. Además, es conveniente que el personal esté informado de los riesgos que se pueden presentar en su trabajo y la forma de protegerse de ellos. El calzado de seguridad debe utilizarse en las actividades donde haya algún riesgo de accidente en los pies y de conformidad con la legislación local vigente. En forma general, la selección de este tipo de calzado se basa en el riesgo que hay en el lugar de trabajo: Se utiliza calzado con punta de seguridad para proteger a los pies de riesgos provocados por la posible caída de objetos o golpes; La suela de seguridad protege al usuario de lesiones por picos o puntas en el suelo; Si hay riesgo eléctrico y agua o humedad en el piso, se utilizan botas impermeables y aislantes. Se consideran zapatos al calzado que cubre totalmente el pie, y botas al tipo de calzado que cubre por lo menos el pie y el tobillo. En actividades donde se generan chispas o virutas el operador debe utilizar caretas que le cubran la cara por completo y no únicamente lentes que le protejan la zona ocular. Asegúrese que el equipo de protección personal sea adecuado para las dimensiones del usuario y se ajuste a su antropometría, ya que puede incrementar el riesgo el utilizar equipo que no sea del tamaño adecuado. 21.3 RECOMENDACIONES PARA EL MANEJO DE BOMBAS Es importante tener en cuenta que la bomba posee un sentido de giro. Es decir que el sentido de giro del motor asociado es relevante y debe ser tomado en cuenta a la hora de la instalación. De conectar el motor en forma incorrecta la bomba girara en el sentido contrario y su efecto será el de no proporcionar flujo alguno. También como sugerencia técnica tenga en cuenta que en ocasiones no basta con simplemente instalar la bomba ya que cuando esta se encuentra en punto estacionario por mucho tiempo resulta conveniente purgarla, como se conoce comercialmente el término, para que esta arranque a trabajar correctamente. En otras palabras diríamos que se trata de obligar de manera manual a que comience a proporcionar un flujo. Una sugerencia adicional es agregar un cheque de paso en la tubería de salida de la bomba con el fin de que en estado de reposo, la bomba no debe soportar la presión que ejerce el líquido en reposo en la tubería. 21.4 RECOMENDACIONES PARA EL MANEJO DE AIRE A PRESION Y LA CORRECTA FORMA DE INSTALAR UNA RED DE AIRE El compresor se considera de tamaño pequeño ya que su consumo será menor a los 40L/s y la entrada es mucho menor a 15KW. Al ubicar el compresor debe tenerse en cuenta las altas temperaturas que se producen cuando el aire es comprimido e igualmente es importante un eficiente enfriamiento del compresor para proteger las partes. Su cuarto debe ser ventilado y colocado cerca de una pared con rejillas que provean salida de calor y entrada de aire. El filtro de entrada de aire al compresor debe aspirar en lo posible aire limpio, consérvese alejado de: humo de vehículos, de otras maquinas, reverberos y procurar no mantenerlo estacionado con el motor en funcionamiento. Evite sitios dónde el aire puede tener una humedad alta como sobre un estanque o un techo en donde el agua de las lluvias no decante con facilidad. Evite sitios dónde se levante polvo, arena y basura esto ampliara la vida útil del compresor y a la vez evita que muchas impurezas se mezclen con el aire de trabajo lo que implicare un desgaste mas rápido de los diferentes elementos que componen el circuito neumático. Para la red de aire como elementos básicos a parte del compresor vamos a utilizar un FRL (filtro-regulador-lubricador) este filtro se sugiere en cada uno de los bancos de trabajo. FRL esta formado por un filtro, un regulador y lubricador. Ellos forman una unidad que prepararán las condiciones del aire comprimido justamente antes de utilizarlo en los equipos neumáticos o maquinaria neumática. Esto asegura que el suministro de aire sea limpio, la presión sea la correcta y que partículas finas de aceite limpio sean transportadas en el aire para lubricar válvulas, cilindros y herramientas neumáticas. Como tal el filtro es encargado de evitar que partículas de agua pasen a los elementos finales, así como partículas sólidas contaminantes. Estas partículas decantan a un pequeño envase adherido (generalmente) al filtro el cual debe ser limpiado con la frecuencia necesaria para mantenerlo libre y vació para el correcto funcionamiento. Se adquieren en el mercado filtros automáticos que se auto limpian o purgan en la medida en que se van llenando. En este filtro se retienen partículas hasta de 1µm de diámetro. Para aplicaciones en donde el aire debe ser excepcionalmente limpio y libre de aceite se utilizan los filtros coalescentes. Para usar en procesos alimenticios y farmacéuticos básicamente. Este tiene la capacidad de remover partículas por debajo de 0.01µm. El aire deberá ser prefiltrado por debajo de 5µm para prevenir una corta vida del elemento filtrante. Recuerde que estos elementos filtrantes son zeolitas (mallas químicas) especiales la cuales después de un tiempo deben desecharse y ser cambiadas. El regulador es el encargado de proporcionar una presión de trabajo en los elementos reduciendo una presión p1 de línea a una presión p2 requerida por el elemento (pistones). Generalmente este elemento lleva consigo un manómetro el cual permite observar la presión de salida que entrega el regulador. En el lubricador por efectos de presión negativa (tubo de benturi) se succionan pequeñas y pocas partículas de aceite las cuales van a mezclarse con el aire de trabajo. Estas partículas son muy pequeñas y básicamente ayudan a proteger la vida útil de los elementos neumáticos, alargar la vida útil de los sellos y empaques, y proporcionar lubricación en las partes donde se genere fricción. Esto evitara calentamiento de las partes y el desgaste será reducido. El lubricante utilizado se acaba con el tiempo de uso por lo que el operario debe revisar constantemente el nivel para inyectar lubricante nuevamente cuando sea necesario. 21.4.1 ASPECTOS BASICOS DE INSTALACION PARA LA RED DE AIRE En tal caso que se desee implementar una red de aire como tal deben tenerse en cuenta ciertos aspectos básicos de instalación. Estos son: Se procura que en cada banco de trabajo exista una unidad FRL según la necesidad y el filtro coalescente si así se requiriera. La distribución de aire se hace por medio de tubería en la que se utiliza el pvc. Es importante tener en cuenta las curvas que se utilizan las cuales deben evitarse al máximo ya que en estos ángulos y más aun en ángulos mayores podría presentarse fenómenos de turbulencia del aire lo que implicaría más condensación. En estas esquinas se recomienda instalar colas de purgas para recolectar y remover agua producto de la condensación del aire. Igualmente el nivel se sube proporcionando a cada línea de tubería una inclinación de 5º en caída para cada tramo que en términos generales no debe sobrepasar los 35m sin purga. Esta purga existe del tipo manual y automática y su utilización depende básicamente de la economía del cliente o de factores alternos que puedan exigir la utilización de una u otra. Así mismo se coloca una válvula incorporada para despresurizar la unidad antes de un mantenimiento. Es bueno también instalar un filtro de malla para retener las partículas sólidas grandes. En los puntos en que se va a tomar aire a presión sacado de la línea principal se utiliza una salida en cuello de ganso como se conoce popularmente de tal modo que no se convierta en un punto de decantación de agua sino que por el contrario el aire ira lo mas libre de humedad posible. Como dato adicional la siguiente grafica permite realizar el cálculo de las caídas de presión que se presenta en las tuberías teniendo en cuenta la presión de trabajo, el caudal o flujo requerido, la longitud y diámetro de la tubería. Con esta grafica podemos encontrar cualquiera de las variables establecidas conociendo las demás. 21.5 TRANSMISIONES Para producir movimientos de rotación es evidente que el motor es un elemento útil. Si queremos producir un movimiento lineal debemos adicionar una transmisión de movimiento tipo cremallera como lo muestra la figura Con el fin de lograr los torques deseados podemos pensar en utilizar transmisiones circular a circular como engranajes, cadenas, correas dentadas o poleas de cable en donde la teoría física es la misma. El perímetro es proporcional al radio de la forma P = 2 (pi) r Y la relación entre velocidades, perímetros y torques es: P1 / P2 = W1 / W2 = T2 / T1 Para el caso de los engranajes dicha relación se conserva pero el perímetro en este caso es equivalente al número de dientes de modo que para el engranaje la variable perímetro “P” será “N” nuecero de dientes. N1 / N2 = W1 / W2 = T2 / T1 Note que el máximo torque se realiza en la parte externa del anillo en donde es más grande la distancia al punto de giro. De esta manera podemos concluir que al aplicar transmisiones lineales. La velocidad lineal es equivalente a la velocidad tangencial del movimiento la que en un ángulo recto con la transmisión quiere decir que W = V (velocidad angular = velocidad lineal) y la fuera que siente es directamente proporcional al torque aplicado siendo F = T/d en donde el torque es proporcionado por el actuador siendo así que entre mas corta sea la distancia mucho mas fuerza vamos a generar. 21.6 RACORES Los racores son los puntos de acople para salida y entrada de aire en los cuales encontramos una estandarización de las medidas de diámetro y rosca que estos pueden tener. Podemos definirlos en pulgadas o en milímetros ya que sus equivalentes son fácilmente adquiribles. Este diámetro de racor depende del diámetro de la manguera flexible que vayamos a utilizar y por ello debemos tener presente el caudal y presión. 21.7 CODIGO DE PROGRAMA PIC CONTROL DEL DOSIFICADOR º;trabaja mostrando hasta 5s;ya tien cuacrados eecon1 equ 0x08 tiempos para los 0.1s;memoria EEprom eecon2 equ 0x09 ;lee los datos tiempo1,2,3;guarda el dato tiempo1 adcon1 equ 0x1f todas las veces y ya lo lee al apagar y prender. dato equ 0x20 ;listo graba los tres datos y lee los tres datos....tiempo tiempo1 equ 0x21 succión , empuje tiempo2 equ 0x22 ;y espera entre ciclos;esta listo las funciones falta tiempo3 equ 0x23 cambio de PIC tiempo4 equ 0x24 ;reformar entradas portb,menos3 y portb,menos4 uni1 equ 0x25 cambiar por otras 2 entradas uni2 equ 0x26 dec1 equ 0x27 especificada$$$$$$$$$$$$$$ dec2 equ 0x28 trabaja con rele y recupera 2 salidas;muestra tiempo uni3 equ 0x29 decrementando mientras pasa el tiempo espera entre uni4 equ 0x2a ciclos con1 equ 0x2b ;porte,2 se usa para switcheo de la fuente de los con2 equ 0x2c motores y no caliente todo el tiempo enlinea equ 0x2d ; configurar el adcon1 para usar puerto e ;porte,0 y enlinea1 equ 0x2e porte,1 mmanejan pistón sale y entra individualmente unidad equ 0x2f ;listo ese ani…….. decena equ 0x30 ; y actualizar cambio listp=16f877 PC equ en la parte numero equ 0x31 0x02 con3 equ 0x32 estado equ 0x03 con4 equ 0x33 porta equ 0x05 con5 equ 0x34 portb equ 0x06 direccion equ 0x35 portc equ 0x07 unid3 equ 0x36 portd equ 0x08 trans1d equ 0 porte equ 0x09 trans1u equ 1 intcon equ 0x0b trans2d equ 2 EEDATA_EECON1 equ 0x0c trans2u equ 3 EEADR_EECON2 equ 0x0d trans3 equ 4 trans4 equ 5 mas1 equ 7 eedata equ eeadr equ 0x08 0x09 menos1 equ 1 bcf portc,trans1d mas2 equ 2 bcf portc,trans2u menos2 equ 3 bcf portc,trans2d mas3 equ 4 bcf portc,trans3 menos3 equ 5 bcf portc,trans4 mas4 equ 6 bsf portc,trans1d menos4 equ 7 movlw 3fh ;0 0011 1111 3f 0100 0000 40 único equ 6 movwf portd darciclo equ 7 salentra equ 2 md equ 3 mi equ 4 movwf portd e equ 5 call tiemposs call movlw tiemposs 06h ;1 0000 0110 06 0111 1001 79 setiar equ 0 movlw 5bh ;2 0101 1011 5b 0010 0100 24 gardar equ 1 movwf org 0 bcf estado,6 bsf estado,5 ;cambio banco1. movlw 0x80 movwf portd ;puerto d portd call tiemposs movlw 4fh ;3 0100 1111 4f 0011 0000 30 movwf portd call tiemposs movlw 66h ;4 0110 0110 66 0001 1001 movwf portd 19 de salida (visualizacion), d7=entrada mas1 movlw 0xfe movwf portb movlw 0xc0 movwf portc call tiemposs movlw 6dh ;5 0110 1101 6d 0001 0010 movwf portd 12 call tiemposs movlw 7dh ;6 0111 1101 7d 0000 0010 0x07 movwf portd movwf adcon1 call tiemposs movlw 0x03 movlw 07h ;7 0000 0111 07 0111 1000 movwf porta movlw 0x03 movwf portd movwf porte call tiemposs bcf estado,6 movlw 7fh ;8 0111 1111 7f 0000 0000 00 bcf estado,5 ;cambio banco0. movwf portd ;viusualizacion dinamica; c7,c6 entradas movlw 02 78 call tiemposs ;pruebas1 movlw 6fh ;9 0110 1111 6f 0001 0000 10 bcf intcon,7 movwf portd movlw 0x00 call tiemposs movwf tiempo1 bcf portc,trans1d movlw 0x00 clrf uni4 movwf tiempo2 movlw 0x00 call cargartiempos movwf tiempo3 call llenardecuni movlw 0x00 movwf tiempo4 btfss portc,unico clrf porta call elciclo clrf porte btfss portc,darciclo bcf portc,trans1u call elciclo inicio ;inicialmente siempre carga el registro 0(ultimo usado) rutina btfsc portd,mas1 ;si el bit de entrada esta "on" aumenta tiempo1. bcf porta,e bsf porte,2 incf tiempo1,1 bsf porta,mi btfss portb,menos1 ;si el bit de entrada call tiempocerrar bcf porta,mi decf tiempo1,1 bcf porte,2 btfsc portb,mas2 ;si el bit de entrada bcf porta,2 esta "on" decrementa tiempo1. return esta "on" aumenta tiempo2. incf tiempo2,1 btfsc portb,menos2 ;si el bit de entrada derecho esta "on" decrementa tiempo2. bcf porta,2 bsf porte,2 decf tiempo2,1 bsf porta,md btfsc portb,mas3 ;si el bit de entrada call tiempoabrir bcf porta,md bcf porte,2 bsf porta,e esta "on" aumenta tiempo3. incf tiempo3,1 btfsc portb,menos3 ;si el bit de entrada esta "on" decrementa tiempo4. der decf tiempo3,1 call visualizo btfsc portb,mas4 ;si el bit de entrada btfsc porte,1 goto der incf tiempo4,1 bcf porta,e btfsc portb,menos4 ;si el bit de entrada bsf porte,2 esta "on" aumenta tiempo3. bsf porta,mi tiempo4,1 call tiempocerrar btfss porta,setiar bcf porta,mi call cargartiempos bcf porte,2 btfss porta,gardar bcf porta,2 call cambiartiempos1 return esta "on" decrementa tiempo4. decf btfsc porte,0 call tienda btfsc porte,1 call tienda ;$$$$$$$$$$$$$$$$$$$$$ cargartiempos ;selleciona la secuencia a cargar el set y listo funcionando. call tiemposs call tiemposs call tiemposs call llenardecuni call tiemposs call visualizo clrf direccion goto rutina movf uni4,0 movwf con5 btfss porte,0 incf con5,1 goto derecho decfsz con5,1 bsf porta,2 goto cualx bsf porte,2 goto estex call cambiartiempos tienda cualx bsf porta,md call tiempoabrir incf direccion,1 bcf porta,md incf direccion,1 bcf porte,2 incf direccion,1 bsf porta,e decfsz con5,1 goto cualx izq estex call visualizo btfsc porte,0 movf direccion,0 goto izq bsf estado,6 ; bsf estado,5 bcf estado,5 ; movwf EEADR_EECON2 ; bsf estado,5 ; btfsc bcf EEDATA_EECON1,7 goto bsf EEDATA_EECON1,0 ; bcf estado,5 bcf estado,6 atril0 lee1 EEDATA_EECON1,1 atril0 btfsc EEDATA_EECON1,0 movf direccion,0 goto lee1 bsf estado,6 bcf estado,5 ; movwf EEADR_EECON2 movf EEDATA_EECON1,0 bcf estado,6 bcf estado,5 movf tiempo1,0 bcf estado,6 ;bank0 bsf estado,6 movwf tiempo1 movwf EEDATA_EECON1 incf direccion,1 bsf estado,5 movf direccion,0 bcf EEDATA_EECON1,7 bsf estado,6 ; bcf estado,5 ; bsf EEDATA_EECON1,2 movwf EEADR_EECON2 ; bsf estado,5 ; bcf intcon,7 bcf EEDATA_EECON1,7 movlw 0x55 bsf EEDATA_EECON1,0 ; ;MOVLW 0x55 ;Write 55h to lee2 btfsc EEDATA_EECON1,0 movwf goto lee2 ;MOVWF EECON2 bcf estado,5 ; ;EECON2 movf EEDATA_EECON1,0 movlw bcf estado,5 ;MOVLW 0xAA bcf estado,6 ;bank0 ;Write AAh to movwf tiempo2 movwf incf direccion,1 ;MOVWF EECON2 movf direccion,0 ;EECON2 bsf estado,6 ; bsf bcf estado,5 ; ;BSF EECON1, WR movwf EEADR_EECON2 ; ;Start write operation bsf estado,5 ; bsf bcf EEDATA_EECON1,7 GIE ;if using interrupts, bsf EEDATA_EECON1,0 ; atril1 btfsc EEDATA_EECON1,0 ;BTFSC EECON1, WR ;Wait for goto lee3 goto bcf estado,5 ; ;write to finish movf EEDATA_EECON1,0 bcf estado,5 ;Only enable interrupts bcf estado,6 ;bank0 bcf movwf tiempo3 ;BCF EECON1, WREN ;Disable writes incf direccion,1 bcf estado,5 return bcf estado,6 cambiartiempos incf direccion,1 btfsc lee3 clrf direccion ;************************* bsf estado,6 EEADR_EECON2 0xAA EEADR_EECON2 EEDATA_EECON1,1 intcon,7 ;BSF INTCON, EEDATA_EECON1,1 atril1 EEDATA_EECON1,2 ;***************** bsf estado,6 ;BSF STATUS, RP1 bsf estado,5 ;BSF STATUS, btfsc RP0 EEDATA_EECON1,1 ;BTFSC EECON1, WR ;Wait for ;Bank 3 goto atril2 btfsc atril3 ;write to finish EEDATA_EECON1,1 ;BTFSC EECON1, WR ;Wait for goto ;Only enable interrupts atril2 bcf ;write to finish bcf estado,5 EEDATA_EECON1,2 ;BCF EECON1, WREN ;Disable writes ;BCF bcf estado,5 bcf estado,6 ;bank0 bcf estado,6 movf direccion,0 ;MOVF ADDR, incf direccion,1 bsf estado,6 STATUS, RP0 ;Bank 2 W ;Address to bsf estado,6 movwf EEADR_EECON2 ;BSF STATUS, RP1 ;bank2 bsf estado,5 ;BSF STATUS, RP0 ;Bank 3 ;MOVWF EEADR ;write to atril4 bcf estado,6 movf tiempo2,0 bsf estado,6 movwf EEDATA_EECON1 ;VALUE, btfsc W EEDATA_EECON1,1 ;BTFSC EECON1, WR ;Wait for ;Data to goto ;write to finish bcf ;MOVWF EEDATA ;write bsf estado,5 ;BSF EEDATA_EECON1,7 ;BCF EECON1, EEPGD ;Point to Data EEDATA_EECON1,2 ;Only disable interrupts intcon,7 ;BCF INTCON, GIE ;if estado,6 ;bank0 movf direccion,0 ;MOVF ADDR, bsf estado,6 ;bank2 movwf EEADR_EECON2 bcf estado,6 movf tiempo3,0 0x55 bsf estado,6 movwf EEDATA_EECON1 ;MOVLW 0x55 ;MOVWF EEDATA ;write ;Write 55h to bsf movwf bcf estado,5 ;BSF EEDATA_EECON1,7 ;BCF EECON1, EEPGD ;Point to Data ;EECON2 memory 0xAA ;MOVLW 0xAA bsf ;Write AAh to ;BSF EECON1, WREN ;Enable writes movwf EEDATA_EECON1,2 EEADR_EECON2 ;MOVWF EECON2 ;Only disable interrupts ;EECON2 bcf bsf EEDATA_EECON1,1 0x55 ;MOVLW 0x55 ;Start write operation intcon,7 intcon,7 ;BSF INTCON, ;BCF INTCON, GIE ;if already enabled,;otherwise discard movlw ;BSF EECON1, WR bsf W STATUS, RP0 ;Bank 3 EEADR_EECON2 ;MOVWF EECON2 movlw ;VALUE, ;Data to already enabled,;otherwise discard movlw bcf ;MOVWF EEADR ;write to ;BSF EECON1, WREN ;Enable writes bcf ;BCF W ;Address to memory bsf estado,5 STATUS, RP0 ;Bank 2 STATUS, RP0 ;Bank 3 bcf atril4 ;Write 55h to GIE ;if using interrupts, movwf atril3 ;MOVWF EECON2 ;EECON2 EEADR_EECON2 movlw bcf 0xAA estado,5 ;BCF STATUS, RP0 ;Bank 2 ;MOVLW 0xAA ;Write AAh to bcf estado,6 ;bank0 movwf movf direccion,0 ;MOVF ADDR, bsf estado,6 ;bank2 movwf EEADR_EECON2 EEADR_EECON2 W ;Address to ;MOVWF EECON2 ;EECON2 bsf ;MOVWF EEADR ;write to EEDATA_EECON1,1 ;BSF EECON1, WR bcf estado,6 ;Start write operation movf tiempo1,0 bsf intcon,7 ;BSF INTCON, ;VALUE, ;Data to GIE ;if using interrupts, bsf estado,6 atril5 movwf EEDATA_EECON1 btfsc ;MOVWF EEDATA ;write EEDATA_EECON1,1 bsf ;BTFSC EECON1, WR ;Wait for goto W estado,5 ;BSF STATUS, RP0 ;Bank 3 atril5 bcf ;write to finish EEDATA_EECON1,7 ;BCF EECON1, EEPGD ;Point to Data memory ;Only enable interrupts bcf bsf EEDATA_EECON1,2 EEDATA_EECON1,2 ;BSF EECON1, WREN ;Enable writes ;BCF EECON1, WREN ;Disable writes bcf estado,5 bcf estado,6 ;Only disable interrupts incf direccion,1 bcf intcon,7 GIE ;if already enabled,;otherwise discard return; movlw ;************ 0x55 ;MOVLW 0x55 cambiartiempos1 clrf direccion ;Write 55h to movf uni4,0 movwf movwf con5 ;MOVWF EECON2 incf con5,1 ;EECON2 decfsz con5,1 movlw goto cualy ;MOVLW 0xAA goto estey ;Write AAh to EEADR_EECON2 0xAA movwf cualy EEADR_EECON2 incf direccion,1 ;MOVWF EECON2 incf direccion,1 ;EECON2 incf direccion,1 decfsz con5,1 goto cualy bsf EEDATA_EECON1,1 EECON1, WR bsf intcon,7 GIE ;if using interrupts, ;************************* atril11 estado,6 ;BSF bsf btfsc ;BSF INTCON, EEDATA_EECON1,1 ;BTFSC EECON1, WR ;Wait for STATUS, RP1 estado,5 ;BSF STATUS, RP0 ;Bank 3 goto atril11 ;write to finish atril10 btfsc EEDATA_EECON1,1 ;BTFSC EECON1, WR ;Wait for goto atril10 ;write to finish ;Only enable interrupts bcf EEDATA_EECON1,2 ;BCF EECON1, WREN ;Disable writes bcf ;BSF ;Start write operation estey bsf ;BCF INTCON, estado,5 bcf estado,6 goto incf direccion,1 bcf ;***************** bsf estado,6 ;BSF STATUS, RP1 bsf estado,5 ;BSF atril14 estado,5 bcf estado,6 movf direccion,0 bsf estado,6 movwf EEADR_EECON2 STATUS, RP0 ;Bank 3 bcf estado,6 atril12 movf tiempo3,0 btfsc EEDATA_EECON1,1 ;BTFSC EECON1, WR ;Wait for goto atril12 ;write to finish bcf estado,5 bsf estado,6 movwf EEDATA_EECON1 bsf estado,5 bcf EEDATA_EECON1,7 bsf EEDATA_EECON1,2 ;BCF STATUS, RP0 ;Bank 2 bcf estado,6 ;bank0 movf direccion,0 ;MOVF ADDR, bcf intcon,7 movlw 0x55 movwf EEADR_EECON2 movlw 0xAA ;MOVWF EEADR ;write to movwf EEADR_EECON2 bcf estado,6 bsf EEDATA_EECON1,1 movf tiempo2,0 bsf intcon,7 bsf estado,6 movwf EEDATA_EECON1 W ;Address to bsf estado,6 movwf EEADR_EECON2 ;bank2 ;VALUE, W ;Data to atril15 btfsc goto ;MOVWF EEDATA ;write bsf estado,5 ;BSF STATUS, RP0 ;Bank 3 bcf bcf EEDATA_EECON1,2 bcf estado,5 bcf estado,6 incf direccion,1 EEDATA_EECON1,7 ;BCF EECON1, EEPGD ;Point to Data memory bsf EEDATA_EECON1,1 atril15 EEDATA_EECON1,2 return; ;BSF EECON1, WREN ;Enable writes elciclo bcf intcon,7 movlw 0x55 call secuenciax movwf EEADR_EECON2 btfsc portc,unico movlw 0xAA return movwf EEADR_EECON2 bsf EEDATA_EECON1,1 bsf intcon,7 movf atril13 btfsc EEDATA_EECON1,1 uni3,0 ciclon movlw 0x20 movwf con4 triciclo call tiempoespera bcf EEDATA_EECON1,2 decfsz con4,1 bcf estado,5 goto triciclo bcf estado,6 decfsz uni3,1 incf direccion,1 goto ciclon bsf estado,6 call tiempoespera bsf estado,5 call tiempoespera call tiempoespera call tiempoespera goto atril13 atril14 btfsc EEDATA_EECON1,1 call tiempoespera call llenadau call tiempoespera movf decena,0 call tiempoespera movwf dec2 call tiempoespera movf unidad,0 call tiempoespera movwf uni2 call tiempoespera movf tiempo3,0 call tiempoespera movwf enlinea call tiempoespera call llenadau return secuenciax movf unidad,0 movwf uni3 ;tiempo espera funciona con uni3 no con tiempo3 bsf porta,2 bsf porte,2 movf tiempo4,0 bsf porta,md movwf enlinea call tiempoabrir call llenadau bcf porta,md movf unidad,0 bcf porte,2 movwf uni4 bsf porta,e call primertiempo bcf porta,e bsf porte,2 clrf decena bsf porta,mi movf enlinea,0 call tiempocerrar sublw .49 bcf porta,mi btfsc estado,0 bcf porte,2 return bcf porta,2 incf decena,1 bsf porte,2 movf enlinea,0 bsf porta,md sublw .99 call tiempoabrir btfsc estado,0 bcf porta,md return bcf porte,2 incf decena,1 bsf porta,e movf enlinea,0 call segundotiempo sublw .149 bcf porta,e btfsc estado,0 bsf porte,2 return bsf porta,mi incf decena,1 call tiempocerrar movf enlinea,0 bcf porta,mi sublw .199 bcf porte,2 btfsc estado,0 funciona con uni4 no con tiempo4 return llenadad return return; incf decena,1 movf tiempo1,0 movf enlinea,0 movwf enlinea sublw .249 call llenadad btfsc estado,0 call llenadau return movf decena,0 incf movwf dec1 return movf unidad,0 movwf uni1 movf enlinea,0 movf tiempo2,0 movwf enlinea1 movwf enlinea clrf unidad call llenadad movf enlinea1,0 llenardecuni decena,1 llenadau ;secuencia sublw .4 btfsc btfsc estado,0 return estado,0 incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .59 sublw .9 btfsc estado,0 btfsc estado,0 return return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .64 sublw .14 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .69 sublw .19 btfsc estado,0 btfsc estado,0 return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .74 sublw .24 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .79 sublw .29 btfsc estado,0 btfsc estado,0 return return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .84 sublw .34 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .89 sublw .39 btfsc estado,0 btfsc estado,0 return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .94 sublw .44 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .99 sublw .49 btfsc estado,0 btfsc estado,0 return return return clrf unidad clrf unidad movf enlinea1,0 movf enlinea1,0 sublw .104 sublw .54 btfsc estado,0 incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .159 sublw .109 btfsc estado,0 btfsc estado,0 return return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .164 sublw .114 btfsc estado,0 btfsc estado,0 return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .169 sublw .119 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .174 sublw .124 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .179 sublw .129 btfsc estado,0 btfsc estado,0 return return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .184 sublw .134 btfsc estado,0 btfsc estado,0 return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .189 sublw .139 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .194 sublw .144 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .199 sublw .149 btfsc estado,0 btfsc estado,0 return return return clrf unidad clrf unidad movf enlinea1,0 movf enlinea1,0 sublw .204 sublw .154 btfsc estado,0 btfsc estado,0 return return incf unidad,1 movf enlinea1,0 bsf portc,trans1d sublw .209 call tiempomuestra btfsc estado,0 bcf portc,trans1d movf uni1,0 return incf unidad,1 movwf numero movf enlinea1,0 call lamuestra sublw .214 movwf portd btfsc estado,0 bsf portc,trans1u call tiempomuestra incf unidad,1 bcf portc,trans1u movf enlinea1,0 movf dec2,0 sublw .219 movwf numero btfsc estado,0 call lamuestra return movwf portd incf unidad,1 bsf portc,trans2d movf enlinea1,0 call tiempomuestra sublw .224 bcf portc,trans2d btfsc estado,0 movf uni2,0 movwf numero return return incf unidad,1 call lamuestra movf enlinea1,0 movwf portd sublw .229 bsf portc,trans2u btfsc estado,0 call tiempomuestra bcf portc,trans2u return incf unidad,1 movf uni3,0 movf enlinea1,0 movwf numero sublw .234 call lamuestra btfsc estado,0 movwf portd bsf portc,trans3 incf unidad,1 call tiempomuestra movf enlinea1,0 bcf portc,trans3 sublw .239 movf uni4,0 btfsc estado,0 movwf numero return call lamuestra incf unidad,1 movwf portd movf enlinea1,0 bsf portc,trans4 sublw .244 call tiempomuestra btfsc estado,0 bcf portc,trans4 return return return tiempomuestra1 incf unidad,1 movf enlinea1,0 clrf con1 sublw .249 movlw 0x02 btfsc estado,0 movwf con2 decfsz con1,1 goto tm1 decfsz con2,1 goto tm1 tm1 return clrf unidad return visualizo movf dec1,0 movwf numero call lamuestra movwf portd return; tiemposs clrf con1 clrf con2 decfsz con3,1 movlw 0x2 goto tmseg movwf con3 return; tiempomuestra tms decfsz con1,1 clrf con1 goto tms movlw 0x10 movwf con2 decfsz con2,1 goto tms tme decfsz con3,1 decfsz con1,1 goto tms goto tme decfsz con2,1 goto tme return; tiempoespera call visualizo call visualizo call visualizo return; lamuestra return; tiempoabrir movlw 0x40 movwf con3 call visualizo call visualizo incf numero,1 decfsz numero,1 goto m1 retlw 3fh ;0 0011 1111 3f 0100 0000 40 m1 decfsz tmab goto retlw decfsz con3,1 79 goto tmab m2 return; tiempocerrar movlw 0x40 movwf con3 call visualizo call visualizo decfsz con3,1 goto tmce m2 06h ;1 0000 0110 06 0111 1001 decfsz numero,1 goto m3 retlw 5bh ;2 0101 1011 5b 0010 0100 24 m3 tmce decfsz numero,1 goto m4 retlw 4fh ;3 0100 1111 4f 0011 0000 30 decfsz numero,1 m4 return; primertiempo movf tiempo1,0 19 movwf con3 m5 incf con3,1 tmun call visualizo call visualizo 12 decfsz con3,1 m6 goto tmun return; segundotiempo tiempo2,0 02 movwf con3 m7 incf con3,1 call visualizo call visualizo movf numero,1 tmseg 78 goto m5 retlw 66h ;4 0110 0110 66 0001 1001 decfsz numero,1 goto m6 retlw 6dh ;5 0110 1101 6d 0001 0010 decfsz numero,1 goto m7 retlw 7dh ;6 0111 1101 7d 0000 0010 decfsz numero,1 goto m8 retlw 07h ;7 0000 0111 07 0111 1000 m8 decfsz numero,1 goto m9 retlw 7fh ;8 0111 1111 7f 0000 0000 00 decfsz numero,1 goto m10 retlw 6fh ;9 0110 1111 6f 0001 0000 10 retlw 0x79 m10 m9 End 21.8 CODIGO DEL PROGRAMA PIC PARA CONTROL DE TEMPERATURA programa para el PIC de temperatura ;CONTROL DE TEMPERATURA 7 segmentos movlw las otras salidas. ;visualiza dinamicamente por el puerto B las dos salidas de 7 segmentos y el ;bit de control muestra datos grabados en la eprom del 0x1c ;00011100 tres entradas y movwf porta clrf portb ;puerto de salida (en caso de visualizacion) tiempo de Pc equ 0x02 porta equ 0x05 portb equ 0x06 bcf estado,5 ;cambio banco0. bcf porta,hot ;apaga resistencia. rutinsini estado equ 0x03 movlw 0xff intcon equ 0x0B movwf portb eedata equ bsf portb,7 eeadr equ 0x08 0x09 call tiempogradual eecon1 equ 0x08 bcf portb,7 eecon2 equ 0x09 call tiempogradual dato equ 0x10 bsf portb,7 t1 equ 0x11 call tiempogradual t2 equ 0x12 bcf portb,7 con1 equ 0x13 call tiempogradual t11 equ 0x14 bsf portb,7 t22 equ 0x15 call tiempogradual contr equ 0x16 bcf portb,7 call tiempogradual call cargart1t2 con2 equ 0x17 numero equ 0x18 numeroh equ 0x19 decena equ 0x20 unidad equ 0x21 enlinea equ 0x22 enlinea1 equ 0x23 lineal2 equ 0x24 con3 equ con4 mas ;rutina que carga al programa el porcentaje del ;periodo en que la resistencia esta apagada. call tiempoinicial 0x25 movlw 0x02 equ 0x26 movwf con3 equ 4 movlw 0x50 movwf con4 btfss porta,mas ;si el bit de entrada esta menos equ 3 cruce equ 2 hot equ 1 org 0 bsf estado,5 bcf estado,6 ;cambio banco1. secuenci "on" aumenta tiempo. decfsz con4,1 goto men call aumente movlw 0x50 movwf con4 btfss porta,menos ;si el bit de entrada - ;rutina de aumento. esta on decrementa tiempo. goto yas call decremente ;rutina de decremento. 0x50 movwf con4 con3,1 goto des goto uni movwf t22 call tiempopwm decfsz t22,1 goto segun bcf porta,hot movf t1,0 movwf t11 incf t11,1 prime yas decfsz 0xfa primermita con4,1 movlw porta,hot movlw segun men decfsz bcf call tiempopwm decfsz t11,1 goto prime bsf porta,hot des call visualiza1 ;(opcional)visualizacion goto return cargart1t2 del porcentaje de calor cruce1 ;que la resistencia entrega. movlw 0x00 uni movwf eeadr bsf estado,5 bsf eecon1,0 call visualiza ;(opcional)visualizacion del porcentaje de calor incf con3,1 bcf estado,5 incf con3,1 movf eedata,0 goto cruce1 movwf t1 bsf estado,5 bcf eecon1,0 ;que la resistencia entrega. cruce1 btfss porta,2 bcf estado,5 goto cruce1 movlw 0x01 bcf porta,hot movwf eeadr bsf estado,5 cruce2 btfsc porta,2 bsf eecon1,0 goto cruce2 bcf estado,5 call pwm goto secuenci ;vuelve al inicio para continuar para repetir ;la secuencia. ;fin de secuencia de programa ; RUTINAS ;rutina de cargar t1 y t2 (5 pasos por cada 1%) h'01f0) pwm btfsc t2,0 goto segundamita goto primermita segundamita movf eedata,0 movwf t2 bsf estado,5 bcf eecon1,0 bcf estado,5 movf t1,0 caso de visualizacion movwf t11 movf t2,0 movwf t22 return decremente bcf porta,hot ;cargat1 ;cargat2 ;cargar variables en call cargart1t2 ;carga los valores existentes movf xorlw btfsc goto t1,0 0x00 ;verifica si t1=0 estado,2 decre eeadr movf t1,0 movwf eedata bsf estado,5 bcf intcon,7 bcf eecon1,4; para grabacion poner bsf eecon1,2 en 0 decf t1,1 call guardart1t2 return decre movf movwf t2,0 xorlw 0x00 ;verifica si t2=0 btfsc estado,2 return ;si es 0 es porque t1=0 movlw 0x55 movwf eecon2 movlw 0xaa movwf eecon2 bsf eecon1,1 btfss eecon1,4;vigila gua1 y t2=0 no hace nada decf t2,1 grabacion correctamente movlw 0xf9 goto gua1 movwf t1 bcf intcon,7 call bcf eecon1,1 bcf estado,5 guardart1t2 final return return guardast2 aumente bcf porta,hot call cargart1t2 ;carga los valores existentes movf t1,0 xorlw 0xf9 btfsc estado,2 ;verifica si t1=250 movlw 0x01 movwf eeadr movf t2,0 movwf eedata bsf estado,5 bcf intcon,7 ;guarda t2 aumen bcf eecon1,4; para conversion incf t1,1 bsf eecon1,2 call guardart1t2 movlw 0x55 movwf eecon2 movlw 0xaa movwf eecon2 bsf eecon1,1 btfss eecon1,4 ;verificar que si goto return aumen movf t2,0 xorlw 0x01 ;verifica si t2=1 btfsc estado,2 return gua2 ;si es 1 es porque goto gua2 0x01 bcf intcon,7 movwf t2 bcf eecon1,1 clrf t1 bcf estado,5 call guardart1t2 return t1=250 y t2=1 no hace nada movlw visualiza return guardart1t2 call cambioenlinea1 call guardast1 call unidades call guardast2 call lamuestra1 call tiempodecambio movwf portb call tiempodecambio bsf portb,7 return return visualiza1 guardast1 movlw 0x00 ;guarda t1 call cambioenlinea de la call decenas nop call lamuestra nop movwf portb nop bcf portb,7 nop nop return nop lamuestra movf decena,0 nop addwf Pc,1 return retlw 10h ;9 0110 1111 6f 0001 0000 10 tiempodecambio retlw 00h ;8 0111 1111 7f 0000 0000 00 ; movlw 0xff retlw 78h ;7 0000 0111 07 0111 1000 78 ; movwf con1 retlw 02h ;6 0111 1101 7d 0000 0010 02 ; movlw 0xff retlw 12h ;5 0110 1101 6d 0001 0010 12 ; movwf con2 retlw 19h ;4 0110 0110 66 0001 1001 19 ;viva retlw 30h ;3 0100 1111 4f 0011 0000 30 ; decfsz con1,1 retlw 24h ;2 0101 1011 5b 0010 0100 24 ; goto retlw 79h ;1 0000 0110 06 0111 1001 79 ; decfsz con2,1 retlw 40h ;0 0011 1111 3f 0100 0000 40 ; goto viva viva return return tiempoinicial movlw 0xff asi en la tabla movwf con1 movf unidad,0 movlw 0xff addwf Pc,1 movwf con2 retlw 10h ;9 0110 1111 6f 0001 0000 10 retlw 00h ;8 0111 1111 7f 0000 0000 00 decfsz con1,1 retlw 78h ;7 0000 0111 07 0111 1000 78 goto retlw 02h ;6 0111 1101 7d 0000 0010 02 decfsz con2,1 retlw 12h ;5 0110 1101 6d 0001 0010 12 goto retlw 19h ;4 0110 0110 66 0001 1001 19 return retlw 30h ;3 0100 1111 4f 0011 0000 30 retlw 24h ;2 0101 1011 5b 0010 0100 24 btfss enlinea,7 retlw 79h ;1 0000 0110 06 0111 1001 79 goto troya retlw 40h ;0 0011 1111 3f 0100 0000 40 decf enlinea,1 decf enlinea,1 lamuestra1 ; invertimos el conteo dando )9=0,8=1 y viva2 viva2 viva2 decenas return decf enlinea,1 clrf decena movlw 0xff movf enlinea,0 movwf sublw .24 movlw 0x01;ff btfsc estado,0 movwf return tiempogradual ; con1 * con2 graduacion de porcentaje troya a los 60Hz con1 con2 incf decena,1 movf enlinea,0 sublw .49 decfsz con2,1 btfsc estado,0 goto return tex1 decfsz goto con1,1 tex1 tex1 incf decena,1 tiempopwm ; con1 * con2 graduacion de porcentaje a movf enlinea,0 los 60Hz return sublw .74 nop btfsc estado,0 nop return cambioenlinea1 incf decena,1 movf enlinea,0 movf t1,0 sublw .99 movwf enlinea1 btfsc estado,0 return unidades return incf decena,1 clrf unidad movf enlinea,0 movf enlinea1,0 sublw .124 sublw .4 btfsc estado,0 btfsc estado,0 return return incf decena,1 incf unidad,1 movf enlinea,0 movf enlinea1,0 sublw .149 sublw .9 btfsc estado,0 btfsc estado,0 return return incf decena,1 incf unidad,1 movf enlinea,0 movf enlinea1,0 sublw .174 sublw .14 btfsc estado,0 btfsc estado,0 return return incf decena,1 incf unidad,1 movf enlinea,0 movf enlinea1,0 sublw .199 sublw .19 btfsc estado,0 btfsc estado,0 return return incf decena,1 incf unidad,1 movf enlinea,0 movf enlinea1,0 sublw .224 sublw .24 btfsc estado,0 btfsc estado,0 return return incf decena,1 return cambioenlinea incf unidad,1 movf enlinea1,0 sublw .29 estado,0 clrf enlinea btfsc btfsc t1,1 return bsf enlinea,0 incf unidad,1 btfsc t1,2 movf enlinea1,0 bsf enlinea,1 sublw .34 btfsc t1,3 btfsc estado,0 bsf enlinea,2 return btfsc t1,4 incf unidad,1 bsf enlinea,3 movf enlinea1,0 btfsc t1,5 sublw .39 bsf enlinea,4 btfsc estado,0 btfsc t1,6 return bsf enlinea,5 incf unidad,1 btfsc t1,7 movf enlinea1,0 bsf enlinea,6 sublw .44 btfsc t2,0 btfsc estado,0 bsf enlinea,7 return return incf unidad,1 movf enlinea1,0 sublw .99 sublw .49 btfsc estado,0 btfsc estado,0 return return clrf unidad clrf unidad movf enlinea1,0 movf enlinea1,0 sublw .104 sublw .54 btfsc estado,0 btfsc estado,0 return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .109 sublw .59 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .114 sublw .64 btfsc estado,0 btfsc estado,0 return return return incf unidad,1 enlinea1,0 incf unidad,1 movf movf enlinea1,0 sublw .119 sublw .69 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .124 sublw .74 btfsc estado,0 btfsc estado,0 return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .129 sublw .79 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .134 sublw .84 btfsc estado,0 btfsc estado,0 return return return incf unidad,1 enlinea1,0 incf unidad,1 movf movf enlinea1,0 sublw .139 sublw .89 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .144 sublw .94 btfsc estado,0 btfsc estado,0 return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .149 return btfsc estado,0 btfsc estado,0 return return clrf unidad clrf unidad movf enlinea1,0 movf enlinea1,0 sublw .154 sublw .204 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .159 sublw .209 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .164 sublw .214 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .169 sublw .219 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .174 sublw .224 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .179 sublw .229 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .184 sublw .234 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .189 sublw .239 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf unidad,1 movf enlinea1,0 movf enlinea1,0 sublw .194 sublw .244 btfsc estado,0 btfsc estado,0 return return incf unidad,1 incf movf enlinea1,0 return sublw .199 End unidad,1 21.9 CODIGO FUENTE DEL SOFTWARE CONTROL DE LA MAQUINA 21.9.1 PROGRAMA PARA PROBAR LOS DIFERENTES ACCIONISMOS DEL SISTEMA. #include<iostream.h> #include<conio.h> #include<string.h> #include<dos.h> #include<stdio.h> #include<fstream.h> #include<stdlib.h> int salidatotal=0; char selladorx='0'; // variables que el sistema char calenturax='0'; // entero debe conocer char dosificarx='0'; char valvulax='0'; int tiemposelle=0; int tiempocorte=0; int tiempoespera=0; int tiemposeguridad=0; int calentamiento=0; int contador=0; void sellador(char onoff); // funciones para encender o apagar las salidas void calentura(char onoff); // void dosificar(char onoff); void valvula(char onoff); void estado0system(); void pantalladebienvenida(); void cargadeinformacion(); void mostrarinformacion(); void puertosalidas(); void menu1(); void menu2(); void menu3(); void menu4(); void main() { char sim1,sim2,sim3; int datolec; int puerto; char opc='n'; puerto=peek(0x40,0x8); do{ do{ cout.flush(); clrscr(); datolec=inportb(puerto+1); sim1='0'; sim2='0'; sim3='0'; if(!datolec&0x20) //verifica entrada3 sim3='1'; // en pc de juan es 0x40 if(datolec&0x10) // verifica entrada2 sim2='1'; if(!datolec&0x8) // verifica entrada1 sim1='1'; puertosalidas(); gotoxy(15,3); cout<<" MAQUINA SAMURAY'S SOCIETY "; gotoxy(14,4); cout<<" ==========================="; gotoxy(10,6); cout<<"ENTRADAS SALIDAS "; gotoxy(1,8); cout<<"( Datos leidos en el puerto )"; gotoxy(1,10); cout<<" Sensor de Papel y Liquido "; if(sim1=='1') cout<<"on"; else cout<<"off"; gotoxy(1,12); cout<<" Sensor Bolsita "; if(sim2=='1') cout<<"on"; else cout<<"off"; gotoxy(1,14); cout<<" Switch Externo "; if(sim3=='1') cout<<"on"; else cout<<"off"; gotoxy(43,8); cout<<" 1) Valvula "; if(valvulax=='1') cout<<"on"; else cout<<"off"; gotoxy(43,10); cout<<" 2) Dosificar "; if(dosificarx=='1') cout<<"on"; else cout<<"off"; gotoxy(43,12); cout<<" 3) Sellador "; if(selladorx=='1') cout<<"on"; else cout<<"off"; gotoxy(43,14); cout<<" 4) Restistencia "; if(calenturax=='1') cout<<"on"; else cout<<"off"; gotoxy(18,20); cout<<" PULSE 0 SI DESEA SALIR"<<endl<<endl; gotoxy(29,16); cout<<"Estado del puerto "; gotoxy(29,17); cout<<"de salida --> "<<salidatotal<<" "; gotoxy(50,16); cout<<calenturax<<" "<<selladorx<<" "<<dosificarx<<" "<<valvulax; gotoxy(50,17); cout<<"R S D V"; gotoxy(8,22); cout<<" Ingrese salida que desea cambiar"; cout.flush(); opc=getch(); }while(opc!='0' && opc!='1' && opc!='2' && opc!='3' && opc!='4'); gotoxy(35,21); cout<<" "; if(opc=='1') menu1(); if(opc=='2') menu2(); if(opc=='3') menu3(); if(opc=='4') menu4(); }while(opc!='0'); }//FIN void menu1() { if(valvulax=='0') valvulax='1'; else valvulax='0'; return; } void menu2() { if(dosificarx=='0') dosificarx='1'; else dosificarx='0'; return; } void menu3() { if(selladorx=='0') selladorx='1'; else selladorx='0'; return; } void menu4() { if(calenturax=='0') calenturax='1'; else calenturax='0'; return; } void puertosalidas() { salidatotal=0; int puerto; int datolec; if(valvulax=='1') salidatotal=salidatotal+1; if(dosificarx=='1') salidatotal=salidatotal+2; if(selladorx=='1') salidatotal=salidatotal+4; if(calenturax=='1') salidatotal=salidatotal+8; puerto=peek(0x40,0x8); if(salidatotal==1) outportb(puerto,0x01); if(salidatotal==2) outportb(puerto,0x02); if(salidatotal==3) outportb(puerto,0x03); if(salidatotal==4) outportb(puerto,0x04); if(salidatotal==5) outportb(puerto,0x05); if(salidatotal==6) outportb(puerto,0x06); if(salidatotal==7) outportb(puerto,0x07); if(salidatotal==8) outportb(puerto,0x08); if(salidatotal==9) outportb(puerto,0x09); if(salidatotal==10) outportb(puerto,0x0a); if(salidatotal==11) outportb(puerto,0x0b); if(salidatotal==12) outportb(puerto,0x0c); if(salidatotal==13) outportb(puerto,0x0d); if(salidatotal==14) outportb(puerto,0x0e); if(salidatotal==15) outportb(puerto,0x0f); return; } 21.9.2 PROGRAMA PARA MANEJO DE TIEMPOS CONFIGURACION DE LA MAQUINA #include<iostream.h> #include<conio.h> #include<string.h> #include<dos.h> #include<stdio.h> #include<fstream.h> #include<stdlib.h> int tiemposelle; int tiempociclo; int tiempoespera; int tiemposeguridad; int calentamiento; int contador; void cargadeinformacion(); char menuinformacion(); void puertosalidas(); void guardainfo(); void menu1(); void menu2(); void menu3(); void menu4(); char seleccionaconfiguracion(); void menu5(); void menu6(); int cambio(); void cambio1(); void menu7(); void menu8(); void mostrarlista(); void ventana(); char verificar(char codigo[70]); void seleccionconfi(int x); void eliminarconfi(int x); void main() { char card='h'; do{ cargadeinformacion(); card=menuinformacion(); }while(card!='0'); } char menuinformacion() { char opc='n'; do{ cout.flush(); clrscr(); gotoxy(15,3); cout<<" MAQUINA SAMURAY'S SOCIETY "; gotoxy(14,4); cout<<" ==========================="; gotoxy(1,6); cout<<" 1) Tiempo de selle "<<tiemposelle<<"ms"; gotoxy(30,6); cout<<" 2) Tiempo de ciclo "<<tiempociclo<<"ms"; gotoxy(1,8); cout<<" 3) Tiempo de espera "<<tiempoespera<<"ms"; gotoxy(30,8); cout<<" 4) Tiempo de seguridad "<<tiemposeguridad<<"ms"; gotoxy(1,10); cout<<" 5) Tiempo de calentamiento inicial "<<calentamiento<<"s"; gotoxy(1,12); cout<<" 6) Contador Actual "<<contador; gotoxy(1,14); cout<<" 7) Configuraciones exixtentes "; gotoxy(1,16); cout<<" 8) Guardar tiempos actuales "; gotoxy(1,8); cout<<" 3) Tiempo de espera "<<tiempoespera<<"ms"; gotoxy(30,8); cout<<" 4) Tiempo de seguridad "<<tiemposeguridad<<"ms"; gotoxy(1,10); cout<<" 5) Tiempo de calentamiento inicial "<<calentamiento<<"s"; gotoxy(1,13); cout<<" ACEPTA LA CONFIGURACION?(S/N) "; cout.flush(); contr=getch(); if(contr=='s') contr='S'; if(contr!='S') return; gotoxy(1,15); gotoxy(35,22); cout<<" PULSE 0 SI DESEA SALIR"; gotoxy(4,22); cout<<"SELECCIONE LA OPCION DESEADA"; gotoxy(1,1); cout.flush(); opc=getch(); }while(opc!='0' && opc!='8' &&opc!='7' && opc!='1' && opc!='2' && opc!='3' && opc!='4' && opc!='5' && opc!='6'); gotoxy(35,22); cout<<" "; if(opc=='1') menu1(); if(opc=='2') menu2(); if(opc=='3') menu3(); if(opc=='4') menu4(); if(opc=='5') menu5(); if(opc=='6') menu6(); if(opc=='7') menu7(); if(opc=='8') menu8(); return opc; } char verificar(char codigo[70]) { if(codigo[0]=='F') if(codigo[1]=='I') if(codigo[2]=='N') return 'F'; return 'V'; } void menu8() { char contr; int conteo; char nombre[50]; cout.flush(); clrscr(); gotoxy(15,3); cout<<" MAQUINA SAMURAY'S SOCIETY "; gotoxy(14,4); cout<<" ==========================="; gotoxy(1,6); cout<<" 1) Tiempo de selle "<<tiemposelle<<"ms"; gotoxy(30,6); cout<<" 2) Tiempo de ciclo "<<tiempociclo<<"ms"; cout<<"DE UN NOMBRE CUALQUIERA MAXIMO 20 CARACTERES Y ACEPTAR"<<endl<<endl; cout<<"SI SE ARREPINTIO PULSE SOLO ACEPTAR "<<endl<<endl; cout<<" ..."; cout.flush(); gets(nombre); if(nombre[0]=='\0') return; if(nombre[0]=='0') return; for(int de=0;de<20;de++) { if(nombre[de]==' ') nombre[de]='.'; if(nombre[de]=='\0') { for(int di=de;di<18;di++) nombre[di]='.'; } } nombre[19]='\0'; conteo=cambio(); ofstream sale; sale.open("secuens1.txt",ios::app); sale<<endl; sale<<conteo+1<<" "; sale<<nombre<<" "; sale<<tiemposelle<<" "; sale<<tiempociclo<<" "; sale<<tiempoespera<<" "; sale<<tiemposeguridad<<" "; sale<<calentamiento<<" "<<endl; sale.close(); cambio1(); cout<<" listo!!!"; cout.flush(); getch(); return; } char seleccionaconfiguracion() {char opc; do{ cout.flush(); clrscr(); gotoxy(15,3); cout<<" MAQUINA SAMURAY'S SOCIETY "; gotoxy(14,4); cout<<" ==========================="; cout<<endl<<endl; cout<<" MENU CONFIGURACIONES"<<endl<<endl; cout<<" 1.SELECCIONAR "<<endl<<endl; cout<<" 2.ELIMINAR "<<endl<<endl; cout<<" 3.MOSTRAR LISTADO "<<endl<<endl; cout<<" SELECCIONE LA OPCION DESEADA "<<endl<<endl<<endl; cout<<" USE 0 PARA SALIR "<<endl<<endl; cout.flush(); opc=getch(); }while(opc!='0' && opc!='1' && opc!='2' && opc!='3'); return opc; } void menu7() { int cnf; int casco; int sal; casco=seleccionaconfiguracion(); cout<<endl<<endl; switch(casco) { case '1': cout<<"INGRESE EL CODIGO SELECCIONADO Y ACEPTAR..."; cin>>cnf; if(cnf<1) return; seleccionconfi(cnf); break;case '2': cout<<"INGRESE EL CODIGO A ELIMINAR Y ACEPTAR..."; cin>>cnf; if(cnf<1) return; if(cnf<1) return; eliminarconfi(cnf); break;case '3': mostrarlista(); break; } return; } void seleccionconfi(int x) { ofstream salda; char se[40]; int res; res=cambio(); cambio1(); if(res<x) return; ifstream entrada; entrada.open("secuens.txt"); for(res=0;res<x;res++) { entrada>>se; entrada>>se; entrada>>tiemposelle; entrada>>tiempociclo; entrada>>tiempoespera; entrada>>tiemposeguridad; entrada>>calentamiento; } entrada.close(); salda.open("lainfo.txt"); salda<<tiemposelle<<endl; salda<<tiempociclo<<endl; salda<<tiempoespera<<endl; salda<<tiemposeguridad<<endl; salda<<calentamiento<<endl; salda<<contador<<endl; salda.close(); return; } void cambio1() { char codig[50]; char su='N'; ofstream salida; ifstream entrada; salida.open("secuens1.txt",ios::app); salida<<endl; salida<<"FIN FIN FIN FIN"; salida.close(); salida.open("secuens.txt"); entrada.open("secuens1.txt"); entrada>>codig; su=verificar(codig); while(su!='F') { salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "<<endl; entrada>>codig; su=verificar(codig); } salida.close(); entrada.close(); return; } void eliminarconfi(int x) { char codig[50]; char su; ofstream salida; int con; ifstream entrada; con=cambio(); if(con<x) return; salida.open("secuens1.txt"); entrada.open("secuens.txt"); int fdr=0; for(int we=0;we<con;we++) { if(we+1!=x) { fdr++; entrada>>codig; salida<<fdr<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "<<endl; } else { cout.flush(); clrscr(); cout<<endl<<endl<<endl; cout<<"CONFIGURACION ELIMINA"<<endl<<endl; entrada>>codig; cout<<codig<<" "; entrada>>codig; cout<<codig<<" "; entrada>>codig; entrada>>codig; entrada>>codig; entrada>>codig; entrada>>codig; } } cambio1(); salida.close(); entrada.close(); } int cambio() { char codig[50]; char su='N'; ofstream salida; int con=0; ifstream entrada; salida.open("secuens.txt",ios::app); salida<<endl; salida<<"FIN FIN FIN FIN"; salida.close(); salida.open("secuens1.txt"); entrada.open("secuens.txt"); entrada>>codig; su=verificar(codig); while(su!='F') { salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "<<endl; con++; entrada>>codig; su=verificar(codig); } salida.close(); entrada.close(); return con; } void mostrarlista() QUE { char esd; int tantos; int yr; int re; int dol; char frio[50]; ifstream entrada; tantos=cambio(); cambio1(); if(tantos==0) { cout.flush(); clrscr(); cout<<endl<<endl<<endl<<"No tiene sucuencias guardadas"; getch(); return; } entrada.open("secuens.txt"); for(re=0;re<tantos;re++) { ventana(); for(dol=0;dol<7;dol++) { entrada>>frio; gotoxy(2,8+dol*2); cout<<"= "<<frio; entrada>>frio; gotoxy(7,8+dol*2); cout<<"= "; for(int tt=0;tt<19;tt++) { if(frio[tt]=='.') cout<<" "; else cout<<frio[tt]; } entrada>>frio; gotoxy(30,8+dol*2); cout<<"= "<<frio; entrada>>frio; gotoxy(39,8+dol*2); cout<<"= "<<frio; entrada>>frio; gotoxy(49,8+dol*2); cout<<"= "<<frio; entrada>>frio; gotoxy(58,8+dol*2); cout<<"= "<<frio; entrada>>frio; gotoxy(67,8+dol*2); cout<<"= "<<frio; gotoxy(2,9+dol*2); cout<<"=================================== ====================================="; gotoxy(73,8+dol*2); cout<<"="; gotoxy(73,9+dol*2); cout<<"="; if(re+dol+1==tantos) break; } re=re+6; cout.flush(); cout<<endl<<"PULSE TECLA PARA CONTINUAR PULSE 0 PARA SALIR"; gotoxy(1,1); esd=getch(); if(esd=='0') { entrada.close(); return; } cout.flush(); clrscr(); } entrada.close(); return; } void ventana() { int x; int y; cout.flush(); clrscr(); gotoxy(15,3); cout<<" MAQUINA SAMURAY'S SOCIETY "; gotoxy(1,5); cout<<" ========================================= ==============================="; gotoxy(1,6); cout<<" = Cd = NOMBRE = SELLE = CICLO = ESPERA = SEGURI = T.C ="; gotoxy(1,7); cout<<" ========================================= ==============================="; /*for(y=7;y<23;y=y+2) {for(x=2;x<73;x++) { gotoxy(x,y); cout<<"="; }} for(x=2;x<8;x=x+5) {for(y=6;y<22;y++) {gotoxy(x,y); cout<<"="; }} for(x=31;x<69;x=x+9) {for(y=6;y<22;y++) {gotoxy(x,y); cout<<"="; }} for(y=6;y<22;y++) { gotoxy(73,y); cout<<"="; }*/ } void cargadeinformacion() { ifstream entrada; entrada.open("lainfo.txt"); entrada>>tiemposelle; entrada>>tiempociclo; entrada>>tiempoespera; entrada>>tiemposeguridad; entrada>>calentamiento; entrada.close(); entrada.open("ulticont.txt"); entrada>>contador; entrada.close(); return; } void menu1() { int dato; do{ gotoxy(4,22); cout<<"INGRESE TIEMPO DE SELLE Y ACEPTAR (milisegundos)..."; cin>>dato; if(dato<1) return; }while(dato>30000); tiemposelle=dato; if(tiemposelle>tiempociclo) tiempociclo=tiemposelle; guardainfo(); } void menu2() { int dato; do{ gotoxy(4,22); cout<<"INGRESE TIEMPO DE CICLO Y ACEPTAR (milisegundos)..."; cin>>dato; if(dato<1) return; if(dato<tiemposelle) return; }while(dato>30000); tiempociclo=dato; guardainfo(); } void menu3() { int dato; do{ gotoxy(4,22); cout<<"INGRESE TIEMPO DE ESPERA Y ACEPTAR (milisegundos)..."; cin>>dato; if(dato<1) return; }while(dato>30000); tiempoespera=dato; guardainfo(); } void menu4() { int dato; do{ gotoxy(4,22); cout<<"INGRESE TIEMPO DE SEGURIDAD Y ACEPTAR (milisegundos)..."; cin>>dato; if(dato<1) return; }while(dato>30000); tiemposeguridad=dato; guardainfo(); } void menu5() { int dato; do{ gotoxy(4,22); cout<<"INGRESE CALENTAMIENTO INICIAL Y ACEPTAR (segundos)..."; cin>>dato; if(dato<1) return; }while(dato>30000); calentamiento=dato; guardainfo(); } void menu6() { int dato; do{ gotoxy(4,22); cout<<"Ingrese la Nueva cantidad actual..."; cin>>dato; if(dato<1) return; }while(dato>30000); contador=dato; guardainfo(); } void guardainfo() { ofstream salida; salida.open("lainfo.txt"); salida<<tiemposelle<<endl; salida<<tiempociclo<<endl; salida<<tiempoespera<<endl; salida<<tiemposeguridad<<endl; salida<<calentamiento<<endl; salida.close(); salida.open("ulticont.txt"); salida<<contador; salida.close(); return; } 21.9.3 PROGRAMA PRINSIPAL CON ARREGLOS PARA UNA SIMULACION #include<iostream.h> #include<conio.h> #include<string.h> #include<dos.h> #include<stdio.h> #include<fstream.h> #include<stdlib.h> int tiemposelle; int tiempociclo; int tiempoespera; int tiemposeguridad; int calentamiento; int contador; void cargadeinformacion(); char menuinformacion(); void puertosalidas(); void guardainfo(); void menu1(); void menu2(); void menu3(); void menu4(); char seleccionaconfiguracion(); void menu5(); void menu6(); int cambio(); void cambio1(); void menu7(); void menu8(); void mostrarlista(); void ventana(); char verificar(char codigo[70]); void main() { char card='h'; do{ cargadeinformacion(); card=menuinformacion(); }while(card!='0'); } char menuinformacion() { char opc='n'; do{ cout.flush(); clrscr(); gotoxy(15,3); cout<<" MAQUINA SAMURAY'S SOCIETY "; gotoxy(14,4); cout<<" ==========================="; gotoxy(1,6); cout<<" 1) Tiempo de selle "<<tiemposelle<<"ms"; gotoxy(30,6); cout<<" 2) Tiempo de ciclo "<<tiempociclo<<"ms"; gotoxy(1,8); cout<<" 3) Tiempo de espera "<<tiempoespera<<"ms"; gotoxy(30,8); cout<<" 4) Tiempo de seguridad "<<tiemposeguridad<<"ms"; gotoxy(1,10); cout<<" 5) Tiempo de calentamiento inicial "<<calentamiento<<"s"; gotoxy(1,12); cout<<" 6) Contador Actual "<<contador; gotoxy(1,14); cout<<" 7) Cargar tiempos seleccionando de una lista "; gotoxy(1,16); cout<<" 8) Guardar tiempos actuales "; gotoxy(35,22); cout<<" PULSE 0 SI DESEA SALIR"; gotoxy(4,22); cout<<"Ingrese la opcion deseada..."; cout.flush(); opc=getch(); }while(opc!='0' && opc!='8' &&opc!='7' && opc!='1' && opc!='2' && opc!='3' && opc!='4' && opc!='5' && opc!='6'); gotoxy(35,22); cout<<" "; if(opc=='1') menu1(); if(opc=='2') menu2(); if(opc=='3') menu3(); if(opc=='4') menu4(); if(opc=='5') menu5(); if(opc=='6') menu6(); if(opc=='7') menu7(); if(opc=='8') menu8(); return opc; } char verificar(char codigo[70]) { if(codigo[0]=='F') if(codigo[1]=='I') if(codigo[2]=='N') return 'F'; return 'V'; } void menu8() { char contr; int conteo; char nombre[50]; cout.flush(); clrscr(); gotoxy(15,3); cout<<" MAQUINA SAMURAY'S SOCIETY "; gotoxy(14,4); cout<<" ==========================="; gotoxy(1,6); cout<<" 1) Tiempo de selle "<<tiemposelle<<"ms"; gotoxy(30,6); cout<<" 2) Tiempo de ciclo "<<tiempociclo<<"ms"; gotoxy(1,8); cout<<" 3) Tiempo de espera "<<tiempoespera<<"ms"; gotoxy(30,8); cout<<" 4) Tiempo de seguridad "<<tiemposeguridad<<"ms"; gotoxy(1,10); cout<<" 5) Tiempo de calentamiento inicial "<<calentamiento<<"s"; gotoxy(1,13); cout<<" ACEPTA LA CONFIGURACION?(S/N) "; cout.flush(); contr=getch(); if(contr=='s') contr='S'; if(contr!='S') return; gotoxy(1,16); cout<<"Ingrese un corto nombre para la nueva configuracion (maximo 20 caracteres)"<<endl; cout<<"(Para salir pulse 0 y aceptar) "<<endl<<endl; cout<<" ..."; cout.flush(); gets(nombre); conteo=cambio(); ofstream sale; sale.open("secuens1.txt",ios::app); sale<<endl; sale<<conteo+1<<" "; sale<<nombre<<" "; sale<<tiemposelle<<" "; sale<<tiempociclo<<" "; sale<<tiempoespera<<" "; sale<<tiemposeguridad<<" "; sale<<calentamiento<<" "<<endl; sale.close(); cambio1(); cout<<" listo!!!"; cout.flush(); getch(); return; } char seleccionaconfiguracion() { char opc; do{ cout<<" MENU CONFIGURACIONES"; cout<<" "; cout<<" 1.SELECCIONAR "<<endl<<endl; cout<<" 2.ELIMINAR "<<endl<<endl; cout<<" 3.MOSTRAR LISTADO "<<endl<<endl; cout<<" SELECCIONE LA OPCION DESEADA "; cout.flush(); opc=getch(); }while(opc!='0' && opc!='1' && opc!='2' && opc!='3'); return opc; } void menu7() { int casco; int sal; sal=cambio(); cambio1(); casco=seleccionaconfiguracion(); switch(casco) { case '1': // seleccionarconfi(); break;case '2': // eliminarconfi(); break;case '3': mostrarlista(); break; } return; } void cambio1() { char codig[50]; char su='N'; ofstream salida; ifstream entrada; salida.open("secuens1.txt",ios::app); salida<<endl; salida<<"FIN FIN FIN FIN"; salida.close(); salida.open("secuens.txt"); entrada.open("secuens1.txt"); entrada>>codig; su=verificar(codig); while(su!='F') { salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; su=verificar(codig); } salida.close(); entrada.close(); return; } int cambio() { char codig[50]; char su='N'; ofstream salida; int con=0; ifstream entrada; salida.open("secuens.txt",ios::app); salida<<endl; salida<<"FIN FIN FIN FIN"; salida.close(); salida.open("secuens1.txt"); entrada.open("secuens.txt"); entrada>>codig; su=verificar(codig); while(su!='F') { salida<<codig<<" "; entrada>>frio; gotoxy(67,8+dol*2); cout<<"= "<<frio; gotoxy(2,9+dol*2); cout<<"=================================== ====================================="; gotoxy(73,8+dol*2); cout<<"="; gotoxy(73,9+dol*2); cout<<"="; if(re==tantos) break; re++; } cout.flush(); cout<<endl<<"Pulse tecla para ver mas o 0 para salir"; esd=getch(); if(esd=='0') { entrada.close(); return; } cout.flush(); clrscr(); } entrada.close(); return; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; entrada>>codig; salida<<codig<<" "; con++; entrada>>codig; su=verificar(codig); } salida.close(); entrada.close(); return con; } void mostrarlista() { char esd; int tantos; int yr; int re; int dol; char frio[50]; ifstream entrada; tantos=cambio(); cambio1(); if(tantos==0) { cout.flush(); clrscr(); cout<<endl<<endl<<endl<<"No guardadas"; getch(); return; } entrada.open("secuens.txt"); for(re=0;re<tantos;re++) { ventana(); for(dol=0;dol<7;dol++) { entrada>>frio; gotoxy(2,8+dol*2); cout<<"= "<<frio; entrada>>frio; gotoxy(7,8+dol*2); cout<<"= "<<frio; entrada>>frio; gotoxy(30,8+dol*2); cout<<"= "<<frio; entrada>>frio; gotoxy(39,8+dol*2); cout<<"= "<<frio; entrada>>frio; gotoxy(49,8+dol*2); cout<<"= "<<frio; entrada>>frio; gotoxy(58,8+dol*2); cout<<"= "<<frio; } void ventana() { int x; int y; cout.flush(); clrscr(); gotoxy(15,3); cout<<" MAQUINA SAMURAY'S SOCIETY "; tiene sucuencias gotoxy(1,5); cout<<" ========================================= ==============================="; gotoxy(1,6); cout<<" = Cd = NOMBRE = SELLE = CICLO = ESPERA = SEGURI = T.C ="; gotoxy(1,7); cout<<" ========================================= ==============================="; /*for(y=7;y<23;y=y+2) {for(x=2;x<73;x++) { gotoxy(x,y); cout<<"="; }} for(x=2;x<8;x=x+5) {for(y=6;y<22;y++) {gotoxy(x,y); cout<<"="; }} for(x=31;x<69;x=x+9) {for(y=6;y<22;y++) {gotoxy(x,y); cout<<"="; }} for(y=6;y<22;y++) { gotoxy(73,y); cout<<"="; }*/ } void cargadeinformacion() { ifstream entrada; entrada.open("lainfo.txt"); entrada>>tiemposelle; entrada>>tiempociclo; entrada>>tiempoespera; entrada>>tiemposeguridad; entrada>>calentamiento; entrada.close(); entrada.open("ulticont.txt"); entrada>>contador; entrada.close(); return; } void menu1() { int dato; do{ gotoxy(4,22); cout<<"Ingrese el Tiempo de selle (milisegundos)..."; cin>>dato; if(dato<1) return; }while(dato>30000); tiemposelle=dato; if(tiemposelle>tiempociclo) tiempociclo=tiemposelle; guardainfo(); } void menu2() { int dato; do{ gotoxy(4,22); cout<<"Ingrese el Tiempo de ciclo (milisegundos)..."; cin>>dato; if(dato<1) return; if(dato<tiemposelle) return; }while(dato>30000); tiempociclo=dato; guardainfo(); } void menu3() { int dato; do{ gotoxy(4,22); cout<<"Ingrese el (milisegundos)..."; cin>>dato; if(dato<1) return; }while(dato>30000); tiempoespera=dato; guardainfo(); } void menu4() Tiempo de espera { int dato; do{ gotoxy(4,22); cout<<"Ingrese el Tiempo de seguridad (milisegundos)..."; cin>>dato; if(dato<1) return; }while(dato>30000); tiemposeguridad=dato; guardainfo(); } void menu5() { int dato; do{ gotoxy(4,22); cout<<"Ingrese el Tiempo de calentamiento inicial (segundos)..."; cin>>dato; if(dato<1) return; }while(dato>30000); calentamiento=dato; guardainfo(); } void menu6() { int dato; do{ gotoxy(4,22); cout<<"Ingrese la Nueva cantidad actual..."; cin>>dato; if(dato<1) return; }while(dato>30000); contador=dato; guardainfo(); } void guardainfo() { ofstream salida; salida.open("lainfo.txt"); salida<<tiemposelle<<endl; salida<<tiempociclo<<endl; salida<<tiempoespera<<endl; salida<<tiemposeguridad<<endl; salida<<calentamiento<<endl; salida.close(); salida.open("ulticont.txt"); salida<<contador; salida.close(); return; } 21.10 MANUAL DE TRABAJO PARA SOFTWARE DE INVENTARIOS Y FACTURACION NOTA: LOS PROGRAMAS TRABAJAN EN LETRAS MAYUSCULAS ESTO ES CON EL FIN DE SIMPLIFICAR CUESTIONES IMPRACTICAS DE PROGRAMACION. 21.10.1 PROGRAMA ACTUALIZACIONES, NUEVOS PRODUCTOS, ELIMINACION DE PRODUCTOS. Este programa es indispensable ya que por medio de el se permite al usuario ingresar productos nuevos, actualizar datos y eliminar productos. La interfase al usuario será la siguiente. Al ejecutar este programa el usuario encuentra que la ventana solicita clave de 4 dígitos. El programa da la posibilidad que 2 claves distintas puedan acceder a este programa en especial. En las opciones avanzadas cada una de las claves puede cambiarse pero solo con la clave correspondiente. Menú principal que le da 4 opciones y una opción (0) que le sirve para salir del programa con solo presionarlo. 21.10.1.1 INGRESAR NUEVOS PRODUCTOS La primera opción le brinda la posibilidad de actualizar datos. Esta opción la veremos mas adelante para que primero ingresemos nuestros productos y ahí si los podemos actualizar. La opción 2 nos da la posibilidad de ingresar los nuevos productos. Lo primero que nos pide es el código en lo que tenemos en cuenta 3 cosas básicamente recordando que el software trabaja con letras mayúsculas. El código es de 7 dígitos de letras y números, es decir que no acepta otro tipo de caracteres. El primer digito debe ser una letra. Los demás programas del software total hacen filtros de búsqueda con el código, es decir que para realizar una consulta buscara por los tres primeros dígitos del código más no del nombre. Se recomienda que el usuario trate de codificar con las tres primeras letras del nombre y luego a su gusto coloque letras y números. Los datos que sean ingresados erróneamente el software los detecta, le informa y retorna para que pueda rectificar el error Error por primer digito debe ser letra Código con número de dígitos menor que 7. Si ingresa un código de más de 7 dígitos el programa toma los 7 primeros. Cuando se ingresa un código ya existente el programa indica y no lo deja continuar. Al ingresar un nuevo producto lo ordena automáticamente en orden de lista. Así que lo ubica en la posición que le corresponde al código ingresado. Al ingresar de forma correcta el código ingresa el nombre de máximo 50 caracteres. Luego de ingresar el nombre y pulsar enter nos pide el precio mayor es decir que nos pedirá un precio menor (2 precios). Debemos considerar las posibilidades: Si el producto ingresado es para vender ósea producido en la empresa podrá manejar precio detal y mayorista. Si el caso es de un producto que es materia prima puede manejar solo un precio es decir marque el mismo valor en ambos precios. El software genera error y le deja continuar corrigiéndolo primero. Al ingresar los precios adecuadamente se nos pide ubicación. Esta ubicación es considerada global ya que veremos mas adelante que el sistema de inventarios permitirá tener un mismo producto en sitios diferentes y podrá encontrarlos con facilidad. Por lo que esta ubicación es de modo más global. Puede no utilizarla y simplemente dar enter, el programa asigna una ubicación “a1” por defecto. Esta ubicación es un código de 2 caracteres. El programa le muestra el nuevo producto y le pregunta si lo acepta y le pide confirmación de modo que tiene 2 opciones para arrepentirse. El programa le indica que el producto ya fue ingresado. Al pulsar una tecla retornaremos al programa principal 21.10.1.2 ACTUALIZAR PRODUCTO La actualización de producto es la opción 1 en la pantalla principal El sistema le pide el código que debe ingresarlo completo. Ahora nos da las tres opciones de cambiar nombre, precios y ubicación. Si desea cambiar el código no lo puede hacer para tal caso debe eliminar el producto y luego ingresarlo de nuevo con el mismo código. Luego de ingresados los datos de actualización puede salir con 0 21.10.1.3 ELIMINAR PRODUCTO La ventana le muestra que esta la opción de eliminar y le pide el código el cual debe ingresar completo Luego ingresar el código el programa le mostrara el producto seleccionado e inmediatamente le pedirá confirmar 2 veces dando opción al arrepentimiento. 21.10.1.4 OPCIONES AVANZADAS 21.10.1.4.1 CAMBIO DE CLAVES Le pide la clave actual Luego le muestra su clave y pide la nueva clave deseada Ingresa la clave El programa pide confirmación y muestra que la clave fue aceptada 21.10.1.4.2 RECUPERACION POR FALLOS La opción 3 nos da información de mantenimiento en caso de fallos por un corto o que se vaya la luz durante un proceso. Esta opción solo puede aplicarse si el programa por si mismo reconoce el problema. Si pulsa la opción 3 y el sistema no encuentra errores indica que el programa esta bien. En el caso de fallos el programa indicara desde un principio que el archivo de información de los productos esta errado. El programa le impide que usted seleccione otra opción diferente a la recomendada. En la opción se pedirá la clave de nuevo e inmediatamente se recupera el sistema en el punto exacto en donde fallo. Es decir que si se realizaron cambios corresponde que únicamente el ultimo cambio pudo perderse, de resto todo es guardado inmediatamente se hace un arreglo. Ya puede trabajar normalmente. Es importante tener en cuenta que hay 2 archivos de datos el que maneja los productos como tal y otro en el que se manejan los inventarios. Este programa recupera del archivo principal. El archivo de inventarios tiene otra forma de recuperación que será vista mas adelante. 21.10.1.4.3 GUARDAR LA INFORMACION La opción 4 da la opción de guardar la información en un disquete para hacer esta operación pedirá la clave de nuevo Pedirá el disquete para luego proceder a guardar. 21.10.2 CAMBIO DE FECHA Para efectos de información que se almacena el usuario puede modificar la fecha del día a su acomodo. Esta fecha se vera reflejada en los programas de facturación/consultas e inventarios. El programa le muestra la fecha actual y pide la confirmación de que desea cambiarla, a esto se da “S” luego le pedirá la nueva fecha la cual debe darse de la forma dd/mm/aa. Da enter y listo. 21.10.3 FACTURACION/CONSULTAS Programa de consulta y facturación 21.10.3.1 CONSULTAS Con los tres primeros dígitos del código se realiza la búsqueda. En este ejemplo se ha codificado los jugos con un código en el que los primero tres códigos son las letras JUG. Luego pulsa enter para realizar la búsqueda. El programa arroja una pantallas con los primeros 10 productos en orden de lista que el código en sus 3 primeras letras es el ingresado. En esta pantalla usted puede ver la información de nombre y ubicación general, debajo del nombre encuentra los 2 precios sugeridos. En el caso de ser un producto de materia prima aparecerán los mismos valores en las dos casillas. Además de los precios mayor y menor se observa un número asignado 0-9 para seleccionarlo. Para observar la cantidad que existe actualmente en inventario (ingresada al sistema) debe seleccionar el número correspondiente al producto con el teclado numérico en las opciones del 0-9. Al seleccionar el producto inmediatamente el software realiza la sumatoria de todo lo que se encuentre en stock con ese código. Pulse 0 para salir. Si el producto buscado no esta en estos primero 10 códigos presione enter para ver los siguientes productos. (Muestra en grupo de 10 o menos) El programa da otra opción ‘+’ que es para salir de la búsqueda inmediatamente. ENTER 21.10.3.2 FACTURACION En este programa solo es posible realizar facturas de venta. Veremos mas adelante que para realizar las facturas de compras se utilizara el programa de ingresos a inventario. Nuevamente realizamos la búsqueda del producto ingresando los 3 primeros dígitos del código, buscamos el articulo deseado en el listado de pantalla seleccionándolo con las opciones 0 al 9, si el articulo no aparece en la lista da enter para un siguiente listado y así sucesivamente hasta encontrarlo y poderlo seleccionar. Al seleccionar el producto el software nos muestra código, nombre, precio mayor y cantidad real en existencia, y nos pregunta la cantidad a vender a lo que se ingresa la cantidad luego pregunta precio unitario. El programa se encuentra restringido y no deja que ingresemos un precio un 20% más barato que el precio menor. Luego de ingresados los datos damos enter y el nos muestra lo que ingresamos y nos habla de un descuento. Este descuento es función del precio mayor (precio en pantalla) en relación al precio vendido. De igual manera puede meter más productos hasta un máximo de 25 por factura. La factura que se va realizando nos muestra un descuento, este descuento es de la factura en totalizada es decir que encuentra la cuenta correspondiente a si se factura con el precio mayor y calcula el descuento según el valor real de factura. La realización de la factura permite borrar el “ultimo producto” con la opción BORRAR Nos permite eliminar con la opción ELIMINAR Al dar eliminar el programa nos muestra un pantallaso de códigos y nombres y nos pide ingresar el código a eliminar. Inmediatamente eliminara todos los ítems que encuentre con el código ingresado. La opción NUEVA le permitirá borrar todos los productos para iniciar una nueva factura Al tener una factura realizada puede imprimir su factura para lo que debe implementar un data switch si va a utilizar el puerto paralelo para otra tarea de modo que pueda trabajar la impresora. Posee tres opciones de impresión FACTURA, COTIZA Y REMISION La opción FACTURA se utiliza para realizar su factura con IVA. Cabe recordar que el programa discrimina el IVA es decir el precio de cada producto debe tener ya el IVA incluido. La opción cotización (COTIZA) da la opción de imprimir con precios y total pero no discrimina IVA. La opción remisión imprime los productos y sus cantidades sin precio. Cualquiera sea la opción seleccionada se da la opción de ingresar datos adicionales como nombre, NIT o dirección para lo cual se asignan 2 casillas de impresión. Cabe resaltar que cualquiera fuese el caso el software pude ser adaptado para imprimir en hoja especial, variando unas pequeñas cosas en el programa fuente. Mas sin embargo la impresión posee un formato referente a una factura existente en la actualidad como muestra. Luego de ingresar estos datos alista la impresora, pulsa enter y se realiza la impresión. Otra opción es PEDIDO esta opción se utiliza para solicitar al inventario que descargue los productos facturados, lo que en el caso de cotizaciones y remisiones no será necesario. Al ingresar esta opción el programa guarda en un archivo los productos así que usted puede realizar varias facturas realizando PEDIDO en cada una de ellas y todos los productos son almacenados en archivo para después ser descargados. El programa le avisa que ya los productos fueron ingresados a archivo. 21.10.4 INGRESAR DATOS A INVENTARIOS El programa titula NUEVO/COMPRAS por razón a que podemos ingresar 2 tipos de productos. Inventario de materia prima e inventario de producto para la venta. Puede manejar el software para ingresar ambos tipos de artículos. Entonces debemos realizar una factura de la misma forma como lo hicimos en el programa de facturación. Tenemos las opciones de NUEVA, BORRAR Y ELIMINAR de igual forma. Excepto que no permite impresión alguna. Tiene una opción adicional FECHA con la cual puede cambiar la fecha del ingreso. Esta fecha es independiente a la fecha del programa total ya que en registro almacenamos lo realizado con la fecha general pero el ingreso puede tener otra fecha distinta. Esto con el fin de dar flexibilidad en operaciones de contabilidad interna de la empresa. El programa nos pide la fecha que damos de la forma dd/mm/aa e inmediatamente cambia Al realizar la factura de ingreso en cada artículo nos pide los datos de (caja) ubicación real para lo que tenemos un espacio que debe ser numérico y de no más de 4 cifras es decir que de esta manera podemos tener un mismo producto en 2 sitios o cajas diferentes. Luego nos pide la cantidad. El software permite ubicar un mismo tipo de producto en sitios y cantidades diferentes. Nos da la opción de poner detalles que pueden ser color, algo de recordar, vencimiento. Estos datos adicionales son de tipo alfanumérico y tiene la posibilidad de dar un detalle de hasta 20 caracteres. Es así que un mismo producto puede tener fechas de vencimiento diferentes. Por esta misma razón se separan los archivos de producto como los de inventario real. De esta forma hacemos un listado de lo que vamos a ingresar a inventarios. Luego que ya esta listo la lista de ingreso realizamos el ingreso con la palabra INGRESO Al dar INGRESO y enter el programa muestra el listado y pide confirmación para lo cual escribimos FINALIZAR. Si nos arrepentimos o nos equivocamos volvemos con 0 y enter. El programa indica que ya hubo el ingreso para lo que nos da tiempo de revisar. Para realizar un nuevo ingreso escribimos NUEVO e inmediatamente quedamos en una nueva factura de entrada a inventario. Si no da la palabra nuevo cada vez que ingrese al programa le dará la indicación de modo que puede estar tranquilo. No falla. 21.10.5 INVENTARIO El programa de inventario le va a permitir realizar consultas y descargas del archivo que guarda el inventario de producción y materia prima. De igual forma que en el programa de consultas el programa permite la consulta rápida y general. Con las 3 primeras letras consulto los productos en los que su código comienza con estas 3 primeras. Me muestra todos los productos que comienzan con las letras y que se encuentran en inventarios. Es decir que solo la mercancía que existe en inventario es mostrada. Así mismo como en el programa de consultas y facturación para realizar una salida de producto selecciono la opción deseada 0-9. Igualmente el programa visualiza en grupos de a 10 ítems, si no encuentro el buscado en el listado con enter voy a los siguientes 10 y así sucesivamente. Recuerde que en esta ocasión lo que voy es a descargar de stocks la mercancía. Si busca un producto específicamente debe ingresar el código de 7 dígitos y el software le muestra solo el producto seleccionado y sus ubicaciones correspondientes. Recuerde que el programa nos da la posibilidad de varias ubicaciones para un mismo producto. Inmediatamente ya podemos seleccionar un ítem para descargar lo necesario. Al seleccionar el producto el programa nos pide la cantidad a descargar y la prioridad, esta opción de prioridad radica en que lo descargado se imprime si usted lo desea con el fin de manejar bodega, ósea que nos puede el programa imprimir la regencia del producto, la caja o ubicación de la cual se saca y la prioridad que tiene la salida del producto. Este programa es muy práctico para manejar bodega. Para datos erróneos como sacar una cantidad mayor el software reconoce el error. De igual manera al sacar todos los productos de un ítem el programa borra la referencia de base de datos con el fin de optimizar el espacio en memoria. Otro tipo de consulta que el software permite es por la caja o lugar de ubicación así que pulsamos cajas y buscamos el lugar deseado de búsqueda. Así que buscamos los productos y cantidades que se encuentren en un lugar específico. Podemos encontrar diferentes productos en una misma ubicación. La opción PEDIR y PEDIDO sirven para la descarga de los productos que se hallan en lista. Es decir en el programa de facturación hicimos la referencia a este ítem. Usted puede con PEDIR realizar la descarga de los productos que se encuentren actualmente en la factura realizada. La instrucción PEDIDO se utiliza para la descarga de los productos que usted ha ido acumulando en listado para la descarga. El programa automáticamente busca los productos y permite que usted seleccione la ubicación y condiciones de detalles con las que quiere descargar los productos dando la opción de selección con enter. Para buscar siguiente producto con “+”. El programa visualiza la mercancía que se va sacando así que para efectos de practicidad usted puede borrar los productos en pantalla con la palabra TERMINAR. Este referencia en un archivo los productos sacados con el fin de que el usuario tenga un reporte de lo que se a descargado de los inventarios. Para acceder a este archivo se genera un acceso directo al archivo de modo que pueda ser consultado. El programa permite el arrepentimiento asi que pide confirmación de la operación. Para dejar referencia le pide una clave. Estas claves se asignan en el archivo “mipais” por referirse a mi paisano. Entonces el usuario da el dato de cuantos pueden sacar y asigna claves de 4 dígitos. El usuario que saca productos ingresa el código pero la referencia en archivo es por medio del nombre asignado. La referencia especifica un numero este numero sirve para recuperar archivo. Así que en el momento de una falla podemos recuperar los datos a fin de que no se pierda la información. Cada vez que se da un terminar el programa guarda una protección en un archivo de reserva. Si desea ver el procedimiento remítase al código fuente en su parte de opción terminar. •Por ultimo tenemos la opción de GUARDAR por medio de la cual podemos guardar la información en un disquete simplemente se da la opción y el programa guarda en disquete. El programa le pide ingresar el disquete para guardar en disquete. Puede usted arrepentirse pulsando 0 para salir. NOTA: el programa de inventarios permite imprimir uno a uno cada producto que se va descargando. Para proceder solo debemos referirnos al archivo con el nombre imprimir en el que se encuentra un BIT de control el cual puede ser 1 o 0 así que si esta en 0 no imprime y si lo pone en 1 imprime. Esta opción es clave en el caso que se maneje la bodega por aparte así que los pedidos para descargar mercancía pueden reverenciarse en papel en donde se especifica la ubicación, los detalles y la prioridad que tiene el producto para ser físicamente sacado de stocks. 21.10.6 RECUPERACION DE INVENTARIOS El programa es un ejecutable exclusivo para la tarea propuesta que consiste en recuperar los datos que se encuentran en inventarios. Esto en caso que se hayan perdido por errores ajenos al software como por ejemplo que la luz se vaya en laguna parte de transferencia de información entre archivos. Para este caso es posible recuperar la información. Al ejecutar nuestro programa el software pide confirmación ya que el lleva una referencia interna de tal modo que utiliza archivos de backup que todo el tiempo están listos para dichas recuperaciones que como veíamos anteriormente puede hacerse también con los listados de productos ya explicados en la sección 12.1. Para este caso nos pedirá doble confirmación y que ingresemos nombre, detalles y hora para dejar una referencia Al aceptar la operación nos muestra un mensaje que nos recuerda que si se realizaba una descarga en el momento del daño debemos realizarla de nuevo. 21.10.7 LISTADO GENERAL El programa genera un listado general buscando en cada código la existencia actual real en inventario de modo que nos da la información de precios y cantidades actuales en sistema. Nos muestra el código, nombre, precio mayor y menor y la sumatoria de cantidad en inventarios del código correspondiente. NOTA: Para el caso que se trabaje en Windows 95 es bueno a la hora de la instalación utilizar accesos directos a los programas con un nombre más representativo del programa a trabajar. Así mismo lo archivos bien sean tipo .TXT o .DAT que contienen información como el listado general, o el reporte de salidas de inventarios también con su acceso directo de modo que el usuario no pueda equivocarse a la hora de manipular y pueda cometer errores borrando información del sistema o manipulando archivos que no corresponde. Para el caso en que se trabaja en puro D.O.S los programas ejecutables tienen un nombre específico que máximo abarca 8 caracteres y de igual forma los archivos donde se guarda la información los cuales podrán ser visto o utilizados con el comando EDIT del D.O.S dando la instrucción “c:\>edit nombre.txt”. 21.10.8 CODIGO FUENTE DEL SOFTWARE SISTEMA DE INFORMACION Manejo de inventarios //imprimir,ndato,salidas,datos #include<fstream.h> #include<iostream.h> #include<conio.h> #include<string.h> #include<dos.h> #include<stdio.h> void cajitas(); void cambilis1v(); void cambilis2v(); void cambilis1(); void cambilviz1(); void cambilviz2(); int pati; char primid; int visual[20]; void camb(); void cambio(); char nombre[6]; void cambilis(); char camino(char a); char codigo1[10][60]; char detalles1[10][50]; int cantidad1[10]; int caja1[10]; void visualiza(); void sale(int cont); void patis(); char verify(char name[15]); char sd; int sped,sd1; char verificar(char codigo[70]); char codigo[60]; char detalles[50]; char facata[15]; int cantidad; int caja; void siguiente(char desido); void pedidout(char desido); char desido; void main() { primid='x'; desido='0'; char odis1[70]; int odis2; char odi='N'; char odi3; ifstream vizin; int vizint; int vip; char su; int cont=0; int re=0; su='N'; char q1q='y'; char papel='0'; char codi[10]; int pas=0; char codisa[10]; char odis[60]; codi[0]='1'; fstream cou; ifstream entrada; ofstream salida; ifstream entrada1; ofstream salida1; ifstream entrada7; ofstream salida7; ofstream salida2; int canto,sa,tu; char claus,pip; vizin.open("imprimir.txt"); vizin>>primid; vizin.close(); vizin.open("vizcaino.txt"); vizin>>vizint; vizin.close(); if(vizint<2) return; if(vizint>9) return; if(vizint==5) cambilis(); do{ sped=0; pip='0'; papel='0'; canto=0; sd1=10; cont=0; re=0; char paso[70]; su='N'; codi[0]='1'; cout.flush(); clrscr(); entrada1.open("fecha.txt"); entrada1>>facata; entrada1.close(); salida1.open("salida1.txt",ios::app); salida1<<endl; salida1<<"FIN FIN FIN FIN"; salida1.close(); entrada1.open("salida1.txt"); salida1.open("salida2.txt"); entrada1>>paso; su=verificar(paso); cout<<"Fecha:"<<facata<<" INVENTARIOS CANTIDAD CAJA "<<endl<<endl; while(su!='F') { salida1<<paso<<" "; cout<<paso<<" "; entrada1>>vip; salida1<<vip<<" "; cout<<vip<<" "; if(vip<10) cout<<" "; if(vip<100) cout<<" "; entrada1>>vip; salida1<<vip<<" "; cout<<vip<<" "<<endl<<"Detalles..."; visual[sped]=vip; sped++; entrada1>>paso; salida1<<paso<<" "<<endl; cout<<paso<<" "<<endl; entrada1>>paso; su=verificar(paso); } salida1<<paso; salida1.close(); entrada1.close(); camb(); cout<<endl; cout<<" INGRESE EL PRODUCTO.(PEDIR/PEDIDO/CAJAS/TERMINAR/GU ARDAR/0 SALIR).."; if(desido=='0') { cout.flush(); gets(codisa); } if(desido!='0') { cout<<endl<<endl; if(desido=='1') salida7.open("pedidop.txt",ios::app); if(desido=='2') salida7.open("pedido1.txt",ios::app); if(desido=='3') salida7.open("a:pedido3.txt",ios::app); salida7<<endl; salida7<<"FIN "; salida7<<"FIN "; salida7.close(); if(desido=='1') entrada7.open("pedidop.txt"); if(desido=='2') entrada7.open("pedido1.txt"); if(desido=='3') entrada7.open("a:pedido3.txt"); entrada7>>odis1; entrada7>>odis2; entrada7.close(); odi=verificar(odis1); if(odi=='F') { cout<<"EL PEDIDO"<<desido<<" YA NO TIENE MAS PRODUCTOS...(tecla para continuar)"; codisa[0]='M'; codisa[1]='M'; codisa[2]='M'; codisa[3]='M'; cout.flush(); getch(); pedidout(desido); desido='0'; } if(odi!='F') { codisa[0]=odis1[0]; codisa[1]=odis1[1]; codisa[2]=odis1[2]; codisa[3]=odis1[3]; codisa[4]=odis1[4]; codisa[5]=odis1[5]; codisa[6]=odis1[6]; codisa[7]='\0'; cout<<odis1<<" cantidad..."<<odis2<<endl<<endl; cout<<"seleccione la opcion (aceptar enter / + siguiente / 0 salir..."; cout.flush(); odi3=getch(); if(odi3=='+') { siguiente(desido); codisa[0]='M'; codisa[1]='M'; codisa[2]='M'; codisa[3]='M'; } if(odi3=='0') { pedidout(desido); codisa[0]='M'; codisa[1]='M'; codisa[2]='M'; codisa[3]='M'; desido='0'; } } if(desido!='0') pedidout(desido); } for(pas=0;pas<9;pas++) codi[pas]=codisa[pas]; codi[9]='\0'; if(codi[0]=='0') return; //if(codi[0]=='\0') //visualiza(); if(codi[0]=='C') if(codi[1]=='A') if(codi[2]=='J') if(codi[3]=='A') if(codi[4]=='S') patis(); if(codi[0]=='T') if(codi[1]=='E') if(codi[2]=='R') if(codi[3]=='M') if(codi[4]=='I') if(codi[5]=='N') if(codi[6]=='A') pip=camino('1'); if(codi[0]=='G') if(codi[1]=='U') if(codi[2]=='A') if(codi[3]=='R') if(codi[4]=='D') if(codi[5]=='A') if(codi[6]=='R') cajitas(); if(pip!='0') return; if(codi[0]=='P') if(codi[1]=='E') if(codi[2]=='D') if(codi[3]=='I') if(codi[4]=='D') if(codi[5]=='O') { desido='1'; } if(codi[0]=='P') if(codi[1]=='E') if(codi[2]=='D') if(codi[3]=='I') if(codi[4]=='R') { desido='2'; } salida.open("datos.txt",ios::app); salida<<endl; salida<<"FIN FIN FIN FIN "; salida.close(); su='N'; entrada.open("datos.txt"); salida.open("datos1.txt"); cout.flush(); clrscr(); cout<<" PRODUCTO CANTIDAD CAJA "<<endl<<endl; while(su!='F') { claus='0'; entrada>>codigo; su=verificar(codigo); if(su=='F') goto fin; entrada>>cantidad; entrada>>caja; entrada>>detalles; if(papel!='1') if(codigo[0]==codi[0]) if(codigo[1]==codi[1]) if(codigo[2]==codi[2]) if(codi[3]=='\0') goto accion; if(codigo[0]==codi[0]) if(codigo[1]==codi[1]) if(codigo[2]==codi[2]) if(codigo[3]==codi[3]) if(codigo[4]==codi[4]) if(codigo[5]==codi[5]) if(codigo[6]==codi[6]) { accion: for(tu=0;tu<60;tu++) codigo1[cont][tu]=codigo[tu]; cout<<cont<<" "<<codigo<<" "; cout<<cantidad<<" "; if(cantidad<1000) cout<<" "; if(cantidad<100) cout<<" "; if(cantidad<10) cout<<" "; cout<<caja<<" "<<endl; caja1[cont]=caja; cantidad1[cont]=cantidad; cout<<" Detalles..."<<detalles<<endl; for(tu=0;tu<50;tu++) detalles1[cont][tu]=detalles[tu]; cont++; claus=1; if(cont==10) { cout<<"Seleccione las opcion deseada.(mas productos presione tecla)..."; cout.flush(); sd=getch(); cambio(); if(sd1<10) { cout.flush(); clrscr(); cout<<" PRODUCTO CANTIDAD CAJA "<<endl<<endl; cout<<sd1<<" "; for(sa=0;sa<58;sa++) cout<<codigo1[sd1][sa]; cout<<cantidad1[sd1]<<" "; if(cantidad1[sd1]<1000) cout<<" "; if(cantidad1[sd1]<100) cout<<" "; if(cantidad1[sd1]<10) cout<<" "; cout<<caja1[sd1]<<" "<<endl<<endl; cout<<"Detalles..."; for(sa=0;sa<50;sa++) { cout<<detalles1[sd1][sa]; if(detalles1[sd1][sa]=='\0') break; } cout<<endl<<endl; cout<<"Ingrese la cantidad..."; cin>>canto; if(canto<1) canto=0; if(canto>cantidad1[sd1]) { cout<<"NO PUEDE SACAR MAS DE LO QUE HAY..."; canto=0; getch(); } cantidad1[sd1]=cantidad1[sd1]-canto; papel='1'; if(canto>=1) { cout<<endl<<endl; cout<<"Seleccione prioridad 1.ALTA"<<endl; cout<<" 2.MEDIA"<<endl; cout<<" 3.BAJA o cualquier tecla..."; cout.flush(); q1q=getch(); salida2.open("salida1.txt",ios::app); for(sa=0;sa<60;sa++) salida2<<codigo1[sd1][sa]; salida2<<" "<<canto<<" "; salida2<<caja1[sd1]<<" "; for(sa=0;sa<50;sa++) salida2<<detalles1[sd1][sa]; salida2<<endl; salida2.close(); salida1.open("salidas.txt",ios::app); for(sa=0;sa<60;sa++) salida1<<codigo1[sd1][sa]; salida1<<" "<<canto<<" "; salida1<<caja1[sd1]<<" "; for(sa=0;sa<50;sa++) { salida1<<detalles1[sd1][sa]; if(detalles1[sd1][sa]=='\0') break; } salida1<<endl; salida1.close(); if(primid=='1') { cou.open("LPT1",ios::out); cou<<endl; if(q1q=='1') cou<<"!!!Alta "; if(q1q=='2') cou<<"media "; for(sa=0;sa<40;sa++) cou<<codigo1[sd1][sa]; cou<<" "<<canto<<" "; cou<<caja1[sd1]<<" "; if(detalles1[sd1][0]!='?') for(sa=0;sa<50;sa++) cou<<detalles1[sd1][sa]; cou<<endl; cou.close(); } codi[0]='M'; codi[1]='M'; codi[2]='M'; codi[3]='M'; } } for(re=0;re<cont;re++) { for(sa=0;sa<60;sa++) { salida<<codigo1[re][sa]; if(codigo1[re][sa]=='\0') break; } salida<<" "<<cantidad1[re]<<" "; salida<<caja1[re]<<" "; for(sa=0;sa<50;sa++) { salida<<detalles1[re][sa]; if(detalles1[re][sa]=='\0') break; } salida<<endl; } cont=0; cout.flush(); clrscr(); cout<<" PRODUCTO CANTIDAD CAJA "<<endl<<endl; } } if(claus=='0') { salida<<codigo<<" "; salida<<cantidad<<" "; salida<<caja<<" "; salida<<detalles<<endl; } } fin: if(cont!=0) { cout<<"Seleccione las opcion deseada.(mas productos presione tecla)..."; cout.flush(); sd=getch(); cambio(); if(sd1<cont) { cout.flush(); clrscr(); cout<<" PRODUCTO CANTIDAD CAJA "<<endl<<endl; cout<<sd1<<" "; for(sa=0;sa<58;sa++) cout<<codigo1[sd1][sa]; cout<<cantidad1[sd1]<<" "; if(cantidad1[sd1]<1000) cout<<" "; if(cantidad1[sd1]<100) cout<<" "; if(cantidad1[sd1]<10) cout<<" "; cout<<caja1[sd1]<<" "<<endl<<endl; cout<<"Detalles..."; for(sa=0;sa<50;sa++) { if(detalles1[sd1][sa]=='\0') break; cout<<detalles1[sd1][sa]; } cout<<endl<<endl; cout<<"Ingrese la cantidad..."; cin>>canto; if(canto<1) canto=0; if(canto>cantidad1[sd1]) {cout<<"NO PUEDE SACAR MAS DE LO QUE HAY..."; canto=0; getch(); } cantidad1[sd1]=cantidad1[sd1]-canto; if(canto>=1) { cout<<endl<<endl; cout<<"Seleccione prioridad 1.ALTA"<<endl; cout<<" 2.MEDIA"<<endl; cout<<" BAJA cualquier otra tecla..."; cout.flush(); q1q=getch(); salida2.open("salida1.txt",ios::app); for(sa=0;sa<60;sa++) salida2<<codigo1[sd1][sa]; salida2<<" "<<canto<<" "; salida2<<caja1[sd1]<<" "; for(sa=0;sa<50;sa++) { salida2<<detalles1[sd1][sa]; if(detalles1[sd1][sa]) break; } salida2<<endl; salida2.close(); salida1.open("salidas.txt",ios::app); for(sa=0;sa<60;sa++) salida1<<codigo1[sd1][sa]; salida1<<" "<<canto<<" "; salida1<<caja1[sd1]<<" "; for(sa=0;sa<50;sa++) { salida1<<detalles1[sd1][sa]; if(detalles1[sd1][sa]) break; } salida1<<endl; salida1.close(); if(primid=='1') { cou.open("LPT1",ios::out); cou<<endl; if(q1q=='1') cou<<"!!!Alta "; if(q1q=='2') cou<<"media "; for(sa=0;sa<40;sa++) cou<<codigo1[sd1][sa]; cou<<" "<<canto<<" "; cou<<caja1[sd1]<<" "; if(detalles1[sd1][0]!='?') for(sa=0;sa<50;sa++) cou<<detalles1[sd1][sa]; cou<<endl; cou.close(); } } } for(re=0;re<cont;re++) { for(sa=0;sa<60;sa++) { salida<<codigo1[re][sa]; if(codigo1[re][sa]=='\0') break; } salida<<" "<<cantidad1[re]<<" "; salida<<caja1[re]<<" "; for(sa=0;sa<50;sa++) { salida<<detalles1[re][sa]; if(detalles1[re][sa]=='\0') break; } salida<<endl; } } entrada.close(); salida.close(); cambilis(); }while(codi[0]!='0'); return; } void cambio() { if(sd=='0') { sd1=0; return; } if(sd=='1') {sd1=1; return; } if(sd=='2') {sd1=2; return; } if(sd=='3') {sd1=3; return; } if(sd=='4') {sd1=4; return; } if(sd=='5') {sd1=5; return; } if(sd=='6') {sd1=6; return; } if(sd=='7') {sd1=7; return; } if(sd=='8') {sd1=8; return; } if(sd=='9') {sd1=9; return; } sd1=10; return; } char verify(char name[15]) { if(name[0]=='0') return '0'; char bu1[15]; char bu2[15]; int cont; ifstream entrada("mipais.txt"); entrada>>cont; for(int res=0;res<cont;res++) { entrada>>bu1; entrada>>bu2; if(name[0]==bu2[0]) if(name[1]==bu2[1]) if(name[2]==bu2[2]) if(name[3]==bu2[3]) { nombre[0]=bu1[0]; nombre[1]=bu1[1]; nombre[2]=bu1[2]; nombre[3]=bu1[3]; nombre[4]='\0'; entrada.close(); return '1'; } } entrada.close(); return 'M'; } char verificar(char codigo[70]) { if(codigo[0]=='F') if(codigo[1]=='I') if(codigo[2]=='N') return 'F'; if(codigo[0]=='V') if(codigo[1]=='O') if(codigo[2]=='L') if(codigo[3]=='V') if(codigo[4]=='E') if(codigo[5]=='R') return 'V'; if(codigo[0]=='T') if(codigo[1]=='E') if(codigo[2]=='R') if(codigo[3]=='M') if(codigo[4]=='I') if(codigo[5]=='N') return 'E'; return 'N'; } void menu0() { cout<<endl<<endl<<endl; cout<<" INGRESE LA CANTIDAD..."; return; } void menu() { cout<<endl<<endl<<endl; cout<<" INGRESE LA CANTIDAD...(0 si desea salir)$"; return; } void cajitas() { //lista x; int cont; char detalle[50]; char codig[70]; int cantida; char mm; int caj; char su='N'; ofstream salida; ifstream entrada; cout.flush(); clrscr(); cout<<endl<<endl<<" INGRESE UN DISKET EN LA UNIDAD A..."<<endl<<endl; cout<<" PRESIONE TECLA PARA CONTINUAR.(DE 0 PARA SALIR)..."; cout.flush(); mm=getch(); if(mm=='0') return; salida.open("datos.txt",ios::app); salida<<endl; salida<<"FIN"; salida.close(); salida.open("datos1.txt"); entrada.open("datos.txt"); while(su!='F') { entrada>>codig; su=verificar(codig); if(su=='F') break; entrada>>cantida; entrada>>caj; entrada>>detalle; if(cantida!=0) { salida<<codig<<" "; salida<<cantida<<" "; salida<<caj<<" "; salida<<detalle<<endl; } } salida.close(); entrada.close(); cambilis1v(); cambilis2v(); cout<<"terminamos bien...."; delay(4000); return; } void cambilis2v() { char detalle[50]; char codig[70]; int cantida; int caj; char su='N'; ofstream salida; ifstream entrada; salida.open("datos1.txt",ios::app); salida<<endl; salida<<"FIN"; salida.close(); salida.open("a:datos.txt"); entrada.open("datos1.txt"); while(su!='F') { entrada>>codig; su=verificar(codig); if(su=='F') return; entrada>>cantida; entrada>>caj; entrada>>detalle; if(cantida!=0) { salida<<codig<<" "; salida<<cantida<<" "; salida<<caj<<" "; salida<<detalle<<endl; } } salida.close(); entrada.close(); return; } void cambilis1v() { char detalle[50]; char codig[70]; int cantida; int caj; char su='N'; ofstream salida; ifstream entrada; salida.open("datos1.txt",ios::app); salida<<endl; salida<<"FIN"; salida.close(); salida.open("datos.txt"); entrada.open("datos1.txt"); while(su!='F') { entrada>>codig; su=verificar(codig); if(su=='F') return; entrada>>cantida; entrada>>caj; entrada>>detalle; if(cantida!=0) { salida<<codig<<" "; salida<<cantida<<" "; salida<<caj<<" "; salida<<detalle<<endl; } } salida.close(); entrada.close(); return; } void cambilis() { char detalle[50]; char codig[70]; int cantida; int caj; char su='N'; ofstream salida; ifstream entrada; salida.open("datos1.txt",ios::app); salida<<endl; salida<<"FIN FIN FIN FIN "; salida.close(); salida.open("vizcaino.txt"); salida<<5; salida.close(); salida.open("datos.txt"); entrada.open("datos1.txt"); while(su!='F') { entrada>>codig; su=verificar(codig); if(su=='F') { salida.close(); entrada.close(); salida.open("vizcaino.txt"); salida<<7; salida.close(); return; } entrada>>cantida; entrada>>caj; entrada>>detalle; if(cantida!=0) { salida<<codig<<" "; salida<<cantida<<" "; salida<<caj<<" "; salida<<detalle<<endl; } } salida.close(); entrada.close(); return; } void camb() { char su='N'; char paso[70]; ifstream entrada1; ofstream salida1; entrada1.open("salida2.txt"); salida1.open("salida1.txt"); entrada1>>paso; su=verificar(paso); while(su!='F') { salida1<<paso<<" "; entrada1>>paso; salida1<<paso<<" "; entrada1>>paso; salida1<<paso<<" "; entrada1>>paso; salida1<<paso<<" "<<endl; entrada1>>paso; su=verificar(paso); } salida1.close(); entrada1.close(); return; } char camino(char a) { char nino[50]; int ger=0; ifstream entrada1; ofstream salida3; char it='W'; char su='0'; char sua='0'; char sas[15]; char name[15]; char paso[70]; char ma[70]; switch(a) { case '1': sas[0]='F'; sas[1]='A'; sas[2]='C'; sas[3]='\0'; cout<<"Ingrese el numero de la factura..."; cout.flush(); gets(nino); break; case '2': sas[0]='M'; sas[1]='O'; sas[2]='S'; sas[3]='\0'; cout<<"Ingrese el nombre de la persona que autoriza..."; cout.flush(); gets(nino); break; } if(nino[0]=='\0') return '0'; for(ger=0;ger<40;ger++) { if(nino[ger]==' ') nino[ger]='.'; if(nino[ger]=='\0') break; } while(sua!='E') { cout.flush(); clrscr(); entrada1.open("salida2.txt"); entrada1>>paso; su=verificar(paso); while(su!='F') { cout<<paso<<" "; entrada1>>paso; cout<<paso<<" "; entrada1>>paso; cout<<paso<<" "<<endl<<"Detalles..."; entrada1>>paso; cout<<paso<<" "<<endl; entrada1>>paso; su=verificar(paso); } entrada1.close(); cout<<endl; if(a=='1') cout<<"Por motivo de FACTURA "<<nino<<endl; if(a=='2') cout<<"Por motivo de MOSTRADOR "<<nino<<endl<<endl; cout<<"Seleccione su opcion...(VOLVER/TERMINAR)"; gets(ma); sua=verificar(ma); if(sua=='V') return '0'; if(sua=='E') { it='W'; do{ gotoxy(1,25); cout<<"Ingrese su clave.(para salir pulse 0).._"; gotoxy(1,25); cout<<"Ingrese su clave.(para salir pulse 0).."; cout.flush(); name[0]=getch(); if(name[0]=='0') return '0'; gotoxy(1,25); cout<<"Ingrese su clave.(para salir pulse 0)..X_"; gotoxy(1,25); cout<<"Ingrese su clave.(para salir pulse 0)..X"; cout.flush(); name[1]=getch(); gotoxy(1,25); cout<<"Ingrese su clave.(para salir pulse 0)..XX_"; gotoxy(1,25); cout<<"Ingrese su clave.(para salir pulse 0)..XX"; cout.flush(); name[2]=getch(); gotoxy(1,25); cout<<"Ingrese su clave.(para salir pulse 0)..XXX_"; gotoxy(1,25); cout<<"Ingrese su clave.(para salir pulse 0)..XXX"; cout.flush(); name[3]=getch(); gotoxy(1,25); cout<<"Ingrese su clave.(para salir pulse 0).._XXX"; it=verify(name); }while(it!='0' && it!='1'); if(it=='0') return '0'; if(it=='1') { salida3.open("salidas.txt",ios::app); salida3<<endl; salida3<<nombre<<" "; salida3<<sas<<" "; salida3<<nino<<" "; salida3<<facata<<endl; salida3.close(); salida3.open("salida1.txt"); salida3<<endl; salida3.close(); cambilviz1(); cambilviz2(); return '1'; } } } return '0'; } void visualiza() { } void patis() { char su; su='S'; int sa; cout.flush(); clrscr(); char domo1[70]; char domo2[50]; char domo3[50]; int cos; ifstream tal; cout<<"ingrese el numero de caja..."; cin>>pati; cambilis1(); cambilis(); cout.flush(); clrscr(); tal.open("datos1.txt"); cout<<" PRODUCTOS EN UNA CANASTILLA CANTIDAD CAJA "<<endl<<endl; tal>>domo1; su=verificar(domo1); while(su!='F') { tal>>domo2; tal>>cos; tal>>domo3; if(cos==pati) { for(sa=0;sa<54;sa++) cout<<domo1[sa]; cout<<" "; cout<<domo2<<" "; cout<<cos<<endl; cout<<"Detalles..."; for(sa=0;sa<50;sa++) { cout<<domo3[sa]; if(domo3[sa]=='\0') break; } cout<<endl; } tal>>domo1; su=verificar(domo1); } tal.close(); cout.flush(); getch(); return; } void cambilviz1() { char detalle[50]; char codig[70]; int cantida; char ndat; int caj; char su='N'; ofstream salida; ifstream entrada; salida.open("datos.txt",ios::app); salida<<endl; salida<<"FIN FIN FIN FIN"; salida.close(); entrada.open("ndato.txt"); entrada>>ndat; entrada.close(); if(ndat=='2') salida.open("datos2.txt"); if(ndat=='3') salida.open("datos3.txt"); if(ndat=='4') salida.open("datos4.txt"); if(ndat=='5') salida.open("datos5.txt"); if(ndat=='6') salida.open("datos6.txt"); entrada.open("datos.txt"); while(su!='F') { entrada>>codig; su=verificar(codig); if(su=='F') return; entrada>>cantida; entrada>>caj; entrada>>detalle; if(cantida!=0) { salida<<codig<<" "; salida<<cantida<<" "; salida<<caj<<" "; salida<<detalle<<endl; } } salida.close(); entrada.close(); return; } void cambilviz2() { char ndat; char detalle[50]; char codig[70]; int cantida; int caj; char su='N'; ofstream salida; ifstream entrada; entrada.open("ndato.txt"); entrada>>ndat; entrada.close(); if(ndat=='2') salida.open("datos2.txt",ios::app); if(ndat=='3') salida.open("datos3.txt",ios::app); if(ndat=='4') salida.open("datos4.txt",ios::app); if(ndat=='5') salida.open("datos5.txt",ios::app); if(ndat=='6') salida.open("datos6.txt",ios::app); salida<<endl; salida<<endl; salida<<"FIN FIN FIN FIN"; salida.close(); salida.open("datos.txt"); if(ndat=='2') entrada.open("datos2.txt"); if(ndat=='3') entrada.open("datos3.txt"); if(ndat=='4') entrada.open("datos4.txt"); if(ndat=='5') entrada.open("datos5.txt"); if(ndat=='6') entrada.open("datos6.txt"); while(su!='F') { entrada>>codig; su=verificar(codig); if(su=='F') { salida.close(); entrada.close(); salida.open("salidas.txt",ios::app); salida<<endl; salida<<" x<"<<ndat<<">x"<<endl<<endl; salida.close(); salida.open("ndato.txt"); if(ndat=='2') { ndat='3'; salida<<ndat; salida.close(); return; } if(ndat=='3') { ndat='4'; salida<<ndat; salida.close(); return; } if(ndat=='4') { ndat='5'; salida<<ndat; salida.close(); return; } if(ndat=='5') { ndat='6'; salida<<ndat; salida.close(); return; } if(ndat=='6') { ndat='2'; salida<<ndat; salida.close(); return; } salida.close(); return; } entrada>>cantida; entrada>>caj; entrada>>detalle; if(cantida!=0) { salida<<codig<<" "; salida<<cantida<<" "; salida<<caj<<" "; salida<<detalle<<endl; } } salida.close(); entrada.close(); return; } void cambilis1() { char detalle[50]; char codig[70]; int cantida; int caj; char su='N'; ofstream salida; ifstream entrada; salida.open("datos.txt",ios::app); salida<<endl; salida<<"FIN FIN FIN FIN"; salida.close(); salida.open("datos1.txt"); entrada.open("datos.txt"); while(su!='F') { entrada>>codig; su=verificar(codig); if(su=='F') return; entrada>>cantida; entrada>>caj; entrada>>detalle; if(cantida!=0) { salida<<codig<<" "; salida<<cantida<<" "; salida<<caj<<" "; salida<<detalle<<endl; } } salida.close(); entrada.close(); return; } void siguiente(char desido) { char das[70]; int das2; char su='N'; ofstream salida; ifstream entrada; if(desido=='1') salida.open("pedidop.txt",ios::app); if(desido=='2') salida.open("pedido1.txt",ios::app); if(desido=='3') salida.open("a:pedido3.txt",ios::app); salida<<endl; salida<<"FIN FIN"; salida.close(); if(desido=='1') { salida.open("pedido10.txt"); entrada.open("pedidop.txt"); } if(desido=='2') { salida.open("pedido20.txt"); entrada.open("pedido1.txt"); } if(desido=='3') { salida.open("pedido30.txt"); entrada.open("a:pedido3.txt"); } entrada>>das; su=verificar(das); if(su=='F') { entrada.close(); salida.close(); return; } entrada>>das2; entrada>>das; su=verificar(das); while(su!='F') { entrada>>das2; su=verificar(das); if(su=='F') goto dsa; salida<<das<<" "; salida<<das2<<endl; entrada>>das; } dsa: salida<<" FIN FIN"; salida.close(); entrada.close(); if(desido=='1') { salida.open("pedidop.txt"); entrada.open("pedido10.txt"); } if(desido=='2') { salida.open("pedido1.txt"); entrada.open("pedido20.txt"); } if(desido=='3') { salida.open("a:pedido3.txt"); entrada.open("pedido30.txt"); } entrada>>das; su=verificar(das); while(su!='F') { entrada>>das2; su=verificar(das); if(su=='F') goto dsa1; salida<<das<<" "; salida<<das2<<endl; entrada>>das; } dsa1: salida.close(); entrada.close(); return; } void pedidout(char desido) { char das[70]; char das2[10]; char su='N'; ofstream salida; ifstream entrada; if(desido=='1') salida.open("pedidop.txt",ios::app); if(desido=='2') salida.open("pedido1.txt",ios::app); if(desido=='3') salida.open("a:pedido3.txt",ios::app); salida<<endl; salida<<"FIN FIN"; salida.close(); if(desido=='1') { salida.open("pedido10.txt"); entrada.open("pedidop.txt"); } if(desido=='2') { salida.open("pedido20.txt"); entrada.open("pedido1.txt"); } if(desido=='3') { salida.open("pedido30.txt"); entrada.open("a:pedido3.txt"); } entrada>>das; su=verificar(das); while(su!='F') { entrada>>das2; su=verificar(das); if(su=='F') goto dsa; salida<<das<<" "; salida<<das2<<endl; entrada>>das; } dsa: salida<<" FIN FIN"; salida.close(); entrada.close(); if(desido=='1') { salida.open("pedidop.txt"); entrada.open("pedido10.txt"); } if(desido=='2') { salida.open("pedido1.txt"); entrada.open("pedido20.txt"); } if(desido=='3') { salida.open("a:pedido3.txt"); entrada.open("pedido30.txt"); } entrada>>das; su=verificar(das); while(su!='F') { entrada>>das2; su=verificar(das); if(su=='F') goto dsa1; salida<<das<<" "; salida<<das2<<endl; entrada>>das; } dsa1: salida.close(); entrada.close(); return; } programa que permite actualizar, crear productos, eliminar productos y guardar informacion #include<iostream.h> #include<conio.h> #include<string.h> #include<dos.h> #include<stdio.h> #include<fstream.h> struct producto{ char codigo[10]; char nombre[50]; double preciocliente; double preciovecino; double cantidad; char ubicacion[3]; double precio; char iva; char fecha1[12]; char credito; char fecha2[12]; char provedor[5]; }; producto escogido; double totalx1; double totalx2; double totalx3; producto nuevo; producto elimina; producto actualiza; char problems; char menu(); void muestranu(char cual); void actualizarpro(); void eliminarpro(); void menuavanzado(); void guardarlainfo(); void recuperasistem(); char alexmira(); void seguroalex(); void nuevoproducto(); char verificaralex(char guia[70]); double revisapreschar(); double revisacantchar(); char revisacodigo(char un[20]); char buscarunco(char un[20]); char buscarpro(char un[20]); void meternuevo(); void eliminarproducto(); void datonumer(char charted[70]); void main() { ifstream clavein; char clave[10]; char clave1[70]; char clave2[70]; char sipro; char uni[20]; char dale='M'; char opc; problems='n'; char opca; cout.flush(); clrscr(); cout<<"INGRESE SU CLAVE..."; clave[0]=getch(); gotoxy(19,1); cout<<"X"; clave[1]=getch(); gotoxy(20,1); cout<<"X"; clave[2]=getch(); gotoxy(21,1); cout<<"X"; clave[3]=getch(); gotoxy(22,1); cout<<"X"; clavein.open("laclave.txt"); clavein>>clave1; clavein>>clave2; clavein.close(); if(clave1[9]==clave[0]) if(clave1[19]==clave[1]) if(clave1[29]==clave[2]) if(clave1[39]==clave[3]) goto buenaclave; if(clave2[9]==clave[0]) if(clave2[19]==clave[1]) if(clave2[29]==clave[2]) if(clave2[39]==clave[3]) goto buenaclave; return; buenaclave: dale=alexmira(); if(dale!='B') problems='s'; if(dale=='B') seguroalex(); do{ opc=menu(); switch(opc) { case '1': sipro='o'; cout.flush(); clrscr(); cout<<endl<<endl<<" ACTUALIZAR PRODUCTO"<<endl<<endl; cout<<"INGRESE EL CODIGO QUE DESEA ACTUALIZAR Y ENTER..."; cout.flush(); gets(uni); sipro=buscarpro(uni); if(sipro=='S') actualizarpro(); dale=alexmira(); if(dale!='B') problems='s'; if(dale=='B') seguroalex(); break; case '2': nuevoproducto(); dale=alexmira(); if(dale!='B') problems='s'; if(dale=='B') seguroalex(); break; case '3': sipro='o'; cout.flush(); clrscr(); cout<<endl<<endl<<" ELIMINAR PRODUCTO"<<endl<<endl; cout<<"INGRESE EL CODIGO QUE DESEA ELIMINAR Y ENTER..."; cout.flush(); gets(uni); sipro=buscarpro(uni); if(sipro=='S') eliminarpro(); dale=alexmira(); if(dale!='B') problems='s'; if(dale=='B') seguroalex(); break; case '4': menuavanzado(); break; } }while(opc!='0'); } char menu() { char menu1='o'; do{ cout.flush(); clrscr(); cout<<endl<<endl; if(problems=='s') { cout<<"TIENE PROBLEMAS CON EL ARCHIVO PRINSIPAL!!!"<<endl; cout<<"SOLUCIONE PRIMERO ANTES DE CONTINUAR...VAYA A OPCION 4 AVANZADO"; cout<<endl<<endl; } cout<<" PRINSIPAL"<<endl<<endl; cout<<" 1.ACTUALIZAR PRODUCTO "<<endl<<endl; cout<<" 2.INGRESAR NUEVO PRODUCTO "<<endl<<endl; cout<<" 3.ELIMINAR PRODUCTO "<<endl<<endl; cout<<" 4.OPCIONES AVANZADAS "<<endl<<endl; cout<<" 0.SALIR"<<endl<<endl; cout<<" SELECCIONE LA OPCION DESEADA"; cout.flush(); menu1=getch(); if(problems=='s') { if(menu1=='1') menu1='W'; if(menu1=='2') menu1='W'; if(menu1=='3') menu1='W'; } }while(menu1!='4' && menu1!='0' && menu1!='1' && menu1!='2' && menu1!='3'); return menu1; } void datonumer(char charted[70]) { double datos[7]; double a0,a1,a2; a2=36*36; a1=36; a0=1; totalx1=0; totalx2=0; totalx3=0; for(int p=0;p<7;p++) { if(charted[p]=='0') datos[p]=0; if(charted[p]=='1') datos[p]=1; if(charted[p]=='2') datos[p]=2; if(charted[p]=='3') datos[p]=3; if(charted[p]=='4') datos[p]=4; if(charted[p]=='5') datos[p]=5; if(charted[p]=='6') datos[p]=6; if(charted[p]=='7') datos[p]=7; if(charted[p]=='8') datos[p]=8; if(charted[p]=='9') datos[p]=9; if(charted[p]=='A') datos[p]=10; if(charted[p]=='B') datos[p]=11; if(charted[p]=='C') datos[p]=12; if(charted[p]=='D') datos[p]=13; if(charted[p]=='E') datos[p]=14; if(charted[p]=='F') datos[p]=15; if(charted[p]=='G') datos[p]=16; if(charted[p]=='H') datos[p]=17; if(charted[p]=='I') datos[p]=18; if(charted[p]=='J') datos[p]=19; if(charted[p]=='K') datos[p]=20; if(charted[p]=='L') datos[p]=21; if(charted[p]=='M') datos[p]=22; if(charted[p]=='N') datos[p]=23; if(charted[p]=='O') datos[p]=24; if(charted[p]=='P') datos[p]=25; if(charted[p]=='Q') datos[p]=26; if(charted[p]=='R') datos[p]=27; if(charted[p]=='S') datos[p]=28; if(charted[p]=='T') datos[p]=29; if(charted[p]=='U') datos[p]=30; if(charted[p]=='V') datos[p]=31; if(charted[p]=='W') datos[p]=32; if(charted[p]=='X') datos[p]=33; if(charted[p]=='Y') datos[p]=34; if(charted[p]=='Z') datos[p]=35; } totalx1=datos[0]*a2+datos[1]*a1+datos[2]*a0; totalx2=datos[3]*a2+datos[4]*a1+datos[5]*a0; totalx3=datos[6]*a0; return; } void nuevoproducto() { char siono='o'; char sino='o'; char uncodigo[20]; char uncodigo1[20]; int ppa; char dido[70]; ofstream pasout; char cantchar[20]; char preschar[20]; mues0: cout.flush(); clrscr(); cout<<endl<<endl; cout<<" NUEVO PRODUCTO"<<endl<<endl; cout<<" (TRABAJE EN MAYUSCULAS PORFAVOR / PARA SALIR PULSE 0 Y ENTER)"<<endl<<endl; cout<<"RECUERDE: EL PROGRAMA CONSULTA POR MEDIO DE LAS 3 PRIMERAS LETRAS DEL CODIGO"<<endl<<endl; cout<<"INGRESE EL CODIGO (7 DIGITOS) Y PULSE ENTER..."; cout.flush(); gets(uncodigo); cout<<endl; if(uncodigo[0]=='0') return; siono=revisacodigo(uncodigo); if(siono=='N') goto mues0; for(int perro=0;perro<7;perro++) nuevo.codigo[perro]=uncodigo[perro]; nuevo.codigo[7]='\0'; muestranu('0'); cout<<"INGRESE EL NOMBRE DEL PRODUCTO MAXIMO 40 CARACTERES Y PULSE ENTER"<<endl; cout<<"NOMBRE..."; cout.flush(); gets(dido); if(dido[0]=='0') return; for(ppa=0;ppa<45;ppa++) { if(dido[ppa]==' ') nuevo.nombre[ppa]='.'; else nuevo.nombre[ppa]=dido[ppa]; if(dido[ppa]=='\0') for(ppa=ppa;ppa<45;ppa++) nuevo.nombre[ppa]='.'; } nuevo.nombre[45]='\0'; mues1: cout<<endl<<"INGRESE EL PRECIO MAYOR Y PULSE ENTER...$"; cout.flush(); gets(cantchar); if(cantchar[0]=='0') return; pasout.open("cantchar.txt"); pasout<<cantchar; pasout.close(); nuevo.preciocliente=revisacantchar(); if(nuevo.preciocliente==0) { muestranu('1'); goto mues1; } mues2: cout<<endl<<"INGRESE EL PRECIO MENOR Y PULSE ENTER...$"; cout.flush(); gets(preschar); if(preschar[0]=='0') return; pasout.open("preschar.txt"); pasout<<preschar; pasout.close(); nuevo.preciovecino=revisapreschar(); if(nuevo.preciovecino==0) { muestranu('2'); goto mues2; } cout<<endl<<"INGRESE LA UBICACION (2 CARACTERES)!OPCIONAL..."; gotoxy(1,20); cout<<"SI NO USA UBICACION PULSE ENTER"; gotoxy(48,18); cout.flush(); gets(uncodigo1); if(uncodigo1[0]=='0') return; if(uncodigo1[0]=='\0' || uncodigo1[0]==' ') { nuevo.ubicacion[0]='a'; nuevo.ubicacion[1]='1'; nuevo.ubicacion[2]='\0'; } if(uncodigo1[0]!='\0' && uncodigo1[0]!=' ') { nuevo.ubicacion[0]=uncodigo1[0]; if(uncodigo1[1]=='\0' || uncodigo1[1]==' ') nuevo.ubicacion[1]='0'; else nuevo.ubicacion[1]=uncodigo1[1]; nuevo.ubicacion[2]='\0'; } cout.flush(); clrscr(); cout<<endl<<endl; cout<<" NUEVO PRODUCTO"<<endl<<endl; cout<<endl<<endl; cout<<"EL NUEVO PRODUCTO QUEDARA DE LA SIGUIENTE MANERA"<<endl<<endl; cout<<nuevo.codigo<<" "<<nuevo.nombre<<" Ub."<<nuevo.ubicacion<<endl<<endl; cout<<"PRECIO MAYOR $"<<nuevo.preciocliente<<" PRECIO MENOR $"<<nuevo.preciovecino<<endl<<endl; cout<<"ACEPTA EL NUEVO PRODUCTO? (S/N)..."; cout.flush(); sino=getch(); cout<<sino; if(sino=='S' || sino=='s') { cout<<endl<<endl<<"SEGURO QUE LO ACEPTA??? (S/N)..."; cout.flush(); sino=getch(); cout<<sino; } if(sino=='S' || sino=='s') { meternuevo(); cout.flush(); clrscr(); cout<<endl<<endl<<"EL NUEVO PRODUCTO!!! "<<endl<<endl; cout<<nuevo.codigo<<" "<<nuevo.nombre<<" Ub."<<nuevo.ubicacion<<endl<<endl; cout<<"PRECIO MAYOR $"<<nuevo.preciocliente<<" PRECIO MENOR $"<<nuevo.preciovecino<<endl<<endl; cout<<endl<<endl<<"SU PRODUCTO HA SIDO INGRESADO!!!"<<endl<<endl; cout<<"PULSE TECLA PARA SALIR"; cout.flush(); getch(); } return; } char revisacodigo(char un[20]) { char devuelve='N'; if(un[0]!='A' && un[0]!='B'&& un[0]!='C'&& un[0]!='D'&& un[0]!='E'&& un[0]!='F'&& un[0]!='G'&& un[0]!='H'&& un[0]!='I'&& un[0]!='J'&& un[0]!='K'&& un[0]!='L'&& un[0]!='M'&& un[0]!='N'&& un[0]!='O'&& un[0]!='P'&& un[0]!='Q'&& un[0]!='R'&& un[0]!='S'&& un[0]!='T'&& un[0]!='U'&& un[0]!='V'&& un[0]!='W'&& un[0]!='X'&& un[0]!='Y'&& un[0]!='Z') { cout<<"LO SIENTO AL MENOS EL PRIMER CARACTER DEBE SER UNA LETRA"<<endl; cout<<endl<<"CODIGO ERRONEO!!!"; cout.flush(); getch(); return 'N'; } for(int v0=1;v0<7;v0++) { if(un[v0]!='A'&& un[v0]!='B'&& un[v0]!='C'&& un[v0]!='D'&& un[v0]!='E'&& un[v0]!='F'&& un[v0]!='G'&& un[v0]!='H'&& un[v0]!='I'&& un[v0]!='J'&& un[v0]!='K'&& un[v0]!='L'&& un[v0]!='M'&& un[v0]!='N'&& un[v0]!='O'&& un[v0]!='P'&& un[v0]!='Q'&& un[v0]!='R'&& un[v0]!='S'&& un[v0]!='T'&& un[v0]!='U'&& un[v0]!='V'&& un[v0]!='W'&& un[v0]!='X'&& un[v0]!='Y'&& un[v0]!='Z'&& un[v0]!='1'&& un[v0]!='2'&& un[v0]!='3'&& un[v0]!='4'&& un[v0]!='5'&& un[v0]!='6'&& un[v0]!='7'&& un[v0]!='8'&& un[v0]!='9'&& un[v0]!='0') { cout<<"LO SIENTO CODIGO ERRONEO!!!"; cout.flush(); getch(); return 'N'; } } devuelve=buscarunco(un); if(devuelve!='S') return 'N'; return 'S'; } //************************************************************* ********* //************************************************************* ********* //************************************************************* ********* //************************************************************* ********* //************************************************************* ********* void meternuevo() { char contex; double datonum1x; double datonum1y; double datonum1z; double datonum2x; double datonum2y; double datonum2z; char elques[10]; char su; char sus[70]; ifstream entra; ofstream sale; char menuac; contex='0'; datonumer(nuevo.codigo); datonum1x=totalx1; datonum1y=totalx2; datonum1z=totalx3; entra.open("alex.txt"); entra>>sus; su=verificaralex(sus); while(su!='F') { datonumer(sus); datonum2x=totalx1; datonum2y=totalx2; datonum2z=totalx3; cout.flush(); clrscr(); if(datonum2x>datonum1x) goto acrax; if(datonum2x>=datonum1x && datonum2y>datonum1y) goto acrax; if(datonum2x>=datonum1x && datonum2y>=datonum1y && datonum2z>datonum1z) goto acrax; if(datonum2x<=datonum1x) { contex='1'; elques[0]=sus[0]; elques[1]=sus[1]; elques[2]=sus[2]; elques[3]=sus[3]; elques[4]=sus[4]; elques[5]=sus[5]; elques[6]=sus[6]; elques[7]='\0'; } entra>>sus; entra>>sus; entra>>sus; entra>>sus; entra>>sus; entra>>sus; su=verificaralex(sus); } acrax: entra.close(); entra.open("alex.txt"); sale.open("alexpaso.txt"); entra>>sus; su=verificaralex(sus); while(su!='F') { if(contex=='0') { contex='2'; sale<<nuevo.codigo<<" "; sale<<nuevo.nombre<<" "; sale<<nuevo.preciocliente<<" "; sale<<nuevo.preciovecino<<" "; sale<<nuevo.cantidad<<" "; sale<<nuevo.ubicacion<<endl; } if(contex=='1') if(sus[0]==elques[0]) if(sus[1]==elques[1]) if(sus[2]==elques[2]) if(sus[3]==elques[3]) if(sus[4]==elques[4]) if(sus[5]==elques[5]) if(sus[6]==elques[6]) { sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<endl; sale<<nuevo.codigo<<" "; sale<<nuevo.nombre<<" "; sale<<nuevo.preciocliente<<" "; sale<<nuevo.preciovecino<<" "; sale<<nuevo.cantidad<<" "; sale<<nuevo.ubicacion<<endl; goto porsias; } sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<endl; porsias: entra>>sus; su=verificaralex(sus); } sale<<"+++++"; entra.close(); sale.close(); entra.open("alexpaso.txt"); sale.open("alex.txt"); entra>>sus; su=verificaralex(sus); while(su!='F') { sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<endl; entra>>sus; su=verificaralex(sus); } sale<<"+++++"; entra.close(); sale.close(); seguroalex(); return; } char buscarunco(char un[20]) { char su='k'; char sus[70]; ifstream entra("alex.txt"); entra>>sus; su=verificaralex(sus); while(su!='F') { if(sus[0]==un[0]) if(sus[1]==un[1]) if(sus[2]==un[2]) if(sus[3]==un[3]) if(sus[4]==un[4]) if(sus[5]==un[5]) if(sus[6]==un[6]) { cout<<"EL CODIGO YA EXISTE!!!"; entra.close(); cout.flush(); getch(); return'N'; } entra>>sus; entra>>sus; entra>>sus; entra>>sus; entra>>sus; entra>>sus; su=verificaralex(sus); } entra.close(); return 'S'; } void eliminarpro() { char su; char sus[70]; ifstream entra; ofstream sale; char menuac; cout.flush(); clrscr(); cout<<endl<<endl; cout<<" ELIMINAR"<<endl<<endl; cout<<escogido.codigo<<" "<<escogido.nombre<<" Ub."<<escogido.ubicacion<<endl<<endl; cout<<"PRECIO MAYOR $"<<escogido.preciocliente<<" PRECIO MENOR $"<<escogido.preciovecino<<endl<<endl; cout<<"ESTA SEGURO QUE DESEA ELIMINAR PRODUCTO??? (S/N)..."; cout.flush(); menuac=getch(); cout<<menuac; if(menuac!='S') return; cout<<endl<<endl<<"COMPLETAMENTE SEGURO QUE DESEA ELIMINARLO??? (S/N)..."; cout.flush(); menuac=getch(); if(menuac!='S') return; cout<<menuac; entra.open("alex.txt"); sale.open("alexpaso.txt"); entra>>sus; su=verificaralex(sus); while(su!='F') { if(sus[0]==escogido.codigo[0]) if(sus[1]==escogido.codigo[1]) if(sus[2]==escogido.codigo[2]) if(sus[3]==escogido.codigo[3]) if(sus[4]==escogido.codigo[4]) if(sus[5]==escogido.codigo[5]) if(sus[6]==escogido.codigo[6]) { entra>>sus; entra>>sus; entra>>sus; entra>>sus; entra>>sus; entra>>sus; su=verificaralex(sus); if(su=='F') goto acabartex; } sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<endl; entra>>sus; su=verificaralex(sus); } acabartex: sale<<"+++++"; entra.close(); sale.close(); entra.open("alexpaso.txt"); sale.open("alex.txt"); entra>>sus; su=verificaralex(sus); while(su!='F') { sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<endl; entra>>sus; su=verificaralex(sus); } sale<<"+++++"; entra.close(); sale.close(); seguroalex(); cout<<endl<<endl<<"PRODUCTO ELIMINADO!!!! "<<endl<<endl; cout<<"PULSE TECLA PARA SALIR"; cout.flush(); getch(); return; } void actualizarpro() { char su; char cantchar[20]; char uncodigo1[20]; char preschar[20]; ofstream pasout; char sus[70]; int ppa; char dido[70]; ifstream entra; ofstream sale; char menuac; filigrana: do{ cout.flush(); clrscr(); cout<<endl<<endl; cout<<" ACTUALIZAR"<<endl<<endl; cout<<escogido.codigo<<" "<<escogido.nombre<<" Ub."<<escogido.ubicacion<<endl<<endl; cout<<"PRECIO MAYOR $"<<escogido.preciocliente<<" PRECIO MENOR $"<<escogido.preciovecino<<endl<<endl; cout<<" 1.ACTUALIZAR NOMBRE "<<endl; cout<<" 2.ACTUALIZAR PRECIOS "<<endl; cout<<" 3.ACTUALIZAR UBICACION "<<endl; cout<<" 0.SALIR"<<endl<<endl; cout<<" SELECCIONE LA OPCION DESEADA"; cout.flush(); menuac=getch(); switch(menuac) { case '1': cout<<endl<<endl; cout<<"INGRESE EL NOMBRE DEL PRODUCTO MAXIMO 40 CARACTERES Y PULSE ENTER"<<endl; cout<<"NOMBRE..."; cout.flush(); gets(dido); if(dido[0]=='0') break; for(ppa=0;ppa<45;ppa++) { if(dido[ppa]==' ') escogido.nombre[ppa]='.'; else escogido.nombre[ppa]=dido[ppa]; if(dido[ppa]=='\0') for(ppa=ppa;ppa<45;ppa++) escogido.nombre[ppa]='.'; } escogido.nombre[45]='\0'; break; case '2': cout<<endl<<endl<<"INGRESE EL PRECIO MAYOR Y PULSE ENTER...$"; cout.flush(); gets(cantchar); pasout.open("cantchar.txt"); pasout<<cantchar; pasout.close(); escogido.preciocliente=revisacantchar(); if(escogido.preciocliente==0) break; cout<<endl<<"INGRESE EL PRECIO MENOR Y PULSE ENTER...$"; cout.flush(); gets(preschar); pasout.open("preschar.txt"); pasout<<preschar; pasout.close(); escogido.preciovecino=revisapreschar(); if(escogido.preciovecino==0) break; break; case '3': cout<<endl<<endl<<"INGRESE LA UBICACION (2 CARACTERES)!OPCIONAL..."; cout.flush(); gets(uncodigo1); if(uncodigo1[0]=='0') break; if(uncodigo1[0]=='\0' || uncodigo1[0]==' ') { escogido.ubicacion[0]='a'; escogido.ubicacion[1]='1'; escogido.ubicacion[2]='\0'; } if(uncodigo1[0]!='\0' && uncodigo1[0]!=' ') { escogido.ubicacion[0]=uncodigo1[0]; if(uncodigo1[1]=='\0' || uncodigo1[1]==' ') escogido.ubicacion[1]='0'; else escogido.ubicacion[1]=uncodigo1[1]; escogido.ubicacion[2]='\0'; } break; } }while(menuac!='0' && menuac!='1' && menuac!='2' && menuac!='3'); if(menuac=='1' || menuac=='2' || menuac=='3') goto filigrana; entra.open("alex.txt"); sale.open("alexpaso.txt"); entra>>sus; su=verificaralex(sus); while(su!='F') { if(sus[0]==escogido.codigo[0]) if(sus[1]==escogido.codigo[1]) if(sus[2]==escogido.codigo[2]) if(sus[3]==escogido.codigo[3]) if(sus[4]==escogido.codigo[4]) if(sus[5]==escogido.codigo[5]) if(sus[6]==escogido.codigo[6]) { sale<<escogido.codigo<<" "; sale<<escogido.nombre<<" "; sale<<escogido.preciocliente<<" "; sale<<escogido.preciovecino<<" "; sale<<escogido.cantidad<<" "; sale<<escogido.ubicacion<<" "<<endl; entra>>sus; entra>>sus; entra>>sus; entra>>sus; entra>>sus; entra>>sus; su=verificaralex(sus); if(su=='F') goto acabarte; } sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<endl; entra>>sus; su=verificaralex(sus); } acabarte: sale<<"+++++"; entra.close(); sale.close(); entra.open("alexpaso.txt"); sale.open("alex.txt"); entra>>sus; su=verificaralex(sus); while(su!='F') { sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<endl; entra>>sus; su=verificaralex(sus); } sale<<"+++++"; entra.close(); sale.close(); return; } void muestranu(char cual) { cout.flush(); clrscr(); cout<<endl<<endl; cout<<" NUEVO PRODUCTO"<<endl<<endl; cout<<" (TRABAJE EN MAYUSCULAS PORFAVOR / PARA SALIR PULSE 0 Y ENTER)"<<endl<<endl; cout<<"RECUERDE: EL PROGRAMA CONSULTA POR MEDIO DE LAS 3 PRIMERAS LETRAS DEL CODIGO"<<endl<<endl; cout<<"INGRESE EL CODIGO (7 DIGITOS) Y PULSE ENTER..."<<nuevo.codigo; cout<<endl<<endl; if(cual=='1' || cual=='2') { cout<<"INGRESE EL NOMBRE DEL PRODUCTO MAXIMO 40 CARACTERES Y PULSE ENTER"<<endl; cout<<"NOMBRE..."; for(int pas=0;pas<45;pas++) { if(nuevo.nombre[pas]=='.') cout<<' '; else cout<<nuevo.nombre[pas]; } cout<<endl; } if(cual=='2') cout<<endl<<"INGRESE EL PRECIO MAYOR Y PULSE ENTER...$"<<nuevo.preciocliente<<endl; return; } char buscarpro(char un[20]) { int r; char su='k'; char sus[70]; char sus1[70]; double sus2; double sus3; double sus4; char sus5[10]; ifstream entra; entra.open("alex.txt"); entra>>sus; su=verificaralex(sus); while(su!='F') { entra>>sus1; entra>>sus2; entra>>sus3; entra>>sus4; entra>>sus5; if(sus[0]==un[0]) if(sus[1]==un[1]) if(sus[2]==un[2]) if(sus[3]==un[3]) if(sus[4]==un[4]) if(sus[5]==un[5]) if(sus[6]==un[6]) { for(r=0;r<8;r++) escogido.codigo[r]=sus[r]; for(r=0;r<50;r++) escogido.nombre[r]=sus1[r]; escogido.preciocliente=sus2; escogido.preciovecino=sus3; escogido.cantidad=sus4; for(r=0;r<3;r++) escogido.ubicacion[r]=sus5[r]; entra.close(); return'S'; } entra>>sus; su=verificaralex(sus); } entra.close(); return 'N'; } double revisacantchar() { int pra; char elchar[20]; double estesi; ifstream pasoin; pasoin.open("cantchar.txt"); pasoin>>elchar; pasoin.close(); if(elchar[0]=='0') return 0; if(elchar[0]=='\0') { cout<<endl; cout<<"NO ES UN NUMERO?!?"; cout.flush(); getch(); return 0; } if(elchar[0]!='1' && elchar[0]!='2' && elchar[0]!='3' && elchar[0]!='4' && elchar[0]!='5' && elchar[0]!='6' && elchar[0]!='7' && elchar[0]!='8' && elchar[0]!='9') { cout<<endl; cout<<"NO ES UN NUMERO?!?"; cout.flush(); getch(); return 0; } for(pra=0;pra<20;pra++) { if(elchar[pra]!='0' && elchar[pra]!='1' && elchar[pra]!='2' && elchar[pra]!='3' && elchar[pra]!='4' && elchar[pra]!='5' && elchar[pra]!='6' && elchar[pra]!='7' && elchar[pra]!='8' && elchar[pra]!='9') { if(elchar[pra]=='\0') { pasoin.open("cantchar.txt"); pasoin>>estesi; pasoin.close(); return estesi; } else { cout<<endl; cout<<"NO ES UN NUMERO?!?"; cout.flush(); getch(); return 0; } } } return 0; } double revisapreschar() { int pra; char elchar[20]; double estesi; ifstream pasoin; pasoin.open("preschar.txt"); pasoin>>elchar; pasoin.close(); if(elchar[0]=='0') return 0; if(elchar[0]=='\0') { cout<<endl; cout<<"NO ES UN NUMERO?!?"; cout.flush(); getch(); return 0; } if(elchar[0]!='1' && elchar[0]!='2' && elchar[0]!='3' && elchar[0]!='4' && elchar[0]!='5' && elchar[0]!='6' && elchar[0]!='7' && elchar[0]!='8' && elchar[0]!='9') { cout<<endl; cout<<"NO ES UN NUMERO?!?"; cout.flush(); getch(); return 0; } for(pra=0;pra<20;pra++) { if(elchar[pra]!='0' && elchar[pra]!='1' && elchar[pra]!='2' && elchar[pra]!='3' && elchar[pra]!='4' && elchar[pra]!='5' && elchar[pra]!='6' && elchar[pra]!='7' && elchar[pra]!='8' && elchar[pra]!='9') { if(elchar[pra]=='\0') { pasoin.open("preschar.txt"); pasoin>>estesi; pasoin.close(); return estesi; } else { cout<<endl; cout<<"NO ES UN NUMERO?!?"; cout.flush(); getch(); return 0; } } } return 0; } void menuavanzado() { char acepto; ifstream clavein; ofstream claveout; char clave[10]; char clave1[70]; char clave2[70]; int cual; int cualtos; char menur='o'; ifstream elseguro("elseguro.txt"); elseguro>>cual; elseguro>>cualtos; elseguro.close(); clavein.open("laclave.txt"); clavein>>clave1; clavein>>clave2; clavein.close(); do{ cout.flush(); clrscr(); cout<<endl<<endl; if(problems=='s') { cout<<"TIENE PROBLEMAS CON EL ARCHIVO PRINSIPAL!!!"<<endl; cout<<"SOLUCIONE PRIMERO ANTES DE CONTINUAR...VAYA A OPCION 3 RECUPERAR"; cout<<endl<<endl; } cout<<" AVANZADO"<<endl<<endl; cout<<" 1.CAMBIAR CLAVE1 "<<endl<<endl; cout<<" 2.CAMBIAR CLAVE2 "<<endl<<endl; cout<<" 3.RECUPERAR SISTEMA seguro en "<<cual<<endl; cout<<" productos "<<cualtos<<endl<<endl; cout<<" 4.GUARDAR LA INFORMACION "<<endl<<endl; cout<<" 0.SALIR"<<endl<<endl; cout<<" SELECCIONE LA OPCION DESEADA"; cout.flush(); menur=getch(); }while(menur!='4' && menur!='0' && menur!='1' && menur!='2' && menur!='3'); switch(menur) { case '3': recuperasistem(); break; case '1': cout.flush(); clrscr(); cout<<"INGRESE SU CLAVE..."; clave[0]=getch(); gotoxy(19,1); cout<<"X"; clave[1]=getch(); gotoxy(20,1); cout<<"X"; clave[2]=getch(); gotoxy(21,1); cout<<"X"; clave[3]=getch(); gotoxy(22,1); cout<<"X"; if(clave1[9]==clave[0]) if(clave1[19]==clave[1]) if(clave1[29]==clave[2]) if(clave1[39]==clave[3]) goto buenaclave1; break; buenaclave1: cout<<endl<<endl; cout<<"SU CLAVE ACTUAL ES..."<<clave[0]<<clave[1]<<clave[2]<<clave[3]<<endl <<endl; cout<<"INGRESE SU NUEVA CLAVE(4 DIGITOS) Y PRESIONE ENTER..."; cout.flush(); gets(clave); cout<<endl<<endl; cout<<"SU NUEVA CLAVE ES..."<<clave[0]<<clave[1]<<clave[2]<<clave[3]<<endl <<endl; cout<<"ACEPTA LA NUEVA CLAVE?...(S/N)"; acepto=getch(); if(acepto=='s') goto siacepto1; if(acepto=='S') goto siacepto1; cout<<endl<<endl; cout<<"NO??? SU CLAVE SIGUE SIENDO "<<clave1[9]<<clave1[19]<<clave1[29]<<clave1[39]<< endl<<endl; cout<<"PULSE TECLA PARA SALIR"; cout.flush(); getch(); break; siacepto1: clave1[9]=clave[0]; clave1[19]=clave[1]; clave1[29]=clave[2]; clave1[39]=clave[3]; claveout.open("laclave.txt"); claveout<<clave1<<endl; claveout<<clave2<<endl; claveout.close(); cout<<endl<<endl; cout<<"CLAVE ACEPTADA!!! SU NUEVA CLAVE ES "<<clave1[9]<<clave1[19]<<clave1[29]<<clave1[39]<< endl<<endl; cout<<"PULSE TECLA PARA SALIR"; cout.flush(); getch(); break; case '2': cout.flush(); clrscr(); cout<<"INGRESE SU CLAVE..."; clave[0]=getch(); gotoxy(19,1); cout<<"X"; clave[1]=getch(); gotoxy(20,1); cout<<"X"; clave[2]=getch(); gotoxy(21,1); cout<<"X"; clave[3]=getch(); gotoxy(22,1); cout<<"X"; if(clave2[9]==clave[0]) if(clave2[19]==clave[1]) if(clave2[29]==clave[2]) if(clave2[39]==clave[3]) goto buenaclave2; break; buenaclave2: cout<<endl<<endl; cout<<"SU CLAVE ACTUAL ES..."<<clave[0]<<clave[1]<<clave[2]<<clave[3]<<endl <<endl; cout<<"INGRESE SU NUEVA CLAVE(4 DIGITOS) Y PRESIONE ENTER..."; cout.flush(); gets(clave); cout<<endl<<endl; cout<<"SU NUEVA CLAVE ES..."<<clave[0]<<clave[1]<<clave[2]<<clave[3]<<endl <<endl; cout<<"ACEPTA LA NUEVA CLAVE?...(S/N)"; acepto=getch(); if(acepto=='s') goto siacepto2; if(acepto=='S') goto siacepto2; cout<<endl<<endl; cout<<"NO??? SU CLAVE SIGUE SIENDO "<<clave2[9]<<clave2[19]<<clave2[29]<<clave2[39]<< endl<<endl; cout<<"PULSE TECLA PARA SALIR"; cout.flush(); getch(); break; siacepto2: clave2[9]=clave[0]; clave2[19]=clave[1]; clave2[29]=clave[2]; clave2[39]=clave[3]; claveout.open("laclave.txt"); claveout<<clave1<<endl; claveout<<clave2<<endl; claveout.close(); cout<<endl<<endl; cout<<"CLAVE ACEPTADA!!! SU NUEVA CLAVE ES "<<clave2[9]<<clave2[19]<<clave2[29]<<clave2[39]<< endl<<endl; cout<<"PULSE TECLA PARA SALIR"; cout.flush(); getch(); break; case '4': guardarlainfo(); break; } return; } void recuperasistem() { int asegurado1; char asegurado2; char dale; ifstream clavein; char clave[10]; char clave1[70]; char clave2[70]; int conteo=0; int trabaj=0; char su; char sus[70]; ifstream entra; ofstream sale; cout.flush(); clrscr(); if(problems!='s') { cout<<"LO SIENTO PERO EL SISTEMA ESTA BIEN..."; cout.flush(); getch(); return; } cout<<"INGRESE SU CLAVE..."; clave[0]=getch(); gotoxy(19,1); cout<<"X"; clave[1]=getch(); gotoxy(20,1); cout<<"X"; clave[2]=getch(); gotoxy(21,1); cout<<"X"; clave[3]=getch(); gotoxy(22,1); cout<<"X"; clavein.open("laclave.txt"); clavein>>clave1; clavein>>clave2; clavein.close(); if(clave1[9]==clave[0]) if(clave1[19]==clave[1]) if(clave1[29]==clave[2]) if(clave1[39]==clave[3]) goto buenaclaver; if(clave2[9]==clave[0]) if(clave2[19]==clave[1]) if(clave2[29]==clave[2]) if(clave2[39]==clave[3]) goto buenaclaver; return; buenaclaver: entra.open("elseguro.txt"); entra>>asegurado1; entra>>asegurado2; entra.close(); sale.open("alex.txt"); if(asegurado1==1) entra.open("alex1.txt"); if(asegurado1==2) entra.open("alex2.txt"); if(asegurado1==3) entra.open("alex3.txt"); if(asegurado1==4) entra.open("alex4.txt"); if(asegurado1==5) entra.open("alex5.txt"); if(asegurado1==6) entra.open("alex6.txt"); if(asegurado1==7) entra.open("alex7.txt"); if(asegurado1==8) entra.open("alex8.txt"); if(asegurado1==9) entra.open("alex9.txt"); if(asegurado1==10) entra.open("alex10.txt"); if(asegurado1==11) entra.open("alex11.txt"); if(asegurado1==12) entra.open("alex12.txt"); if(asegurado1==13) entra.open("alex13.txt"); if(asegurado1==14) entra.open("alex14.txt"); if(asegurado1==15) entra.open("alex15.txt"); entra>>sus; su=verificaralex(sus); while(su!='F') { sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "<<endl; entra>>sus; conteo++; trabaj++; if(trabaj==100) { cout<<" RECUPERANDO..."; trabaj=0; } su=verificaralex(sus); if(conteo==20000) { cout.flush(); clrscr(); cout<<endl<<endl<<"!!!PROBLEMAS LLAMAR TECNICO PULSE TECLA"; cout.flush(); getch(); cout<<"!!!PROBLEMAS LLAMAR TECNICO PULSE TECLA"; cout.flush(); getch(); return; } } sale<<"+++++"; sale.close(); entra.close(); problems='M'; dale=alexmira(); if(dale!='B') problems='s'; if(dale=='B') seguroalex(); if(problems!='s') { cout.flush(); clrscr(); cout<<endl<<endl; cout<<"SE HA RECUPERADO!!! EL ULTIMO ARCHIVO GUARDADO..."<<endl<<endl; cout<<"REVISE LAS ULTIMAS OPERACIONES."<<endl<<endl; cout<<"PULSE TECLA PARA CONTINUAR"; cout.flush(); getch(); } return; } void guardarlainfo() { char asegurado1; char asegurado2; ifstream clavein; char clave[10]; char clave1[70]; char clave2[70]; int conteo=0; int trabaj=0; char su; char sus[70]; ifstream entra; ofstream sale; cout.flush(); clrscr(); cout<<"INGRESE SU CLAVE..."; clave[0]=getch(); gotoxy(19,1); cout<<"X"; clave[1]=getch(); gotoxy(20,1); cout<<"X"; clave[2]=getch(); gotoxy(21,1); cout<<"X"; clave[3]=getch(); gotoxy(22,1); cout<<"X"; clavein.open("laclave.txt"); clavein>>clave1; clavein>>clave2; clavein.close(); if(clave1[9]==clave[0]) if(clave1[19]==clave[1]) if(clave1[29]==clave[2]) if(clave1[39]==clave[3]) goto buenaclaveg; if(clave2[9]==clave[0]) if(clave2[19]==clave[1]) if(clave2[29]==clave[2]) if(clave2[39]==clave[3]) goto buenaclaveg; return; buenaclaveg: cout.flush(); clrscr(); cout<<"INGRESE DISQUET PARA GUARDAR LA INFORMACION DE LOS PRODUCTOS"<<endl<<endl; cout<<"PULSE TECLA PARA CONTINUAR"; cout.flush(); getch(); sale.open("a:asegurado.txt"); entra.open("elseguro.txt"); entra>>asegurado1; entra>>asegurado2; sale<<asegurado1<<endl; sale<<asegurado2<<endl; sale.close(); entra.close(); sale.open("a:producto.txt"); entra.open("alex.txt"); entra>>sus; su=verificaralex(sus); while(su!='F') { sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "<<endl; entra>>sus; conteo++; trabaj++; if(trabaj==100) { cout<<" TRABAJANDO..."; trabaj=0; } su=verificaralex(sus); if(conteo==20000) { cout<<"!!!PROBLEMAS LLAMAR TECNICO PULSE TECLA"; cout.flush(); getch(); cout<<"!!!PROBLEMAS LLAMAR TECNICO PULSE TECLA"; cout.flush(); getch(); return; } } sale<<"+++++"; sale.close(); entra.close(); } void seguroalex() { char su; int contador=0; int elseguro; int cuantos; char sus[70]; ofstream salex1; ofstream salex; ifstream entralex; entralex.open("elseguro.txt"); entralex>>elseguro; entralex>>cuantos; entralex.close(); elseguro++; if(elseguro==15) elseguro=1; salex1.open("alexmira.txt"); if(elseguro==1) salex.open("alex1.txt"); if(elseguro==2) salex.open("alex2.txt"); if(elseguro==3) salex.open("alex3.txt"); if(elseguro==4) salex.open("alex4.txt"); if(elseguro==5) salex.open("alex5.txt"); if(elseguro==6) salex.open("alex6.txt"); if(elseguro==7) salex.open("alex7.txt"); if(elseguro==8) salex.open("alex8.txt"); if(elseguro==9) salex.open("alex9.txt"); if(elseguro==10) salex.open("alex10.txt"); if(elseguro==11) salex.open("alex11.txt"); if(elseguro==12) salex.open("alex12.txt"); if(elseguro==13) salex.open("alex13.txt"); if(elseguro==14) salex.open("alex14.txt"); if(elseguro==15) salex.open("alex15.txt"); entralex.open("alex.txt"); entralex>>sus; su=verificaralex(sus); while(su!='F') { salex<<sus<<" "; salex1<<sus<<" "; entralex>>sus; salex<<sus<<" "; salex1<<sus<<" "; entralex>>sus; salex<<sus<<" "; salex1<<sus<<" "; entralex>>sus; salex<<sus<<" "; salex1<<sus<<" "; entralex>>sus; salex<<sus<<" "; salex1<<sus<<" "; entralex>>sus; salex<<sus<<endl; salex1<<sus<<endl; entralex>>sus; contador++; su=verificaralex(sus); } salex<<endl<<"+++++"; salex1<<endl<<"+++++"; salex.close(); salex1.close(); entralex.close(); salex.open("elseguro.txt"); salex<<elseguro<<endl; salex<<contador; salex.close(); return; } char alexmira() { char su; int elseguro; int yuv; int cuantos; char sus[70]; ofstream salex; ifstream entralex; entralex.open("elseguro.txt"); entralex>>elseguro; entralex>>cuantos; entralex.close(); entralex.open("alex.txt"); for(yuv=0;yuv<cuantos;yuv++) { entralex>>sus; su=verificaralex(sus); if(su=='F') goto nadapaila; entralex>>sus; su=verificaralex(sus); if(su=='F') goto nadapaila; entralex>>sus; su=verificaralex(sus); if(su=='F') goto nadapaila; entralex>>sus; su=verificaralex(sus); if(su=='F') goto nadapaila; entralex>>sus; su=verificaralex(sus); if(su=='F') goto nadapaila; entralex>>sus; su=verificaralex(sus); if(su=='F') goto nadapaila; } entralex>>sus; su=verificaralex(sus); if(su!='F') { nadapaila: cout<<endl<<endl; cout<<"PILAS!! archivo da¤ado. Recupere en AVANZADO"<<endl; cout<<"mientras el problema no se solucione el programa le avisara"<<endl; cout<<"presione tecla para continuar"<<endl; cout.flush(); getch(); return 'M'; } return 'B'; } char verificaralex(char guia[70]) { if(guia[0]=='+') if(guia[1]=='+') if(guia[2]=='+') if(guia[3]=='+') if(guia[4]=='+') return 'F'; return 'N'; } Programa que permite ingresar datos a los inventarios #include<iostream.h> #include<conio.h> #include<string.h> #include<dos.h> #include<stdio.h> #include<fstream.h> struct nodo{ char codigo[10]; char nombre[50]; double preciocliente; double preciovecino; int cantidad; char ubicacion[4]; double precio; char iva; char fecha1[12]; char credito; char fecha2[12]; char provedor[5]; nodo *siguiente; }; class lista{ private: nodo *cabeza; public: lista(); void mostrar(nodo *&p); void destruir(int cont);/////////////////////////////////// void ubicar(nodo*&q,nodo*&p,char n[50],int cont); int iniciaralex(char archalex[10]); void char void consultar(int cont,char sus[50]); comono(int cont,char ri); consultar1(int cont,int drull); }; void marcia(); void losingresos(); void ingresar(); void cambilis(double reas); int primo1; int primo2; int primo3; char facata[12]; char detalles[40]; double tomax; void fecha(); void fecha1(); void cambiarfecha(); void imfecha(); void ingreso(); char codi[10][10]; char nomb[10][50]; char ingres; char menu(); void guardado(); char clavep(char z[12]); char clave2(char z[12]); char verificaralex(char guia[70]); char tads; void main() { lhdmmlc: char archalex[70]; char sw; ifstream entralex; ifstream ferew; ifstream fere; ifstream solo; ofstream salir; ofstream fare; ofstream farew; /* salir.open("numer1.txt"); salir<<0<<" "; salir<<0<<" "; salir.close(); salir.open("INVEN.txt"); salir<<"VENTA.FERRETERIA"; salir<<endl; salir.close(); */ int siza; int cont; int ww; int numer; int yes; double dess; double tias; double tia; double tios; double tioas; int dw; int dwr; char sus[50]; char elegido[50]; char maria[150]; char murcigay[40]; char a,t; lista x; fecha(); ingreso(); do{ { case'A': cont=0; cout.flush(); clrscr(); solo.open("numer1.txt"); solo>>numer; solo>>dess; solo.close(); solo.open("inven1.txt"); dess=0; tioas=0; solo>>maria; cout<<maria<<" fecha:"; cout<<facata<<" CAJA CANTIDAD "<<endl; for(yes=0;yes<numer;yes++) { solo>>maria; cout<<maria; solo>>tias; solo>>tios; cout<<" "; cout<<tios; if(tios<10) cout<<" "; if(tios<100) cout<<" "; cout<<" "; cout<<tias<<endl; tioas=tioas+tios; solo>>detalles; dess=0; } solo.close(); cout<<endl; if(ingres!='0') { cout<<"ESTOS DATOS YA FUERON INGRESADOS AL SISTEMA"<<endl; cout<<"INGRESE PALABRA NUEVO PARA INICIAR LISTA..."; cout.flush(); gets(murcigay); if(murcigay[0]=='N') if(murcigay[1]=='U') if(murcigay[2]=='E') if(murcigay[3]=='V') if(murcigay[4]=='O') { marcia(); goto lhdmmlc; } sus[0]='0'; } if(ingres=='0') { cout<<"OPCIONES...(NUEVA,BORRAR,ELI MINAR,FECHA,INGRESO)"<<endl; cout<<"Ingrese el nombre del producto.(de 0 para salir)..."; cout.flush(); gets(sus); } cout.flush(); clrscr(); tads='0'; switch(sus[0]) entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='A') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'B': if(sus[1]=='O') if(sus[2]=='R') if(sus[3]=='R') if(sus[4]=='A') if(sus[5]=='R') { fare.open("numer1.txt"); fare<<numer-1<<" "; fare<<0; fare.close(); fere.open("inven1.txt"); fare.open("inven11.txt"); fere>>sus; fare<<sus<<endl; for(dwr=0;dwr<numer-1;dwr++) { for(dw=0;dw<4;dw++) { fere>>sus; fare<<sus<<" "; } fare<<endl; } fare.close(); fere.close(); fere.open("inven11.txt"); fare.open("inven1.txt"); fere>>sus; fare<<sus<<endl; for(dwr=0;dwr<numer-1;dwr++) { for(dw=0;dw<4;dw++) { fere>>sus; fare<<sus<<" "; } fare<<endl; } fare.close(); fere.close(); break; } entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='B') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; solo>>maria; cout<<maria; solo>>tias; cout<<"..Cant."; cout<<tias; solo>>tios; cout<<"..Precio..$"; cout<<tios<<endl; tioas=tioas+tios; solo>>tia; dess=dess+tia; } entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='C') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; cout<<endl; cout<<"digite el codigo que desea case'C': eliminar..."; cout.flush(); gets(elegido); siza=0; fere.open("inven1.txt"); fare.open("inven11.txt"); fere>>sus; fare<<sus<<endl; for(dwr=0;dwr<numer;dwr++) { for(dw=0;dw<4;dw++) { fere>>sus; if(dw==0) { if(sus[0]==elegido[0]) if(sus[1]==elegido[1]) if(sus[2]==elegido[2]) if(sus[3]==elegido[3]) if(sus[4]==elegido[4]) if(sus[5]==elegido[5]) if(sus[6]==elegido[6]) { fere>>sus; fere>>sus; fere>>sus; dw=5; siza++; } } if(dw!=5) { fare<<sus<<" "; fare<<endl; } case'D': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='D') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'E': if(sus[1]=='L') if(sus[2]=='I') if(sus[3]=='M') if(sus[4]=='I') if(sus[5]=='N') { solo.open("numer1.txt"); solo>>numer; solo>>dess; solo.close(); solo.open("inven1.txt"); dess=0; tioas=0; solo>>maria; cout<<maria<<endl; for(yes=0;yes<numer;yes++) { } } if(siza!=0) { farew.open("numer1.txt"); farew<<numer-siza<<" "; farew<<0; farew.close(); siza=0; } fare.close(); fere.close(); fere.open("numer1.txt"); fere>>numer; fere>>dess; fere.close(); fere.open("inven11.txt"); fare.open("inven1.txt"); fere>>sus; fare<<sus<<endl; for(dwr=0;dwr<numer;dwr++) { for(dw=0;dw<4;dw++) { fere>>sus; fare<<sus<<" "; } fare<<endl; } fare.close(); fere.close(); break; { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; } entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='E') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'F': case'H': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='H') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'I': if(sus[1]=='E') if(sus[2]=='C') if(sus[3]=='H') if(sus[4]=='A') { cambiarfecha(); break; } entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='F') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; if(sus[1]=='N') if(sus[2]=='G') if(sus[3]=='R') if(sus[4]=='E') if(sus[5]=='S') if(sus[6]=='O') { losingresos(); break; } entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='I') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'G' : entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='G') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') case'J': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='J') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'N': if(sus[1]=='U') if(sus[2]=='E') if(sus[3]=='V') if(sus[4]=='A') { fare.open("numer1.txt"); fare<<0<<" "; fare<<0; fare.close(); fare.open("inven1.txt"); fare<<"INVENTARIOS "; fare.close(); break; } entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='N') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'K': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='K') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'L': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='L') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'O': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='O') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'M': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='M') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'P': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='P') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='T') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'Q': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='Q') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'U': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='U') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'R': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='R') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'V': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='V') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'S': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='S') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'T': case'W': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='W') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'X': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='X') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'Y': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='Y') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'Z': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='Z') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; } adioschao: sw='+'; }while(sus[0]!='0'); return; } void marcia() { char x; ofstream papa; ifstream entrada; entrada.open("inv1.txt"); entrada>>x; entrada.close(); if(x=='0') { cout.flush(); clrscr(); cout<<" LA LISTA DE ENTRADA AUN SE ENCUENTRA ESPERANDO INGRESO!!!!"<<endl; cout<<"PRESIONE TECLA PARA SALIR..."; cout.flush(); getch(); return; } papa.open("inv1.txt"); papa<<0<<endl<<endl; papa.close(); papa.open("inven1.txt"); papa<<"NUEVAS.COMPRAS"<<endl<<endl; papa.close(); papa.open("numer1.txt"); papa<<"0 0"<<endl<<endl; papa.close(); } void ingreso() { ifstream salia("inv1.txt"); salia>>ingres; salia.close(); } void cambiarfecha() { cout.flush(); clrscr(); char ranura[20]; cout<<"INGRESE LA FECHA ACTUAL..."; cout.flush(); gets(ranura); ranura[2]='/'; ranura[5]='/'; ranura[8]='\0'; for(int re=0;re<9;re++) { if(ranura[re]==' ') ranura[re]='0'; facata[re]=ranura[re]; } return; } void fecha() { ifstream entrada("fecha1.txt"); entrada>>facata; entrada.close(); return; } void cambilis(double reas) { primo1=0; primo2=0; primo3=0; while(reas>1000000) { reas=reas-1000000; primo1++; } while(reas>1000) { reas=reas-1000; primo2++; } while(reas>1) { reas=reas-1; primo3++; } primo3++; if(primo3==1000) { primo3=0; primo2++; if(primo2==1000) { primo2=0; primo1++; } } return; } void losingresos() { ifstream ferew; ifstream fere; ifstream solo; ofstream salir; ofstream fare; ofstream farew; int siza; int cont; int ww; int numer; int yes; double dess; double tias; double tia; double tios; double tioas; int dw; int dwr; char sus[50]; char elegido[50]; char maria[150]; char a,t; //lista x; fecha(); ingreso(); do{ // cont=0; cout.flush(); clrscr(); solo.open("numer1.txt"); solo>>numer; solo>>dess; solo.close(); solo.open("inven1.txt"); dess=0; tioas=0; solo>>maria; cout<<"INGRESO DE "<<maria<<" fecha:"; cout<<facata<<" CAJA CANTIDAD "<<endl; for(yes=0;yes<numer;yes++) { solo>>maria; cout<<maria; solo>>tias; solo>>tios; cout<<" "; cout<<tios; if(tios<10) cout<<" "; if(tios<100) cout<<" "; cout<<" "; cout<<tias<<endl; tioas=tioas+tios; solo>>detalles; dess=0; } solo.close(); cout<<endl; if(ingres!='0') { sus[0]='0'; } if(ingres=='0') { cout<<"REVISE SU LISTA. OPCIONES...(FINALIZAR, de 0 para salir)..."; cout.flush(); gets(sus); } cout.flush(); clrscr(); switch(sus[0]) { case'F': if(sus[1]=='I') if(sus[2]=='N') if(sus[3]=='A') if(sus[4]=='L') if(sus[5]=='I') if(sus[6]=='Z') if(sus[7]=='A') if(sus[8]=='R') { ingresar(); ingres='9'; break; } break; } }while(sus[0]!='0'); return; } void ingresar() { int nuez; ifstream trem("numer1.txt"); trem>>nuez; trem.close(); char codigo[70]; int cant; int caja; char deta[50]; ifstream entrada("inven1.txt"); ofstream salida("datos.txt",ios::app); entrada>>codigo; for(int ter=0;ter<nuez;ter++) { entrada>>codigo; entrada>>cant; entrada>>caja; entrada>>deta; salida<<codigo<<" "; salida<<cant<<" "; salida<<caja<<" "; salida<<deta<<endl; while(p->codigo[2]==cliente->codigo[2]) { } cout<<" "<<p->codigo<<"."<<p>nombre<<"..Cant."<<p->cantidad<<".."<<p>ubicacion<<endl; cout<<" $"<<p->preciovecino; if(p->preciovecino<100000) cout<<" "; if(p->preciovecino<10000) cout<<" "; if(p->preciovecino<1000) cout<<" "; if(p->preciovecino<100) cout<<" "; if(p->preciovecino<10) cout<<" "; cout<<" $"<<p->preciocliente; cout<<" -->"<<papo<<endl; for(int reas=0;reas<8;reas++) codi[papo][reas]=p->codigo[reas]; papo++; if(papo==10) { papo=0; cout<<"salir(PRESIONE +)/continuar(enter)/seleccione..."; cout.flush(); ri=getch(); ri=comono(cont,ri); cout.flush(); clrscr(); if(ri=='+') return; entrada.close(); salida.close(); ofstream salia("inv1.txt"); salia<<1; salia.close(); } void lista::ubicar(nodo*&q,nodo*&p,char n[50],int cont)///////////////////////////// { q=NULL; p=cabeza; for(int f=0;f<cont;f++) { if(n[0]>p->codigo[0]) { q=p; p=p->siguiente; } else break; } if(n[0]==p->codigo[0]) { for(int ry=f;ry<cont;ry++) { if(n[0]==p->codigo[0]&&n[1]>p->codigo[1]) { q=p; p=p->siguiente; } else break; } if(n[1]==p->codigo[1]) { for(int fab=ry;fab<cont;fab++) { if(n[1]==p->codigo[1]&&n[2]>p->codigo[2]) { q=p; p=p->siguiente; } else break; } } } } void guardado() { return; } void lista::consultar(int cont,char sus[50])/////////////////////////////////////// { char res; nodo *p,*q,*cliente; cliente=new nodo; int papo=0; for(int dd=0;dd<cont;dd++) cliente->codigo[dd]=sus[dd]; ubicar(q,p,cliente->codigo,cont); if(p->codigo[0]==cliente->codigo[0]) { if(p->codigo[1]==cliente->codigo[1]) { char ri; } p=p->siguiente; } } } if(papo!=0) { cout<<"salir(PRESIONE +)/continuar(enter)/seleccione..."; cout.flush(); res=getch(); res=comono(cont,res); cout.flush(); clrscr(); } return; } char lista::comono(int cont,char ri)/////////////////////////////////////// { switch(ri) { case '0': consultar1(cont,0); return '+'; break; case '1': consultar1(cont,1); return '+'; break; case '2': consultar1(cont,2); return '+'; break; case '3': consultar1(cont,3); return '+'; break; case '4': consultar1(cont,4); return '+'; break; case '5': consultar1(cont,5); return '+'; break; case '6': consultar1(cont,6); return '+'; break; case '7': consultar1(cont,7); return '+'; break; case '8': consultar1(cont,8); return '+'; break; case '9': consultar1(cont,9); return '+'; break; case '+': return '+'; break; } return 'N'; } void lista::consultar1(int cont,int drull)/////////////////////////////////////// { int arroz; cout.flush(); ofstream sale; clrscr(); nodo *p,*q,*cliente; cliente=new nodo; for(int dd=0;dd<8;dd++) cliente->nombre[dd]=codi[drull][dd]; ubicar(q,p,cliente->nombre,cont); if(p->codigo[1]==cliente->nombre[1]) { if(p->codigo[1]==cliente->nombre[1]) { char ri; while(p->codigo[2]==cliente->nombre[2]) { if(p->codigo[3]==cliente->nombre[3]) if(p->codigo[4]==cliente->nombre[4]) if(p->codigo[5]==cliente->nombre[5]) if(p->codigo[6]==cliente->nombre[6]) if(p->codigo[7]==cliente->nombre[7]) { ifstream entr; double cant; double toti; double numero; double descuento; double descu; tads='1'; cout<<" "<<p->codigo<<".."<<p>nombre<<"...precio..$"<<p->preciocliente<<endl; cout<<endl; cout<<"INGRESE EL NUMERO DE CAJA..."; cin>>toti; if(toti<1) return; cout<<"INGRESE LA CANTIDAD..."; cin>>cant; cout<<"INGRESE LA DETALLES..."; cout.flush(); gets(detalles); if(detalles[0]=='\0') { detalles[0]='?'; detalles[1]='?'; detalles[2]='?'; detalles[3]='\0'; } for(arroz=0;arroz<50;arroz++) { if(detalles[arroz]==' ') detalles[arroz]='.'; if(detalles[arroz]=='\0') break; cout<<" "; } if(cant==0) return; cout<<endl; descu=(1-(toti/(cant*p->preciocliente)))*100; entr.open("numer1.txt"); entr>>numero; entr>>descuento; entr.close(); sale.open("numer1.txt"); sale<<numero+1<<" "; sale<<((descuento*numero)+descu)/(numero+1); sale.close(); sale.open("inven1.txt",ios::app); sale<<p->codigo<<".."; sale<<p->nombre<<" "<<cant<<" "<<toti<<" "<<detalles<<endl; sale.close(); } p=p->siguiente; } } } } lista::lista()//////////////////////////////////////////////////////////////// { cabeza=NULL; } void lista::destruir(int cont)//////////////////////////////////////////////// { nodo *p; p=cabeza; for(int w=0;w<cont;w++) { cabeza=cabeza->siguiente; delete p; p=cabeza; } } char verificaralex(char guia[70]) { if(guia[0]=='+') if(guia[1]=='+') if(guia[2]=='+') if(guia[3]=='+') if(guia[4]=='+') return 'F'; return 'N'; } int lista::iniciaralex(char archalex[10])////////////////////////////////////// { nodo *p,*q,*nuevo; int cont; ifstream entrada(archalex); if(!entrada) { cout<<"llamar a juan"; cout.flush(); getch(); } entrada>>cont; cabeza=new nodo; entrada>>cabeza>codigo; entrada>>cabeza>nombre; private: nodo *cabeza; public: lista(); void mostrar(nodo *&p); void destruir(int cont);/////////////////////////////////// void ubicar(nodo*&q,nodo*&p,char n[50],int cont); void terminard(int cont); void terminar(int cont); entrada>>cabeza>preciocliente; entrada>>cabeza>preciovecino; entrada>>cabeza>cantidad; entrada>>cabeza>ubicacion;p=cabeza; nuevo=new nodo; for(int jav=1;jav<cont;jav++) { entrada>>nuevo>codigo; entrada>>nuevo>nombre; entrada>>nuevo>preciocliente; entrada>>nuevo>preciovecino; entrada>>nuevo>cantidad; entrada>>nuevo>ubicacion;p->siguiente=nuevo; nuevo=new nodo; p=p->siguiente; p->siguiente=NULL; } entrada.close(); return cont; } Generar listado general de precios y cantidades actualizadas #include<iostream.h> #include<conio.h> #include<string.h> #include<dos.h> #include<stdio.h> #include<fstream.h> struct nodo{ char codigo[10]; char nombre[50]; double preciocliente; double preciovecino; int cantidad; char ubicacion[3]; double precio; char iva; char fecha1[12]; char credito; char fecha2[12]; char provedor[5]; nodo *siguiente; }; class lista{ void void consultar(int cont,char sus[50]); consultar1(int cont,char sus[50]); }; char verificar(char guia[70]); char verificame(char guia[70]); char verific(char sus[10]); char clavep(char z[12]); char clave2(char z[12]); double buscapro(char codo[70]); void main() { ifstream entrada; ofstream salida; salida.open("datos.txt",ios::app); salida<<endl<<"FIN FIN FIN FIN FIN FIN"; salida.close(); ofstream papa("toditos.txt"); papa<<" LISTADO GENERAL"<<endl; papa<<" '''''''''''''''''"<<endl; papa<<"#CODIGO #NOMBRE $VENTA $COMPRA #CANT"<<endl; papa<<"''''''' ''''''''''' ''''''' ''''''' '''''''"<<endl; papa.close(); double tantosw; int cont; int ww; char su; char sus[50]; char a,t; cout.flush(); clrscr(); cout<<"PORFAVOR ESPERE MIENTRAS TERMINA LA TRANSFERENCIA..."<<endl; cout<<endl; cout<<endl; entrada.open("alex.txt"); papa.open("toditos.txt",ios::app); entrada>>sus; su=verificame(sus); while(su!='F') { tantosw=buscapro(sus); papa<<sus<<" "; entrada>>sus; papa<<sus<<" "; entrada>>sus; papa<<sus<<" "; if(sus[1]=='\0') { cout<<" "; goto uno; } if(sus[2]=='\0') { cout<<" "; goto uno; } if(sus[3]=='\0') { cout<<" "; goto uno; } if(sus[4]=='\0') { cout<<" "; goto uno; } if(sus[5]=='\0') { cout<<" "; goto uno; } if(sus[6]=='\0') { cout<<" "; goto uno; } uno: entrada>>sus; papa<<sus<<" "; if(sus[1]=='\0') { cout<<" "; goto uno1; } if(sus[2]=='\0') { cout<<" "; goto uno1; } if(sus[3]=='\0') { cout<<" "; goto uno1; } if(sus[4]=='\0') { cout<<" "; goto uno1; } if(sus[5]=='\0') { cout<<" "; goto uno1; } if(sus[6]=='\0') { cout<<" "; goto uno1; } uno1: papa<<tantosw<<endl; entrada>>sus; entrada>>sus; entrada>>sus; su=verificame(sus); } papa.close(); entrada.close(); } lista::lista()//////////////////////////////////////////////////////////////// { cabeza=NULL; } void lista::destruir(int cont)//////////////////////////////////////////////// { nodo *p; p=cabeza; for(int w=0;w<cont;w++) { cabeza=cabeza->siguiente; delete p; p=cabeza; } } char verific(char sus[10]) { if(sus[1]=='Z') if(sus[2]=='Z') if(sus[3]=='Z') return 'Z'; return 'N'; } double buscapro(char codo[70]) { char jiz1[70]; char sux; double mixq=0; double mixq1=0; ifstream enr; enr.open("datos.txt"); enr>>jiz1; sux=verificar(jiz1); while(sux!='F') { enr>>mixq1; if(codo[0]==jiz1[0]) if(codo[1]==jiz1[1]) if(codo[2]==jiz1[2]) if(codo[3]==jiz1[3]) if(codo[4]==jiz1[4]) if(codo[5]==jiz1[5]) if(codo[6]==jiz1[6]) mixq=mixq+mixq1; enr>>jiz1; enr>>jiz1; enr>>jiz1; sux=verificar(jiz1); } enr.close(); return mixq; } char verificar(char guia[70]) { if(guia[0]=='F') if(guia[1]=='I') if(guia[2]=='N') return 'F'; return 'N'; } char verificame(char guia[70]) { if(guia[0]=='+') if(guia[1]=='+') if(guia[2]=='+') if(guia[3]=='+') if(guia[4]=='+') return 'F'; return 'N'; } recuperacion del archivo de inventarios en caso de fallos del sistema #include<fstream.h> #include<iostream.h> #include<conio.h> #include<string.h> #include<dos.h> #include<stdio.h> void cambilis1(); void cambilviz1(); void cambilviz2(); int pati; char primid; int visual[20]; void camb(); void cambio(); char nombre[6]; void cambilis(char as); char camino(char a); char codigo1[10][60]; char detalles1[10][50]; int cantidad1[10]; int caja1[10]; void visualiza(); void sale(int cont); void patis(); char verify(char name[15]); char sd; int sped,sd1; char verificar(char codigo[50]); char codigo[60]; char detalles[50]; char facata[15]; int cantidad; int caja; void siguiente(char desido); void pedidout(char desido); char desido; void main() { ofstream salida1; ifstream entrada; char a; char as; char dansa[70]; cout.flush(); clrscr(); cout<<"DESEA RECUPERAR SEGURO!!!(S/N)"; cout.flush(); a=getch(); if(a=='n') return; if(a=='N') return; cout<<endl; cout<<endl; cout<<" ESTA SEGURO SEGURO!!!(S/N)"; cout.flush(); a=getch(); if(a=='n') return; if(a=='N') return; cout<<endl; cout<<endl; cout<<"Ingrese su nombre y hora del arreglo..."<<endl<<endl; cout.flush(); gets(dansa); salida1.open("salidas.txt",ios::app); salida1<<endl; salida1<<"REPARACION DE "<<dansa<<endl<<endl; salida1.close(); entrada.open("ndato.txt"); entrada>>as; entrada.close(); if(as!='2' && as!='3' && as!='4' && as!='5' && as!='6') { salida1.open("salidas.txt",ios::app); salida1<<endl; salida1<<"NO!! FUE POSIBLE REPARAR(LLAMAR A SOPORTE TECNICO)...presione tecla para salir"; cout<<endl; cout<<endl; cout<<"NO!! FUE POSIBLE REPARAR(LLAMAR A SOPORTE TECNICO)...presione tecla para salir"; cout.flush(); getch(); return; } cambilis(as); salida1.open("salida1.txt"); salida1<<endl; salida1<<"SE.HA.REALIZADO.RECUPERACION.SI.E S.NECESARIO.ACTUALICE 0 0 .................................................................."<<endl; salida1.close(); cout.flush(); clrscr(); cout<<endl; cout<<endl; cout<<"NO OLVIDE REVISAR EL HISTORICO DE COMPRAS PARA REANUDAR EL PROCESO"<<endl; cout<<" EN EL QUE SE ENCONTRABA ANTES DE LA FALLA. INGRESE DE NUEVO LAS"<<endl; cout<<"DESCARGAS QUE ESTAN JUSTO DESPUES DE LA ULTIMA COMPRA REGISTRADA."<<endl; cout<<"POR MOTIVO DE REPARACION! pulse tecla para salir..."; cout.flush(); getch(); return; } char verificar(char codigo[70]) { if(codigo[0]=='F') if(codigo[1]=='I') if(codigo[2]=='N') return 'F'; if(codigo[0]=='V') if(codigo[1]=='O') if(codigo[2]=='L') if(codigo[3]=='V') if(codigo[4]=='E') if(codigo[5]=='R') return 'V'; if(codigo[0]=='T') if(codigo[1]=='E') if(codigo[2]=='R') if(codigo[3]=='M') if(codigo[4]=='I') if(codigo[5]=='N') return 'E'; return 'N'; } void cambilis(char as) { char codig[70]; char detalle[70]; char cantida[20]; char caj[20]; char su='N'; ofstream salida; ofstream sali; ifstream entrada; salida.open("datos.txt"); sali.open("datos.txt"); switch(as) { case '2': entrada.open("datos6.txt"); break; case '3': entrada.open("datos2.txt"); break; case '4': entrada.open("datos3.txt"); break; case '5': entrada.open("datos4.txt"); break; case '6': entrada.open("datos5.txt"); break; } entrada>>codig; su=verificar(codig); while(su!='F') { entrada>>cantida; entrada>>caj; entrada>>detalle; salida<<codig<<" "; salida<<cantida<<" "; salida<<caj<<" "; salida<<detalle<<" "<<endl; sali<<codig<<" "; sali<<cantida<<" "; sali<<caj<<" "; sali<<detalle<<" "<<endl; entrada>>codig; su=verificar(codig); } sali<<endl; sali<<endl; sali<<"FIN FIN FIN FIN FIN"; salida<<endl; salida<<endl; salida<<"FIN FIN FIN FIN FIN"; salida.close(); sali.close(); entrada.close(); return; } programa para tranferencia de información si se utilizan 2 o mas computadoras #include<iostream.h> #include<conio.h> #include<string.h> #include<dos.h> #include<stdio.h> #include<fstream.h> struct producto{ char codigo[10]; char nombre[50]; double preciocliente; double preciovecino; double cantidad; char ubicacion[3]; double precio; char iva; char fecha1[12]; char credito; char fecha2[12]; char provedor[5]; }; producto escogido; producto nuevo; producto elimina; producto actualiza; char problems; char menu(); void actualizarpro(); void eliminarpro(); void menuavanzado(); void guardarlainfo(); void recuperasistem(); char alexmira(); void seguroalex(); void nuevoproducto(); char verificaralex(char guia[70]); double revisapreschar(); double revisacantchar(); char revisacodigo(char un[20]); char buscarunco(char un[20]); char buscarpro(char un[20]); void meternuevo(); void eliminarproducto(); void main() { ifstream entra; ofstream sale; char sus[70]; char su; cout.flush(); clrscr(); cout<<endl<<endl<<"INGRESE EL DISQUET CON LA INFORMACION Y PULSE ENTER..."; cout<<endl<<endl<<"SI DESEA SALIR Y ABORTAR EL PROCESO PULSE 0"; gotoxy(55,3); cout.flush(); su=getch(); if(su=='0') return; cout<<endl<<endl<<"TRABAJANDO!!!"; entra.open("a:producto.txt"); sale.open("alex.txt"); entra>>sus; su=verificaralex(sus); while(su!='F') { sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<" "; entra>>sus; sale<<sus<<endl; entra>>sus; su=verificaralex(sus); } sale<<"+++++"; entra.close(); sale.close(); seguroalex(); seguroalex(); } void seguroalex() { char su; int contador=0; int elseguro; int cuantos; char sus[70]; ofstream salex1; ofstream salex; ifstream entralex; entralex.open("elseguro.txt"); entralex>>elseguro; entralex>>cuantos; entralex.close(); elseguro++; if(elseguro==15) elseguro=1; salex1.open("alexmira.txt"); if(elseguro==1) salex.open("alex1.txt"); if(elseguro==2) salex.open("alex2.txt"); if(elseguro==3) salex.open("alex3.txt"); if(elseguro==4) salex.open("alex4.txt"); if(elseguro==5) salex.open("alex5.txt"); if(elseguro==6) salex.open("alex6.txt"); if(elseguro==7) salex.open("alex7.txt"); if(elseguro==8) salex.open("alex8.txt"); if(elseguro==9) salex.open("alex9.txt"); if(elseguro==10) salex.open("alex10.txt"); if(elseguro==11) salex.open("alex11.txt"); if(elseguro==12) salex.open("alex12.txt"); if(elseguro==13) salex.open("alex13.txt"); if(elseguro==14) salex.open("alex14.txt"); if(elseguro==15) salex.open("alex15.txt"); entralex.open("alex.txt"); entralex>>sus; su=verificaralex(sus); while(su!='F') { salex<<sus<<" "; salex1<<sus<<" "; entralex>>sus; salex<<sus<<" "; salex1<<sus<<" "; entralex>>sus; salex<<sus<<" "; salex1<<sus<<" "; entralex>>sus; salex<<sus<<" "; salex1<<sus<<" "; entralex>>sus; salex<<sus<<" "; salex1<<sus<<" "; entralex>>sus; salex<<sus<<endl; salex1<<sus<<endl; entralex>>sus; contador++; su=verificaralex(sus); } salex<<endl<<"+++++"; salex1<<endl<<"+++++"; salex.close(); salex1.close(); entralex.close(); salex.open("elseguro.txt"); salex<<elseguro<<endl; salex<<contador; salex.close(); return; } char verificaralex(char guia[70]) { if(guia[0]=='+') if(guia[1]=='+') if(guia[2]=='+') if(guia[3]=='+') if(guia[4]=='+') return 'F'; return 'N'; } programa para iniciar el sistema a la hora de la instalacion #include<iostream.h> #include<conio.h> #include<string.h> #include<dos.h> #include<stdio.h> #include<fstream.h> struct producto{ char codigo[10]; char nombre[50]; double preciocliente; double preciovecino; double cantidad; char ubicacion[3]; double precio; char iva; char fecha1[12]; char credito; char fecha2[12]; char provedor[5]; }; producto escogido; producto nuevo; producto elimina; producto actualiza; char problems; char menu(); void actualizarpro(); void eliminarpro(); void menuavanzado(); void guardarlainfo(); void recuperasistem(); char alexmira(); void seguroalex(); void nuevoproducto(); char verificaralex(char guia[70]); double revisapreschar(); double revisacantchar(); char revisacodigo(char un[20]); char buscarunco(char un[20]); char buscarpro(char un[20]); void meternuevo(); void eliminarproducto(); void main() { seguroalex(); } void seguroalex() { char su; int contador=0; int elseguro; int cuantos; char sus[70]; ofstream salex1; ofstream salex; ifstream entralex; entralex.open("elseguro.txt"); entralex>>elseguro; entralex>>cuantos; entralex.close(); elseguro++; if(elseguro==15) elseguro=1; salex1.open("alexmira.txt"); if(elseguro==1) salex.open("alex1.txt"); if(elseguro==2) salex.open("alex2.txt"); if(elseguro==3) salex.open("alex3.txt"); if(elseguro==4) salex.open("alex4.txt"); if(elseguro==5) salex.open("alex5.txt"); if(elseguro==6) salex.open("alex6.txt"); if(elseguro==7) salex.open("alex7.txt"); if(elseguro==8) salex.open("alex8.txt"); if(elseguro==9) salex.open("alex9.txt"); if(elseguro==10) salex.open("alex10.txt"); if(elseguro==11) salex.open("alex11.txt"); if(elseguro==12) salex.open("alex12.txt"); if(elseguro==13) salex.open("alex13.txt"); if(elseguro==14) salex.open("alex14.txt"); if(elseguro==15) salex.open("alex15.txt"); entralex.open("alex.txt"); entralex>>sus; su=verificaralex(sus); while(su!='F') { salex<<sus<<" "; salex1<<sus<<" "; entralex>>sus; salex<<sus<<" "; salex1<<sus<<" "; entralex>>sus; salex<<sus<<" "; salex1<<sus<<" "; entralex>>sus; salex<<sus<<" "; salex1<<sus<<" "; entralex>>sus; salex<<sus<<" "; salex1<<sus<<" "; entralex>>sus; salex<<sus<<endl; salex1<<sus<<endl; entralex>>sus; contador++; su=verificaralex(sus); } salex<<endl<<"+++++"; salex1<<endl<<"+++++"; salex.close(); salex1.close(); entralex.close(); salex.open("elseguro.txt"); salex<<elseguro<<endl; salex<<contador; salex.close(); return; } char verificaralex(char guia[70]) { if(guia[0]=='+') if(guia[1]=='+') if(guia[2]=='+') if(guia[3]=='+') if(guia[4]=='+') return 'F'; return 'N'; } programa para la facturación y verificasr los precios #include<iostream.h> #include<conio.h> #include<string.h> #include<dos.h> #include<stdio.h> #include<fstream.h> #include<stdlib.h> struct nodo{ char codigo[10]; char nombre[50]; double preciocliente; double preciovecino; int cantidad; char ubicacion[3]; double precio; char iva; char fecha1[12]; char credito; char fecha2[12]; char provedor[5]; nodo *siguiente; }; class lista{ private: nodo *cabeza; public: lista(); void mostrar(nodo *&p); void destruir(int cont);/////////////////////////////////// void ubicar(nodo*&q,nodo*&p,char n[50],int cont); int iniciaralex(char archalex[10]); void consultar(int cont,char sus[50]); char comono(int cont,char ri); void consultar1(int cont,int drull); }; void borraped(); void cambilis(double reas); char tads; double tads1; int primo1; int primo2; int primo3; char facata[12]; double tomax; void fecha(); void imfecha(); char codi[10][10]; char nomb[10][50]; char nombri[50]; void buscapro(char codo[10]); char verificaralex(char guia[70]); char verificar(char guia[70]); char menu(); void imprimir(); void imprimir1(); void imprimir2(); char clavep(char z[12]); char clave2(char z[12]); char verificaralex(char guia[70]); void inicial(); char casa(int cont1); char aumento(char abc); double revisapreschar(); double revisacantchar(); void main() { inicial(); char disque[70]; int ssl=0; char sqsq; ifstream entralex; ifstream ferew; ifstream fere; ifstream solo; ofstream salir; ofstream fare; ofstream farew; salir.open("pedido1.txt",ios::app); salir<<endl; salir<<"FIN FIN FIN "; salir.close(); salir.open("pedixdo.txt"); solo.open("pedido1.txt"); solo>>disque; sqsq='N'; sqsq=verificar(disque); while(sqsq!='F') { ssl++; salir<<disque<<" "; solo>>disque; salir<<disque<<endl; solo>>disque; sqsq=verificar(disque); } salir<<endl; salir<<"FIN FIN FIN"; solo.close(); salir.close(); solo.close(); solo.open("factuk.txt"); dess=0; tioas=0; solo>>maria; cout<<maria<<" fecha:"; fecha(); cout<<facata<<endl; for(yes=0;yes<numer;yes++) { solo>>maria; cout<<maria; solo>>tias; cout<<"Cant."; cout<<tias; solo>>tios; cout<<".Precio.$"; cout<<tios<<endl; tioas=tioas+tios; solo>>tia; dess=dess+tia; salir.open("pedido2.txt"); salir<<ssl; salir.close(); } if(numer>0) cout<<"TOTAL...$"<<tioas; if((dess-tioas)>0) cout<<" DESCUENTO..."<<(dess-tioas)/dess*100<<"%"; cout<<endl; solo.close(); cout<<endl; salir.open("pedido1.txt"); solo.open("pedixdo.txt"); solo>>disque; sqsq=verificar(disque); while(sqsq!='F') { salir<<disque<<" "; solo>>disque; salir<<disque<<endl; solo>>disque; sqsq=verificar(disque); } salir<<endl; solo.close(); salir.close(); salir.open("lasdehoy.txt"); salir<<endl; salir.close(); int siza; char mahoma2; int mahoma1; int cont; int ww; int numer; char lasde1[60]; int lasde2; int mahoma; int yes; double dess; double tias; double tia; double tios; double tioas; char sw; int dw; int dwr; char archalex[10]; char sus[50]; char elegido[50]; char maria[150]; char a,t; lista x; do{ cont=0; cout.flush(); clrscr(); solo.open("numerok.txt"); solo>>numer; solo>>dess; cout<<"OPCIONES...(NUEVA,BORRAR,ELI MINAR,FACTURA,COTIZA,REMISION,PEDIDO)"<<e ndl; cout<<"Ingrese el nombre del producto.(de 0 para salir)..."; cout.flush(); gets(sus); cout.flush(); clrscr(); tads='0'; switch(sus[0]) { case'A': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='A') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'B': if(sus[1]=='O') if(sus[2]=='R') if(sus[3]=='R') if(sus[4]=='A') if(sus[5]=='R') { fere.open("pedido2.txt"); fere>>mahoma; fere.close(); sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='B') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; if(mahoma<2) borraped(); if(mahoma>=2) { mahoma--; fare.open("pedido2.txt"); fare<<mahoma; fare.close(); fere.open("pedido1.txt"); fare.open("pedido3.txt"); for(dwr=0;dwr<mahoma;dwr++) { fere>>lasde1; fare<<lasde1<<" "; fere>>lasde2; fare<<lasde2<<endl; } fere.close(); fare.close(); case'C': if(sus[1]=='O') if(sus[2]=='T') if(sus[3]=='I') if(sus[4]=='Z') if(sus[5]=='A') { imprimir1(); fare.open("numerok.txt"); fare<<0<<" "; fare<<0; fare.close(); fare.open("factuk.txt"); fere.open("pedido3.txt"); fare.open("pedido1.txt"); for(dwr=0;dwr<mahoma;dwr++) { fere>>lasde1; fare<<lasde1<<" "; fere>>lasde2; fare<<lasde2<<endl; } fere.close(); fare.close(); } fare<<"FACTURACION/CONSULTAS"<<en dl; fare.open("numerok.txt"); fare<<numer-1<<" "; fare<<0; fare.close(); fere.open("factuk.txt"); fare.open("factu1k.txt"); fere>>sus; fare<<sus<<endl; for(dwr=0;dwr<numer-1;dwr++) { for(dw=0;dw<4;dw++) { fere>>sus; fare<<sus<<" "; } fare<<endl; } fare.close(); fere.close(); fere.open("factu1k.txt"); fare.open("factuk.txt"); fere>>sus; fare<<sus<<endl; for(dwr=0;dwr<numer-1;dwr++) { for(dw=0;dw<4;dw++) { fere>>sus; fare<<sus<<" "; } fare<<endl; } fare.close(); fere.close(); break; } entralex.open("alexarch.txt"); entralex>>archalex; fare.close(); fare.open("controlk.txt"); fare<<"1"; fare.close(); borraped(); break; } entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='C') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'D': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='D') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; { fare<<sus<<" "; fare<<endl; } } } if(siza!=0) { farew.open("numerok.txt"); farew<<numer-siza<<" "; farew<<0; farew.close(); siza=0; } case'E': if(sus[1]=='L') if(sus[2]=='I') if(sus[3]=='M') if(sus[4]=='I') if(sus[5]=='N') fare.close(); fere.close(); fere.open("numerok.txt"); fere>>numer; fere>>dess; fere.close(); { solo.open("numerok.txt"); solo>>numer; solo>>dess; solo.close(); solo.open("factuk.txt"); dess=0; tioas=0; solo>>maria; cout<<maria<<endl; for(yes=0;yes<numer;yes++) { solo>>maria; cout<<maria; solo>>tias; cout<<"..Cant."; cout<<tias; solo>>tios; cout<<"..Precio..$"; cout<<tios<<endl; tioas=tioas+tios; solo>>tia; dess=dess+tia; } fere.open("factu1k.txt"); fare.open("factuk.txt"); fere>>sus; fare<<sus<<endl; for(dwr=0;dwr<numer;dwr++) { for(dw=0;dw<4;dw++) { fere>>sus; fare<<sus<<" "; } fare<<endl; } fare.close(); fere.close(); break; } entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='E') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; cout<<endl; cout<<"digite el codigo que desea eliminar..."; cout.flush(); gets(elegido); siza=0; fere.open("factuk.txt"); fare.open("factu1k.txt"); fere>>sus; fare<<sus<<endl; for(dwr=0;dwr<numer;dwr++) { for(dw=0;dw<4;dw++) { fere>>sus; if(dw==0) { if(sus[0]==elegido[0]) if(sus[1]==elegido[1]) if(sus[2]==elegido[2]) if(sus[3]==elegido[3]) if(sus[4]==elegido[4]) if(sus[5]==elegido[5]) if(sus[6]==elegido[6]) { fere>>sus; fere>>sus; fere>>sus; dw=5; siza++; } } if(dw!=5) case'F': if(sus[1]=='A') if(sus[2]=='C') if(sus[3]=='T') if(sus[4]=='U') if(sus[5]=='R') { imprimir(); fare.open("numerok.txt"); fare<<0<<" "; fare<<0; fare.close(); fare.open("factuk.txt"); break; fare<<"FACTURACION/CONSULTAS"<<en case'I': dl; fare.close(); fare.open("controlk.txt"); fare<<"1"; fare.close(); borraped(); break; } entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='F') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='I') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'J': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='J') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'G' : entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='G') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'K': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='K') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'H': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='H') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); case'L': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='L') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='O') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'M': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='M') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'N': if(sus[1]=='U') if(sus[2]=='E') if(sus[3]=='V') if(sus[4]=='A') { fare.open("numerok.txt"); fare<<0<<" "; fare<<0; fare.close(); fare.open("factuk.txt"); case'P': if(sus[1]=='E') if(sus[2]=='D') if(sus[3]=='I') if(sus[4]=='D') if(sus[5]=='O') { fere.open("pedido2.txt"); fere>>mahoma; fere.close(); fere.open("pedido1.txt"); fare.open("pedidop.txt",ios::app); fare<<endl; for(dwr=0;dwr<mahoma;dwr++) { fere>>lasde1; fare<<lasde1<<" "; fere>>lasde2; fare<<lasde2<<endl; } fere.close(); fare.close(); fare<<"FACTURACION/CONSULTAS"<<en dl; borraped(); fare.close(); borraped(); break; } entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='N') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'O': cout<<endl<<endl<<endl; cout<<"....LISTO SU PEDIDO!!!!!"<<endl<<endl; cout<<" ...pulse tecla para continuar..."; cout.flush(); getch(); break; } entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='P') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'Q': goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'T': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='Q') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'R': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='T') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'U': if(sus[1]=='E') if(sus[2]=='M') if(sus[3]=='I') if(sus[4]=='S') if(sus[5]=='I') { imprimir2(); break; } entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='R') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='U') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'V': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='V') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'S': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='S') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); case'W': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='W') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'X': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='X') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'Y': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='Y') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; case'Z': entralex.open("alexarch.txt"); entralex>>archalex; sw=verificaralex(archalex); while(sw!='F') { if(archalex[0]=='Z') { cont=x.iniciaralex(archalex); x.consultar(cont,sus); x.destruir(cont); } if(tads!='0') { entralex.close(); goto adioschao; } entralex>>archalex; sw=verificaralex(archalex); } entralex.close(); break; } adioschao: sw='+'; }while(sus[0]!='0'); return; } void fecha() { ifstream entrada("fecha.txt"); entrada>>facata; entrada.close(); } void cambilis(double reas) { primo1=0; primo2=0; primo3=0; while(reas>1000000) { reas=reas-1000000; primo1++; } while(reas>1000) { reas=reas-1000; primo2++; } while(reas>1) { reas=reas-1; primo3++; } primo3++; if(primo3==1000) { primo3=0; primo2++; if(primo2==1000) { primo2=0; primo1++; } } return; } void buscapro(char codo[10]) { char jiz1[70]; char sux; double mixq=0; double mixq1=0; ifstream enr; enr.open("datos1.txt"); enr>>jiz1; sux=verificar(jiz1); while(sux!='F') { enr>>mixq1; if(codo[0]==jiz1[0]) if(codo[1]==jiz1[1]) if(codo[2]==jiz1[2]) if(codo[3]==jiz1[3]) if(codo[4]==jiz1[4]) if(codo[5]==jiz1[5]) if(codo[6]==jiz1[6]) mixq=mixq+mixq1; enr>>jiz1; enr>>jiz1; enr>>jiz1; sux=verificar(jiz1); } enr.close(); cout<<mixq; return; } void imfecha() { char estado='0'; char df='0'; char su='N'; char kk[10]; ifstream des; char guia1[50]; char guia2[50]; char nit[50]; int you; nuev: df='0'; cout.flush(); clrscr(); cout<<endl<<endl<<endl; cout<<"Si el cliente esta en archivo pulse la tecla (+) y de enter "<<endl<<endl; cout<<"Ingrese el nombre del cliente..."; cout.flush(); gets(nombri); if(nombri[0]!='+') df='1'; if(nombri[0]=='+') { estado='0'; des.open("clientes.txt"); cout<<endl<<"Ingrese las 3 primeras letras del nombre..."; cout.flush(); gets(kk); des>>guia1; su=verificar(guia1); while(su!='F') { des>>guia2; if(guia1[0]==kk[0]) if(guia1[1]==kk[1]) if(guia1[2]==kk[2]) { cout<<endl; cout<<guia1<<endl; cout<<guia2<<endl; cout<<"acepta el cliente (s/n)? ..."; su=getch(); if(su=='S') { for(you=0;you<40;you++) { nit[you]=guia2[you]; nombri[you]=guia1[you]; } df='1'; goto loca; } } des>>guia1; su=verificar(guia1); } des.close(); } if(df=='0') goto nuev; cout<<"Ingrese datos adicionales..."; cout.flush(); gets(nit); loca: for(int ui=0;ui<39;ui++) {if(nombri[ui]=='\0') {for(int uiy=ui;uiy<39;uiy++) nombri[uiy]=' '; } } nombri[39]='\0'; fstream cou; cou.open("LPT1",ios::out); cou<<nombri<<facata[0]<<facata[1]<<" "; cou<<facata[3]<<facata[4]<<" "<<facata[6]<<facata[7]; cou<<endl; cou<<nit<<endl; cou<<endl; cou<<endl; cou<<endl; cou.close(); } void imprimir2() { imfecha(); double numero; char uno[60]; double cant; double dess; double pres1; double pres2; double total1; double total2; fstream cou; int pi; int pe; int po; ifstream entrada; ofstream salida; cout.flush(); clrscr(); total1=0; total2=0; entrada.open("numerok.txt"); entrada>>numero; entrada>>dess; entrada.close(); entrada.open("factuk.txt"); cou.open("LPT1",ios::out); entrada>>uno; cout<<" "<<endl; cout<<" "<<endl; cout<<endl; cout<<endl; cou<<endl; cou<<endl; cou<<endl; for(pe=0;pe<numero;pe++) { entrada>>uno; entrada>>cant; entrada>>pres1; entrada>>pres2; for(pi=0;pi<55;pi++) { if(pi==6) { pi=pi+2; } if(uno[pi]=='\0') break; } cout<<cant; if(cant<1000) cout<<" "; if(cant<100) cout<<" "; if(cant<10) cout<<" "; cout<<" "; cou<<cant; if(cant<1000) cou<<" "; if(cant<100) cou<<" "; if(cant<10) cou<<" "; cou<<" "; for(pi=3;pi<41;pi++) { if(uno[pi]=='\0') { for(po=pi;po<40;po++) uno[po]='.'; uno[po]='\0'; } if(uno[pi]=='.') { cout<<" "; cou<<" "; } else { cout<<uno[pi]; cou<<uno[pi]; } } cout<<" "; if(pres1/cant<10000000) cout<<" "; if(pres1/cant<1000000) cout<<" "; if(pres1/cant<100000) cout<<" "; if(pres1/cant<10000) cout<<" "; if(pres1/cant<1000) cout<<" "; if(pres1/cant<100) cout<<" "; cout<<(pres1/cant); cou<<" "; if(pres1/cant<10000000) cou<<" "; if(pres1/cant<1000000) cou<<" "; if(pres1/cant<100000) cou<<" "; if(pres1/cant<10000) cou<<" "; if(pres1/cant<1000) cou<<" "; if(pres1/cant<100) cou<<" "; cou<<" "; if(pres1<100000000) cout<<" "; if(pres1<10000000) cout<<" "; if(pres1<1000000) cout<<" "; if(pres1<100000) cout<<" "; if(pres1<10000) cout<<" "; if(pres1<1000) cout<<" "; if(pres1<100) cout<<" "; cout<<pres1<<endl; if(pres1<100000000) cou<<" "; if(pres1<10000000) cou<<" "; if(pres1<1000000) cou<<" "; if(pres1<100000) cou<<" "; if(pres1<10000) cou<<" "; if(pres1<1000) cou<<" "; if(pres1<100) cou<<" "; cou<<endl; total1=total1+pres1; total2=total2+pres2; } while(numero<20) { cou<<endl; numero++; } cou.close(); entrada.close(); return; } void borraped() { ofstream rey; rey.open("pedido1.txt"); rey<<endl; rey.close(); rey.open("pedido2.txt"); rey<<"0"<<endl; rey.close(); } void imprimir1() { imfecha(); double numero; char uno[60]; double cant; double dess; double pres1; double pres2; double total1; double total2; fstream cou; int pi; int pe; int po; ifstream entrada; ofstream salida; cout.flush(); clrscr(); total1=0; total2=0; entrada.open("numerok.txt"); entrada>>numero; entrada>>dess; entrada.close(); salida.open("lasdehoy.txt",ios::app); entrada.open("factuk.txt"); cou.open("LPT1",ios::out); entrada>>uno; salida<<"NUEVA "<<facata<<endl; cout<<" "<<endl; cout<<" "<<endl; cout<<endl; cout<<endl; cou<<endl; cou<<endl; cou<<endl; for(pe=0;pe<numero;pe++) { entrada>>uno; entrada>>cant; entrada>>pres1; entrada>>pres2; for(pi=0;pi<55;pi++) { salida<<uno[pi]; if(pi==6) { salida<<" "; pi=pi+2; } if(uno[pi]=='\0') break; } salida<<" "; salida<<cant<<" "; salida<<pres1<<endl; cout<<cant; if(cant<1000) cout<<" "; if(cant<100) cout<<" "; if(cant<10) cout<<" "; cout<<" "; cou<<cant; if(cant<1000) cou<<" "; if(cant<100) cou<<" "; if(cant<10) cou<<" "; cou<<" "; for(pi=3;pi<40;pi++) { if(uno[pi]=='\0') { for(po=pi;po<39;po++) uno[po]='.'; uno[po]='\0'; } if(uno[pi]=='.') { cout<<" "; cou<<" "; } else { cout<<uno[pi]; cou<<uno[pi]; } } cout<<" "; if(pres1/cant<10000000) cout<<" "; if(pres1/cant<1000000) cout<<" "; if(pres1/cant<100000) cout<<" "; if(pres1/cant<10000) cout<<" "; if(pres1/cant<1000) cout<<" "; if(pres1/cant<100) cout<<" "; cout<<(pres1/cant); cou<<" "; if(pres1/cant<10000000) cou<<" "; if(pres1/cant<1000000) cou<<" "; if(pres1/cant<100000) cou<<" "; if(pres1/cant<10000) cou<<" "; if(pres1/cant<1000) cou<<" "; if(pres1/cant<100) cou<<" "; cou<<(pres1/cant); cou<<" "; if(pres1<100000000) cout<<" "; if(pres1<10000000) cout<<" "; if(pres1<1000000) cout<<" "; if(pres1<100000) cout<<" "; if(pres1<10000) cout<<" "; if(pres1<1000) cout<<" "; if(pres1<100) cout<<" "; cout<<pres1<<endl; if(pres1<100000000) cou<<" "; if(pres1<10000000) cou<<" "; if(pres1<1000000) cou<<" "; if(pres1<100000) cou<<" "; if(pres1<10000) cou<<" "; if(pres1<1000) cou<<" "; if(pres1<100) cou<<" "; cou<<pres1<<endl; total1=total1+pres1; total2=total2+pres2; } while(numero<20) { cou<<endl; numero++; } //cou.close(); cout<<endl; cout<<endl; //cout<<" DESCUENTO $"<<(total2total1)<<""<<endl; cout<<" TOTAL "<<total1<<endl; //cou<<" DESCUENTO $"<<(total2total1)<<""<<endl; if((total1-(total1*16/100))<100000000) cou<<" "; if((total1-(total1*16/100))<10000000) cou<<" "; if((total1-(total1*16/100))<1000000) cou<<" "; if((total1-(total1*16/100))<100000) cou<<" "; if((total1-(total1*16/100))<10000) cou<<" "; if((total1-(total1*16/100))<1000) cou<<" "; cou<<endl; cou<<endl; if(((total1*16/100))<100000000) cou<<" "; if(((total1*16/100))<10000000) cou<<" "; if((total1*16/100)<1000000) cou<<" "; if(((total1*16/100))<100000) cou<<" "; if(((total1*16/100))<10000) cou<<" "; if(((total1*16/100))<1000) cou<<" "; cou<<endl; cou<<endl; if(total1<100000000) cou<<" "; if(total1<10000000) cou<<" "; if(total1<1000000) cou<<" "; if(total1<100000) cou<<" "; if(total1<10000) cou<<" "; if(total1<1000) cou<<" "; cambilis(total1); if(total1>=1000000) { cou<<" "<<primo1<<"."; if(primo2<100) cou<<"0"; if(primo2<10) cou<<"0"; cou<<primo2<<"."; if(primo3<100) cou<<"0"; if(primo3<10) cou<<"0"; cou<<primo3<<endl; } if(total1<1000000) if(total1>=1000) { cou<<" "<<primo2<<"."; if(primo3<100) cou<<"0"; if(primo3<10) cou<<"0"; cou<<primo3<<endl; } if(total1<1000) { cou<<" "<<primo3<<endl; } cout.flush(); getch(); cou.close(); entrada.close(); salida.close(); return; } void imprimir() { imfecha(); double numero; char uno[60]; double cant; double dess; double pres1; double pres2; double total1; double total2; fstream cou; int pi; int pe; int po; ifstream entrada; ofstream salida; cout.flush(); clrscr(); total1=0; total2=0; entrada.open("numerok.txt"); entrada>>numero; entrada>>dess; entrada.close(); salida.open("lasdehoy.txt",ios::app); entrada.open("factuk.txt"); cou.open("LPT1",ios::out); entrada>>uno; salida<<"NUEVA "<<facata<<endl; cout<<" "<<endl; cout<<" "<<endl; cout<<endl; cout<<endl; cou<<endl; cou<<endl; cou<<endl; for(pe=0;pe<numero;pe++) { entrada>>uno; entrada>>cant; entrada>>pres1; entrada>>pres2; for(pi=0;pi<55;pi++) { salida<<uno[pi]; if(pi==6) { salida<<" "; pi=pi+2; } if(uno[pi]=='\0') break; } salida<<" "; salida<<cant<<" "; salida<<pres1<<endl; cout<<cant; if(cant<1000) cout<<" "; if(cant<100) cout<<" "; if(cant<10) cout<<" "; cout<<" "; cou<<cant; if(cant<1000) cou<<" "; if(cant<100) cou<<" "; if(cant<10) cou<<" "; cou<<" "; for(pi=3;pi<40;pi++) { if(uno[pi]=='\0') { for(po=pi;po<39;po++) uno[po]='.'; uno[po]='\0'; } if(uno[pi]=='.') { cout<<" "; cou<<" "; } else { cout<<uno[pi]; cou<<uno[pi]; } } cout<<" "; if(pres1/cant<10000000) cout<<" "; if(pres1/cant<1000000) cout<<" "; if(pres1/cant<100000) cout<<" "; if(pres1/cant<10000) cout<<" "; if(pres1/cant<1000) cout<<" "; if(pres1/cant<100) cout<<" "; cout<<(pres1/cant); cou<<" "; if(pres1/cant<10000000) cou<<" "; if(pres1/cant<1000000) cou<<" "; if(pres1/cant<100000) cou<<" "; if(pres1/cant<10000) cou<<" "; if(pres1/cant<1000) cou<<" "; if(pres1/cant<100) cou<<" "; cou<<(pres1/cant); cou<<" "; if(pres1<100000000) cout<<" "; if(pres1<10000000) cout<<" "; if(pres1<1000000) cout<<" "; if(pres1<100000) cout<<" "; if(pres1<10000) cout<<" "; if(pres1<1000) cout<<" "; if(pres1<100) cout<<" "; cout<<pres1<<endl; if(pres1<100000000) cou<<" "; if(pres1<10000000) cou<<" "; if(pres1<1000000) cou<<" "; if(pres1<100000) cou<<" "; if(pres1<10000) cou<<" "; if(pres1<1000) cou<<" "; if(pres1<100) cou<<" "; cou<<pres1<<endl; total1=total1+pres1; total2=total2+pres2; } while(numero<20) { cou<<endl; numero++; } //cou.close(); cout<<endl; cout<<endl; //cout<<" DESCUENTO $"<<(total2total1)<<""<<endl; cout<<" "<<total1(total1*16/100)<<endl; cout<<" "<<(total1*16/100)<<endl; cout<<" "<<total1<<endl; //cou<<" DESCUENTO $"<<(total2total1)<<""<<endl; tomax=total1/1.16; if(tomax<100000000) cou<<" "; if(tomax<10000000) cou<<" "; if(tomax<1000000) cou<<" "; if(tomax<100000) cou<<" "; if(tomax<10000) cou<<" "; if(tomax<1000) cou<<" "; cambilis(tomax); if(tomax>=1000000) { cou<<" "<<primo1<<"."; if(primo2<100) cou<<"0"; if(primo2<10) cou<<"0"; cou<<primo2<<"."; if(primo3<100) cou<<"0"; if(primo3<10) cou<<"0"; cou<<primo3<<endl; } if(tomax<1000000) if(tomax>=1000) { cou<<" "<<primo2<<"."; if(primo3<100) cou<<"0"; if(primo3<10) cou<<"0"; cou<<primo3<<endl; } if(tomax<1000) { cou<<" "<<primo3<<endl; } cou<<endl; tomax=total1-(total1/1.16); if(tomax<100000000) cou<<" "; if(tomax<10000000) cou<<" "; if(tomax<1000000) cou<<" "; if(tomax<100000) cou<<" "; if(tomax<10000) cou<<" "; if(tomax<1000) cou<<" "; cambilis(tomax); if(tomax>=1000000) { cou<<" "<<primo1<<"."; if(primo2<100) cou<<"0"; if(primo2<10) cou<<"0"; cou<<primo2<<"."; if(primo3<100) cou<<"0"; if(primo3<10) cou<<"0"; cou<<primo3<<endl; } if(tomax<1000000) if(tomax>=1000) { cou<<" "<<primo2<<"."; if(primo3<100) cou<<"0"; if(primo3<10) cou<<"0"; cou<<primo3<<endl; } if(tomax<1000) { cou<<" "<<primo3<<endl; } cou<<endl; if(total1<100000000) cou<<" "; if(total1<10000000) cou<<" "; if(total1<1000000) cou<<" "; if(total1<100000) cou<<" "; if(total1<10000) cou<<" "; if(total1<1000) cou<<" "; cambilis(total1); if(total1>=1000000) { cou<<" "<<primo1<<"."; if(primo2<100) cou<<"0"; if(primo2<10) cou<<"0"; cou<<primo2<<"."; if(primo3<100) cou<<"0"; if(primo3<10) cou<<"0"; cou<<primo3<<endl; } if(total1<1000000) if(total1>=1000) { cou<<" "<<primo2<<"."; if(primo3<100) cou<<"0"; if(primo3<10) cou<<"0"; cou<<primo3<<endl; } if(total1<1000) { cou<<" "<<primo3<<endl; } cout.flush(); getch(); cou.close(); entrada.close(); salida.close(); return; } void lista::ubicar(nodo*&q,nodo*&p,char n[50],int cont)///////////////////////////// { q=NULL; p=cabeza; for(int f=0;f<cont;f++) { if(n[0]>p->codigo[0]) { q=p; p=p->siguiente; } else break; } if(n[0]==p->codigo[0]) { for(int ry=f;ry<cont;ry++) { if(n[0]==p->codigo[0]&&n[1]>p->codigo[1]) { q=p; p=p->siguiente; } else break; } if(n[1]==p->codigo[1]) { for(int fab=ry;fab<cont;fab++) { if(n[1]==p->codigo[1]&&n[2]>p->codigo[2]) { q=p; p=p->siguiente; } else break; } } } } void lista::consultar(int cont,char sus[50])/////////////////////////////////////// { char res; nodo *p,*q,*cliente; cliente=new nodo; int papo=0; for(int dd=0;dd<cont;dd++) cliente->codigo[dd]=sus[dd]; ubicar(q,p,cliente->codigo,cont); if(p->codigo[0]==cliente->codigo[0]) { if(p->codigo[1]==cliente->codigo[1]) { char ri; while(p->codigo[2]==cliente->codigo[2]) { cout<<" "<<p->codigo<<"."<<p->nombre<<" Ub."<<p>ubicacion<<endl; cout<<" $"<<p->preciovecino; if(p->preciovecino<100000) cout<<" "; if(p->preciovecino<10000) cout<<" "; if(p->preciovecino<1000) cout<<" "; if(p->preciovecino<100) cout<<" "; if(p->preciovecino<10) cout<<" "; cout<<" $"<<p->preciocliente; cout<<" -->"<<papo<<endl; for(int reas=0;reas<8;reas++) codi[papo][reas]=p->codigo[reas]; papo++; if(papo==10) { papo=0; cout<<"salir(PRESIONE +)/continuar(enter)/seleccione..."; cout.flush(); ri=getch(); ri=comono(cont,ri); cout.flush(); clrscr(); if(ri=='+') return; } p=p->siguiente; } } } if(papo!=0) { cout<<"salir(PRESIONE +)/continuar(enter)/seleccione..."; cout.flush(); res=getch(); res=comono(cont,res); cout.flush(); clrscr(); } return; } char lista::comono(int cont,char ri)/////////////////////////////////////// { switch(ri) { case '0': consultar1(cont,0); return '+'; break; case '1': consultar1(cont,1); return '+'; break; case '2': consultar1(cont,2); return '+'; break; case '3': consultar1(cont,3); return '+'; break; case '4': consultar1(cont,4); return '+'; break; case '5': consultar1(cont,5); return '+'; break; case '6': consultar1(cont,6); return '+'; break; case '7': consultar1(cont,7); return '+'; break; case '8': consultar1(cont,8); return '+'; break; case '9': consultar1(cont,9); return '+'; break; case '+': return '+'; break; } return 'N'; } void lista::consultar1(int cont,int drull)/////////////////////////////////////// { char preschar[20]; char cantchar[20]; ofstream pasout; ifstream pasoin; int tan=0; int wqe; ofstream sale; cout.flush(); clrscr(); nodo *p,*q,*cliente; cliente=new nodo; for(int dd=0;dd<8;dd++) cliente->nombre[dd]=codi[drull][dd]; ubicar(q,p,cliente->nombre,cont); if(p->codigo[1]==cliente->nombre[1]) { if(p->codigo[1]==cliente->nombre[1]) { char ri; while(p->codigo[2]==cliente->nombre[2]) { if(p->codigo[3]==cliente->nombre[3]) if(p->codigo[4]==cliente->nombre[4]) if(p->codigo[5]==cliente->nombre[5]) if(p->codigo[6]==cliente->nombre[6]) if(p->codigo[7]==cliente->nombre[7]) { ifstream entr; double cant; double toti; double numero; double numero12; double descuento; double descu; if(p->codigo[0]=='N') if(p->codigo[1]=='A') if(p->codigo[2]=='D') if(p->codigo[3]=='A') { tan=8; cout<<"Ingrese el nombre del producto..."; cout.flush(); gets(p->nombre); cout<<endl; for(wqe=0;wqe<50;wqe++) { if(p->nombre[wqe]==' ') p->nombre[wqe]='.'; if(p->nombre[wqe]=='\0') p->nombre[wqe]='.'; } p->nombre[45]='\0'; } cout<<" "<<p->codigo<<".."<<p>nombre<<"...precio..$"; if(tan==8) cout<<" "<<endl; if(tan==0) cout<<p->preciocliente<<endl; cout<<endl; tads='1'; cout<<"Cantidad en existencia..."; buscapro(p->codigo); cout<<endl; cout<<endl; cout<<"Cual es la cantidad a vender..."; cout.flush(); gets(cantchar); pasout.open("cantchar.txt"); pasout<<cantchar; pasout.close(); cant=revisacantchar(); if(cant==0) return; cout<<"....precio venta unitario..."; cout.flush(); gets(preschar); pasout.open("preschar.txt"); pasout<<preschar; pasout.close(); toti=revisapreschar(); if(tan==8) p->preciovecino=toti; if(tan!=8) if(toti<p->preciovecino*3/4) toti=0; if(toti>p->preciovecino*9) toti=0; toti=toti*cant; if(toti==0) return; cout<<endl; cout<<" "<<p->codigo<<".."<<p>nombre<<"Cant."<<cant<<".unidad..$"<<toti/cant<<e ndl; cout<<endl; cout<<"precio total...$"<<toti<<"...."<<endl; descu=(1-(toti/(cant*p->preciocliente)))*100; if(tan==8) descu=0; if(descu>0) cout<<"DESCUENTO.."<<descu<<"%"; } } lista::lista()//////////////////////////////////////////////////////////////// { cabeza=NULL; } void lista::destruir(int cont)//////////////////////////////////////////////// { nodo *p; p=cabeza; for(int w=0;w<cont;w++) { cabeza=cabeza->siguiente; delete p; p=cabeza; } } int lista::iniciaralex(char archalex[10])////////////////////////////////////// { nodo *p,*q,*nuevo; int cont; ifstream entrada(archalex); if(!entrada) { cout<<"llamar a juan"; cout.flush(); getch(); } entrada>>cont; cabeza=new nodo; entrada>>cabeza>codigo; entrada>>cabeza>nombre; entrada>>cabeza>preciocliente; entrada>>cabeza>preciovecino; entrada>>cabeza- entr.open("numerok.txt"); entr>>numero; entr>>descuento; entr.close(); sale.open("numerok.txt"); sale<<numero+1<<" "; sale<<((descuento*numero)+descu)/(numero+1); sale.close(); sale.open("factuk.txt",ios::app); sale<<p->codigo<<".."; sale<<p->nombre<<" "<<cant<<" "<<toti<<" "<<cant*p->preciocliente<<endl; sale.close(); entr.open("pedido2.txt"); entr>>numero12; entr.close(); sale.open("pedido2.txt"); sale<<numero12+1<<" "; sale.close(); sale.open("pedido1.txt",ios::app); sale<<p->codigo<<".."; sale<<p->nombre<<" "<<cant<<endl; sale.close(); cout.flush(); getch(); } p=p->siguiente; } } >cantidad; entrada>>cabeza>ubicacion;p=cabeza; nuevo=new nodo; for(int jav=1;jav<cont;jav++) { entrada>>nuevo>codigo; entrada>>nuevo>nombre; entrada>>nuevo>preciocliente; entrada>>nuevo>preciovecino; entrada>>nuevo>cantidad; entrada>>nuevo>ubicacion;p->siguiente=nuevo; nuevo=new nodo; p=p->siguiente; p->siguiente=NULL; } entrada.close(); return cont; } char verificar(char guia[70]) { if(guia[0]=='F') if(guia[1]=='I') if(guia[2]=='N') return 'F'; return 'N'; } char verificaralex(char guia[70]) { if(guia[0]=='+') if(guia[1]=='+') if(guia[2]=='+') if(guia[3]=='+') if(guia[4]=='+') return 'F'; return 'N'; } void inicial() { char abc; char archiv[10]; char su; ofstream salida; ofstream salida2; ifstream entrada; int cont0; int cont; int cont1; int ww; char sus[70]; char a,t; cout.flush(); clrscr(); cout<<"PORFAVOR ESPERE MIENTRAS TERMINA LA TRANSFERENCIA..."<<endl; cout<<endl; cout<<endl; archiv[2]='.'; archiv[3]='t'; archiv[4]='x'; archiv[5]='t'; archiv[6]='\0'; salida2.open("alexarch.txt"); cont=0; cont1=0; entrada.open("alex.txt"); entrada>>sus; su=verificaralex(sus); abc='A'; while(su!='F') { again: if(sus[0]!=abc) { abc=aumento(abc); su=verificaralex(sus); if(su=='F') goto sale; goto again; } if(abc=='0') goto sale; if(sus[0]==abc) { archiv[0]=abc; archiv[1]=casa(cont1); salida.open(archiv); salida<<75<<endl; while(sus[0]==abc) { salida<<sus<<" "; entrada>>sus; salida<<sus<<" "; entrada>>sus; salida<<sus<<" "; entrada>>sus; salida<<sus<<" "; entrada>>sus; salida<<sus<<" "; entrada>>sus; salida<<sus<<endl; cont++; entrada>>sus; if(cont==75) { cont=0; cont1++; salida2<<archiv<<endl; archiv[1]=casa(cont1); salida.close(); salida.open(archiv); salida<<75<<endl; } if(sus[0]!=abc) { for(cont0=0;cont0<75;cont0++) { salida<<"ZZZZZZZ 1 2 3 4 5"<<endl; } salida2<<archiv<<endl; salida.close(); cont1=0; cont=0; abc=aumento(abc); archiv[0]=abc; goto again; } su=verificaralex(sus); if(su=='F') goto sale; } salida2<<archiv<<endl; salida.close(); } } sale: salida2<<"+++++"; salida.close(); salida2.close(); entrada.close(); } char casa(int cont1) { if(cont1==0) return'0'; if(cont1==1) return'1'; if(cont1==2) return'2'; if(cont1==3) return'3'; if(cont1==4) return'4'; if(cont1==5) return'5'; if(cont1==6) return'6'; if(cont1==7) return'7'; if(cont1==8) return'8'; if(cont1==9) return'9'; } char aumento(char abc) { if(abc=='A') return 'B'; if(abc=='B') return 'C'; if(abc=='C') return 'D'; if(abc=='D') return 'E'; if(abc=='E') return 'F'; if(abc=='F') return 'G'; if(abc=='G') return 'H'; if(abc=='H') return 'I'; if(abc=='I') return 'J'; if(abc=='J') return 'K'; if(abc=='K') return 'L'; if(abc=='L') return 'M'; if(abc=='M') return 'N'; if(abc=='N') return 'O'; if(abc=='O') return 'P'; if(abc=='P') return 'Q'; if(abc=='Q') return 'R'; if(abc=='R') return 'S'; if(abc=='S') return 'T'; if(abc=='T') return 'U'; if(abc=='U') return 'V'; if(abc=='V') return 'W'; if(abc=='W') return 'X'; if(abc=='X') return 'Y'; if(abc=='Y') return 'Z'; if(abc=='Z') return '0'; return '0'; } double revisacantchar() { int pra; char elchar[20]; double estesi; ifstream pasoin; pasoin.open("cantchar.txt"); pasoin>>elchar; pasoin.close(); if(elchar[0]=='0') return 0; if(elchar[0]=='\0') { cout<<"no es numero"; cout.flush(); getch(); return 0; } if(elchar[0]!='1' && elchar[0]!='2' && elchar[0]!='3' && elchar[0]!='4' && elchar[0]!='5' && elchar[0]!='6' && elchar[0]!='7' && elchar[0]!='8' && elchar[0]!='9') { cout<<"no es numero"; cout.flush(); getch(); return 0; } for(pra=0;pra<20;pra++) { if(elchar[pra]!='0' && elchar[pra]!='1' && elchar[pra]!='2' && elchar[pra]!='3' && elchar[pra]!='4' && elchar[pra]!='5' && elchar[pra]!='6' && elchar[pra]!='7' && elchar[pra]!='8' && elchar[pra]!='9') { if(elchar[pra]=='\0') { pasoin.open("cantchar.txt"); pasoin>>estesi; pasoin.close(); return estesi; } else { cout<<"no es numero"; cout.flush(); getch(); return 0; } } } return 0; } double revisapreschar() { int pra; char elchar[20]; double estesi; ifstream pasoin; pasoin.open("preschar.txt"); pasoin>>elchar; pasoin.close(); if(elchar[0]=='0') return 0; if(elchar[0]=='\0') { cout<<"no es numero"; cout.flush(); getch(); return 0; } if(elchar[0]!='1' && elchar[0]!='2' && elchar[0]!='3' && elchar[0]!='4' && elchar[0]!='5' && elchar[0]!='6' && elchar[0]!='7' && elchar[0]!='8' && elchar[0]!='9') { cout<<"no es numero"; cout.flush(); getch(); return 0; } for(pra=0;pra<20;pra++) { if(elchar[pra]!='0' && elchar[pra]!='1' && elchar[pra]!='2' && elchar[pra]!='3' && elchar[pra]!='4' && elchar[pra]!='5' && elchar[pra]!='6' && elchar[pra]!='7' && elchar[pra]!='8' && elchar[pra]!='9') { if(elchar[pra]=='\0') { pasoin.open("preschar.txt"); pasoin>>estesi; pasoin.close(); return estesi; } else { cout<<"no es numero"; cout.flush(); getch(); return 0;}}}return 0;} 22. LABORATORIO DE DISEÑO JERINGA INDUSTRIAL ESTRUCTURA DE SOPORTE DEL DOSIFICADOR ACOPLE AL PISTON ACOPLE DE EMPUJE DEL LÍQUIDO PISTON DE DOBLE VASTAGO PARA EL SENSADO RACOR NORMA AMERICANA 6mm VASTAGO DELGADO TRACERO DE SENSADO TALLER DE MECANIZADO DE PIEZAS MODELO A ESCALA SISTEMA DE SELLADO HORIZONTAL SISTEMA COMERCIAL DE SELLADO HORIZONTAL SELLADORA VERTICAL RESISTENCIA DE SELLADO INCRUSTADAS EN LAS MORDAZAS DE BRONCE TANQUE DE ALMACENAMIENTO DOSIFICADOR SISTEMA CHEQUE-CHEQUE CON 2 TIPOS DE CHEQUE DISTINTO ACONDICIONAMIENTO PARA MOTORES ACTUADORES DE VALVULAS VALVULA DE CORTINA CON ACOPLE AL MOTOR ELECTROVALVULA PARA PASO DE FLUIDO ELECTROVALVULA PARA AIRE 3/2 DE 120VAC PIROMETRO ECONOMICO SISTEMA DE CONTROL DOSIFICADOR SIN PC (PRODUCTO INDEPENDIENTE) PIROMETRO DE CONTROL CONTROLADOR DE VOLTAJE AC PARA RESISTENCIAS SELLADORAS PC DE CONTROL PARA PC INTERFASES DE POTENSIA 23. CONCLUSIONES Con este proyecto se pudo entender y dar a conocer en que consiste un dosificador de líquidos alimenticios, proporcionando una solucion eficiente y eficaz a los problemas que presenta hoy día la industria en Colombia. Cada una de las soluciones planteadas en cada uno de los aspectos, refleja un grado de investigación a nivel de ingeniería que debe esperarse en el desarrollo de un proyecto de nivel industrial con el cual los interesados buscan soluciones factibles. La implementación de sistemas de cómputo en el ámbito industrial es una ficha clave en la comercialización de un producto. La pequeña y mediana industria del país aunque busca la automatización de algunos de sus procesos ve lejana la implementación de control por computadora que a su vez le ayude en sus procesos de organización interna de producción y manejo de la materia prima. Es este un punto clave con que cuenta el proyecto presentado ya que al realizar reingeniería en la utilización de tecnología como las computadoras de bajo nivel para el desarrollo de los puntos tratados el empresario se ve motivado a incursionar con el producto ofrecido y a su vez al diseñador no representa mas que un producto agregado de costos despreciables dado que el desarrollo de software no implican ningún tipo de inversión y si hace mas llamativo un producto. El uso de la electrónica se hace hoy día necesaria dada la economía que ella nos brinda en las etapas de control. El conocimiento en los aspectos de neumática e hidráulica es básico para el diseño de sistemas industriales. Y de igual forma la interacción entre esta electrónica de control y el manejo de de sistemas automáticos es el beneficio claro que pudo ser evidenciado en el desarrollo de este proyecto. Es de suma importancia parámetros alternos como normatividad y recomendaciones que se tienen que tener en cuenta para la elaboración de un proyecto de carácter industrial, asi como normas en cuanto a seguridad industrial. Esto nos permite ver que la parte técnica-teórica de diseño no es suficiente ya que un desarrollo de esta categoría requiere del conocimiento de una serie de aspectos legales que poseen un grado de importancia bastante considerable y no pueden ser dejados fuera de vista a la hora de cotizar un proyecto. La investigación realizada y el trabajo hecho han permitido evidenciar la alta gama de productos, tecnologías y profesionales expertos que se reúnen en torno al tema de la automatización industrial referente al empacado, dosificado, control de calidad, accesorios, materiales, consultorías y todo el entorno en el que se desenvuelve este amplio desarrollo. La exigencia es cada vez más alta y aunque se han desarrollado ciertos estándares en cuanto a sistemas de producción la competencia es cada vez más alta. Hoy día se evidencia como todos los productos de consumo masivo son empacados y así mismo podemos ver como toda esta producción y desarrollo gira en torno a la productividad que cada vez exige estándares de calidad más altos. Los sistemas de información se hacen hoy día mas necesarios ya que el control de producciones elevadas no es de fácil manejo y es por esto que no solo mecanismos eficientes y eficaces son la necesidad sino que también la industria exige una adecuada monitorización y supervisión de los procesos, a su vez con entornos cada vez mas amigables a las necesidades del empresario que nos plantea la industria actual. En nuestro caso se genero más que un producto de alta tecnología, una ayuda practica y económica que permitirá el desarrollo de la industria del país y especialmente de la pequeña industria que abarca la mayor parte de la producción nacional. El proyecto permitió observar que la industria colombiana se encuentra con muchas desventajas ya que no existe la tecnología de desarrollo que puede evidenciarse en maquinas europeas y estadounidenses y aunque encontramos muchas soluciones ya desarrolladas son los acabados un claro ejemplo de las capacidades de nuestro entorno. Aunque no desmerita el hecho que si bien las maquinas nacionales no presentan la calidad de la maquinaria internacional, están avanzando en sus desarrollos y evidentemente están dando igualmente solución a muchas de las necesidades que el país presenta. Nos damos cuenta que las exigencias para nuestros ingenieros son cada vez mas altas, ya que no solo en desarrollo sino en el mantenimiento y sostenimiento de toda esta infraestructura implementada en nuestra industria debemos darnos a la tarea de estar en capacidad de aportar la calidad educativa y de conocimiento que el actual entorno nos exige para desarrollarnos como profesionales de alto nivel en esta área de la ingeniería. El área de automatización enfocada al empaque y dosificación de productos es hoy día alta y de mucha competencia. Las diferentes empresas presentan maquinaria especializada ofreciendo al país un desarrollo industrial en cuanto al tema, aunque a nivel de confiabilidad y economía estamos aun muy lejos de competir con países desarrollados que ofrecen servicios de ultima tecnología con alta productividad y de difícil desarrollo en nuestro medio social dado que no se cuenta ni con los recursos, ni con la infraestructura necesaria. Las herramientas tecnológicas permiten generar expectativas de carácter técnico y comercial. Es así que la utilización de software como solid edge permite evidenciar de manera más clara y concisa el ideal de un diseño sin necesidad de llevarlo a la práctica. De igual manera herramientas como C++ o mplab dan la posibilidad de generar desarrollos de forma eficiente y económica a las expectativas de un cliente final. 24. BIBLIOGRAFIA AMPUDIA, E. Danilo. (1991). Mantenimiento de equipo oleohidráulico. Universidad del valle. AVALLONE, Eugene A. (1995). Manual del ingeniero mecánico. Mc Graw Hill. BEER Ferdinand P, JOHNSTON E Russel, ( 1993 ) Mecánica de materiales. Mc Graw Hill. Bogotá. ( Colombia ) BEER Ferdinand P, JOHNSTON E Russel, ( 1998 ) Mecánica vectorial para ingenieros Estática. Mc Graw Hill. España. BEER Ferdinand P, JOHNSTON E Russel, ( 1998 ) Mecánica vectorial para ingenieros Dinámica. Mc Graw Hill. España. BOYLESTAD, Robert. (1998). Análisis introductorio de Circuitos. Ed. Prentice Hall. México. CONSIDINE, Douglas M. (1998). Process Industrial Instruments and Controls. Handbook. DEMPSEY, John A. (1984). Electrónica digital básica: con aplicaciones de circuitos MSI. Fondo educativo interamericano. CHAPMAN, Stephen. (1991). Máquinas eléctricas. Ed. McGraw-Hill. México DORF, Richard. (1995). Circuitos Eléctricos. Introducción al análisis y diseño. Editorial Alfaomega. 2a. Edición. España. DORF, C. Richard. (1989). Sistemas modernos de control. Addison-Wesly. FLOWER LEIVA, Luis. (1989). Controles y Automatismo eléctricos. Teoría y práctica. Telemecanique. Colombia. GERHARTZ, J. (1995). Neumática en bucle cerrado: nivel básico, libro de trabajo TP 111. Fest didáctic. GOTTFRIED, Byron. (199/). Programación en C. Ed. McGraw-Hill. México Hidráulica Proporcional. Manual de estudio. Festo didáctic. Hidráulica proporcional. Nivel básico. Colección de ejercicios con soluciones. Festo didáctic. HIBBELER Russel Charles, ( 1995 ) Mecánica de materiales. Prentice Hall. México. HALLYDAY David, ( 1992 ) Física Parte I. Mc Graw Hill. España. HUBERT, Charles. (1987).Circuitos Eléctricos CA/CC. Ed. McGraw-Hill. México. MANZANO, Orrego. Juan Jose. ( 1999). Mantenimiento de máquinas eléctricas. Paraninfo. MANNESMANN REXROTH. (1995). Técnica de válvulas proporcionales y de servoválvulas. Training hidráulico. Compendio 2. MALVINO, Albert Paul. (1994). Principios de electrónica. Ed. McGraw-Hill MURRAY, William.(1990) Manual de BORLAND C++. Serie de informática. Ed. McGraw-Hill. México MORRIS, Mano. (1998). Fundamento de diseño Lógica y computadoras. Ed. Prentice Hall. México. MORRIS,Mano. (1987). Diseño Digital. Ed. Prentice Hall. México. MORRIS, Mano. (1992). Lógica Digital y diseño de computadores. Prentice Hall. Mc KERVEY, Jhon. ( 1992 ). Física para ciencias e ingeniería. Vol 1. Ed. Harla. España. NELSON , Victor P. (1996). Analisis y diseño de Circuitos Logicos Digitales. Ed. Prentice Hall. México, México. ORLOV, P. (1985). Ingeniería de diseño. Mir. OGATA, Katsuhito. (1994). Solving control enginering problems with matlab. Prentice Hall. OGATA, Katsuhito. (1993). Ingeniería de control moderna. Prentice Hall. PRATT Terrense W. (1997) . Lenguajes de programación. Ed. Prentice Hall. México. RAMIREZ, Castaño. Samuel. (1985). Mantenimiento. Universidad Nacional de Colombia. RICHARDSON, Donal V. (1997). Maquinas Eléctricas Rotativas y Transformadores. Ed. Prentice Hall. México. SCHILDT, Herbert. ( 1994). Guía Autodidáctica. Serie de informática. Ed. McGraw-Hill. México SMITH, Carlos A. CORRIPIO, Armando B. (1997). Control automático de procesos. Limusa. SHIGLEY, Joseph Eduard, (1990). Diseño en ingeniería mecánica. Mc Graw Hill. SHINSKEY, F G. (1996). Sistemas de control de procesos. Mc Graw Hill. SAVANT, C.J. (1992). Diseño Electrónico. Circuitos y sistemas. Ed. Addison Wesley. TAVERNIER, Christian. (1997). Microcontroladores PIC. Paraninfo. TOCCI, Ronald. (1997). Sistemas Digitales, principios y aplicaciones. Ed. Prentice Hall. México. TOMASI, Wayne. (1996). Sistemas de comunicaciones Electrónicas. Ed. Prentice Hall. México. TOKHEIM, Roger L.. (1995). Principios Digitales.Ed. McGraw Hill. México, México. WAKERLY, John. (1992). Diseño digital, Principios y prácticas. Ed. Prentice Hall. México, México. "Certificación de BPM", Énfasis Alimentación N° 8 A ño V, Diciembre 99- Enero 2003. "BPM y HACCP, Cómo controlar la inocuidad", Énfasis Alimentación N° 1 Año VI, Febrero-Marzo 2000. Guía para las Buenas Prácticas de Manufactura y Manual de Análisis de Riesgos y Puntos Críticos de Control, Editorial El Obrador, Año 1997. 1 Maquina semiautomática para dosificado y empaque de líquidos en bolsa Juan Carlos Vizcaino Aponte. Universidad de La Salle I. Resumen: Sistema semiautomático de dosificado y empaque en el cual el usuario cuenta con el tubo (bolsa) de empaque y necesita dosificar, empacar, sellar y cortar la dosis necesaria. Alimenta un tanque ubicado en la parte superior de la maquina por medio de bombeo de un tanque mas grande que abastece de material a la maquina. Luego por medio de una jeringa industrial se succiona la cantidad deseada de empaque para luego dosificarla por un tubo que dirige el liquido a la zona de empaque en donde un sistema de selle por medio de mordazas realiza la acción de sellar y cortar la unidad de empaque. El control del sistema es realizado por medio de un computador el cual se encuentra conectado al sistema de dosificado y empaque del producto por medio del cual se controla el correcto funcionamiento del sistema en su conjunto, proveyendo a su vez la posibilidad de planear la producción así como supervisando el comportamiento de la maquina. Es importante resaltar que el sistema es hecho bajo DOS lo que implica bajos costos de software. II. INTRODUCCION El creciente desarrollo de la industria en el país, lleva consigo un amplio desarrollo de la ingeniería que en este podemos encontrar. Siendo cada vez mayor la oferta de productos y servicios que para el ámbito industrial encontramos. La industria alimenticia por su parte no se escapa de esta realidad. No obstante la economía no parece ser el centro del desarrollo de productos que solucionen las dificultades y problemas que se encuentran para dar solución. Es por ello que se pretende dar a conocer un enfoque mas practico y funcional referente a la economía tan necesaria de pequeñas y medianas industrias que no cuentan con el capital suficiente ni poseen la una producción tan grande como para exigir inversiones altas para el crecimiento de sus empresas. La maquina dosificadora y empacadora semiautomática presentada a continuación se desarrollo en torno a esa economía y desarrollo planteado, dejando en claro que el sistema ofrece solución a las necesidades y a su vez introduce al empresario en un ámbito mas productivo y de crecimiento industrial dándole mayores posibilidades de adquisición. III. Figura 1 (sistema alimentación de material) tanque que abastece de producto a la maquina se encuentre vació. Para ello se utiliza un control basado en reles y por supuesto esta implícito el control de nivel en los mismos. De modo que se hace necesario implementar el sistema de sensores que nos indiquen los niveles bajo y alto del tanque pequeño (superior) y el nivel bajo de material (liquido) en el tanque de abastecimiento. Para ello se implemento un sistema de sensores tipo resistivo que se implementa y acondiciona como lo muestra la figura 2. En este se introduce un par de varillas delgadas (1/8’’) en el tanque, unidas a un hilo conductor de modo que la resistencia medida entre los dos hilos es proporcional al líquido interno del tanque. Luego de ello electrónicamente se acondiciona según sea la necesidad un nivel bajo y nivel alto de liquido a sensar. Figura 2 (sensor resistivo y acondicionamiento) SISTEMA DE ALIMENTACION DE MATERIAL Se tiene un gran tanque de almacenamiento de material el cual por medio de un bombeo alimentara un pequeño tanque (50Lt) ubicado en la parte superior de la maquina como lo muestra la figura 1. Este sistema de abastecimiento debe controlarse solo de modo que la maquina no pare de trabajar a menos que el Figura 3(circuito de control) 2 Teniendo el sensado y acondicionamiento se realiza el circuito de control que sensa nivel alto y bajo en el tanque superior y el nivel bajo en el tanque inferior. Este sistema debe controlar la activación automática del bombeo. Figura 3. Es decir que a nivel electronico debemos conocer el circuito inversor de giro para motores DC que fue hecho a base de reles como lo muestra la figura 6. Para calcular la potencia de bomba que utilizamos tenemos en cuenta la altura y el diámetro de la tubería por la cual vamos a transportar el líquido para calcular la presión, luego calculamos el caudal sabiendo la necesidad en litros por minuto que necesitamos, así con los datos de presión y caudal calculamos la potencia de la bomba. Presión = 10 * peso liquido (N) / área del tubo (mm) = X bar Caudal = Lt / m Presión * Caudal / 15 = Potencia (KW) IV. SISTEMA DE DOSIFICACION El sistema de dosificación tiene como eje central la jeringa dosificadora. Como su nombre lo indica, el sistema funciona cargando la jeringa por medio de succión para luego inyectarla en el área de salida del dosificado. Para generar la succión y empuje de la jeringa se cuenta con un pistón neumático de doble efecto y doble vástago con el cual vamos a proporcionar el empuje de la dosis así como la carga de la dosis controlada a succionar ya que el doble vástago proveerá en su parte trasera el sistema de sensor por medio del cual tendremos la posibilidad de elegir una dosis diferente según sea requerido como lo indica la figura 4. Figura 6 (inversor de giro motor DC) A fin de evitar una sobre carga de los motores en los puntos abierto y cerrado se dispone un final de carrera en serie al circuito que impide que se de corriente cuando la válvula se encuentre ya abierta o ya cerrada. Como lo muestra la figura 7. Figura 7 (finales de carrera apertura y cierre de la válvula) Figura 4 (Jeringa dosificadora) Para controlar la salida y entrada de liquido se dispone de válvulas de embolo, mal conocidas en el mercado como registros, que se automatizan por medio de motores para proporcionar la apertura y cierre de las mismas. Mientras se succión el liquido una de las válvulas debe abrirse y al momento del empuje debe abrirse la otra así que por una cavidad entra el material y por el otro sale. Estas dos válvulas (succión y empuje) deben estar controladas simultáneamente de modo que el sistema funcione correctamente como lo muestra la figura 5. Figura 5 (sistema de succión y empuje de la jeringa) El tanque superior se conecta al punto de succión del dosificador y el punto de empuje se conecta a la tubería en la que encuentra alojado el tubo plástico de empaque para el líquido. El circuito de control dosifica en la succión, controlada por un final de carrera accionado por el vástago trasero del pistón, para luego de esto entregar la dosis en el empuje. Figura 8. 3 Figura 8 (circuito control dosificador) V. SISTEMA DE SELLADO Luego de dosificado el producto a empacar la jeringa dosificadora entrega la dosis en el empuje por entre un tubo llegando al sistema de sellado en el que por medio de unas mordazas hechas en bronce se produce el selle del empaque y el posterior corte por medio de un fino hilo colocado sobre las mismas mordazas. El sistema de selle trabaja con un pistón neumático que es el encargado de presionar el empaque en el punto de corte. Para mayor claridad la figura 9 nos muestra el sistema en su conjunto. Figura 11 (variación temperatura con pirometro) Por esto se recomienda la implementación de un sistema PWM el cual garantiza que la resistencia se calienta a una temperatura mas constante ya que el voltaje aplicado no es máximo y mínimo, sino proporcional al valor de temperatura que se desea (figura 12). Figura 12(PWM) El siguiente circuito nos da este tipo de señal. Diseñado por medio de sistema PIC nos permite entregar dicha señal PWM que hace más eficiente el trabajo de calentamiento de las resistencias selladoras. Figura 9 (sistema de sellado) Un sensor móvil es el encargado de la orden al pistón para ejecutar el selle. Este sensor puede realizarse por medio de una foto-celda la cual reacciona a los cambios de luz. El empaque (plástico) lleva en su elaboración una franja de diferente color la cual nos indica el punto en donde debemos realizar el corte (figura 10). Este sensor puede acondicionarse como lo muestra la figura 10 dando un valor on/off para el punto de corte. Figura 10 (sensor del punto de corte acondicionado) Las mordazas selladoras trabajan en caliente por lo que debemos diseñar un sistema de control para la temperatura. Dentro de ellas va alojada una resistencia la cual se calienta y el bronce disipa de forma proporciona el calor. El circuito de control para esta temperatura comúnmente utilizado a sido el pirometro el cual tiene el problema de generar una variación de temperatura inestable como lo indica la figura 11. El sistema consiste en sincronizar la señal AC de la red con la señal de salida. Para ello detectamos el cruce de la onda senosoidal por 0V. Al detectar el cruce por 0 el microcontrolador debe poseer la forma de interactuar con el usuario para saber el porcentaje de señal que desea proveer a la resistencia para el calentamiento. De este modo el restante del porcentaje se entrega como desactivado a la salida para luego activar el porcentaje de activado a la salida. La activación nombrada consiste en switchar un triac para el paso y no paso de corriente hacia las mordazas. Si lo desea puede generar una visualización dinámica al usuario de modo que facilite la programación de dicho porcentaje. Para el sincronismo con el cruce por 0 puede utilizar el mismo transformador que utiliza en su fuente de voltaje para el circuito. Figura 13 4 Figura 13 (control de temperatura) A fin de clarificar el desarrollo del programa para el PIC en la figura 14 se establece el diagrama de flujo que permite el correcto funcionamiento del circuito electronico. Figura 14 (diagrama de flujo del programa para PIC) VI. INTEGRACION DE PROCESOS La integración de toso los sistemas plasmados en este documento se pueden realizar por medio de un computador pequeño de capacidad. Es decir con características de procesador 486(166MHz), RAM de 16M, monitor monocromático, disco de 100Mb, sistema operativo DOS y teclado estándar. La interfase se realiza por medio del puerto paralelo acondicionando como lo muestra la figura 15 a los demás circuitos plasmados en este documento. Figura 16 (diagrama de flujo programa de control) El manejo del puerto paralelo en C++ se realiza con la función outportb (puerto,0xXX); en donde puerto corresponde a la dirección del puerto paralelo utilizada, la cual podemos cargar con la instrucción int puerto; puerto=peek(0x40,0x08); y el dato 0xXX es un dato hexagesimal que va desde 0x00 hasta 0xFF o si lo prefiere utilice datos decimales 0 a 255 de la forma outportb(puerto,45); VII. CONCLUSION Figura 15 (interfase puerto paralelo). El software de control realizado en asembler, o para mayor facilidad utilizando lenguaje de programación C. Conociendo el comportamiento lógico de la maquina se plantea el diagrama de flujo que desarrolla este proyecto. Figura 16. El desarrollo de proyectos de ingeniería que proponen la reutilización de tecnología abandonada o ya desplazada por nuevos desarrollos, generan para el país propuestas económicas y de fácil acceso. El empresario colombiano busca eficiencia y eficacia en el desarrollo de sus productos que puede conseguir fácilmente con elementos prácticos, económicos y de fácil manejo que no impliquen una ardua capacitación, sino que por el contrario logran la finalidad esencial que es una ayuda práctica a las dificultades que se presentan. El área de automatización enfocada al empaque y dosificación de productos es hoy día alta y de mucha competencia La industria alimenticia, y específicamente la de empaque de refrescos, yogures y similares necesita prontamente sistemas económicos que les permitan crecer como industria