使用 Linux 自动化制造流程

作者:Craig Swanson

一家制造公司只有在生产运行时才能赚钱。因此,来自生产现场的及时信息对业务至关重要。随着我们公司的发展,复杂性也随之增加。我们已经超越了人工和纸质方法来监控制造。

Midwest Tool & Die 公司为汽车、电子和消费品行业冲压电子终端和模制塑料零件。我们的制造流程产生大量数据。我们的高速冲床每分钟最多可生产 1,200 个零件,并且每个零件都必须正确。我们检查每个生产零件的关键尺寸。零件质量被制成图表并受到监控,数据被存档以进行追溯。

为什么要自动化?

我们需要管理所有这些数据以改进制造流程。我们的主要目标是提高正常运行时间并了解停机的原因。此外,我们希望跟踪和控制成本、减少文书工作并避免人为输入错误。

为了实现这些目标,我们提出了新系统的要求。首要要求是从各种机器控制装置、传感器、自动化检测设备、可编程逻辑控制器 (PLC) 和人工操作员处收集数据。该系统必须可靠,并且能够以我们最快的生产速度收集数据。

其次,系统必须关联收集到的数据。系统需要与企业 PostgreSQL 数据库交互。生产数据和流程状态将被传递到 PostgreSQL 以进行显示和报告。

新的自动化系统还必须提供用户界面,以便机器操作员和维护人员可以记录他们的活动。流程停机时间和停机原因将被记录并传递到企业数据库。此要求将取代纸质日志和人工数据输入工作。

最后,系统需要灵活且易于升级。该解决方案将适应新的生产线和不断变化的系统输入。

为什么选择 Linux?

我们评估了多种解决方案以满足这些要求。工业 PLC 可以可靠地收集数据。然而,它们在网络连接方面的方法几十年来一直停留在专有的非标准上。以太网连接已经可用,但系统价格昂贵。用户界面通常在特定于供应商的显示硬件上实现。每个供应商都生产自己的专有开发平台。因此,在评估的每个阶段,供应商锁定都是一个问题。

接下来,我们研究了带有数据采集 (DAQ) 板的 PC。过去,我们曾使用带有 DAQ 板、Microsoft Windows 和 Agilent VEE 的笔记本电脑。这种组合在快速采集数据且编程量少的情况下效果良好。通过该设置,与我们数据库系统的数据传输仅通过 Windows OLE 可用。我们可以开发应用程序,但专有平台会将我们绑定到供应商。National Instruments 也为 PC 提供完整的 DAQ 软件包,但价格昂贵。

最符合我们要求的解决方案也使用了 PC 和 DAQ 板。最大的不同之处在于使用了 RTLinux,这是一个基于 Linux 的实时操作系统堆栈。我们可以限制供应商绑定,并与 PostgreSQL 和 TCP/IP 网络自由通信。实时操作系统提供了 PLC 的可靠性,而不会牺牲通信。最后,GUI 可以用我们选择的语言编写。使用开源工具,我们可以创建灵活、可升级的应用程序。

Automating Manufacturing Processes with Linux

图 1. 使用中的两个 SmartPress 制造自动化系统。每个系统都包括一台带有 DAQ 板、电气隔离硬件、电池备用和条形码打印机的 PC。

SmartPress 系统

我们选择执行数据采集和数据处理任务的计算机与当今可用的计算机相比速度较慢。我们能够回收旧的办公室电脑以在车间使用。这些 400MHz Celeron 机器速度足够快,可以充分执行分配给它们的任务,而不会妨碍我们对数据采集的硬实时要求。我们使用的系统最初安装了 Red Hat 7.3 发行版和 2.4.18 Linux 内核。

RTLinux 和 Linux 内核

内核将用户级任务与系统硬件分离。标准 Linux 内核为每个用户级任务分配时间片,并在时间用完时可以暂停任务。这可能会导致优先级任务被系统非关键任务延迟。有一些命令可以控制 Linux 调度器的操作;但是,在 2.4 内核中破解调度器的参数不会产生硬实时系统。2.6 内核增强了实时性能,但也不能满足硬实时系统的需求。

