IMES 是一款专为中小型作业车间制造商设计的开源制造执行系统应用程序。
由于COVID-10的情况,该项目的预算被削减,这暂时暂停了我们的部署阶段和项目时间表。然而,我们的研究团队仍在继续研究这个项目。希望2021年我们能够全面恢复这个项目的开发。
- 将应用程序迁移到 React
- 将当前组件重构为 ES6 模块。(重度迁移)
- 修复单元测试并添加集成测试(需要咨询)
- 修复刷新页面时缓慢的未验证布局。
- 导出示例数据库数据以供用户部署。
- 清理并删除未使用的库。
- 优化未使用的重资源,转换为原生。
- 创建生产模拟器(工程师讨论)
- 提高生产绩效板(工程师讨论)
- 改进生产排程算法(进行中)
- 改进 JobShop 的权重和优先级计算
- 讨论并规划 2018-19 年 IMES 项目的新路线图。
- 集成生产优化(线性规划)
演示的用户名和密码🔑
电子邮件 | 密码 |
---|---|
[email protected] | 消杀器 |
注意:如果您发现任何错误🐞请报告我或提出问题,谢谢😊
请注意,该项目仍处于大量开发阶段🚧,并且可能会出现很多错误🐞,如果您想为我们贡献(帮助我们)从事该项目,请阅读关于项目文档,了解该项目第一阶段的概述和范围,以及有关技术信息,请阅读技术文档以了解此应用程序的工作原理。
想与我们聊天只需加入这个Gitter 房间
https://docs.google.com/document/d/1pmqYlmHHh6zBY-pTad84tMNii69BmYCoIzdapJ916-I/edit?usp=sharing
该项目有两个主要分支。按开发版本分开。
-
MASTER
- 最新的稳定/测试版软件,该分支将每月发布新的更新。(适合生产使用) -
DEVELOP
- 最新的alpha版本软件,该分支的更新频率取决于工作。(不建议用于生产用途)
制造执行系统(MES)涉及使用计算机跟踪和记录从提取原材料到生产成品的整个制造过程。它们主要作为独立系统运行,主要收集有关工作场所的数据。MES 可用于多种行业,包括包装货物、金属或塑料生产以及自动化。使用 MES 的主要目的是提高生产、最大限度地减少延误并简化货物交付。
“智能”MES 建立在 MES 最初理念的基础上,通过使用允许决策的数学算法。今后,信息系统将能够针对问题场景选择最合适的解决方案。通过采用具有改进决策能力的智能MES系统,可以进一步提高制造绩效并降低生产成本。
尽管世界上大多数国家仍在使用工业 2.0,但仍然缺乏对制造系统的支持,这些系统可以减少工作流程中的错误并让企业更智能地工作。可以看出,当中小型企业无法投资高科技系统或雇用足够的人员来管理生产时,他们将受制于现行标准。这就是所谓的工业2.0“陷阱”。这是提出这个项目的驱动力之一。智能 MES 技术可以为工厂主提供经济实惠的解决方案,并将行业标准推向未来。
该项目涉及构建一个智能 MES Web 应用程序,该应用程序将帮助制造商规划制造流程、模拟计划流程的工作流程、跟踪实际生产线的事件并最终生成实际流程的报告。这将帮助制造商建立更有效的生产线,并减少和防止整个制造过程中可能出现的潜在问题。第二章将介绍智能MES项目的可行性研究。
- 帮助工人计算并选择最合适的工作优先级来管理流程调度。
- 提高生产、制造和工业流程的自动化和数字化程度。
- 通过管理整个价值链流程来提高生产和规划流程的效率。
- 通过模拟构建框图来可视化工作流程和作业状态。
根据范围,该项目使用互联网连接来连接到基于网络的在线应用程序。我们的实现将尝试使用跨平台、灵活且能够在移动设备上工作的 Javascript 语言。
特别是,该项目将使用以下流程和算法:线性规划(LP)、统计过程控制(SPC)、整体设备效率(OEE)和生产调度算法,其中包括最早到期日(EDD)和最短处理时间(SPT)。
Resource Usage Optimization using Linear Programming (LP)
线性规划(LP)用于资源优化,只要输出函数是线性的。这在存在可行解决方案或者更好的是最优解决方案的情况下很有帮助。然而,如果需要特定的算法,结果的相关值可能会很弱。LP只能直接解决凸问题。
Overall Equipment Effectiveness (OEE)
整体设备效率(OEE)是用于衡量制造绩效的工具。总的来说,有大量的数据和大量的测量方法已经过时,无法用来提高生产率。有时,标准太多,彼此不相关,碎片化的数据不一致。因此,除了了解机器性能之外,OEE 也是衡量制造质量标准的理想方法。它可以提供有关性能损失原因的信息,并可以提出准确、系统地减少性能损失的方法。
计算 OEE 包含三个主要部分。首先,可用性衡量系统运行的总时间以及意外停机时间。其次,绩效衡量一个时间周期内生产的单位数量。完美的性能评级意味着系统运行得尽可能快。第三,衡量制造系统的质量。质量涉及测量生产中缺陷零件的数量。100% 质量的系统意味着不会生产出有缺陷的零件。
Original quantity (Q0)
原始数量是包含备份订单项目的订单数量。当发生意外事件时,可以用备份替换损坏的物品。
Scheduling Algorithms
调度优化涉及通过考虑可用资源和时间来选择适当的调度方法。通过实施分析系统中当前作业的决策模型,重新安排作业优先级以满足条件并获得最佳结果。本项目将使用两种生产调度算法。第一个是 EDD,它考虑产品的到期日并首先对最早的项目进行排序。第二种算法是SPT,它考虑了处理产品的时间。处理时间最快的产品将优先。
边缘 |
火狐浏览器 |
铬合金 |
苹果浏览器 |
歌剧 |
---|---|---|---|---|
17+ | 44+ | 46+ | 11.1+ | 33+ |
参考: https: //caniuse.com/#search=web%20component
此模板是使用基于抽屉的布局构建应用程序的起点。布局由app-layout
元素提供。
该模板以及polymer-cli
工具链还演示了“PRPL 模式”的使用。该模式允许在用户请求的初始路线上快速首次交付和与内容交互,并通过预先缓存所需的剩余组件来快速进行后续导航通过应用程序,并在用户浏览应用程序时逐步按需加载它们。
PRPL 模式,简而言之:
- 推送初始路由所需的组件
- 尽快渲染初始路线
- 剩余路由的预缓存组件
- 延迟加载并按需逐步升级下一条路线
安装最新的 NodeJS(所需版本 >= 8.x)
下载: https: //nodejs.org/en
安装最新的npm(所需版本 >= 5.x)
$ npm i npm -g
安装Yarn(所需版本 >= 1.6.0)
$ npm install -g yarn
安装polymer-cli:(需要版本> = 1.6.x)
$ yarn add global polymer-cli
Note: polymer-cli is not able to install with npm version 5.x.x for now. Please use yarn to install.
安装Bower (需要版本 >= 1.8.x)
$ yarn add global bower
$ npm install $ bower install
此命令为应用程序提供服务http://localhost:8081
并为应用程序提供基本的 URL 路由:
$ polymer serve --open
此命令为应用程序提供服务http://localhost:8081
并为应用程序提供基本的 URL 路由:
$ polymer build $ npm start
此命令对应用程序依赖项执行 HTML、CSS 和 JS 缩小,并生成一个 service-worker.js 文件,其中包含用于根据 中指定的入口点和片段预缓存依赖项的代码polymer.json
。
输出文件适合build/default
从 HTTP/2+Push 兼容服务器提供服务。
构建项目:
$ polymer build
http://localhost:8080
此命令提供使用片段捆绑生成的应用程序的生产版本:
$ polymer serve build/es6-bundled/ --open
该命令将运行 Polymer Lint
$ polymer lint --input src/**/*.html
此命令将 针对计算机上当前安装的浏览器运行Web Component Tester 。
$ polymer test
Polymer 2.x/3.x 引入了符合标准的 ES6 基于类的语法来定义 Web 组件。这对于大多数现代浏览器都很有效,而且 ES6 还有许多其他不错的功能(如箭头函数),可以让您的 JS 代码更干净、编写起来更有趣。
但是,如果您需要支持 IE 11 等较旧的浏览器,则必须将代码编译为 ES5,与直接在现代浏览器上运行 ES6 相比,这会带来性能缺陷。
理想的方法是使用差异化服务为现代浏览器提供 ES6 版本,并为旧版浏览器提供后备 ES5 版本。prpl-server-node 是使用此模式的节点服务器的示例实现。我从这个实现中汲取了想法,并基于 Polymer-starter-kit 创建了一个示例,了解如何使用 Cloud Functions for Firebase 在 Firebase 托管上使用差异化服务,从而动态地将正确的版本发送给用户。
之后,运行polymer build,然后运行它来部署应用程序(确保您已登录并选择了您的 firebase 项目)
$ firebase deploy
PRPL pattern
定义了生产就绪的 Polymer 应用程序如何通过仅向客户端发送所需的资源来高效工作:
Push
- 初始路线的关键资源。Render
- 初始路线。Pre-cache
- 剩余路线。Lazy-load
- 根据需要创建剩余路线。
在 PRPL 模式中,服务器需要能够识别每个应用程序的路由所需的资源。它不是将资源捆绑到单个单元中进行下载,而是使用 HTTP2 推送来提供呈现请求的路由所需的各个资源。
构建应用程序时,始终考虑优先发送关键资源以首先呈现有意义的视图,然后根据请求发送其余应用程序资源。
<span data-target="animated-image.imageContainer">
<img data-target="animated-image.replacedImage" alt="68747470733a2f2f63646e2d696d616765732d312e6d656469756d2e636f6d2f6d61782f313630302f312a592d5569585133424173555645384a7a62486b3456772e676966" class="AnimatedImagePlayer-animatedImage" src="https://camo.githubusercontent.com/398240a66f20eb76a71d91a0177483978f64230d81ecc74d38001004169de22e/68747470733a2f2f63646e2d696d616765732d312e6d656469756d2e636f6d2f6d61782f313630302f312a592d5569585133424173555645384a7a62486b3456772e676966" style="display: block; opacity: 1;">
<canvas class="AnimatedImagePlayer-stillImage" aria-hidden="true" width="500" height="279"></canvas></span></a>
<button data-target="animated-image.imageButton" class="AnimatedImagePlayer-images" tabindex="-1" aria-label="Play 68747470733a2f2f63646e2d696d616765732d312e6d656469756d2e636f6d2f6d61782f313630302f312a592d5569585133424173555645384a7a62486b3456772e676966" hidden=""></button>
<span class="AnimatedImagePlayer-controls" data-target="animated-image.controls" hidden="">
<button data-target="animated-image.playButton" class="AnimatedImagePlayer-button" aria-label="Play 68747470733a2f2f63646e2d696d616765732d312e6d656469756d2e636f6d2f6d61782f313630302f312a592d5569585133424173555645384a7a62486b3456772e676966">
<svg aria-hidden="true" focusable="false" class="octicon icon-play" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 13.5427V2.45734C4 1.82607 4.69692 1.4435 5.2295 1.78241L13.9394 7.32507C14.4334 7.63943 14.4334 8.36057 13.9394 8.67493L5.2295 14.2176C4.69692 14.5565 4 14.1739 4 13.5427Z">
</path></svg>
<svg aria-hidden="true" focusable="false" class="octicon icon-pause" width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<rect x="4" y="2" width="3" height="12" rx="1"></rect>
<rect x="9" y="2" width="3" height="12" rx="1"></rect>
</svg>
</button>
<a data-target="animated-image.openButton" aria-label="Open 68747470733a2f2f63646e2d696d616765732d312e6d656469756d2e636f6d2f6d61782f313630302f312a592d5569585133424173555645384a7a62486b3456772e676966 in new window" class="AnimatedImagePlayer-button" href="https://camo.githubusercontent.com/398240a66f20eb76a71d91a0177483978f64230d81ecc74d38001004169de22e/68747470733a2f2f63646e2d696d616765732d312e6d656469756d2e636f6d2f6d61782f313630302f312a592d5569585133424173555645384a7a62486b3456772e676966" target="_blank">
<svg aria-hidden="true" class="octicon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
<path fill-rule="evenodd" d="M10.604 1h4.146a.25.25 0 01.25.25v4.146a.25.25 0 01-.427.177L13.03 4.03 9.28 7.78a.75.75 0 01-1.06-1.06l3.75-3.75-1.543-1.543A.25.25 0 0110.604 1zM3.75 2A1.75 1.75 0 002 3.75v8.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 12.25v-3.5a.75.75 0 00-1.5 0v3.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-8.5a.25.25 0 01.25-.25h3.5a.75.75 0 000-1.5h-3.5z"></path>
</svg>
</a>
</span>
</span></animated-image></p>
回到我们的主题,在 PRPL 模式中,服务器和 Service Worker 共同为非活动路由预缓存资源。
当用户切换路由时,应用程序会延迟加载尚未缓存的任何所需资源,并创建所需的视图。
prpl-server
足够智能,可以使用用户代理标头、检测浏览器功能并为您的浏览器提供正确的构建
首先,在本地服务器上安装 PRPL 服务器
$ yarn global add prpl-server
然后,进入项目目录
在开发中运行 PRPL 服务器
$ prpl-server --root ./build --config polymer.json --host 127.0.0.1
在生产中运行 PRPL 服务器
$ prpl-server --root ./build --config polymer.json --host 127.0.0.1 --https-redirect
为了使用 nginx 反向代理(支持 http2)为应用程序提供服务,您需要拥有证书。我们建议使用 certbot 工具来帮助生成站点证书。
Example of nginx configuration files
server {<span class="pl-k">listen</span> <span class="pl-s">443</span> ssl http2; <span class="pl-k">listen</span> [::]:443 ssl http2; <span class="pl-k">server_name</span> <yourdomainname>; <span class="pl-k">if</span> (<span class="pl-smi">$scheme</span> != <span class="pl-s">"https"</span>) { <span class="pl-c1">return</span> <span class="pl-s">301</span> https://<span class="pl-smi">$host$request_uri</span>; } <span class="pl-k">root</span> /var/www/html; <span class="pl-k">index</span> index.html; <span class="pl-k">charset</span> utf-8; <span class="pl-k">access_log</span> <span class="pl-c1"> off</span>; <span class="pl-k">error_log</span> /var/log/nginx.error_log<span class="pl-c1"> error</span>; <span class="pl-c"># SSL Certificate config</span> <span class="pl-k">ssl_certificate</span> /etc/letsencrypt/live/<yourdomainname>/fullchain.pem; <span class="pl-k">ssl_certificate_key</span> /etc/letsencrypt/live/<yourdomainname>/privkey.pem; <span class="pl-k">include</span> /etc/letsencrypt/options-ssl-nginx.conf; <span class="pl-k">ssl_session_timeout</span> <span class="pl-c1">10m</span>; <span class="pl-k">ssl_session_cache</span> shared:SSL:10m; <span class="pl-k">ssl_session_tickets</span> off; <span class="pl-c"># Diffie-Hellman parameter for DHE ciphersuites, recommended 4096 bits</span> <span class="pl-c"># to generate your dhparam.pem file, run $ openssl dhparam -out /etc/letsencrypt/live/<yourdomainname>/dhparam.pem 4096</span> <span class="pl-k">ssl_dhparam</span> /etc/letsencrypt/live/<yourdomainname>/dhparam.pem; <span class="pl-c"># SSL Key exchanges</span> <span class="pl-k">ssl_protocols</span> TLSv1.2 TLSv1.3; <span class="pl-c">#!! TLS 1.3 Requires nginx >= 1.13.0 !!</span> <span class="pl-k">ssl_ecdh_curve</span> secp384r1; <span class="pl-k">ssl_ciphers</span> <span class="pl-s">'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'</span>; <span class="pl-k">ssl_prefer_server_ciphers</span><span class="pl-c1"> on</span>; <span class="pl-c"># OCSP Stapling - fetch OCSP records from URL in ssl_certificate and cache them for faster handshake</span> <span class="pl-k">ssl_stapling</span> on; <span class="pl-k">ssl_stapling_verify</span> on; <span class="pl-k">ssl_trusted_certificate</span> /etc/letsencrypt/live/<yourdomainname>/fullchain.pem; <span class="pl-c"># DNS for OSCP Resolver - to lookup your upstream domain name URL</span> <span class="pl-k">resolver</span> <span class="pl-s">8.8.8.8</span> <span class="pl-s">4.4.4.4</span> valid=300s ipv6=off; <span class="pl-k">resolver_timeout</span> <span class="pl-c1">10s</span>; <span class="pl-c"># Security Header</span> <span class="pl-k">add_header</span> Strict-Transport-Security <span class="pl-s">"max-age=31536000; includeSubdomains; preload"</span>; <span class="pl-k">add_header</span> Referrer-Policy no-referrer-when-downgrade; <span class="pl-k">add_header</span> X-Content-Type-Options nosniff; <span class="pl-k">add_header</span> X-Frame-Options SAMEORIGIN; <span class="pl-k">add_header</span> X-XSS-Protection <span class="pl-s">"1; mode=block"</span>; <span class="pl-k">add_header</span> Content-Security-Policy upgrade-insecure-requests; <span class="pl-c"># Required for LE certificate enrollment using certbot</span> <span class="pl-k">location</span> <span class="pl-en">'/.well-known/acme-challenge' </span>{ <span class="pl-k">default_type</span> <span class="pl-s">"text/plain"</span>; <span class="pl-k">root</span> /var/www/html; } <span class="pl-k">location</span> <span class="pl-en">/ </span>{ <span class="pl-k">root</span> /var/www/html; } <span class="pl-c"># Reverse proxy</span> <span class="pl-k">location</span> <span class="pl-en">/ </span>{ <span class="pl-k">http2_push_preload</span> on; <span class="pl-k">proxy_pass</span> http://127.0.0.1:8080/; <span class="pl-k">proxy_set_header</span> X-Forwarded-Proto <span class="pl-smi">$scheme</span>;
# proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host:$server_port; proxy_set_header X-Forwarded-Server $host; proxy_read_timeout 3m; proxy_send_timeout 3m; proxy_buffer_size 128k; proxy_buffers 32 32k; proxy_busy_buffers_size 128k; } }
<clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 tooltipped-no-delay d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w" value="server {listen 443 ssl http2; listen [::]:443 ssl http2; server_name <yourdomainname>; if ($scheme != "https") { return 301 https://$host$request_uri; } root /var/www/html; index index.html; charset utf-8; access_log off; error_log /var/log/nginx.error_log error; # SSL Certificate config ssl_certificate /etc/letsencrypt/live/<yourdomainname>/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/<yourdomainname>/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_session_timeout 10m; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; # Diffie-Hellman parameter for DHE ciphersuites, recommended 4096 bits # to generate your dhparam.pem file, run $ openssl dhparam -out /etc/letsencrypt/live/<yourdomainname>/dhparam.pem 4096 ssl_dhparam /etc/letsencrypt/live/<yourdomainname>/dhparam.pem; # SSL Key exchanges ssl_protocols TLSv1.2 TLSv1.3; #!! TLS 1.3 Requires nginx >= 1.13.0 !! ssl_ecdh_curve secp384r1; ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'; ssl_prefer_server_ciphers on; # OCSP Stapling - fetch OCSP records from URL in ssl_certificate and cache them for faster handshake ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/<yourdomainname>/fullchain.pem; # DNS for OSCP Resolver - to lookup your upstream domain name URL resolver 8.8.8.8 4.4.4.4 valid=300s ipv6=off; resolver_timeout 10s; # Security Header add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload"; add_header Referrer-Policy no-referrer-when-downgrade; add_header X-Content-Type-Options nosniff; add_header X-Frame-Options SAMEORIGIN; add_header X-XSS-Protection "1; mode=block"; add_header Content-Security-Policy upgrade-insecure-requests; # Required for LE certificate enrollment using certbot location '/.well-known/acme-challenge' { default_type "text/plain"; root /var/www/html; } location / { root /var/www/html; } # Reverse proxy location / { http2_push_preload on; proxy_pass http://127.0.0.1:8080/; proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host:$server_port; proxy_set_header X-Forwarded-Server $host; proxy_read_timeout 3m; proxy_send_timeout 3m; proxy_buffer_size 128k; proxy_buffers 32 32k; proxy_busy_buffers_size 128k; }
}" tabindex="0" role="button">
了解让加密证书,请访问https://letsencrypt.org/certificates/ 了解 nginx 配置,请访问https://github.com/jukbot/setup-nginx-webserver 了解 PRPL 服务器配置,请访问https://github.com/ Polymer/prpl-服务器-节点
如果您在此项目中发现错误或错误,请在以下位置提出问题: https: //github.com/jukbot/smart-industry/issues
鼓励修补程序,并且可以通过分叉此项目并通过 GitHub 提交拉取请求来提交修补程序。
始终欢迎拉取请求和反馈。我们始终尽力尽快处理它们。
- https://medium.com/platform-engineer/polymer-2-0-building-progressive-web-apps-with-enhanced-web-platform-features-933251824f13
- https://www.nginx.com/blog/nginx-1-13-9-http2-server-push/#automatic-push
版权所有 2016-2018 Chukkrit Visitsaktavorn。
根据 Apache 许可证 2.0 版(“许可证”)获得许可;除非遵守许可证,否则您不得使用此文件。您可以在以下位置获取许可证副本:
(https://www.apache.org/licenses/LICENSE-2.0)
除非适用法律要求或书面同意,否则根据许可证分发的软件均按“原样”分发,不带任何明示或暗示的保证或条件。请参阅许可证,了解许可证下管理权限和限制的特定语言。