用Raspberry Pi 3构建一个低成本的工业控制器

很少有小型工厂操作要求严格的操作环境,高I / O容量和可编程逻辑控制器(PLC)最初预期的复杂功能要求的组合。在缩小版本的PLC的同时,设计人员现在也可以选择一系列低成本的开源硬件和软件解决方案,进行有效的工业监控。
这种解决方案的一个例子是树莓派基金会(Raspberry Pi Foundation)的  小树莓派(Raspberry Pi 3)及其相关附加板。在讨论如何将其用于监视和控制应用程序之前,本文将描述Raspberry Pi 3的主要特性。

为什么树莓派为小店铺工业控制

对于许多较小规模的操作,Raspberry Pi 3平台提供了具有相当性能的低成本解决方案。完全有能力处理专用的工业自动化任务,树莓裨3板结合了博通 ARM ®皮质®基于-A53处理器,RAM 1G字节,数字接口,无线网络连接,和蓝牙连接。处理器本身是一款高性能片上系统(SoC)器件,集成了一个四核ARM Cortex-A53 CPU和512 KB二级高速缓存,以及54个GPIO,分布在三个组中。
每个单独的GPIO都支持至少两个和六个替代功能,包括脉宽调制器,时钟和串行接口。开发人员可以使用任何未分配的GPIO作为能够提供高达16毫安(mA)(每个GPIO bank最多为50 mA)的中断线路,输入或输出。
与Raspberry Pi家族的其他成员一样,Raspberry Pi 3的设计使嵌入式开发对于初学者来说足够简单,但又足够强大,足以满足具有更复杂和更强大处理要求的经验丰富的开发人员的需求。
开始时,开发人员只需将电路板的视频端口连接到显示器及其USB端口连接到键盘和鼠标即可。对于软件设计,开发人员可以建立在树莓派基金会免费的基于Linux的Raspbian操作系统所支持的广泛的生态系统上,该操作系统通过电路板的微型SD接口从存储卡加载。

增加工业能力

除了性能和易于开发之外,Raspberry Pi扩展功能的简化方法使其非常适合工业自动化应用的各种需求。为了增加硬件功能,开发者只需要在Raspberry Pi 3板上插入一个名为HAT(Hardware Attached on Top)的附加板即可。与更复杂的工业系统一样,HAT提供了标准的方法来识别HAT,并根据需要自动配置GPIO和驱动程序。因此,只需插入Pimoroni PIM213自动化HAT(图1),开发人员就能立即升级Raspberry Pi系统以用于工业应用。
Pimoroni自动化HAT附加板的图像
图1:开发人员可以通过附加专门的附加板(如Pimoroni Automation HAT)来升级基础Raspberry Pi 3工业自动化板。(图片来源:Pimoroni)
Pimoroni自动化HAT专门用于自动化系统的监控和控制,结合了多个I / O通道,包括模拟和数字输入,加电输出和继电器控制。除了它们的24伏(V)功能,I / O通道提供了实质性的输入和输出缓冲。例如,继电器输出支持高达2安培(A)的电流,足以驱动Crouzet 81 546 001电磁阀等低功耗24伏电源。
对于使用Automation Hat进行软件开发,Pimoroni提供了一个相关的Python模块,只需要几行代码即可使用HAT的硬件功能。当导入Python程序时,Pimoroni模块为模拟输入,数字输入,数字输出,继电器输出和LED灯控制创建软件对象,每个对象都包含适当的低级读/写功能(清单1)。
class AnalogInput(object):
    type = 'Analog Input'
 
    def __init__(self, channel, max_voltage, led):
        self._en_auto_lights = True
        self.channel = channel
        self.value = 0
        self.max_voltage = float(max_voltage)
        self.light = SNLight(led)
 
    def auto_light(self, value):
        self._en_auto_lights = value
        return True
 
    def read(self):
        """Return the read voltage of the analog input"""
        return round(self.value * self.max_voltage, 2)
 
    def _update(self):
        self.value = ads1015.read(self.channel)
 
    def _auto_lights(self):
        if self._en_auto_lights:
            adc = self.value
            self.light.write(max(0.0,min(1.0,adc)))
