25.10.2015, 09:43 | #1 (permalink) |
Новичок
Регистрация: 14.09.2015
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Не понимаю, как вызвать функции
from socket import * from struct import * import threading import time import math #Открытие файлов для записи f1=open ('1.csv','w') f2=open ('2.csv','w') f3=open ('3.csv','w') f4=open ('4.csv','w') global w1 global w2 global E3 global w3 global x1 global x2 global PI global PID Kp = 0 Kd = 0 Ki = 0 PI = 0 PID = 0 w1 = 0 w2 = 0 w3 = 0 E3 = 0 E2 = 0 E1 = 0 g = 0 i = 1 # Класс буфера class Buffer(): buffer = [0,] update = True def __init__(self, buffer_size, ): self.buffer = self.buffer*buffer_size def put(self, data):# Внедрение значения self.buffer[0:len(self.buffer)-2] = self.buffer[1:len(self.buffer)-1] self.buffer[len(self.buffer)-1] = data self.update = True def pop(self):# Извлечение значения self.update = False return self.buffer[len(self.buffer)-1] # Класс получения данных class receive_data(threading.Thread): UDP_rsv = socket(AF_INET, SOCK_DGRAM) addr = ("127.0.0.1", 25001) buf = 1024 data = "" UDP_rsv.bind(addr) CanRun = True def __init__(self, addr): threading.Thread.__init__(self) self.addr = addr def run(self): while self.CanRun: self.data,self.addr = self.UDP_rsv.recvfrom(1024) a = unpack('dd', self.data) ob1.put(a[0]) ob2.put(a[1]) f4.write('%s\n' %(a[1])) def Stop(self): self.CanRun = False f4.close() # Класс контроллера class Controller(receive_data): def SetEpsilon(self,E1,E2,E3,x1,x2): E3= E2 x1 = self.ob1.pop() x2 = self.ob2.pop() E1 = g - x1 E2 = g - x2 f1.write('%s\n' %(E1)) f2.write('%s\n' %(E2)) def SetIntegrator(w1,w2,w3): w1 = w1+0.01*E1 w2 = w2+0.01*E2 w3 = (E2-E3)/0.01 # Класс PI class PI_reg(Controller): def SetK(Kp,Kd): Kp = 0.1 Kd = 0.35 def run(self): while self.CanRun: #здесь нужно вызвать w1 и E1 PI = Kp*E1[i]+Kd*w1[i] def Stop(self): self.CanRun = True # Класс PID class PID_reg(Controller): def SetK(Kp,Kd,Ki): Kp = 0.1 Kd = 0.135 Ki = 0.0001 def run(self): while self.CanRun: #здесь нужно вызвать w2, w3 и E2 PID = Kp*E2[i]+Kd*w2[i]+Ki*w3 def Stop(self): self.CanRun = True # Класс отправки данных class send_data(threading.Thread): UDP_send = socket(AF_INET,SOCK_DGRAM) addr = ("localhost", 25000) data = "" i = 0 times = [0] CanRun = True def __init__(self, addr, buf, sign): threading.Thread.__init__(self) self.addr = addr self.buf = buf self.sign = sign def Stop(self): self.CanRun = False def run(self): while self.CanRun: if Buffer.update: self.times[0] = 0.001 t = time.clock() self.times.append(t) if sign == '1': g = math.sin(1.5*t) if sign == '2': g=1.0 f3.write('%s\n' %(g)) #здесь нужно вызвать PI и PID u1 = PI u2 = PID print (PI) self.data = pack('dd', u1, u2) self.UDP_send.sendto(self.data, self.addr) self.i=self.i+1 f1.close() f2.close() f3.close() host = "localhost" addr = (host,25000) addr2 = (host, 25001) print('Choose signal: Sin - 1, Step - 2') sign = input() ob1 = Buffer(1024) ob2 = Buffer(1024) thread1 = send_data(addr, 1024, sign) thread2 = receive_data(addr2) thread3 = PI_reg(addr) thread4 = PID_reg(addr) thread1.start() thread2.start() thread3.start() thread4.start() |
25.10.2015, 09:43 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
На форуме много схожих тем, можете полистать Не могу вызвать Boot Menu Не понимаю, для чего нужен резистор в схеме? Правильно ли я понимаю принцип регулировки напряжения в БП? "AGP отключен. Это может вызвать снижение производительности" Задача на ruby. Помогите, вообще не понимаю! |
25.10.2015, 10:46 | #2 (permalink) |
Радиоинженер
Регистрация: 25.09.2012
Адрес: г.Дзержинск Нижегородской обл.
Сообщений: 25,308
Записей в дневнике: 7
Сказал(а) спасибо: 292
Поблагодарили 219 раз(а) в 70 сообщениях
Репутация: 110185
|
Вот тут,например, открывают с комментарием четыре потока (файла) для записи:
Код:
#Открытие файлов для записи f1=open ('1.csv','w') f2=open ('2.csv','w') f3=open ('3.csv','w') f4=open ('4.csv','w') |
25.10.2015, 12:34 | #4 (permalink) |
Радиоинженер
Регистрация: 25.09.2012
Адрес: г.Дзержинск Нижегородской обл.
Сообщений: 25,308
Записей в дневнике: 7
Сказал(а) спасибо: 292
Поблагодарили 219 раз(а) в 70 сообщениях
Репутация: 110185
|
Я просто обескуражен вашим стилем программирования. Кто ж так пишет?
Открытие потока в одном классе, закрытие - в другом. Ничего удивительного что у Вас.теряются данные. Запомните раз и навсегда: все логически связанные действия делаются в одном программном модуле. |
25.10.2015, 13:00 | #5 (permalink) |
Новичок
Регистрация: 14.09.2015
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Первоначально было так, но понадобилось разделение классов на PI, PID и Controller
from socket import * from struct import * import threading import time import math import msvcrt f1=open ('1.csv','w') f2=open ('2.csv','w') f3=open ('3.csv','w') f4=open ('4.csv','w') class Buffer(): buffer = [0,] update = True def __init__(self, buffer_size, ): self.buffer = self.buffer*buffer_size def put(self, data): self.buffer[0:len(self.buffer)-2] = self.buffer[1:len(self.buffer)-1] self.buffer[len(self.buffer)-1] = data self.update = True def pop(self): self.update = False return self.buffer[len(self.buffer)-1] class receive_data(threading.Thread): UDP_rsv = socket(AF_INET, SOCK_DGRAM) addr = ("127.0.0.1", 25001) buf = 1024 data = "" UDP_rsv.bind(addr) CanRun = True i = 1 def __init__(self, addr): threading.Thread.__init__(self) self.addr = addr def run(self): while self.CanRun: self.data,self.addr = self.UDP_rsv.recvfrom(1024) a = unpack('dd', self.data) x1.put(a[0]) x2.put(a[1]) f4.write('%s\n' %(a[1])) self.i=self.i+1 def Stop(self): self.CanRun = False f4.close() class send_data(threading.Thread): UDP_send = socket(AF_INET,SOCK_DGRAM) addr = ("localhost", 25000) data = "" i = 0 times = [0] CanRun = True def __init__(self, addr, buf, sign): threading.Thread.__init__(self) self.addr = addr self.buf = buf self.sign = sign def Stop(self): self.CanRun = False def run(self): global w1 global w2 global E3 global w3 w1 = 0 w2 = 0 w3 = 0 E3 = 0 E2 = 0 g = 0 while self.CanRun: if Buffer.update: self.times[0] = 0.001 t = time.clock() self.times.append(t) if sign == '1': g = math.sin(1.5*t) if sign == '2': g=1.0 x1 = self.x1.pop() x2 = self.x2.pop() E3 = E2 E1 = g - x1 E2 = g - x2 w1 = w1+0.01*E1 w2 = w2+0.01*E2 w3 = (E2-E3)/0.01 f1.write('%s\n' %(E1)) f2.write('%s\n' %(E2)) f3.write('%s\n' %(g)) u1 = 0.1*E1+0.35*w1 u2 = 0.1*E2+0.135*w2+0.0001*w3 print (u1) print (u2) self.data = pack('dd', u1, u2) self.UDP_send.sendto(self.data, self.addr) self.i=self.i+1 f1.close() f2.close() f3.close() seconds = [0.0001] host = "localhost" addr = (host,25000) addr2 = (host, 25001) print('signal: sin - 1, Step - 2') sign = input() x1 = Buffer(1024) x2 = Buffer(1024) snd = send_data(addr, 1024, sign) rsv = receive_data(addr2) snd.start() rsv.start() |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
25.10.2015, 15:25 | #6 (permalink) |
Радиоинженер
Регистрация: 25.09.2012
Адрес: г.Дзержинск Нижегородской обл.
Сообщений: 25,308
Записей в дневнике: 7
Сказал(а) спасибо: 292
Поблагодарили 219 раз(а) в 70 сообщениях
Репутация: 110185
|
Не на много лучше.
Потоки открываются в самом начале и закрываются в одной из функций. А если функция будет вызвана несколько раз? (Она ведь именно для этого предназначена.) Вы взяли за основу неудачный пример для своего задания. Пишите заново - будет легче разобраться. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|