Digi-Key Electronics
Avtor: Rich Miron
2018_261_36
Določeni industrijski postopki v majhnih delavnicah zahtevajo kombinacijo robustnih okolij delovanja, visoke zmogljivosti V/I in kompleksne funkcije, za katere so bili programabilni logični krmilniki (PLC-ji)prvotno namenjeni. Poleg pomanjšanih različic PLC-jev lahko oblikovalci zdaj izbirajo tudi iz nabora cenovno ugodnih odprtokodnih rešitev strojne in programske opreme za učinkovit industrijski nadzor.
Primer takšne rešitve je drobna platforma Raspberry Pi 3 sklada Raspberry Pi Foundation ter njene sorodne dodatne plošče. V tem članku bomo opisali glavne značilnosti platforme Raspberry Pi 3 ter nato razložili, kako jo uporabljati za potrebe nadzora.
Zakaj izbrati Raspberry Pi za industrijski nadzor v majhnih delavnicah
Za potrebe manjših postopkov platforma Raspberry Pi 3 nudi poceni rešitev z znatnimi zmogljivostmi. Plošča Raspberry Pi 3, ki je popolnoma sposobna izvajanja namenskih opravil industrijske avtomatizacije, vsebuje procesor Broadcom ARM® Cortex®-A53, 1 GB delovnega pomnilnika, digitalne vmesnike, Wi-Fi in povezljivost Bluetooth. Procesor je vrhunski sistem na čipu (SoC), ki združuje štirijedrno procesorsko enoto ARM Cortex-A53 s 512 KB predpomnilnika L2 in 54 priključkov GPIO, razporejenih v treh bankah.
Vsak posamezen priključek GPIO podpira najmanj dve in največ šest drugih funkcij, vključno s pulznimi modulatorji, urami in zaporednimi vmesniki. Razvijalci lahko nedodeljene GPIO priključke uporabljajo kot prekinitvene linije, vhode ali izhode, ki lahko napajajo do 16 miliamperov (mA) (skupno do 50 mA na banko GPIO).
Kot tudi drugi člani družine Raspberry Pi je platforma Raspberry Pi 3 zasnovana, da poenostavi razvoj vgrajenih sistemov za začetnike, vendar hkrati omogoči dovolj zmogljivosti, da izpolni zahteve izkušenih razvijalcev po bolj zapleteni in zmogljivi obdelavi.
Za začetek razvijalci preprosto povežejo video vhode plošče s svojimi zasloni, USB vhode pa s tipkovnico in miško. Pri razvoju programske opreme lahko razvijalci uporabljajo bogat ekosistem, ki ga podpira brezplačni operacijski sistem Raspbian sklada Raspberry Pi, ki temelji na Linuxu in ga naložite s pomnilniške kartice prek vmesnika micro SD na plošči.
Dodajanje industrijskih zmogljivosti
Poleg zmogljivosti in enostavnosti razvoja platforma Raspberry Pi omogoča tudi poenostavljen pristop k razširitvi funkcij, zaradi česar je zelo primerna za različne zahteve pri uporabi v industrijski avtomatizaciji. Za dodajanje zmogljivosti strojne opreme morajo razvijalci le priključiti dodatno ploščo, imenovano HAT (Hardware Attached on Top), na ploščo Raspberry Pi 3. HAT, podobno kot bolj kompleksni industrijski sistemi, zagotavlja standardni pristop za njegovo prepoznavanje ter po potrebi samodejno konfigurira GPIO priključke in gonilnike. Na ta način lahko razvijalci takoj preprosto nadgradijo svoj sistem Raspberry Pi za industrijsko uporabo, tako da priklopijo HAT za avtomatizacijo podjetja Pimoroni PIM213 (slika 1).
HAT za avtomatizacijo podjetja Pimoroni, ki je zasnovan posebej za nadzor sistemov za avtomatizacijo, združuje več kanalov V/I, vključno z analognimi in digitalnimi vhodi, napajanimi izhodi in krmilniki relejev. Poleg možnosti napajanja 24-voltnih enot (V) kanali V/I zagotavljajo dokaj zmogljivo vhodno in izhodno medpomnjenje. Relejni izhodi na primer napajajo do 2 ampera (A), kar je dovolj za poganjanje 24-voltnih nizkonapetostnih delov, na primer magnetnega ventila Crouzet 81 546 001.
Za razvijanje programske opreme s HAT-om za avtomatizacijo podjetje Pimoroni nudi povezani modul Python, ki omogoča uporabo funkcij strojne opreme HAT s samo nekaj vrsticami kode. Ko ga uvozite v program v jeziku Python, modul podjetja Pimoroni ustvari programske objekte za analogni vhod, digitalni vhod, digitalni izhod, relejni izhod in nadzor lučk LED, pri čemer vsak objekt vsebuje ustrezne nizkonivojske funkcije branja in zapisovanja (izpis 1).
Izpis 1: modul Python podjetja Pimoroni za HAT za avtomatizacijo poenostavlja razvijanje tako, da izvaja podrobne transakcije, kot je branje iz vgrajenega analogno-digitalnega pretvornika (ADC). (Vir slike: Pimoroni)
Vsak objekt prepozna ustrezni kanal in druge sorodne podatke. Ko je na primer predmet analognega vhoda ustvarjen, vsebuje največjo napetost za povezan priključek (glejte funkcijo »init« v izpisu 1). Za pretvorbo iz analognega signala v digitalnega (ADC) objekt ADC kliče osnovni ADC modul (ads1015.read v izpisu 1). ADC modul nato izvede nizkonivojske I2C transakcije, ki so potrebne za nastavitev analogno-digitalnega pretvornika in izvedbo pretvorbe, ter vrne vrednost v uporabni obliki (izpis 2).
Izpis 2: visokonivojski funkcijski klic za analogno-digitalno pretvorbo kliče bralno rutino, ki izvede zapisovanje na vodilo I2C za začetek pretvorbe, nato miruje dovolj dolgo, da se pretvorba dokonča in izvede branje I2C vodila za pridobivanje rezultata. (Vir slike: Pimoroni)
Razvijalec mora za branje analogne vrednosti preprosto izvršiti visokonivojsko funkcijo branja (.read()) na določenem analognem vhodu (.one) za analogni objekt:
value = automationhat.analog.one.read()
Knjižnica podpira ta preprost model za druge funkcije HAT, tako da se vklop ali izklop releja izvede s preprostim klicem metode:
automationhat.relay.write(1) # 1=ON, 0=OFF
Prilagodljive možnosti
HAT za avtomatizacijo podjetja Pimoroni nudi osnovno funkcionalnost V/I, ki je potrebna pri avtomatizaciji v industriji majhnega obsega, vendar lahko razvijalci izbirajo iz bogatega nabora razpoložljivih HAT-ov za vse vrste funkcij, potrebnih za specializirano uporabo, kot je industrijska avtomatizacija. Adafruit 3013 RTC HAT na primer nudi funkcionalnost ure v realnem času (RTC), kar ni standardna funkcija same plošče. Oblikovalci platforme Raspberry Pi pričakujejo, da bodo razvijalci poskrbeli, da bo plošča ostala povezana z internetom, kjer lahko uporablja standardni protokol omrežnega časa (NTP) za vzdrževanje časa na uri. Posledično je za zasnove, pri katerih lahko namenoma ali nehote pride do prekinitve povezave z internetom, potrebna zunanja RTC ura, kot je Adafruit RTC HAT.
Če razvijalci dodajo funkcionalnost, kot je RTC ura, se jim pri oblikovanju industrijske avtomatizacije ni treba omejiti le na en sam HAT. Razvijalci lahko na ploščo Raspberry Pi priklopijo več HAT-ov. Čeprav je večina HAT-ov zasnovana za skladanje, bodo za dokončanje sestavljanja razvijalci morda morali dodati glave za skladanje, kot je glava 2223 podjetja Adafruit, ali distančnike M2.5, ki preprečujejo, da bi se HAT-i dotikali drug drugega ali osnovne plošče.
Z glavami za skladanje in distančniki lahko razvijalci enostavno sestavijo HAT, kot je motorni HAT 2348 podjetja Adafruit, za dodajanje gonilnikov motorjev, ki so potrebni v številnih primerih industrijske avtomatizacije. Vsak motorni HAT 2348 lahko poganja dva koračna motorja ali štiri motorje na enosmerni tok. Razvijalci lahko zložijo do 32 dodatnih plošč za podpiranje do 64 koračnih motorjev ali 128 motorjev na enosmerni tok (slika 2).
Podobno kot HAT za avtomatizacijo podjetja Pimoroni lahko tudi motorni HAT 2348 podjetja Adafruit programirate z nekaj preprostimi ukazi v programskem jeziku Python. Vzorčna programska oprema podjetja Adafruit za motorni HAT celo prikazuje osnovne oblikovalske vzorce za uporabo modula Python za večnitno programiranje za zagon več motorjev hkrati (izpis 3).
Izpis 3: modul Python za motorni HAT podjetja Adafruit vključuje vzorčno programsko opremo, kot je ta delček programske kode, ki prikazuje uporabo preprostih krmilnih ukazov in uporabo modula Python za večnitno programiranje za nadzor para koračnih motorjev. (Vir slike: Adafruit)
Za funkcije, ki jih razpoložljivi HAT-i ne ponujajo, se razvijalcem ni treba omejevati na format HAT. Dodatna plošča Arduino DFRobot DFR0327, začetni komplet Seeed Technology GrovePi+ in »click« plošča MikroElektronika MIKROE-2756 razvijalcem omogočajo dostop do širokega nabora razpoložljivih dodatnih plošč Arduino, naprav Grove oziroma »click« plošč MikroBUS.
S temi ploščami lahko razvijalci hitro dodajo podporo za standardne vmesnike CAN, in sicer tako, da pritrdijo »click« ploščo MikroElektronika MIKROE-988 CAN, za omogočanje tokovnih zank 4–20 mA pa »click« ploščo MikroElektronika MIKROE-1296.
Zaključevanje oblikovanja za majhne delavnice
Tudi po hitri konfiguraciji zasnove, ki temelji na platformi Raspberry Pi, z zahtevano dodatno funkcionalnostjo razvijalci pogosto izgubljajo čas z izdelavo ustreznega uporabniškega vmesnika. S platformo Raspberry Pi 3 lahko razvijalci svojo zasnovo povežejo s storitvijo v oblaku Adafruit IO, da uporabnikom omogočijo grafične povratne informacije in nadzor nad postopki avtomatizacije. Storitev v oblaku razvijalcem omogoča ustvarjanje preprostih virov podatkov, obdelavo informacij (izpis 4) in izdelovanje nadzornih plošč, ki uporabnikom omogočajo nadziranje projektov prek katerega koli spletnega brskalnika v namiznem računalniku, pametnem telefonu ali drugi mobilni napravi (slika 3).
Izpis 4: razvijalci lahko enostavno pretakajo podatke iz svoje aplikacije za industrijsko avtomatizacijo v oblak Adafruit IO za prikaz in nadzor. (Vir slike: Adafruit)
Kombinacija preprostega razvoja programske opreme, različnih dodatnih plošč in visokozmogljive platforme Raspberry Pi zagotavlja primerno rešitev za majhne aplikacije za industrijsko avtomatizacijo. Pri nekaterih aplikacijah pa bodo razvijalci morda potrebovali strožji nadzor časa, kot je na voljo pri konfiguracijah z uro RTC, kot je Adafruit 3013 RTC HAT.
3013 RTC HAT temelji na integriranem vezju Maxim Integrated DS3231 RTC IC, ki nudi dva programabilna alarma ter izhodni pravokotni signal. Razvijalci lahko alarme uporabljajo za ustvarjanje prekinitev ob določenem številu dni, ur, minut oziroma sekund, ali uporabijo pravokotni val za ustvarjanje prekinitve pri frekvenci 1 Hertza (Hz). Pri aplikacijah, kjer so potrebne periodične prekinitve, hitrejše od 1 Hz, bodo morali razvijalci razviti programske funkcije po meri s sistemskim časovnikom procesorja ali izdelati števce strojne opreme po meri, ki lahko ustvarjajo prekinitve z želeno frekvenco.
Pri aplikacijah, kjer je potrebna hitrejša ločljivost časa, je še ena pomembna zahteva zakasnitev determinističnega odziva. Pri visokih frekvencah lahko razlike v zakasnitvah odziva standardnega operacijskega sistema Raspbian OS zmanjšajo stopnjo natančnosti. Čeprav bo standardni sistem verjetno omogočil dovolj determinističen odziv z miisekundno ločljivostjo, se bodo morda razvijalci morali obrniti k pristopom, ki uporabljajo programski popravek Linux PREEMPT_RT za izpolnjevanje strožjih in bolj determinističnih zahtev po ločljivosti.
Zaključek
Običajni PLC-ji nudijo zmogljivosti, ki običajno presegajo zahteve in proračune večine manjših industrijskih postopkov v proizvodnji majhnega obsega, strojništvu in prototipnih delavnicah. Pri teh uporabah se upravljavci običajno soočajo s skromnejšimi zahtevami, ki povsem ustrezajo zmogljivosti platforme Raspberry Pi 3.
Z uporabo platforme Raspberry Pi 3 in ustreznih dodatnih plošč lahko razvijalci hitro uvedejo namenske sisteme industrijske avtomatizacije, ki lahko izpolnjujejo zahteve za široko paleto postopkov v majhnih delavnicah.
www.digikey.com
izpis 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)))
izpis 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 ...
izpis 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()
izpis 4 # 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)