有很多关于 RTLinux 的优秀出版物,其中许多是由 Michael Barabanov 和 Victor Yodaiken 撰写的,他们早在 1996 年首次实施 RTLinux,并且一直在不断改进它。Finite State Machine Labs, Inc., (FSMLabs) 是一家私营软件公司,负责维护该软件。多年来,他们取得了进步,这些进步被包含在他们的专业版 RTLinux 中。他们仍然提供 RTLinux/Free,必须在 GNU GPL 和 Open RTLinux 专利许可条款下使用。对于我们的项目,我们使用了免费软件,该软件没有 FSMLabs 的支持。

Dinil Divakaran 编写的 RTLinux HOWTO 提供了我们完成 RTLinux 安装并在我们的系统上启动和运行所需的大部分信息。

RTLinux 系统流程

在标准 Linux 系统中,如果您编写一个函数以设定的间隔轮询数据采集卡的输入,您的任务将不会有理想的结果。这样的系统无法保证它将接收到的调度优先级。在标准 Linux 操作系统中,如图 2 所示,所有系统进程都与硬件隔离。如果我们的数据轮询是系统执行的唯一进程,这还不错。然而,我们的项目需要用户空间程序,并保证每 1 毫秒轮询一次传感器输入。硬实时系统将保证不会遗漏传感器输入。

Automating Manufacturing Processes with Linux

图 2. RTLinux 系统流程

在 RTLinux 操作系统中,如图 2 所示,实时任务与系统的其余进程隔离,并作为模块实现。该模块可以直接访问硬件和 DAQ 卡驱动程序,同时获得它需要的优先级,高于系统的其余部分。该模块被编写为执行特定任务,该任务产生可靠的结果,并通过 FIFO 设备文件将结果呈现给用户。模块的代码保持简单,仅执行必须满足硬实时约束的任务。将处理程序函数连接到其中一个 FIFO 设备文件可以从操作员界面程序控制模块。RTLinux 生成的这种结构确保内核不会因次要优先级而延迟重要的模块任务。

数据采集线程

我们只需要监控具有硬实时要求的数字输入状态,这使得实时功能相当小。轮询数据输入变得容易,因为 United Electronics Industries 为其 DAQ 卡提供了 RTLinux 驱动程序。来自 ADLINK Technology, Inc. 的 DAQ 卡也使用 RTLinux 平台的驱动程序进行了测试,并且配置简单。没有多少公司提供这样的服务。然而,Comedi Project 为数据采集提供了另一种开源驱动程序、工具和库的选择。

实时任务以可加载模块的形式编写,该模块必须至少有两个函数:init_module,在模块插入内核时调用;以及 cleanup_module,在模块移除之前调用(清单 1)。

一旦建立基本模块结构,我们需要在模块中为我们的实时任务创建一个线程。该线程在 init_module 内部创建,并设置为以已建立的 RTLinux 优先级运行。建立线程的优先级和执行速率是创建我们的实时任务的重要步骤。

FIFO 设备文件

对于以可预测的时序运行的任务,需要用于数据传输的实时内存。用户级任务需要访问收集的数据并控制实时任务。实时 FIFO 是 Linux 进程可以读取和写入的队列。实时 FIFO 设备在 RTLinux 安装期间构建,并在实时模块的初始化期间创建。现在可以创建处理程序并将其绑定到其中一个 FIFO 设备。可以将处理程序设置为在从用户界面程序写入 1 到处理程序 FIFO 时执行,因为需要控制模块。

创建该模块是为了将其作为实时任务安装到内核中。实时模块的棘手部分是建立框架。我们的实时任务代码很简单,但很冗长。因此,我们仅包含实时模块框架(清单 1)。请注意使用实时要求实现的代码的简洁性。

清单 1. 实时模块代码框架示例

#include <pthread.h>
#include <rtl_fifo.h>
#include <rtl_core.h>
#include <rtl_time.h>
#include <rtl.h>
#include <rtl_fifo.h>