清单1:用于Automation HAT的Pimoroni Python模块通过处理详细事务(例如从板载模数转换器(ADC)读取)来简化开发过程。(图片来源:Pimoroni)
每个对象标识相应的频道和其他相关数据。例如,在创建时,模拟输入对象包含相关引脚的最大电压(请参见清单1中的init函数)。为了执行模数转换器(ADC)转换,ADC对象调用底层ADC模块(清单1中的ads1015.read)。ADC模块反过来执行设置ADC所需的低级I 2 C事务处理,并在以有用的形式(清单2)返回值之前执行转换。
class ads1015:
    def __init__(self, i2c_bus=None, addr=ADDR):
        self._over_voltage = [False] * 4
 
        self.i2c_bus = i2c_bus
        if not hasattr(i2c_bus, "write_i2c_block_data") or not hasattr(i2c_bus, "read_i2c_block_data"):
            raise TypeError("Object given for i2c_bus must implement write_i2c_block_data and read_i2c_block_data")
 
        self.addr = addr
 
    def read(self, channel=0, programmable_gain=PGA_4_096V, samples_per_second=1600):
        # sane defaults
        config = 0x0003 | 0x0100
 
        config |= SAMPLES_PER_SECOND_MAP[samples_per_second]
        config |= CHANNEL_MAP[channel]
        config |= PROGRAMMABLE_GAIN_MAP[programmable_gain]
 
        # set "single shot" mode
        config |= 0x8000
 
        # write single conversion flag
        self.i2c_bus.write_i2c_block_data(self.addr, REG_CFG, [(config >> 8) & 0xFF, config & 0xFF])
 
        delay = (1.0 / samples_per_second) + 0.0001
        time.sleep(delay)
 
        data = self.i2c_bus.read_i2c_block_data(self.addr, REG_CONV)
 
        value = ((data[0] << 4) | (data[1] >> 4))
 
        if value & 0x800:
            value -= 1 << 12
 
        value /= 2047.0 # Divide down to percentage of FS
        value *= float(programmable_gain)
        value /= 3300.0 # Divide by VCC
 
        return value
...
清单2:ADC对话的高级函数调用会调用一个读取例程,该例程执行I 2 C总线写入以启动转换,休眠足够长的时间以完成转换,并执行I 2 C总线读取以收集结果。(图片来源:Pimoroni)
但是,对于开发人员来说,读取模拟值只需要在模拟对象的指定模拟输入(.one)上执行高级读取函数(.read()):
          value = automationhat.analog.one.read()
该库支持其他HAT功能的简单模型,因此打开或关闭中继是一个简单的调用:
          automationhat.relay.write(1) # 1 = ON, 0 = OFF

灵活的选择

Pimoroni自动化HAT提供小型工业自动化应用所需的基本IO功能,但是开发人员可以从丰富的可用HAT中选择适用于工业自动化等特殊应用所需的各种功能。例如,Adafruit 3013 RTC HAT提供实时时钟(RTC)功能,这不是电路板本身的标准功能。Raspberry Pi设计人员希望开发人员能够将电路板连接到互联网上,并使用标准的网络时间协议(NTP)来维持时间。因此,对于可能由于设计或意外而失去与互联网的连接的设计,需要诸如Adafruit RTC HAT的外部RTC。
在添加诸如RTC之类的功能时,开发人员不需要将自己限制在工业自动化设计中的单个HAT中。开发人员可以在Raspberry Pi板上堆叠多个HAT。尽管大多数HATS都是为堆叠而设计的,但开发人员可能需要添加堆叠头(如Adafruit的2223)来完成装配,或M2.5支架,以消除HAT可能彼此接触或与底板接触的机会。
使用堆叠头和支架,开发人员可以轻松地堆叠诸​​如Adafruit 2348电机HAT之类的HAT,以添加许多工业自动化应用中所需的电机驱动器。每个2348电机HAT可以驱动两个步进电机或四个直流电机。事实上,开发人员可以堆叠多达32个这样的附加板,以支持多达64个步进电机或128个直流电机(图2)。
多个Adafruit 2348电机帽子的图像
图2:开发人员可以堆叠多个Adafruit 2348电机HAT,在一个设计中支持多达64个步进电机或128个直流电机。(图片来源:Adafruit)
与Pimoroni Automation HAT一样,Adafruit 2348电机HAT可以使用几个简单的Python命令进行编程。Adafruit用于电机HAT的示例软件甚至演示了使用Python线程模块并行运行多个电机的基本设计模式(清单3)。
from Adafruit_MotorHAT import Adafruit_MotorHAT, Adafruit_DCMotor, Adafruit_StepperMotor
import threading
 
# create a default object, no changes to I2C address or frequency
mh = Adafruit_MotorHAT()
 
# create empty threads (these will hold the stepper 1 and 2 threads)
st1 = threading.Thread()
st2 = threading.Thread()
 
. . .
 
myStepper1 = mh.getStepper(200, 1)      # 200 steps/rev, motor port #1
myStepper2 = mh.getStepper(200, 2)      # 200 steps/rev, motor port #1
myStepper1.setSpeed(60)          # 30 RPM
myStepper2.setSpeed(60)          # 30 RPM
 
stepstyles = [Adafruit_MotorHAT.SINGLE, Adafruit_MotorHAT.DOUBLE, Adafruit_MotorHAT.INTERLEAVE, Adafruit_MotorHAT.MICROSTEP]
 
def stepper_worker(stepper, numsteps, direction, style):
    #print("Steppin!")
    stepper.step(numsteps, direction, style)
    #print("Done")
 
