2013-02-17 65 views
1

我使用OneWire傳感器(ds18b20)讀出溫度,並將其用於PI算法以控制SSR繼電器。我想在這兩個函數之間使用Pipe來發送溫度並使「Reg」函數儘可能快地運行。如果我不使用Pipe,Reg函數會等待溫度函數(使用0.75秒)並且輸出錯誤... 任何人都可以請教我如何使用Pipe函數。使Python多處理。在兩個函數之間移動

代碼:

import time 
import RPi.GPIO as GPIO 
import os 

GPIO.setwarnings(False) 
GPIO.setmode(GPIO.BCM) 
GPIO.setup(22, GPIO.OUT) 


def temperatur(self): 
while True: 

    tfile = open("/sys/bus/w1/devices/28-00000433f810/w1_slave") 
    text = tfile.read() 
    tfile.close() 
    secondline = text.split("\n")[1] 
    temperaturedata = secondline.split(" ")[9] 
    temp2 = float(temperaturedata[2:]) 
    self.temp = temp2/1000 
    print self.temp 


def reg(self): 

    while True: 

    ek = self.ref - self.temp 
    P_del = self.Kp * ek 
    I_del = ((self.Kp * self.Syklustid)/self.Ti) * ek 
    Paadrag = P_del + I_del 
    if Paadrag > 100: 
     Paadrag = 100 
    if Paadrag < 0: 
     Paadrag = 0  
    print "Paadrag: ", Paadrag, " Temperatur: ", self.temp 
    duty = Paadrag/100.0 
    on_time = self.Syklustid * (duty) 
    off_time = self.Syklustid * (1.0-duty) 
    print "On_time: ", on_time, " Off_time: ", off_time 
    GPIO.output(22, GPIO.HIGH) 
    time.sleep(on_time) 
    GPIO.output(22, GPIO.LOW) 
    time.sleep(off_time 

if __name__ == '__main__': 
+1

有一些代碼丟失。 – Bakuriu 2013-02-17 14:41:36

回答

1

這是直接從Python文檔: http://docs.python.org/2/library/multiprocessing.html

from multiprocessing import Process, Pipe 

def f(conn): 
    conn.send([42, None, 'hello']) 
    conn.close() 

if __name__ == '__main__': 
    parent_conn, child_conn = Pipe() 
    p = Process(target=f, args=(child_conn,)) 
    p.start() 
    print parent_conn.recv() # prints "[42, None, 'hello']" 
    p.join() 

我使用共享狀態有更好的結果。特別是對於像溫度的簡單數據(一些我認爲 - 並不是一個複雜的自定義對象或其他)下面是一個例子凌晨(再次,你會發現更多的Python文檔)

#import stuff 
from multiprocessing import Process, Manager 

# Create a shared dictionary of paremeters for both processes to use 
manager = Manager() 
global_props = manager.dict() 
# SuperImportant - initialise all parameters first!! 
global_props.update({'temp': 21.3}) 

def functionOne(global_props): 
    # Do some stuff read temperature 
    global_props['temp'] = newVal 

def functionTwo(global_props): 
    temp = global_props['temp'] 
    # Do some stuff with the new value 

# assign listeners to the two processes, passing in the properties dictionary 

handlerOne = functionOne # This can also be a class in which case it calls __init__() 
handlerTwo = functionTwo 
processOne = Process(target=handlerOne, 
    args=(global_props)) 
processTwo = Process(target=handlerTwo, 
    args=(global_props)) 

# Start the processes running... 
processOne.start() 
processTwo.start() 
processOne.join() 
processTwo.join() 
相關問題