Escolar Documentos
Profissional Documentos
Cultura Documentos
Autor:
Álvaro Roberto Rojas Castro
Tutor:
José Manuel Framiñán Torres
Profesor titular
iii
iv
Trabajo Fin de Máster: Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95
El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros:
Presidente:
Vocales:
Secretario:
Sevilla, 2016
v
vi
A María y Mario
A mis padres
vii
Agradecimientos
En primer lugar me gustaría agradecer a todas aquellas personas que han sido fundamentales para la
realización de este Máster y por el apoyo, colaboración, ánimo e inestimable ayuda de mi tutor José Manuel
Framiñán.
A mis compañeros de trabajo que sirvieron de inspiración y guía para la selección del tema del trabajo fin de
máster.
En tercer lugar agradecer a mis padres por su sacrificio y por la educación que nos han dado tanto a mis
hermanos como a mí, sin ellos este trabajo no hubiera sido posible.
También quisiera agradecer a mi mujer su ayuda y comprensión en las largas jornadas de dedicación en las
que no la he podido acompañar por la dedicación al máster, ha sido un apoyo fundamental en todo momento.
Muchas gracias María por tu cariño, por tu ánimo, por tu profundo amor y por estar ahí siempre que te he
necesitado.
Finalmente mi especial dedicatoria a mi hijo Mario, eres lo mejor que me ha pasado y haces de mí una mejor
persona.
viii
ix
Resumen
En el presente trabajo fin de máster se pretende desarrollar y presentar una prueba de concepto para la
integración entre un sistema ERP y un sistema MES mediante la utilización de las especificaciones del
estándar internacional ANSI/ISA-95.
El sistema ERP seleccionado para la integración es Odoo (antes conocido como OpenERP) por ser de código
abierto y fácilmente ampliable y por permitir la modificación de su comportamiento de manera sencilla.
Como sistema MES se ha seleccionado PROMIA, del que se disponía del esquema de base de datos por parte
del Departamento de Organización Industrial y Gestión de Empresas I.
La prueba de concepto desarrollada permite el registro de órdenes de fabricación del ERP en el MES; sin
embargo, no se ha desarrollado una integración completa de la información, pudiéndose quedar dicha
integración completa como un trabajo a finalizar en el futuro. La prueba de concepto cumple su objetivo
principal que no es más que la demostración de cómo se puede llevar a cabo la integración de los sistemas
ERP y MES mediante el estándar ISA-95.
x
xi
Abstract
In this Master’s degree job I develop and explain a proof of concept to integrate an ERP System and a MES
using the specification of the international standard ANSI/ISA-95.
The selected ERP System for this integration is Odoo (formerly known as OpenERP) because it is open source
and easily expandable and because it permits modifying its behavior in a simple way.
The selected MES system is PROMIA, of which the database schema was available by the Department of
Industrial Organization and Enterprises Management I.
The developed proof of concept allows the registration of manufacturing orders from the ERP in the MES;
however, a complete integration of the information has not been developed, such complete integration can
remain as a work to be completed in the future. The proof of concept fulfills its main purpose which is nothing
more tan de demonstration of how the integration of the ERP and MES systems can be carried out using the
standard ISA-95.
xii
Índice
Agradecimientos viii
Resumen x
Abstract xii
Índice xiii
Índice de Tablas xv
Índice de Figuras xvi
1 Introducción 1
1.1 Objeto 1
1.1.1 Objetivos generales 1
1.1.2 Objetivos específicos 1
1.2 Alcance 1
2 Estado de la integración de Sistemas 3
2.1 Sistemas de información 3
2.2 Sistemas ERP / MRP 5
2.3 Sistemas MES 9
2.4 Integración de Sistemas 11
2.5 Estándar ANSI/ISA-95 13
2.5.1 B2MML 18
3 Escenario para la Integración de Sistemas 21
3.1 Descripción del scenario a desarrollar 21
3.2 Odoo 21
3.2.1 El módulo MRP de Odoo 22
3.3 MES PROMIA 22
3.3.1 Flujo de trabajo de PROMIA 23
3.3.2 Conceptos clave de PROMIA 24
4 Desarrollo de la prueba de concepto 26
4.1 Objetivos, alcance y descripción del escenario 26
4.2 Desarrollo en Odoo 30
4.2.1 Modificaciones en el flujo de trabajo del módulo MRP de Odoo 30
4.2.2 Desarrollo de módulo isa95mrp 34
4.2.3 Recepción de mensajes por parte del MES 41
4.3 Desarrollo en PROMIA 42
4.3.1 Desarrollo de aplicación CRUD de PROMIA 42
4.3.2 Desarrollo de Webservice en aplicación PROMIA 46
4.3.3 Desarrollo para el traslado de estado finalizado desde PROMIA a Odoo 47
xiii
4.4 Desarrollo del Middleware 49
4.4.1 Desarrollo de Webservice de alta de órdenes de fabricación de Odoo en PROMIA 49
4.4.2 Desarrollo de Webservice de finalización de órdenes de fabricación de PROMIA en Odoo 49
4.5 Integración entre el ERP y el MES en acción 51
4.5.1 Flujo de información del ERP al MES 51
4.5.2 Flujo de información del MES al ERP 56
4.6 Descripción y recomendaciones de Seguridad, Infraestructura y Hardware 60
5 Conclusiones y líneas futuras 62
5.1 Conclusiones 62
5.2 Líneas de trabajo futuras 63
Referencias 64
Anexos 66
A. Anexo A: Funcionalidades del módulo MRP de Odoo 66
Entorno de trabajo con Odoo 66
Introducción al módulo MRP de Odoo 68
Funciones adicionales del módulo MRP de Odoo 84
B. Anexo B: Fichero B2MML generado con el módulo isa95mrp de Odoo 112
C. Anexo C: Código del módulo isa95mrp de Odoo 116
D. Anexo D: Código del Servicio Web del MES PROMIA 129
E. Anexo E: Fichero B2MML generado por el MES PROMIA 130
xiv
ÍNDICE DE TABLAS
xv
ÍNDICE DE FIGURAS
Figura 2-1. Agrupaciones de programas comerciales (Fuente: Santos et al., (Los Sistemas Integrales de
Información del Siglo XXI, 2000)) 4
Figura 2-2. Evolución de los sistemas de Planificación (Fuente: (Implantación de un sistema ERP en una
organización, 2005)) 5
Figura 2-3. Estructura de un Sistema MRP (Fuente: (Evolución en los sistemas de gestión empresarial. Del
MRP al ERP., 2000)) 6
Figura 2-4. Estructura de un Sistema MRP II (Fuente: (Evolución en los sistemas de gestión empresarial. Del
MRP al ERP., 2000)) 7
Figura 2-5. Estructura de un Sistema ERP (Fuente: (Evolución en los sistemas de gestión empresarial. Del
MRP al ERP., 2000)) 8
Figura 2-6. Integración de Sistemas de Gestión Empresarial (Fuente: (Evolución en los sistemas de gestión
empresarial. Del MRP al ERP., 2000)) 9
Figura 2-7. Contexto de los sistemas MES (Fuente: (MES explained: A high level vision. White Paper 6,
1997)) 11
Figura 2-8. Integración Horizontal de Sistemas (ESB) 12
Figura 2-9. Integración de Sistemas en Estrella 13
Figura 2-10. Integración de Sistemas mediante Formato de datos común 13
Figura 2-11. Modelo funcional de control empresarial de ISA-95 (Fuente: (A Study on OPC Specifications.
Perspective and Challenges, 2010)) 14
Figura 2-12. Jerarquía funcional de ISA-95 (Fuente: (Estándar ANSI/ISA-95 partes 1, 2, 3 y 5)) 15
Figura 2-13. Niveles funcionales de ISA-95 (Fuente: (Estándar ANSI/ISA-95 partes 1, 2, 3 y 5)) 16
Figura 2-14. Información intercambiada en ISA-95 (Fuente: (Estándar ANSI/ISA-95 partes 1, 2, 3 y 5)) 17
Figura 2-15. Modelo de Intercambio de Información de la Producción en ISA-95 (Fuente: (Estándar
ANSI/ISA-95 partes 1, 2, 3 y 5)) 18
Figura 2-16. Modelos de Objetos del Rendimiento de la Producción de ISA-95 (Fuente: (MESA)) 19
Figura 2-17. Esquema B2MML del Objeto Production Response (Fuente: (MESA)) 20
Figura 3-1. Arquitectura del Sistema PROMIA (Fuente: (Departamento de Organización Industrial y Gestión
de Empresas de la Universidad de Sevilla, 2014)) 23
Figura 4-1. Integración de Odoo-PROMIA. Iniciar Producción 27
Figura 4-2. Integración Odoo-PROMIA. Finalizar Producción 28
Figura 4-3. Diagrama de estado de órdenes de producción entre sistemas 29
Figura 4-4. Entrada en modo desarrollador. Acceso a ventana “Acerca de” 30
Figura 4-5. Entrada en modo desarrollador. Ventana "Acerca de" 31
Figura 4-6. Edición de flujo de trabajo. Menú Debug 31
Figura 4-7. Edición de flujo de trabajo. Listado de Flujos de trabajo 32
Figura 4-8. Edición de flujo de trabajo. Vistas de Flujos de trabajo disponibles 32
xvi
Figura 4-9. Edición de flujo de trabajo. Diagrama de Flujo de trabajo de órdenes de producción 32
Figura 4-10. Edición de flujo de trabajo. Formulario de nuevo nodo 33
Figura 4-11. Edición de flujo de trabajo. Formulario de transición desde ready hacia send_MES 33
Figura 4-12. Edición de flujo de trabajo. Formulario de transición desde send_MES hacia in_production 34
Figura 4-13. Edición de flujo de trabajo. Diagrama de Flujo de trabajo de órdenes de producción modificado
34
Figura 4-14. Desarrollo de módulo en Odoo. Fichero __openerp__.py 35
Figura 4-15. Desarrollo de módulo en Odoo. Fichero isa95mrp_workflow.xml definición de nuevo estado
35
Figura 4-16. Desarrollo de módulo en Odoo. Fichero isa95mrp_workflow.xml definición de nuevas
transiciones 36
Figura 4-17. Desarrollo de módulo en Odoo. Fichero isa95mrp_workflow.xml redefinición de transiciones
existentes 36
Figura 4-18. Desarrollo de módulo en Odoo. Fichero isa95mrp_view.xml definición de nuevo estado en barra
de estados 36
Figura 4-19. Desarrollo de módulo en Odoo. Fichero isa95mrp_view.xml definición y modificación de
botones 37
Figura 4-20. Desarrollo de módulo en Odoo. Fichero isa95mrp_view.xml definición botón cancel 37
Figura 4-21. Desarrollo de módulo en Odoo. Fichero isa95mrp.py definición de clase 37
Figura 4-22. Desarrollo de módulo en Odoo. Fichero isa95mrp.py definición función action_send_MES 38
Figura 4-23. Desarrollo de módulo en Odoo. Instalación de Módulo isa95mrp 38
Figura 4-24. Desarrollo de módulo en Odoo. Instalación de Módulo isa95mrp. Detalles del módulo 39
Figura 4-25. Desarrollo de módulo en Odoo. Instalación de Módulo isa95mrp. Detalles técnicos del módulo
39
Figura 4-26. Desarrollo de módulo en Odoo. Instalación de Módulo isa95mrp. Módulo isa95mrp instalado
40
Figura 4-27. Página principal de la aplicación web del MES PROMIA 43
Figura 4-28 - Listado de Presupuestos de la aplicación web del MES PROMIA 44
Figura 4-29 - Formulario de edición de Presupuestos en la aplicación web de PROMIA 44
Figura 4-30 - Listado de Ots de la aplicación web del MES PROMIA 45
Figura 4-31 - Formulario de edición de Ots en la aplicación web de PROMIA 46
Figura 4-32. Operación addManufacturingOrder del Servicio Web del MES PROMIA 47
Figura 4-33. Función parse2Database del MES PROMIA 47
Figura 4-34. Función edit de la clase P520OtFacade del MES PROMIA 48
Figura 4-35. Servicio Web sendToMES del Sistema Middleware 49
Figura 4-36. Servicio Web sendToERP del Sistema Middleware 50
Figura 4-37 - Función endManufacturingOrder del Sistema Middleware 50
Figura 4-38. Listado de órdenes de producción del módulo MRP de Odoo 51
xvii
Figura 4-39 - Formulario de orden de producción MO00073 en estado “Nuevo” 52
Figura 4-40 - Formulario de orden de producción MO00073 en estado Esperando materias primas 52
Figura 4-41 - Formulario de orden de producción MO00073 en estado Listo para producir 53
Figura 4-42 - Formulario de orden de producción MO00073 en estado Producción iniciada tras generación de
fichero B2MML 53
Figura 4-43 - Fichero B2MML generado para la orden MO00073 54
Figura 4-44 - Página inicial de la aplicación web MES PROMIA 55
Figura 4-45 - Listado de Presupuestos en el MES PROMIA 56
Figura 4-46 - Listado de órdenes de trabajo del MES PROMIA 56
Figura 4-47. Orden de producción en estado Producción Iniciada 57
Figura 4-48. Detalle de producto en Odoo 57
Figura 4-49. Formulario de orden de trabajo en el MES 58
Figura 4-50. Detalle de orden de trabajo modificada en el MES 59
Figura 4-51. Repositorio de ficheros B2MML generados por el MES 59
Figura 4-52. Orden de producción en estado Realizado en Odoo 60
Figura 4-53. Detalle de producto en Odoo. Se observa que se ha incrementado el número de unidades 60
Figura 4-54. Esquema Físico de Integración de Sistemas 61
Figura 4-55 - Esquema Físico de Integración de Sistemas con bases de datos en servidores independientes
61
Figura A-1. Página de Login de Odoo 66
Figura A-2. Página de gestión de base de datos de Odoo 67
Figura A-3. Página de creación de base de datos en Odoo 67
Figura A-4. Página de aplicaciones en línea de Odoo antes de instalar el módulo MRP 68
Figura A-5. Página de Aplicaciones en línea de Odoo tras la instalación de MRP 68
Figura A-6. Página principal del módulo MRP de Odoo 69
Figura A-7. Página principal de Productos del módulo MRP de Odoo 70
Figura A-8. Formulario de creación de Productos en el módulo MRP de Odoo 70
Figura A-9. Página inicial de Lista de Materiales de Producto del módulo MRP de Odoo 71
Figura A-10. Formulario de creación de Listas de Materiales en el módulo MRP de Odoo 71
Figura A-11. Lista de materiales de Producto en el módulo MRP de Odoo 72
Figura A-12. Lista de materiales de Producto finalizada 72
Figura A-13. Formulario de creación de Orden de Fabricación 73
Figura A-14. Formulario de creación de Orden de Fabricación 74
Figura A-15. Listado de Órdenes de Fabricación 74
Figura A-16. Vista Calendario de ördenes de Fabricación 75
Figura A-17. Vista Calendario Filtrado de ördenes de Fabricación. 75
Figura A-18. Vista Tablero de Órdenes de Fabricación 76
Figura A-19. Formulario de Orden de Fabricación en estado Esperando Materias Primas 76
xviii
Figura A-20. Formulario de Orden de Fabricación en estado Listo para Producir 77
Figura A-21. Ventana de confirmación de producción de Orden de Fabricación 77
Figura A-22. Formulario de Orden de Fabricación en estado Realizado 78
Figura A-23. Formulario de Lista de Materiales de Producto (con acciones desplegadas) 78
Figura A-24. Formulario de Lista de Materiales de Producto 79
Figura A-25. Listado de lista de materiales de producto 79
Figura A-26. Formulario de creación de Orden de producción en estado Nuevo. Selección de lista de
materiales 80
Figura A-27. Formulario de creación de Orden de producción en estado Listo para producir 80
Figura A-28. Formulario de creación de Orden de producción en estado Producción iniciada 81
Figura A-29. Formulario de creación de Orden de producción en estado Producción iniciada con materiales
consumidos. 81
Figura A-30. Ventana de confirmación de Orden de Producción 82
Figura A-31. Formulario de Orden de producción en estado Realizado 82
Figura A-32. Formulario de Lista de materiales con rangos de fechas para los materiales 83
Figura A-33. Formulario de creación de Orden de producción con fecha de fabricación posterior a la fecha de
disponibilidad de materiales 83
Figura A-34. Lista de Materiales del producto Nueva Placa Base 84
Figura A-35. Formulario de creación de orden de producción de producto con materiales que han de ser
fabricados 85
Figura A-36. Formulario de Orden de fabricación en estado Realizado 85
Figura A-37. Informe de Valoración de Inventario 86
Figura A-38. Informae de Valoración de inventario con información desglosada 86
Figura A-39. Tablero de productos en el módulo de Inventario 87
Figura A-40. Formulario de creación de Ajuste de Inventario 88
Figura A-41. Formulario de ajuste de inventario en proceso 88
Figura A-42. Formulario de ajuste de inventario validado 89
Figura A-43. Tablero de Productos 89
Figura A-44. Formulario de creación de Orden de fabricación para subproducto 90
Figura A-45. Formulario de Orden de fabricación para subproducto en estado Realizado 90
Figura A-46. Tablero de Productos en el módulo Inventario. 91
Figura A-47. Tablero de Productos en el módulo Inventario 91
Figura A-48. Formulario de Producto. Estableciendo fabricación bajo demanda. 92
Figura A-49. Formulario de Orden de producción en estado Esperando materias primas 92
Figura A-50. Listado de Órdenes de fabricación. Orden de producción de subproducto generada
automáticamente 93
Figura A-51. Formulario de Orden de fabricación de producto intermedio en estado Realizado 93
xix
Figura A-52. Listado de órdenes de fabricación. Orden de producción de producto pasa automáticamente a
estado Listo para producir 94
Figura A-53. Formulario de Orden de producción en estado Realizado 94
Figura A-54. Formulario de Lista de Materiales de Producto 95
Figura A-55. Página de detalle de producto 95
Figura A-56. Página de detalle de producto 96
Figura A-57. Ventana de actualización de cantidad de producto en stock 96
Figura A-58. Formulario de Orden de producción de producto compuesto por subproductos en estado
Esperando materias primas 97
Figura A-59. Listado de Órdenes de producción. Se han creado automáticamente dos órdenes de productos
intermedios del producto final 97
Figura A-60. Formulario de Orden de producción de producto intermedio que depende de subproducto 98
Figura A-61. Listado de Órdenes de producción. Producto intermedio finalizado 98
Figura A-62. Listado de Órdenes de producción. Producto intermedio finalizado 99
Figura A--63. Formulario de Producto. 100
Figura A-64. Formulario de Producto 100
Figura A-65. Formulario de reglas de abastecimiento de producto 101
Figura A-66. Página de Lista de materiales de producto 102
Figura A-67. Formulario de Producto con reglas de abastecimiento 102
Figura A-68. Página de confirmación de ejecución de reglas de reabastecimiento 103
Figura A-69. Listado de Órdenes de producción. Se crea orden de fabricación automática a partir de regla de
abastecimiento 103
Figura A-70. Formulario detalle de producto tras la ejecución de la orden de fabricación de reabastecimiento
104
Figura A-71. Página de configuración del módulo MRP. Se señala la opción para gestionar las órdenes de
producción como órdenes de trabajo 104
Figura A-72. Página inicial de Centros de producción 105
Figura A-73. Formulario de creación de centro de trabajo 106
Figura A-74. Página inicial de Rutas de Producción 107
Figura A-75. Formulario de creación de Rutas de producción 108
Figura A-76. Ventana de creación de operaciones en el centro de producción 108
Figura A-77. Formulario de Ruta de producción 109
Figura A-78. Formulario de Lista de Materiales con Ruta de producción asignada 109
Figura A-79. Formulario de creación de producto con Ruta de producción asignada 110
Figura A-80. Formulario de orden de producción con orden de trabajo creada automáticamente 110
Figura A-81. Listado de órdenes de producción 111
xx
1 INTRODUCCIÓN
Jon Franklin.
n el presente capítulo estableceremos los objetivos generales y específicos que se pretenden alcanzar con
E este trabajo fin de máster. Además, estableceremos el alcance del trabajo para dejar claro lo que se
pretende hacer y lo que queda fuera de las motivaciones y objetivos del trabajo.
1.1 Objeto
1.1.1 Objetivos generales
El objetivo general del proyecto es el de realizar una prueba de concepto de las capacidades del estándar ISA-
95 para la integración entre un sistema ERP y un sistema MES. Para llevar a cabo este objetivo general se han
debido llevar a cabo los objetivos específicos que se explican en la siguiente sección.
1.2 Alcance
El alcance del trabajo se limita a cubrir los objetivos descritos en el apartado anterior. El aspecto más
2 Introducción
importante es el desarrollo de una herramienta middleware que permita la integración del ERP seleccionado
(Odoo) y el sistema MES de la forma más transparente posible para ambos sistemas.
Desde el punto de vista tecnológico, los desarrollos a efectuar se realizarán con tecnologías de código abierto
en la medida de lo posible, entre las que se encuentran los lenguajes de programación Python (para
modificaciones en el ERP Odoo) y Java (para el desarrollo de la herramienta middleware y simulación del
sistema MES a partir de su base de datos), además del uso de una plataforma para la publicación de servicios
web.
De forma más detallada se procederá a la modificación del flujo de trabajo de las órdenes de producción del
módulo MRP de Odoo. Estas órdenes de Odoo no pasarán a estado “En producción” hasta que no se realice el
envío de la orden al sistema MES y éste confirme su recepción correcta. Además, a la hora de finalizar las
órdenes de producción, éstas pasarán a estado “Realizado” cuando se reciba por parte del MES el mensaje de
que, efectivamente, se ha finalizado la orden.
Se creará un módulo en Odoo que, cuando se detecte que una orden de fabricación pasa a estado “Enviar al
MES” por parte del usuario, se genere el fichero B2MML para ser publicado por el servicio web que gestiona
el sistema Middleware. En el otro extremo, cuando se detecte la recepción del fichero B2MML, el middleware
realizará la inserción de la orden de producción en la base de datos del MES e informará al sistema ERP el
registro de la misma. Cuando la producción finalice, el middleware enviará una señal a Odoo (mediante el
middleware) para que la orden de producción pase a estado “Realizada”.
Para la integración de sistemas nos centraremos exclusivamente en las órdenes de producción, obviando el
resto de posibles flujos de información que debería existir entre el ERP y el MES (productos, materiales,
equipamiento, recursos humanos y físicos, etc.), por lo que tan sólo se controlará que las órdenes de
producción generadas en el ERP sean enviadas y almacenadas por el MES y que el estado de dichas órdenes
sea equivalente en ambos sistemas.
Por otro lado, se tratará el sistema MES como una caja negra, por lo que no entraremos en los procedimientos
internos que este necesite para efectuar las órdenes de fabricación. Tan sólo tendremos en cuneta que para la
correcta creación de una orden de trabajo en el MES, ésta debe tener asociado un presupuesto aprobado que
permita el inicio del proceso de producción.
2 ESTADO DE LA INTEGRACIÓN DE SISTEMAS
ras especificar los objetivos y alcance del trabajo, en el presente capítulo vamos a realizar un repaso del
T estado del arte en lo que respecta a la integración de sistemas. Para ello, vamos a definir qué es un
sistema de información, los disitintos tipos de sistemas a los que nos vamos a referir en este trabajo y los
distintos tipos de integraciones que existen.
aplicaciones conocidas como MRP II (Manufacturing Resource Planning). Tiempo más tarde, en los años 90,
surgen las aplicaciones ERP (Enterprise Resource Planning), término acuñado por Gartner Group (Lauchbury
y Ptak, 1998). En 1997, META Group bautizó a los sistemas ERP que estudiaba como ERM (Enterprise
Resource Management).
Tanto los ERP como los ERM no son más que una evolución de los MRP II que mantienen su misma
funcionalidad y estructura.
Aplicaciones que gestionan la función de ingeniería:
Los primeros sistemas que informatizaron los diseños de los productos fueron los conocidos como CAD
(Computer Aided Design). Los CAD se enriquecieron con funciones CAE (Computer Aided Engineering)
para estudiar el comportamiento mecánico de los diseños. Finalmente, los programas CAM (Computer Aided
Manufacturing) permiten la conexión con la fabricación de los productos diseñados.
Actualmente, para integrar en una sola herramienta todos los datos que monitorizan el ciclo de vida de un
producto se conocen como aplicaciones PDM (Product Data Management).
Aplicaciones que gestionan la función logística:
Se ha pasado desde los programas DRP (Distribution Resource Planning) que permiten la gestión de la cadena
de suministro a programas SCM (Supply Chain Management) que pretenden abarcar todas las relaciones
cliente-proveedor que tienen lugar tanto dentro como fuera de la empresa.
Aplicaciones que gestionan la función de control de producción:
Los programas conocidos como SFC (Shop Floor Control) recogían datos de las máquinas y los almacenaba
para su posterior tratamiento. En 1992 se fundó la asociación sin ánimo de lucro MESA (Manufacturing
Enterprise Solutions Association) formada por empresas proveedoras de programas de control de producción
llamadas aplicaciones MES (Manufacturing Execution System). Estos sistemas los veremos en siguientes
apartados.
Aplicaciones que gestionan la función comercial:
Engloba las herramientas que pretenden gestionar la información necesaria para ofrecer un servicio de calidad
a los clientes, son las aplicaciones llamadas CRM (Customer Relationship Management) que vienen siendo
desarrolladas por las empresas de desarrollo de sistemas ERP y tienen en cuenta las capacidades de producción
y los costes.
Figura 2-1. Agrupaciones de programas comerciales (Fuente: Santos et al., Fuente especificada no válida.)
En el gráfico de la figura 2-1 se muestran todos los distintos sistemas de información descritos y su
solapamiento en las funciones de gestión dentro de la empresa.
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 5
De los distintos tipos que se han explicado, nos centraremos a continuación en los sistemas de información
ERP/MRP y MES enfocados los primeros en la planificación de recursos de la empresa y en el control de
producción los segundos.
Figura 2-2. Evolución de los sistemas de Planificación (Fuente: Fuente especificada no válida.)
Como establecen los autores Delgado y Marín Fuente especificada no válida., las herramientas MRP surgen
a comienzos de los años 70 del siglo XX como respuesta al problema de determinar cuándo lanzar las órdenes
de aprovisionamiento que hasta entonces se realizaban mediante la técnica de punto de pedido. Los MRP
integran el cálculo de necesidades y métodos específicos de dimensionado de lotes.
Los sistemas MRP presentan una estructura modular como se muestra en la siguiente figura:
6
Estado de la integración de Sistemas
trabajo frente a la carga resultante de la ejecución de las órdenes de producción planificadas en un horizonte de
tiempo determinado. Esta planificación de las necesidades de capacidad permite tomar decisiones respecto a la
capacidad de los centros de trabajo como la modificación de dicha capacidad, la subcontratación de ciertos
procesos o la modificación de rutas o fechas de las órdenes de producción.
En la década de los 90, surge la necesidad de integrar diferentes áreas de la empresa (ingeniería, ventas,
fabricación o compras) bajo un mismo sistema de información. Así aparecen los sistemas ERP que abordan la
planificación de recursos humanos o financieros junto con la planificación de necesidades de materiales y de
recursos de producción. Estos sistemas dotan a las empresas de un sistema de información sin duplicidades
respecto a la información utilizada por diferentes componentes de la empresa.
Figura 2-6. Integración de Sistemas de Gestión Empresarial (Fuente: Fuente especificada no válida.)
Existen dos tipos de integraciones entre sistemas: los conocidos como B2B (Business To Business) y B2C
(Business To Consumer). Los sistemas B2B pretenden mejorar la interacción entre empresas mediante el uso
de sistemas de información compartidos. Las herramientas B2C están orientadas a la relación con los clientes
finales utilizando las nuevas tecnologías de comunicación.
El valor de la Planificación de los Recursos Empresariales (ERP) en los negocios.
Como establecen Díaz et al. Fuente especificada no válida., la implantación de un sistema ERP en una
organización supone una ventaja competitiva o, en su defecto permitirá alinearse comparativamente con sus
competidores. Las ventajas que aporta un ERP bien implantado suponen una reducción de costes, aumento de
la productividad y la automatización de procesos, ya que se establece una solución que permite la integración
total de todas las operaciones de la empresa con el fin de tener una gestión adecuada en cada una de sus áreas.
Figura 2-7. Contexto de los sistemas MES (Fuente: Fuente especificada no válida.)
Las necesidades de comunicación más frecuentes de los MES se producen con los sistemas ERP para la
planificación de la producción y con los sistemas de control de la producción a pie de planta.
Resulta, por tanto, interesante la integración entre los sistemas ERP y MES para que exista una
implementación del paso de la planificación de la producción al control de la misma, ya que, mientras que una
fábrica ejecuta las órdenes en tiempo real, los ERP habrán realizado una planificación previa con unas
hipótesis de funcionamiento fijadas a priori, pero no tienen constancia de las operaciones realmente efectuadas
y no tienen supervisión ni control en tiempo real del proceso productivo. Estas funciones son las propias de los
MES con quienes se tendrán que integrar los ERP para compartir información y sacar el máximo partido de las
operaciones de fabricación.
• Formato de Datos Común: Este tipo de integración permite evitar el uso de adaptadores desde y
hacia cada uno de los formatos de datos de las aplicaciones. Los sistemas que utilizan este método
establecen un formato de datos común e independiente de aplicaciones, o bien, se proporciona un
servicio que hace la transformación de datos desde y hacia una aplicación a la aplicación común.
Para la prueba de concepto que vamos a desarrollar en este trabajo realizaremos una integración horizontal
donde utilizaremos un sistema Middleware como Bus de servicio empresariales; sin embargo, la integración
también tendrá características de formato de datos común por la utilización de ficheros B2MML que
explicaremos en el siguiente capítulo.
Figura 2-11. Modelo funcional de control empresarial de ISA-95 (Fuente: Fuente especificada no válida.)
La mayor parte de la información descrita en este modelo funcional se puede agrupar en tres grandes áreas:
• Información necesaria para producir un producto.
• Información sobre la capacidad para producir un producto.
• Información sobre la producción real de un producto.
ISA-95 es un estándar internacional en desarrollo para la integración de la empresa con los sistemas de control.
Proporciona un modelo de referencia para la organización de sistemas, asignando el negocio a diferentes
sistemas y el flujo de información entre sistemas. Originariamente es un estándar estadounidense, pero se ha
adoptado como un estándar internacional como IEC/ISO 62246.
El propósito del estándar es:
• Acentuar las buenas prácticas en la integración de sistemas de control con sistemas empresariales
durante todo su ciclo de vida.
• Se puede utilizar para la mejora de las capacidades de integraciones existentes.
• Se puede aplicar sin importar el grado de automatización de los sistemas.
El estándar ISA-95 se centra principalmente en tres áreas y estará dividido en 6 partes:
• Modelos de intercambio de información entre sistemas logísticos del negocio y sistemas de
operaciones de fabricación. (Partes 1, 2 y 5).
• Modelos de actividades en sistemas de operaciones de fabricación. (Parte 3).
14
Estado de la integración de Sistemas
Respecto a las correspondencias de estos niveles funcionales definidos por el estándar, queda claro que:
• El nivel 1 se corresponde con dispositivos inteligentes.
• El nivel 2 se corresponde con los sistemas de control como por ejemplo, los Programadores Lógicos
Programables (o PLC por sus sigls en inglés, Programmable Logic Controller).
• El nivel 3 se corresponde con los sistemas de Operaciones de Fabricación (MES, Batch, Sistemas de
Gestión de Información de Laboratorio o LIMS por sus siglas en inglés, Laboratory Information
Management System).
• El nivel 4 se corresponde con los sistemas logísticos del negocio (ERP).
El tipo de información que se define para su intercambio entre los sistemas del nivel 3 y el nivel 4 se muestran
en la siguiente figura:
16
Estado de la integración de Sistemas
Dicha información de intercambio se define mediante los modelos de datos formales mediante notación UML
(Unified Modeling Language) y se implementan utilizando esquemas B2MML (Business To Manufacturing
Markup Language). De esta manera, se definen clases, definiciones de materiales e instancias, así como sus
propiedades y valores.
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 17
2.5.1 B2MML
B2MML responde a las siglas en inglés Business To Manufacturing Markup Language y no es más que el
lenguaje para el intercambio de información entre los sistemas de gestión del negocio (ERP) y los sistemas de
gestión de la fabricación (MES). Es una implementación completa en XML del estándar ISA-95 en el que se
representan las estructuras de datos definidas en el estándar. Consta de una serie de esquemas XML escritos en
el lenguaje XSD del WWC (World Wide Web Consortium). B2MML fue desarrollado por el WBF (World
Batch Forum), organización que ha quedado incluida dentro de la asociación MESA.
Cualquier empresa que esté interesada en seguir el estándar ISA-95 para proyectos de integración, pueden
utilizar el lenguaje B2MML para la integración entre sistemas del negocio (como los ERP) y sistemas de
gestión de la cadena de suministro con sistemas de fabricación, tales como los sistemas de control y los
sistemas de ejecución de la fabricación (MES). Se puede utilizar libre de cargos, siempre dándole el crédito a
la asociación MESA.
La última versión disponible es la B2MML V0600, que incluye soporte para la parte 4 del ISA-95, lanzada en
2012. El lenguaje B2MML se ha convertido en la implementación estándar por excelencia para las
integraciones entre sistemas del negocio y de la fabricación.B2MML es también una implementación del
estándar ISA-88, que queda fuera del alcance de este proyecto.
Para entender mejor el lenguaje B2MML, veremos un ejemplo, si observamos en objeto de la parte 1 de ISA-
95 “Rendimiento de Producción” (“Production Performance”), veremos que está compuesto de una serie de
“Respuestas de Producción” (“Production Responses”). Por ejemplo, una orden de producción de, digamos,
18
Estado de la integración de Sistemas
1.000 productos, podría ser dividida en planta en 5 lotes de 200. Cada “Respuesta de Producción” se refiere a
un sub-lote de 200. Cada “Respuesta de Producción” está compuesta de una serie de “Respuestas de
Segmento” (“Segment Response”) que, a su vez, se compone de una serie de objetos que contienen los datos
reales de la producción para uno o más pasos del proceso. Mostramos esto en el siguiente diagrama de
modelado de objetos del ISA-95.
Figura 2-16. Modelos de Objetos del Rendimiento de la Producción de ISA-95 (Fuente: Fuente especificada
no válida.)
Este modelado de objetos se representa como un conjunto de esquemas XML que forman el B2MML. Por
ejemplo, a continuación se muestra el objeto de “Respuesta de Producción” (“Production Response”).
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 19
Figura 2-17. Esquema B2MML del Objeto Production Response (Fuente: Fuente especificada no válida.)
3 ESCENARIO PARA LA INTEGRACIÓN DE
SISTEMAS
Hazlo todo tan simple como sea possible, pero no más simple.
Albert Einstein.
n este capítulo vamos a describir los sistemas a integrar mediante la implementación del estándar
E ANSI/ISA-95 explicado en el capítulo anterior. Más concretamente describiremos el sistema ERP Odoo
(antes llamado OpenERP) centrándonos en su módulo MRP y, por otro lado, veremos el sistema MES
PROMIA. Para la integración entre ambos, se utilizarán los ficheros B2MML descritos anteriormente.
3.2 Odoo
OpenERP (en la actualidad, Odoo) es un sistema de gestión empresarial (ERP) de código abierto que no
presenta costes de licencia y cubre las necesidades que pueda tener una empresa en las áreas, entre otras, de
contabilidad y finanzas, ventas, recursos humanos, compras, gestión de almacenes, CRM y fabricación.
Fuente especificada no válida.
OpenERP pasó a denominarse Odoo en su versión 8, en la que se incorporan nuevas funcionalidades web,
como el CMS (Gestor de Contenidos Web), herramientas de blog, un módulo para el comercio electrónico y
funcionalidades para el Marketing Online (Newsletters, encuestas, foros o creación de eventos) que funcionan
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 21
como aplicaciones. Por tanto, la inclusión de dichas funcionalidades web, hacen de OpenERP algo más que un
ERP, por ello el cambio de nombre a Odoo pretende desvincular la marca con la palabra “ERP”. Fuente
especificada no válida.
Debido a su carácter modular, permite la personalización de Odoo con aquellas funcionalidades que se
necesiten sin tener instalado ningún módulo que no se vaya a utilizar. Todos estos módulos funcionan de
forma integrada, sin necesidad de utilizar conectores entre distintas aplicaciones. La modularidad de Odoo, por
tanto, permite añadir o eliminar funcionalidades con todos sus datos unificados y con una misma interfaz web.
Odoo utiliza flujos de trabajo flexibles y personalizables conforme a las necesidades específicas de la empresa.
Permite modificar flujos de trabajo de manera gráfica e intuitiva, así como informes personalizados.
Además, es un sistema de código abierto y libre, disponible bajo licencia AGPL (Affero General Public
License), está basado en estándares abiertos y desarrollado basado en herramientas libres.
Odoo es un sistema orientado a objetos que utiliza el lenguaje de programación Python. Utiliza un esquema
cliente-servidor que permite distribuir el servidor y la base de datos para realizar balanceos de carga y
configuraciones en alta disponibilidad.
También permite realizar modificaciones en el código para tener una mayor personalización del sistema a los
procesos de la empresa, sin limitaciones ni restricciones. Además permite la extensión de las aplicaciones
mediante el desarrollo de módulos personalizados que modifiquen el funcionamiento de Odoo según nuestras
necesidades.
Debido a todas estas características de flexibilidad, código abierto y posibilidades para realizar desarrollos
personalizados, Odoo es el ERP que vamos a utilizar para nuestra prueba de concepto de la integración con un
sistema MES mediante el estándar ISA-95. La versión seleccionada de Odoo es la 9 por ser la última
disponible al comienzo de este trabajo.
Como se ha comentado en el apartado anterior, Odoo es un sistema completamente modular que cubre todas
las funciones de las empresas. Entre dichas funciones está el proceso de fabricación de productos en el que
Odoo nos ayuda a la programación de las órdenes de fabricación basándose en los recursos disponibles.
Dichos recursos serían las materias primas, mano de obra y la disponibilidad de una determinada máquina.
Estas funciones se consiguen en Odoo gracias al módulo MRP (Manufacturing Resources Planning).
En el Anexo A se puede seguir un recorrido completo al módulo MRP Fuente especificada no válida.. Las
funcionalidades básicas que ofrece este módulo son las siguientes:
• Planificación de recursos de producción: Gestión de lista de materiales, planificación de órdenes de
producción y seguimiento de órdenes de trabajo.
• Programación eficiente de órdenes de fabricación.
• Definición de Datos Maestros flexible: productos, listas de materiales y operaciones de órdenes de
trabajo.
• Flexibilidad en todas las operaciones
• Programación de órdenes de trabajo: comprobando capacidades de los recursos y resolviendo cuellos
de botella.
• Análisis de Inventarios y Producción.
• Completamente integrado con otras operaciones: Ventas, Compras y Contabilidad.
22
Escenario para la Integración de Sistemas
Figura 3-1. Arquitectura del Sistema PROMIA (Fuente: Fuente especificada no válida.)
En nuestros trabajos de integración con el ERP, el funcionamiento interno del MES no será excesivamente
importante, ya que nuestro objetivo principal es modelar e implementar el intercambio de datos entre ambas
aplicaciones; sin embargo, a continuación vamos a detallar los flujos de trabajo y algunas definiciones del
MES PROMIA que pueden resultar interesantes para entender su funcionamiento y el alcance de la
integración que vamos a desarrollar.
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 23
• Cuellos de botella: Son las operaciones que limitan el ritmo de producción de la fábrica.
• Planificar: Estimar si es posible realizar la fabricación de los productos del pedido para cumplir con
la fecha de entrega establecida en el presupuesto. Si fuera posible su planificación, nos calculará el
tiempo más tardío de comienzo de cada una de las operaciones de los ítems para cumplir con la fecha
de entrega.
• Programar: Determinar la secuencia de procesamiento de cada tarea de la que se compone la
fabricación de productos. Indica en qué momento empieza cada tarea y en qué momento finaliza.
• Órdenes de Trabajo (OT): Orden de fabricación de una unidad de producto, o de un lote de
unidades de un mismo producto que han sido programadas. Una Orden de Trabajo específica, para un
tipo de Producto y una Ruta para fabricar el mismo, el número de unidades de dicho producto que es
preciso fabricar antes de una determinada “Fecha de Entrega”. En el caso de que se trate de un lote de
unidades de un mismo producto, el lote de unidades será tratado de forma conjunta, de manera que a
todos los efectos (incluyendo la programación de la producción) se considerará una única unidad de
producto.
• Tareas: Unidad de trabajo de cada Orden de Trabajo que se corresponde con la fabricación de un
componente del producto asociado. Cada tarea tendrá asociado un estado que describirá su ciclo de
vida desde que se inicia la tarea hasta que se finaliza.
• Estado de la tarea: Indica la fase en la que se encuentra. Se considerarán los siguientes estados:
o Creada: La Orden de Trabajo a la que pertenece la tarea ha sido creada, pero no tiene
asignadas fechas de comienzo ni de finalización estimadas.
o Planificada: La tarea ha sido planificada y tiene, por tanto, unas fechas de inicio y fin
estimadas que vendrán determinadas por el proceso de Planificación de la Producción.
o Programada: La tarea ha sido programada y tiene, por tanto, unas fechas de inicio y fin
estimadas que vendrán determinadas por el proceso de Programación de la Producción.
o En proceso: La tarea ha comenzado, por lo que además de las fechas estimadas, tiene una
fecha de comienzo real.
o Terminada: La tarea ha terminado, por lo que tiene fechas estimadas y reales tanto de inicio
como de finalización.
o Pendiente de Cierre de Observaciones.
o Validada.
4 DESARROLLO DE LA PRUEBA DE CONCEPTO
I.O. Angell
n este capítulo realizaremos una explicación detallada de los desarrollos y modificaciones que se van a
E realizar para la integración entre el sistema ERP Odoo y el sistemas MES PROMIA explicados en el
capítulo anterior. Además, estableceremos los objetivos y el alcance de la implementación de la
integración entre ambos sistemas
integración de sistemas y modificar el estado de las mismas y su fecha de finalización para poder
pasarlas a estado “Finalizada”.
• Desarrollo de Webservice que reciba como entrada el fichero B2MML proveniente del Middleware y
que lo dé de alta en la base de datos del MES.
• Desarrollar función mediante la cual, una vez se detecte la finalización de una orden de fabricación, se
llame al Webservice del Middleware que permita el traspaso de dicha información al ERP.
El desarrollo del Middleware consta de dos servicios web que permitirán la interconexión entre sistemas en los
dos flujos de información definidos anteriormente:
• Desarrollo de Webservice que reciba la llamada desde el ERP adjuntando el fichero B2MML y que lo
traslade al servicio web del MES para que esta se registre en PROMIA. Una vez registrada, trasladará
a Odoo el mensaje positivo o negativo de creación de la orden de fabricación en el MES mediante la
respuesta a la llamada del Servicio Web.
• Desarrollo de Webservice que reciba la llamada desde el MES con el fichero B2MML adjunto de
finalización de orden de fabricación y efectúe la llamada a los procedimientos remotos necesarios de
Odoo mediante XML-RPC para que la orden de fabricación pase a estado “Finalizado”.
Figura 4-9. Edición de flujo de trabajo. Diagrama de Flujo de trabajo de órdenes de producción
En esta ventana podemos crear el nuevo estado que necesitamos haciendo clic en el botón “Nuevo nodo”. El
nuevo estado lo llamaremos send_MES, será de tipo función y especificaremos la función de Python llamada
action_send_MES() que es donde implementaremos las funcionalidades necesarias para el paso a este nuevo
estado.
32
Desarrollo de la prueba de concepto
Figura 4-11. Edición de flujo de trabajo. Formulario de transición desde ready hacia send_MES
Y la transición entre el estado “send_MES” y “in_production”:
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 33
Figura 4-12. Edición de flujo de trabajo. Formulario de transición desde send_MES hacia in_production
Se puede observar que se está definiendo un nuevo botón (“button_send_MES”) para el paso entre el estado
“ready” y “send_MES”. En definitiva el flujo de trabajo de las órdenes de producción quedará como se
observa en la siguiente figura:
Figura 4-13. Edición de flujo de trabajo. Diagrama de Flujo de trabajo de órdenes de producción modificado
En la siguiente sección veremos más en detalle cómo se ha realizado la definición del nuevo estado junto a sus
transiciones y las modificaciones de las vistas mediante el desarrollo de un nuevo módulo de Odoo.
Las modificaciones del flujo de trabajo también se pueden realizar en el nuevo módulo, como veremos en este
apartado.
A este nuevo módulo le llamaremos “isa95mrp” para hacer referencia a que se pretende incluir en éste los
desarrollos necesarios para la implementación del estándar ISA-95 dentro del módulo MRP de Odoo.
En primer lugar, todo módulo de Odoo debe contener un fichero llamado __openerp__.py donde se defina el
nombre del módulo, su descripción, autor, versión y categoría a la que pertenece. Además, podemos definir en
este fichero las dependencias del módulo así como los datos a cargar en la instalación del módulo y
configuración de sus posibilidades a la hora de instalar el módulo.
Figura 4-15. Desarrollo de módulo en Odoo. Fichero isa95mrp_workflow.xml definición de nuevo estado
Se puede observar que definimos el nuevo estado con el nombre “send_MES” y ejecuta la función
“action_send_MES()” que definiremos en este mismo módulo.
En lo que respecta a las nuevas transiciones también las definimos en el fichero XML de workflow:
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 35
Finalmente, para terminar la definición de modificaciones del flujo de trabajo, redefinimos la transición entre
los estados “ready” y “in_prodcution” para evitarla de forma que cortocircuitemos el flujo por defecto de las
órdenes de producción.
Figura 4-18. Desarrollo de módulo en Odoo. Fichero isa95mrp_view.xml definición de nuevo estado en barra
de estados
También en el fichero de vistas incluimos el botón “button_send_MES” antes del botón “button_produce”
además de sustituir la configuración de este último con los botones “button_produce” relativos al nuevo estado
“send_MES”.
Figura 4-20. Desarrollo de módulo en Odoo. Fichero isa95mrp_view.xml definición botón cancel
Por otro lado, y para finalizar el desarrollo del módulo personalizado de Odoo, tenemos que definir el fichero
isa95mrp.py donde desarrollaremos en Python toda la lógica del módulo. En dicho fichero definiremos la clase
“isa95mrp_production” que heredará de la clase “mrp.production” donde se redefinen los estados del MRP de
Odoo de forma análoga a como lo hicimos en el XML de workflow.
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 37
Figura 4-22. Desarrollo de módulo en Odoo. Fichero isa95mrp.py definición función action_send_MES
Se puede observar que, tras la llamada al servicio web del middleware, si este envía el código de alta realizada
correctamente (igual a “0”), pasaremos la orden de fabricación a estado “En Producción”, pero si se recibe un
código de error, cancelaremos la orden de fabricación de Odoo.
Una vez finalizado el desarrollo del módulo personalizado de Odoo, podemos pasar a la instalación del mismo
en Odoo. Para ello, copiamos la carpeta del módulo isa95mrp en la ruta de addons de Odoo (C:\Program Files
(x86)\Odoo 9.0-20160204\server\openerp\addons\ en Windows), a continuación se reinicia el servidor de
Odoo (en Windows se reinicia el servicio odoo-server) y al volver a iniciar Odoo, vamos al menú aplicaciones
en línea y en el buscador de módulos buscamos el texto isa95mrp.
38
Desarrollo de la prueba de concepto
Figura 4-24. Desarrollo de módulo en Odoo. Instalación de Módulo isa95mrp. Detalles del módulo
Si hacemos clic en la pestaña “Technical Data”, nos aparecerá información técnica del módulo donde
podemos destacar las dependencias de este módulo con otros de Odoo.
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 39
Figura 4-25. Desarrollo de módulo en Odoo. Instalación de Módulo isa95mrp. Detalles técnicos del módulo
Observamos que las únicas dependencias de este módulo son con los módulos base y mrp que están ambos
instalados, por tanto podemos proceder a instalar el módulo isa95mrp haciendo clic en el botón “Install”.
Figura 4-26. Desarrollo de módulo en Odoo. Instalación de Módulo isa95mrp. Módulo isa95mrp instalado
Una vez finalizada la instalación del módulo volverá a aparecer la página de detalle del módulo isa95mrp
donde ya aparecen los botones “Actualizar” y “Desinstalar”. Ahora, cuando creemos una nueva orden de
fabricación se regirá por el flujo de trabajo que hemos definido en nuestro módulo y pasará por el estado
“send_MES” donde se generará el fichero B2MML y se llamará al Webservice del Middleware.
Un ejemplo de fichero B2MML que se genera con este módulo se puede observar en el Anexo B.
En el Anexo C se incluye el código de todos los ficheros que forman el módulo personalizado isa95mrp.
En la siguiente tabla se muestran las correspondencias que se han detectado entre la información de Odoo y la
40
Desarrollo de la prueba de concepto
En las siguientes figuras se puede apreciar cómo queda la aplicación MES tras su desarrollo:
producción del MES (tabla P520Ot de PROMIA) y su presupuesto asociado (en su tabla P510Presupuesto
correspondiente). Durante esta transacción a la base de datos, se comprobará que los datos de productos,
materiales y recursos físicos y humanos son correctos y ya existen en la base de datos PROMIA, en caso
afirmativo, se responderá al servicio web con un código de procesamiento correcto; en caso contrario, se
devolverá un error.
Figura 4-32. Operación addManufacturingOrder del Servicio Web del MES PROMIA
El mapeo de la información recibida en el fichero B2MML en la base de datos se realiza en la función
parse2Database que básicamente comprueba que la información que contiene es correcta y coherente con la
información del MES (productos, materiales, etc.) y que si la información es correcta, realiza el alta de los
registros correspondientes en la tabla de presupuestos y en la de órdenews de fabricación, como se observa en
el siguiente código:
Figura 4-40 - Formulario de orden de producción MO00073 en estado Esperando materias primas
En la siguiente imagen se puede observar cómo en el estado Listo para producir nos aparece el botón Enviar
al MES que realizará el procedimiento de generación del fichero B2MML y llamada al servicio web del
middleware.
52
Desarrollo de la prueba de concepto
Figura 4-41 - Formulario de orden de producción MO00073 en estado Listo para producir
Cuando pulsamos el botón Enviar al MES, tras unos pocos segundos de carga, la orden de fabricación pasa
directamente a estado Producción Iniciada, ya que el estado Envío al MES es transitorio mientras se recibe
respuesta a la llamada al servicio web.
Figura 4-42 - Formulario de orden de producción MO00073 en estado Producción iniciada tras generación de
fichero B2MML
Una vez que se ha enviado la información al MES, podemos comprobar que se ha generado el correspondiente
fichero B2MML en el repositorio de ficheros (Nótese el identificador 66 en el nombre del fichero resaltado en
la captura).
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 53
Figura 4-53. Detalle de producto en Odoo. Se observa que se ha incrementado el número de unidades
Figura 4-55 - Esquema Físico de Integración de Sistemas con bases de datos en servidores independientes
Además, dependiendo de la criticidad con la que se evalúen los procesos del negocio que soportan estos
sistemas, puede resultar imprescindible la configuración de los servidores en alta disponibilidad y con una
contingencia de los servidores e incluso de las salas donde estos se ubiquen.
Es una buena práctica conocida la publicación de los servicios web en un bus de servicios para tener una
arquitectura SOA (Service Oriented Architecture), de esta manera, se pueden publicar los servicios de esta
integración y otros servicios propios de la organización en cuestión centralizando las llamadas en un único
servidor incrementando la mantenibilidad y accesibilidad de los servicios web.
5 CONCLUSIONES Y LÍNEAS FUTURAS
Edsger W. Dijkstra
n este capítulo realizaremos una evaluación final de la prueba de concepto desarrollada en este trabajo
E para la integración de sistemas mediante el estándar ANSI/ISA-95. Además, se sentarán las bases para
las posibles líneas de investigación y trabajo que se puedan derivar de la elaboración del trabajo.
5.1 Conclusiones
Mediante el desarrollo de la prueba de concepto que se ha explicado en el presente trabajo fin de máster se ha
demostrado la simplicidad que otorga el estándar ANSI/ISA-95 a la hora de realizar la integración entre los
sistemas ERP y MES. Quizá se podría destacar que la mayor complejidad reside en el mapeo de campos entre
los sistemas y los ficheros B2MML.
En nuestro caso, al no estar Odoo preparado para la integración con el estándar ISA-95, hemos tenido que
desarrollar un módulo completo que permita la generación de ficheros B2MML en el paso a producción de las
órdenes de fabricación.
Por otro lado, al haber desarrollado la aplicación MES a partir de su base de datos, hemos podido hacer que el
MES cumpliera el estándar y pudiera leer y generar los ficheros B2MML necesarios para su comunicación con
ERP.
Debido a esto último, nuestro Middleware se ha quedado algo más vacío de funcionalidad, con la excepción de
las necesarias llamadas a procedimientos remotos de Odoo para la finalización de órdenes de producción a
partir de la información recibida del MES en forma de fichero B2MML.
Si el MES a integrar hubiera sido de código cerrado y no cumpliera con el estándar ISA-95, tendríamos que
haber realizado un desarrollo más extenso en sistema de integración Middleware porque tendríamos que haber
traducido los ficheros B2MML en el formato de los mensajes que entendiera el sistema MES en cuestión.
En los últimos tiempos el estándar ANSI/ISA-95 está adquiriendo una notoriedad en el sector industrial que
los proveedores de software y los integradores no pueden ignorar. En el nivel del MES, los proveedores de
sistemas ofrecen interfaces que cumplen con el estándar ISA-95 y en el nivel de los ERP, nos encontramos con
que SAP, el líder mundial de este tipo de sistemas, ofrece también interfaces que cumplen el estándar. Por lo
tanto, es innegable que se hace necesario el ofrecer una integración completa cumpliendo el estándar ISA-95
para el ERP Odoo, lo cual podría considerarse una oportunidad de mercado.
El estándar ANSI/ISA-95 no está enfocado tan sólo a la interfaz entre sistemas de la empresa y del control de
la producción, sino que también puede utilizarse como una buena guía que recopila los requisitos funcionales y
de los usuarios, para el desarrollo de aplicaciones MES y bases de datos y para la optimización procesos
productivos.
La utilización de estándares está creciendo en la industria, pero la cuestión permanece en si las empresas
también siguen esto estándares en sus métodos de trabajo; es por ello que existe un clamor que solicita la
creación de un certificado de cumplimiento del estándar ISA-95 para sistemas; sin embargo, de momento no
parece que se vaya a llevar a cabo, pues el estándar aún sigue en desarrollo.
62
Conclusiones y líneas futuras
Figura A-4. Página de aplicaciones en línea de Odoo antes de instalar el módulo MRP
Hacemos clic en Install y esperamos a que cargue. En cuanto finaliza de instalar volvemos a la misma página
de instalación de módulos (Aplicaciones en línea):
Se puede pensar en una lista de materiales como una receta de cocina; ya que para fabricar un producto vamos
a necesitar una serie de materias primas que, gracias al proceso productivo, se convertirán en el producto final.
Por lo tanto, antes de crear una orden de producción vamos a crear un producto donde definiremos la lista de
materias primas necesarias para su fabricación.
Vamos a poner como ejemplo la fabricación de un PC de sobremesa que tiene como materias primas la
carcasa del PC, la placa base, la fuente de alimentación, el disco duro y la memoria RAM (un PC de
sobremesa tendrá más componentes, pero lo dejaremos simple de momento para mostrar las posibilidades del
módulo MRP de Odoo).
Para crear el producto, hacemos clic en el menú Productos y hacemos clic en el botón Crear:
68
Anexos
Figura A-9. Página inicial de Lista de Materiales de Producto del módulo MRP de Odoo
Hacemos clic en el botón Crear y observamos que el campo Producto se rellena automáticamente:
Una vez que hemos creado la lista de materiales, podemos continuar creando la orden de fabricación de
nuestro producto.
Para ello, seleccionamos el enlace del menú lateral Órdenes de producción y pulsamos el botón Crear.
Como se comentó en el apartado anterior, es posible que necesitemos especificar distintas configuraciones
para un mismo producto que requiera que la lista de materiales sea distinta según las materias primas que se
utilicen. Para ello, Odoo nos permite crear varias listas de materiales para un mismo producto final; esto es útil
para, por ejemplo, crear un mismo producto con distintas configuraciones; en nuestro caso crearemos una
variación del montaje para poder definir un PC sobremesa con montaje multimedia que incluya una tarjeta
gráfica y más memoria RAM que la configuración estándar.
Para crear esta nueva lista de materiales podemos abrir la que creamos anteriormente y hacer clic en Acción >
Duplicar para que nos cree una nueva lista de materiales pero basada en los datos ya configurados en la lista
anterior.
Una vez duplicada la lista de materiales, podemos modificar los componentes para crear el nuevo tipo de
montaje.
Figura A-26. Formulario de creación de Orden de producción en estado Nuevo. Selección de lista de
materiales
Cuando guardamos y confirmamos producción de esta nueva orden de producción nos volverán a aparecer los
materiales en rojo en el apartado de Productos a consumir. Al hacer clic en Reserva, ya tendremos las
materias primas reservadas para su consumo en el proceso de fabricación.
Figura A-27. Formulario de creación de Orden de producción en estado Listo para producir
En esta ocasión vamos a consumir los materiales de uno en uno utilizando la flecha verde que aparece junto a
ellos; en lugar de pulsar el botón Producir. Esta manera de consumir los productos de uno en uno nos permite
tener un seguimiento del proceso de fabricación más a bajo nivel informando al sistema del consumo de los
productos a medida que se vayan utilizando.
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 79
Figura A-29. Formulario de creación de Orden de producción en estado Producción iniciada con materiales
consumidos.
Al pulsar el botón Producir, nos aparecerá la ventana de confirmación pero en esta ocasión no se listarán los
productos a consumir pues ya se han consumido de uno en uno.
80
Anexos
En este apartado vamos a comprobar cómo se comporta Odoo cuando especificamos los rangos de fechas de
los materiales de la lista de materiales. En nuestro caso vamos a suponer que a partir de una fecha determinada
vamos a dejar de montar los PCs de sobremesa con la placa base habitual y se van a comenzar a montar con
una nueva placa base de otro proveedor o de un modelo superior, por ejemplo.
Para ello, en la lista de materiales estándar editamos la línea de la placa base y ponemos la fecha deseada en el
campo Válido hasta. Además, añadimos un material Nueva Placa Base que indicaremos que estará disponible
a partir de la fecha introducida en el campo Válido desde.
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 81
Figura A-32. Formulario de Lista de materiales con rangos de fechas para los materiales
Para ver cómo funcionan estos campos de rango de fechas vamos a crear una nueva orden de fabricación con
una fecha prevista de fabricación posterior a la fecha en que deja de estar disponible la placa base antigua.
Figura A-33. Formulario de creación de Orden de producción con fecha de fabricación posterior a la fecha de
disponibilidad de materiales
Observamos que, al confirmar la producción de la orden de fabricación, los productos a consumir se ven ahora
distintos, ya que no aparece la placa base antigua pero sí aparece la Nueva Placa Base.
Hay que destacar que estos campos no se tienen en cuenta para fechas futuras; es decir, si en la orden de
facturación seleccionamos una fecha prevista futura y en la lista de materiales hemos configurado un cambio
de materias primas por fechas también futuras (anteriores a la fecha prevista de la orden de fabricación), en los
productos a consumir de la orden no se refleja este cambio de materias primas. Si las fechas de cambio de
materiales ya han pasado, al crear la orden de producción, sí se refleja el cambio de materiales en los productos
82
Anexos
a consumir.
Esto es probablemente un bug que se corrija en nuevas actualizaciones de Odoo, pero de momento hay que
tenerlo en cuenta para la especificación de componentes por rango de fechas.
Hasta el momento todas las materias primas que hemos ido consumiendo en nuestras órdenes de producción
han sido del tipo consumible (Consumable), por lo que Odoo, nos permitía su reserva incluso aunque no los
tuviéramos en el inventario. Sin embargo, podemos configurar uno de los materiales de la lista como un
producto almacenable (Stockable Product) que sea subproducto de otras materias primas de manera que se
puede configurar el módulo MRP de manera más modular.
En nuestro ejemplo supongamos que una placa base no es un producto consumible y que tiene que ser
fabricado y almacenado a partir de un circuito integrado, un microprocesador y un ventilador para este.
Figura A-35. Formulario de creación de orden de producción de producto con materiales que han de ser
fabricados
En esta ocasión podemos bien crear una orden de fabricación para fabricar una nueva placa base o bien
podemos forzar la reserva de materiales (botón Forzar reservas) que nos permite reservar materiales aun
cuando éstos no estén disponibles. Esta opción es útil cuando sabemos que tenemos disponibilidad del
producto aunque Odoo desconozca su existencia en el inventario.
Como vimos en la sección anterior, al configurar la nueva placa base como un producto que se debe fabricar,
al reservar materiales en una orden de fabricación, la placa base se mantiene en rojo y sólo pudimos
consumirla forzando su reserva, veamos ahora cómo podemos arreglar estos problemas de abastecimiento del
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 85
Odoo nos permite la opción de generar órdenes de producción de productos intermedios a partir de la orden de
producción del producto final; es decir, en nuestro ejemplo, podríamos configurar el producto intermedio
90
Anexos
Nueva Placa Base para que cuando se genere una orden de fabricación de PCs de sobremesa que requieran la
fabricación de Nuevas Placas Base, por no tener en stock, se cree de manera automática la orden de
producción para las nuevas placas base necesarias para cubrir la producción de PCs de Sobremesa de la orden
original.
Para ello, vamos a la configuración del producto Nueva Placa Base y en la pestaña Inventario, en la sección
Rutas, activamos las opciones Fabricar y Bajo Pedido.
siguiente captura) que se encuentra en espera de materias primas y cuyo Documento Origen es nuestra orden
de producción de PC de Sobremesa original (MO00011).
Figura A-52. Listado de órdenes de fabricación. Orden de producción de producto pasa automáticamente a
estado Listo para producir
Y ya podremos finalizar la fabricación de nuestro producto final.
Figura A-58. Formulario de Orden de producción de producto compuesto por subproductos en estado
Esperando materias primas
Pero si vemos ahora el listado de órdenes de producción, observaremos que se ha creado una orden de
producción de la nueva placa base que a su vez ha generado una orden de producción para el circuito integrado
que lo compone.
Figura A-59. Listado de Órdenes de producción. Se han creado automáticamente dos órdenes de productos
intermedios del producto final
Si intentamos ahora realizar la reserva de materiales de la orden de producción de la Nueva Placa Base
(MO00014), observaremos que el material Circuito Integrado no se puede reservar porque tiene una orden de
fabricación en espera de materiales (MO00015).
96
Anexos
Figura A-60. Formulario de Orden de producción de producto intermedio que depende de subproducto
Por lo tanto, tenemos que ejecutar la orden de producción del circuito integrado antes de poder fabricar la
nueva placa base. Una vez que el Circuito Integrado esté disponible, orden de fabricación de la Nueva Placa
Base pasará a estado Listo para Producir.
En esta sección vamos a definir unas cantidades mínimas y máximas de materiales y productos para que las
órdenes de producción se lancen de forma automática para satisfacer esas unidades mínimas.
Supongamos que la Carcasa de PC es un producto que tenga que ser montado por nuestros operarios a partir
de las piezas de montaje del proveedor. Al ser una pieza tan básica en la producción de PCs de sobremesa,
digamos que queremos tener una cantidad mínima en stock de 5 unidades y como máximo 20 para no saturar
el espacio de nuestro almacén. Para ello modificamos el producto Carcasa PC para hacerlo un Stockable
Product, en lugar de Consumable.
98
Anexos
Figura A-69. Listado de Órdenes de producción. Se crea orden de fabricación automática a partir de regla de
abastecimiento
Si ejecutamos dicha orden de producción y volvemos al detalle del producto observaremos que la cantidad de
producto ha llegado a 20, el máximo que habíamos configurado.
102
Anexos
Figura A-70. Formulario detalle de producto tras la ejecución de la orden de fabricación de reabastecimiento
Hasta el momento hemos estado gestionando la producción mediante órdenes de fabricación; sin embargo,
Odoo nos ofrece la posibilidad de gestionarla mediante órdenes de trabajo. Para modificar esta forma de
trabajar, en primer lugar tenemos que modificar la configuración del módulo MRP de Odoo, por tanto, en la
sección Configuración, hacemos clic en Settings y en la opción Rutas de Producción se selecciona
Gestionar la producción por órdenes de trabajo como se muestra en la captura siguiente.
Figura A-71. Página de configuración del módulo MRP. Se señala la opción para gestionar las órdenes de
producción como órdenes de trabajo
Con esta configuración las operaciones de una orden de trabajo nos permiten crear y gestionar las operaciones
de fabricación que deben seguirse en nuestros distintos centros de trabajo con el fin de fabricar un producto.
Dichos centros de trabajo se asocian a las listas de materiales que definirán las materias primas necesarias.
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 103
En cuanto modifiquemos esta configuración, nos aparecerá dentro del menú de configuración dos nuevas
entradas correspondientes a los Centros de producción y Rutas de Producción, veamos con más detalle
cada uno de ellos.
Al acceder al menú Centros de producción nos aparecerá la opción de crear un centro de trabajo que nos
permiten crear y gestionar las unidades de fabricación. Estos centros se componen de trabajadores y/o
máquinas a las que se asignarán tareas y se configurará su capacidad y previsión de la planificación.
• Información de costes:
o Producto centro producción: Producto que se genera en el centro de producción. Sirve para
seguir la pista a sus costes de producción fácilmente en la contabilidad analítica.
o Coste por hora: Coste horario del centro de producción.
o Coste por ciclo: Coste del centro de producción por ciclo.
• Descripción: Texto que describa más concretamente al centro de producción.
nuestra empresa y tiene como única operación el montaje de las placas base en el centro de trabajo de montaje
de las mismas.
Figura A-80. Formulario de orden de producción con orden de trabajo creada automáticamente
En la orden de trabajo que se ha creado automáticamente podemos ver que se calcula el número de horas
según configuramos en el centro de trabajo; es decir, se suma el tiempo para un ciclo al tiempo necesario para
la pre y post producción del artículo (total de 23 minutos en el ejemplo).
Si vamos ahora al listado de órdenes de producción, veremos que la configuración de rutas y centros de
producción no ha afectado a las configuraciones previas que habíamos definido para la fabricación de los
productos intermedios y; por tanto, se ha generado una orden de producción para el circuito integrado
necesario para la nueva placa base.
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 109
<Description />
<Value />
<Quantity />
</PersonnelRequirementProperty>
<RequiredByRequestedSegmentResponse />
</PersonnelRequirement>
<EquipmentRequirement>
<EquipmentClassID />
<EquipmentID />
<Description />
<HierarchyScope />
<Quantity />
<EquipmentRequirementProperty>
<ID />
<Description />
<Value />
<Quantity />
</EquipmentRequirementProperty>
<RequiredByRequestedSegmentResponse />
</EquipmentRequirement>
<PhysicalAssetRequirement>
<PhysicalAssetClassID />
<PhysicalAssetID>False</PhysicalAssetID>
<Description />
<HierarchyScope>False</HierarchyScope>
<Quantity />
<PhysicalAssetRequirementProperty>
<ID>False</ID>
<Description>False</Description>
<Value />
<Quantity>1</Quantity>
</PhysicalAssetRequirementProperty>
<RequiredByRequestedSegmentResponse />
</PhysicalAssetRequirement>
<MaterialRequirement>
<MaterialClassID />
<MaterialDefinitionID />
<MaterialLotID />
<MaterialSubLotID />
112
Anexos
<Description>Circuito Integrado</Description>
<HierarchyScope>False</HierarchyScope>
<MaterialUse>Product</MaterialUse>
<Quantity>1.0</Quantity>
<AssemblyRequirement />
<AssemblyType />
<AssemblyRelationship />
<MaterialRequirementProperty>
<ID>11</ID>
<Description>
Circuito Integrado
</Description>
<Value>Product</Value>
<Quantity>1.0</Quantity>
</MaterialRequirementProperty>
<RequiredByRequestedSegmentResponse />
</MaterialRequirement>
<MaterialRequirement>
<MaterialClassID />
<MaterialDefinitionID />
<MaterialLotID />
<MaterialSubLotID />
<Description>Chip Controlador
Memoria</Description>
<HierarchyScope>False</HierarchyScope>
<MaterialUse>Consumed</MaterialUse>
<Quantity>1.0</Quantity>
<AssemblyRequirement />
<AssemblyType />
<AssemblyRelationship />
<MaterialRequirementProperty>
<ID>14</ID>
<Description>
Chip Controlador Memoria
</Description>
<Value>Raw Material</Value>
<Quantity>1.0</Quantity>
</MaterialRequirementProperty>
<RequiredByRequestedSegmentResponse />
</MaterialRequirement>
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 113
<MaterialRequirement>
<MaterialClassID />
<MaterialDefinitionID />
<MaterialLotID />
<MaterialSubLotID />
<Description>Chip Controlador I/O</Description>
<HierarchyScope>False</HierarchyScope>
<MaterialUse>Consumed</MaterialUse>
<Quantity>1.0</Quantity>
<AssemblyRequirement />
<AssemblyType />
<AssemblyRelationship />
<MaterialRequirementProperty>
<ID>15</ID>
<Description>Chip Controlador I/O
</Description>
<Value>Raw Material</Value>
<Quantity>1.0</Quantity>
</MaterialRequirementProperty>
<RequiredByRequestedSegmentResponse/>
</MaterialRequirement>
<RequiredByRequestedSegmentResponse />
<SegmentState />
</SegmentRequirement>
<SegmentResponse>False</SegmentResponse>
<RequestState />
</ProductionRequest>
<ScheduleState />
</ProductionSchedule>
114
Anexos
isa95mrp.py
class isa95mrp_production(orm.Model):
"""
Extending Production Orders / Manufacturing Orders Workflow
"""
_inherit = ‘mrp.production’
_columns = {
‘state’: fields.selection([
(‘draft’, ‘New’),
(‘cancel’, ‘Cancelled’),
(‘confirmed’, ‘Awaiting Raw Materials’),
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 115
productionScheduleEquipmentElementLevel =
ElementTree.SubElement(productionSchedule,
"EquipmentElementLevel")
productionScheduleEquipmentElementLevel.text = "Site"
# <ProductionRequest>
productionScheduleProductionRequest =
ElementTree.SubElement(productionSchedule,
"ProductionRequest")
# <ID />
productionScheduleProductionRequestID =
ElementTree.SubElement(productionScheduleProductionRequest,
"ID")
productionScheduleProductionRequestID.text = str(man_order.id)
# <Description />
productionScheduleProductionRequestDescription =
ElementTree.SubElement(productionScheduleProductionRequest,
"Description")
productionScheduleProductionRequestDescription.text =
str(man_order.name)
# <ProductProductionRuleIDGroup />
productionScheduleProductionRequestProductProductionRuleIDGroup =
ElementTree.SubElement(productionScheduleProductionRequest,
"ProductProductionRuleIDGroup")
# <HierarchyScope />
productionScheduleProductionRequestHierarchyScope =
ElementTree.SubElement(productionScheduleProductionRequest,
"HierarchyScope")
productionScheduleProductionRequestHierarchyScope.text =
str(routing_obj.name)
# <StartTime />
productionScheduleProductionRequestStartTime =
ElementTree.SubElement(productionScheduleProductionRequest,
"StartTime")
productionScheduleProductionRequestStartTime.text =
str(man_order.date_planned)
# <EndTime />
productionScheduleProductionRequestEndTime =
ElementTree.SubElement(productionScheduleProductionRequest,
"EndTime")
productionScheduleProductionRequestEndTime.text =
str(man_order.date_finished)
# <Priority />
productionScheduleProductionRequestPriority =
ElementTree.SubElement(productionScheduleProductionRequest,
"Priority")
productionScheduleProductionRequestPriority.text =
str(man_order.priority)
# <SegmentRequirement>
productionScheduleProductionRequestSegmentRequirement =
ElementTree.SubElement(productionScheduleProductionRequest,
"SegmentRequirement")
# <ID />
productionScheduleProductionRequestSegmentRequirementID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentR
equirement, "ID")
productionScheduleProductionRequestSegmentRequirementID.text =
str(man_order.id)
# <ProductSegmentID />
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 117
productionScheduleProductionRequestSegmentRequirementProductSegmentID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirement,
"ProductSegmentID")
# <ProcessSegmentID />
productionScheduleProductionRequestSegmentRequirementProcessSegmentID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirement,
"ProcessSegmentID")
# <Description />
productionScheduleProductionRequestSegmentRequirementDescription =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirement,
"Description")
productionScheduleProductionRequestSegmentRequirementDescription.text =
str(man_order.name)
# <HierarchyScope />
productionScheduleProductionRequestSegmentRequirementHierarchyScope =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirement,
"HierarchyScope")
productionScheduleProductionRequestSegmentRequirementHierarchyScope.text =
str(routing_obj.name)
# <EarliestStartTime />
productionScheduleProductionRequestSegmentRequirementEarliestStartTime =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirement,
"EarliestStartTime")
productionScheduleProductionRequestSegmentRequirementEarliestStartTime.text =
str(man_order.date_planned)
# <LatestEndTime />
productionScheduleProductionRequestSegmentRequirementLatestEndTime =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirement,
"LatestEndTime")
date_planned =
datetime.datetime.strptime(str(man_order.date_planned), ‘%Y-
%m-%d %H:%M:%S’)
date_planned_1 = date_planned + datetime.timedelta(days=1)
productionScheduleProductionRequestSegmentRequirementLatestEndTime.text =
str(date_planned_1)
# <Duration />
productionScheduleProductionRequestSegmentRequirementDuration =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirement,
"Duration")
productionScheduleProductionRequestSegmentRequirementDuration.text =
str(man_order.hour_total)
# <ProductionParameter>
productionScheduleProductionRequestSegmentRequirementProductionParameter =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirement,
"ProductionParameter")
# <ProductSegmentID />
productionScheduleProductionRequestSegmentRequirementProductionParameterProdu
ctSegmentID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
roductionParameter, "ProductSegmentID")
# <ProcessSegmentID />
productionScheduleProductionRequestSegmentRequirementProductionParameterProce
ssSegmentID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
roductionParameter, "ProcessSegmentID")
# <Parameter />
productionScheduleProductionRequestSegmentRequirementProductionParameterParam
eter =
118
Anexos
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
roductionParameter, "Parameter")
# </ProductionParameter>
# <PersonnelRequirement>
productionScheduleProductionRequestSegmentRequirementPersonnelRequirement =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirement,
"PersonnelRequirement")
# <PersonnelClassID />
productionScheduleProductionRequestSegmentRequirementPersonnelRequirementPers
onnelClassID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
ersonnelRequirement, "PersonnelClassID")
# <PersonID />
productionScheduleProductionRequestSegmentRequirementPersonnelRequirementPers
onID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
ersonnelRequirement, "PersonID")
# <Description />
productionScheduleProductionRequestSegmentRequirementPersonnelRequirementDesc
ription =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
ersonnelRequirement, "Description")
# <HierarchyScope />
productionScheduleProductionRequestSegmentRequirementPersonnelRequirementHier
archyScope =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
ersonnelRequirement, "HierarchyScope")
# <Quantity />
productionScheduleProductionRequestSegmentRequirementPersonnelRequirementQuan
tity =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
ersonnelRequirement, "Quantity")
# <PersonnelRequirementProperty>
productionScheduleProductionRequestSegmentRequirementPersonnelRequirementPers
onnelRequirementProperty =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
ersonnelRequirement, "PersonnelRequirementProperty")
# <ID />
productionScheduleProductionRequestSegmentRequirementPersonnelRequirementPers
onnelRequirementPropertyID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
ersonnelRequirementPersonnelRequirementProperty, "ID")
# <Description />
productionScheduleProductionRequestSegmentRequirementPersonnelRequirementPers
onnelRequirementPropertyDescription =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
ersonnelRequirementPersonnelRequirementProperty, "Description")
# <Value />
productionScheduleProductionRequestSegmentRequirementPersonnelRequirementPers
onnelRequirementPropertyValue =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
ersonnelRequirementPersonnelRequirementProperty, "Value")
# <Quantity />
productionScheduleProductionRequestSegmentRequirementPersonnelRequirementPers
onnelRequirementPropertyQuantity =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
ersonnelRequirementPersonnelRequirementProperty, "Quantity")
# </PersonnelRequirementProperty>
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 119
#
<RequiredByRequestedSegmentResponse />
productionScheduleProductionRequestSegmentRequirementPersonnelRequirementRequ
iredByRequestedSegmentResponse =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
ersonnelRequirement, "RequiredByRequestedSegmentResponse")
# </PersonnelRequirement>
# <EquipmentRequirement>
productionScheduleProductionRequestSegmentRequirementEquipmentRequirement =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirement,
"EquipmentRequirement")
# <EquipmentClassID />
productionScheduleProductionRequestSegmentRequirementEquipmentRequirementEqui
pmentClassID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementE
quipmentRequirement, "EquipmentClassID")
# <EquipmentID />
productionScheduleProductionRequestSegmentRequirementEquipmentRequirementEqui
pmentID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementE
quipmentRequirement, "EquipmentID")
# <Description />
productionScheduleProductionRequestSegmentRequirementEquipmentRequirementDesc
ription =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementE
quipmentRequirement, "Description")
# <HierarchyScope />
productionScheduleProductionRequestSegmentRequirementEquipmentRequirementHier
archyScope =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementE
quipmentRequirement, "HierarchyScope")
# <Quantity />
productionScheduleProductionRequestSegmentRequirementEquipmentRequirementQuan
tity =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementE
quipmentRequirement, "Quantity")
# <EquipmentRequirementProperty>
productionScheduleProductionRequestSegmentRequirementEquipmentRequirementEqui
pmentRequirementProperty =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementE
quipmentRequirement, "EquipmentRequirementProperty")
# <ID />
productionScheduleProductionRequestSegmentRequirementEquipmentRequirementEqui
pmentRequirementPropertyID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementE
quipmentRequirementEquipmentRequirementProperty, "ID")
# <Description />
productionScheduleProductionRequestSegmentRequirementEquipmentRequirementEqui
pmentRequirementPropertyDescription =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementE
quipmentRequirementEquipmentRequirementProperty, "Description")
# <Value />
productionScheduleProductionRequestSegmentRequirementEquipmentRequirementEqui
pmentRequirementPropertyValue =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementE
quipmentRequirementEquipmentRequirementProperty, "Value")
# <Quantity />
120
Anexos
productionScheduleProductionRequestSegmentRequirementEquipmentRequirementEqui
pmentRequirementPropertyQuantity =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementE
quipmentRequirementEquipmentRequirementProperty, "Quantity")
# </EquipmentRequirementProperty>
#
<RequiredByRequestedSegmentResponse />
productionScheduleProductionRequestSegmentRequirementEquipmentRequirementRequ
iredByRequestedSegmentResponse =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementE
quipmentRequirement, "RequiredByRequestedSegmentResponse")
# </EquipmentRequirement>
# <PhysicalAssetRequirement>
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
=
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirement,
"PhysicalAssetRequirement")
# <PhysicalAssetClassID />
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
PhysicalAssetClassID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
hysicalAssetRequirement, "PhysicalAssetClassID")
# <PhysicalAssetID />
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
PhysicalAssetID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
hysicalAssetRequirement, "PhysicalAssetID")
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
PhysicalAssetID.text = str(routing_obj.id)
# <Description />
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
Description =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
hysicalAssetRequirement, "Description")
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
Description = str(routing_obj.name)
# <HierarchyScope />
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
HierarchyScope =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
hysicalAssetRequirement, "HierarchyScope")
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
HierarchyScope.text = str(routing_obj.code)
# <Quantity />
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
Quantity =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
hysicalAssetRequirement, "Quantity")
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
Quantity = "1"
#
<PhysicalAssetRequirementProperty>
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
PhysicalAssetRequirementProperty =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
hysicalAssetRequirement, "PhysicalAssetRequirementProperty")
# <ID />
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 121
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
PhysicalAssetRequirementPropertyID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
hysicalAssetRequirementPhysicalAssetRequirementProperty, "ID")
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
PhysicalAssetRequirementPropertyID.text = str(routing_obj.id)
# <Description />
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
PhysicalAssetRequirementPropertyDescription =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
hysicalAssetRequirementPhysicalAssetRequirementProperty, "Description")
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
PhysicalAssetRequirementPropertyDescription.text = str(routing_obj.name)
# <Value />
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
PhysicalAssetRequirementPropertyValue =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
hysicalAssetRequirementPhysicalAssetRequirementProperty, "Value")
# <Quantity />
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
PhysicalAssetRequirementPropertyQuantity =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
hysicalAssetRequirementPhysicalAssetRequirementProperty, "Quantity")
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
PhysicalAssetRequirementPropertyQuantity.text = "1"
#
</PhysicalAssetRequirementProperty>
#
<RequiredByRequestedSegmentResponse />
productionScheduleProductionRequestSegmentRequirementPhysicalAssetRequirement
RequiredByRequestedSegmentResponse =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementP
hysicalAssetRequirement, "RequiredByRequestedSegmentResponse")
# </PhysicalAssetRequirement>
# <MaterialRequirement> PRODUCT
productionScheduleProductionRequestSegmentRequirementMaterialRequirement =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirement,
"MaterialRequirement")
# <MaterialClassID />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialClassID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "MaterialClassID")
# <MaterialDefinitionID />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialDefinitionID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "MaterialDefinitionID")
# <MaterialLotID />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialLotID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "MaterialLotID")
# <MaterialSubLotID />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialSubLotID =
122
Anexos
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "MaterialSubLotID")
# <Description />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementDescr
iption =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "Description")
productionScheduleProductionRequestSegmentRequirementMaterialRequirementDescr
iption.text = str(product_obj.name_template)
# <HierarchyScope />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementHiera
rchyScope =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "HierarchyScope")
productionScheduleProductionRequestSegmentRequirementMaterialRequirementHiera
rchyScope.text = str(routing_obj.name)
# <MaterialUse />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialUse =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "MaterialUse")
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialUse.text = "Product"
# <Quantity />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementQuant
ity =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "Quantity")
productionScheduleProductionRequestSegmentRequirementMaterialRequirementQuant
ity.text = str(man_order.product_qty)
# <AssemblyRequirement />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementAssem
blyRequirement =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "AssemblyRequirement")
# <AssemblyType />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementAssem
blyType =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "AssemblyType")
# <AssemblyRelationship />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementAssem
blyRelationship =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "AssemblyRelationship")
# <MaterialRequirementProperty>
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementProperty =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "MaterialRequirementProperty")
# <ID />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementPropertyID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirementMaterialRequirementProperty, "ID")
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementPropertyID.text = str(product_obj.id)
# <Description />
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 123
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementPropertyDescription =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirementMaterialRequirementProperty, "Description")
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementPropertyDescription.text = str(product_obj.name_template)
# <Value />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementPropertyValue =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirementMaterialRequirementProperty, "Value")
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementPropertyValue.text = "Product"
# <Quantity />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementPropertyQuantity =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirementMaterialRequirementProperty, "Quantity")
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementPropertyQuantity.text = str(man_order.product_qty)
# </MaterialRequirementProperty>
#
<RequiredByRequestedSegmentResponse />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementRequi
redByRequestedSegmentResponse =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "RequiredByRequestedSegmentResponse")
# </MaterialRequirement>
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "Description")
productionScheduleProductionRequestSegmentRequirementMaterialRequirementDescr
iption.text = str(bom_line.product_id.name_template)
# <HierarchyScope />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementHiera
rchyScope =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "HierarchyScope")
productionScheduleProductionRequestSegmentRequirementMaterialRequirementHiera
rchyScope.text = str(routing_obj.name)
# <MaterialUse />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialUse =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "MaterialUse")
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialUse.text = "Consumed"
# <Quantity />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementQuant
ity =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "Quantity")
productionScheduleProductionRequestSegmentRequirementMaterialRequirementQuant
ity.text = str(bom_line.product_qty)
# <AssemblyRequirement />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementAssem
blyRequirement =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "AssemblyRequirement")
# <AssemblyType />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementAssem
blyType =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "AssemblyType")
# <AssemblyRelationship />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementAssem
blyRelationship =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "AssemblyRelationship")
#
<MaterialRequirementProperty>
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementProperty =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "MaterialRequirementProperty")
# <ID />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementPropertyID =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirementMaterialRequirementProperty, "ID")
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementPropertyID.text = str(bom_line.product_id.id)
# <Description />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementPropertyDescription =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirementMaterialRequirementProperty, "Description")
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementPropertyDescription.text =
str(bom_line.product_id.name_template)
Integración de sistemas ERP y MES mediante el estándar ANSI/ISA-95 125
# <Value />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementPropertyValue =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirementMaterialRequirementProperty, "Value")
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementPropertyValue.text = "Raw Material"
# <Quantity />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementPropertyQuantity =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirementMaterialRequirementProperty, "Quantity")
productionScheduleProductionRequestSegmentRequirementMaterialRequirementMater
ialRequirementPropertyQuantity.text = str(bom_line.product_qty)
#
</MaterialRequirementProperty>
#
<RequiredByRequestedSegmentResponse />
productionScheduleProductionRequestSegmentRequirementMaterialRequirementRequi
redByRequestedSegmentResponse =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirementM
aterialRequirement, "RequiredByRequestedSegmentResponse")
# </MaterialRequirement>
# <RequiredByRequestedSegmentResponse />
productionScheduleProductionRequestSegmentRequirementRequiredByRequestedSegme
ntResponse =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirement,
"RequiredByRequestedSegmentResponse")
# <SegmentState />
productionScheduleProductionRequestSegmentRequirementSegmentState =
ElementTree.SubElement(productionScheduleProductionRequestSegmentRequirement,
"SegmentState")
# </SegmentRequirement>
# <SegmentResponse />
productionScheduleProductionRequestSegmentResponse =
ElementTree.SubElement(productionScheduleProductionRequest,
"SegmentResponse")
productionScheduleProductionRequestSegmentResponse.text =
"False"
# <RequestState />
productionScheduleProductionRequestRequestState =
ElementTree.SubElement(productionScheduleProductionRequest,
"RequestState")
# </ProductionRequest>
# <ScheduleState />
productionScheduleScheduleState =
ElementTree.SubElement(productionSchedule, "ScheduleState")
# </ProductionSchedule>
outFile = open(‘B2MML\B2MML_ProductionSchedule_’ +
str(man_order.id) + ‘.xml’, ‘w’)
b2mml = ElementTree.ElementTree(productionSchedule)
b2mml.write(outFile)
import java.io.IOException;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.ejb.Stateless;
import org.promia.b2mml.ReadB2MMLFile;
/**
*
* @author rojasa06
*/
@WebService(serviceName = "B2MMLWebService")
@Stateless()
public class B2MMLWebService {
/**
* Web service operation
*/
@WebMethod(operationName = "addManufacturingOrder")
public String addManufacturingOrder(@WebParam(name = "B2MMLPath") String
B2MMLPath) throws IOException {
String response = "0";
ReadB2MMLFile xml = new ReadB2MMLFile(B2MMLPath);
if (xml.getDoc() != null) {
if (xml.parse2Database()) {
response = "0";
} else {
response = "-1";
}
} else {
response = "-1";
}
return response;
}
}
128
Anexos
</EquipmentRequirement>
<PhysicalAssetRequirement>
<PhysicalAssetClassID/>
<PhysicalAssetID>False</PhysicalAssetID>
<Description/>
<HierarchyScope>False</HierarchyScope>
<Quantity/>
<PhysicalAssetRequirementProperty>
<ID>False</ID>
<Description>False</Description>
<Value/>
<Quantity>1</Quantity>
</PhysicalAssetRequirementProperty>
<RequiredByRequestedSegmentResponse/>
</PhysicalAssetRequirement>
<MaterialRequirement>
<MaterialClassID/>
<MaterialDefinitionID/>
<MaterialLotID/>
<MaterialSubLotID/>
<Description>PC Sobremesa</Description>
<HierarchyScope>False</HierarchyScope>
<MaterialUse>Product</MaterialUse>
<Quantity>1.0</Quantity>
<AssemblyRequirement/>
<AssemblyType/>
<AssemblyRelationship/>
<MaterialRequirementProperty>
<ID>1</ID>
<Description>PC Sobremesa</Description>
<Value>Product</Value>
<Quantity>1.0</Quantity>
</MaterialRequirementProperty>
<RequiredByRequestedSegmentResponse/>
</MaterialRequirement>
<RequiredByRequestedSegmentResponse/>
<SegmentState/>
</SegmentRequirement>
<SegmentResponse>True</SegmentResponse>
<RequestState/>
</ProductionRequest>
</ProductionSchedule>