tesis vizcaino - Universidad de La Salle

Anuncio
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
Descargar