while (True):
    if not st1.isAlive():
        randomdir = random.randint(0, 1)
        if (randomdir == 0):
            dir = Adafruit_MotorHAT.FORWARD
        else:
            dir = Adafruit_MotorHAT.BACKWARD
        randomsteps = random.randint(10,50)
        st1 = threading.Thread(target=stepper_worker, args=(myStepper1, randomsteps, dir, stepstyles[random.randint(0,3)],))
        st1.start()
 
    if not st2.isAlive():
        randomdir = random.randint(0, 1)
        if (randomdir == 0):
            dir = Adafruit_MotorHAT.FORWARD
        else:
            dir = Adafruit_MotorHAT.BACKWARD
 
        randomsteps = random.randint(10,50)
        print("%d steps" % randomsteps)
 
        st2 = threading.Thread(target=stepper_worker, args=(myStepper2, randomsteps, dir, stepstyles[random.randint(0,3)],))
        st2.start()
清单3:Adafruit的马达HAT Python模块包含示例软件,例如这个片段,演示如何使用简单的控制命令以及如何使用Python线程模块来控制一对步进电机。(图片来源:Adafruit)
对于不在可用的HAT中提供的功能,开发人员不需要限制自己的HAT格式。所述DFRobot DFR0327 Arduino的屏蔽,Seeed技术 GrovePi +入门套件,和制造商mikroElektronika MIKROE-2756点击屏蔽给开发人员访问可用的宽阵列的Arduino屏蔽,树丛设备,和MikroBUS点击板分别。
通过使用这些电路板,开发人员可以通过连接MikroElektronika MIKROE-988 CAN点击电路板,以及用于MikroElektronika MIKROE-1296 4-20 mA电流环点击电路板的4-20 mA电流回路,快速添加对标准CAN接口的支持。

四舍五入的小店铺设计

即使在使用所需的附加功能快速配置基于树莓派的设计之后,开发人员也往往会浪费时间来构建适当的用户界面。使用Raspberry Pi 3,开发人员可以将设计与Adafruit的IO云服务连接起来,为用户提供图形反馈和对自动化流程的控制。云服务允许开发人员创建简单的数据和处理信息源(清单4),并构建仪表板,使用户能够通过桌面,智能手机或其他移动设备上的任何Web浏览器来监视和控制项目(图3)。
# Import library and create instance of REST client.
from Adafruit_IO import Client
aio = Client('YOUR ADAFRUIT IO KEY')
 
# Send the value 100 to a feed called 'Foo'.
aio.send('Foo', 100)
清单4:开发人员可以轻松地将工业自动化应用程序中的数据传输到Adafruit IO云中进行显示和控制。(图片来源:Adafruit)
Adafruit IO仪表板的图像
图3:开发人员可以显示来自基于Raspberry Pi 3的工业自动化应用程序的信息,并使用Adafruit IO仪表板进行控制。(图片来源:Adafruit)
简单的软件开发,多样的附加电路板和高性能树莓派的结合为小型工业自动化应用提供了一个合适的解决方案。然而,在其中一些应用中,开发者可能需要比使用RTC的配置(例如Adafruit 3013 RTC HAT)中提供的更严格的时序控制。
3013 RTC HAT基于Maxim Integrated DS3231 RTC IC,提供两个可编程报警和一个方波输出信号。开发人员可以使用报警在指定的天数,小时,分钟和秒数内产生中断,或者使用方波以1赫兹(Hz)的速率产生中断。对于需要高于1 Hz的周期性中断的应用,开发人员需要使用处理器的系统定时器来开发自定义的软件功能,或者构建定制的硬件计数器,以便以所需的速率产生中断。
在需要更快时序分辨率的应用中,同样重要的要求就是确定性响应延迟。高速率下,标准Raspbian操作系统响应延迟的变化可能会降低准确性。尽管标准系统可能提供毫秒级分辨率的足够确定的响应,但开发人员可能需要转向使用Linux PREEMPT_RT补丁的方法,以满足更严格和更确定的解决方案要求。

结论

传统的PLC提供的功能通常超出了小规模制造,机加工和原型车间中大多数小型工业操作的要求和预算。对于这些应用程序,运营商通常面临的是树莓派3的能力范围内更适度的要求。
使用Raspberry Pi 3和适当的附加电路板,开发人员可以快速实施能够满足各种小型店铺操作要求的专用工业自动化系统。

用户喜欢...

贸泽电子与Industruino 签订全球代理协议

专注于新产品引入 (NPI) 与推动创新的领先分销商贸泽电子 (Mouser Electronics) 宣布与Industruino签订全球分销协议,Indust...


ST电力线通信芯片组解决方案为新智能电力基础设施的推出铺平道路

横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)推...


“安富利杯”赛灵思FPGA设计技巧与应用创新博文大赛---论工业控制系统的FPGA设计方法(5)- FPGA在工业控制器设计中的贡献与限制

上次博文大概介绍了基于FPGA的控制器设计原则,特别是改进算法实现效率的A3原则。本次主要就FPGA在工业控制器设计中的贡献与限制进行讨论。看了看老外的观点,归纳一下,再对比上次我...