pthread_t thread_variable;

void thread_name(void)
{
    Struct Sched_param p;
    p.sched_priority = 1
    pthread_setschedparam(pthread_self(),
                          SCHED_FIFO, &p);
    pthread_make periodicnp(pthread_self(),
                            getrtime(), 1000000);
    while(1) {
        // Real Time Task Code
        // Poll Data input lines, count low to high
        // transitions
        rtf_put() // Counts to be transferred by FIFO
        pthread_wait_np();
    }
}

int handler_function(){
    // Code tied to the handler FIFO
    // Variables for counting above are cleared out
}

int init_module(void)
{
    ififo_status =  rtl_create(unsigned int fifo,
                               int size)
    pthread_create(&thread_variable, NULL,
                   thread_name, NULL);
    rtf_create_handler(FIFO_Number,
                       &handler_function)
}

int cleanup_module(void)
{
    rtf_destroy(unsigned int fifo)
    pthread_cancel(thrad_variable)
}

用户界面

随着实时任务的启动和运行,下一步是为项目构建用户界面。GUI 是我们程序中的众多任务之一,不需要在硬实时约束内完成。我们不担心系统资源,因为我们的实时模块将在我们建立的硬实时要求内执行。我们选择了 KDevelop IDE 和 Trolltech 的 Qt Designer GUI 构建器来编程界面。Qt Designer 允许开发具有信号和槽交互的 GUI,与 KDevelop 程序中的函数进行交互。使用这两个软件包组合进行开发的结果非常适合我们的应用程序。我们能够快速开发用户友好的界面。

该程序被编写为利用两种形式的信息输入到系统:来自 DAQ 卡的数字输入和人机操作员与 GUI 的交互。需要两者的结合来维护数据的完整性。例如,操作员将输入正在制造的作业的零件号。在运行期间收集的数据将与零件号相关联。这取代了用户在手写表格上手工记录信息的旧方法。

管理数据

收集数据只是系统和程序的第一步。最重要的方面是使其可供公司的所有部门使用。调度部门、物料采购部门和工具服务部门是数据将被有效利用的一些示例。

SmartPress 程序将收集的数据存储在 PostgreSQL 数据库中。PostgreSQL 也是我们的企业后端数据库。因此,未来的应用程序开发将使 SmartPress 数据在整个公司的企业应用程序中可见。

总结 - 自助式信息技术

我们的 SmartPress 系统已从测试台转移到生产车间。回顾过去,我们创建了一个灵活的制造监控系统。使用 Linux,最终获得了一个可扩展的系统,该系统已根据公司的需求进行了定制。我们可以将 SmartPress 适配到新的制造流程。该系统也是可升级的。将来,我们计划在新内核上重建该项目。对于升级,我们可能会使用 Fedora Core 作为基础 Linux 平台。

SmartPress 系统的低硬件成本非常重要,因为我们正在为每条冲压生产线安装一个系统。我们通过使用个人计算机和 Linux 支持的 DAQ 板来降低硬件成本。我们的软件开发成本也很低。Ryan Walsh 花在这个项目上的时间与学习和使用专有控制语言进行开发的时间相似。现在,Ryan 精通内核模块、实时操作系统、PostgreSQL 和 GUI 开发。这些技能比学习一家供应商的控制编程语言更有用。对于我们来说,自助选项带来了更低的成本、没有供应商绑定和提升的开发人员技能。

本文的资源: www.linuxjournal.com/article/7810

Craig Swanson (craig.swanson@slssolutions.net) 在 SLS Solutions 设计网络并提供 Linux 咨询。他还在 Midwest Tool & Die 开发 Linux 软件。Craig 自 1993 年以来一直使用 Linux。

Ryan Walsh (ryan.walsh@midwest-tool.com) 在 Midwest Tool & Die 担任网络工程师。Ryan 在业余时间进行自由落体运动,从飞机上跳下来。

加载 Disqus 评论