Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 25.10.2015, 09:43   #1 (permalink)
AID_GEN
Новичок
 
Регистрация: 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()

AID_GEN вне форума   Ответить с цитированием

Старый 25.10.2015, 09:43
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

На форуме много схожих тем, можете полистать

Не могу вызвать Boot Menu
Не понимаю, для чего нужен резистор в схеме?
Правильно ли я понимаю принцип регулировки напряжения в БП?
"AGP отключен. Это может вызвать снижение производительности"
Задача на ruby. Помогите, вообще не понимаю!

Старый 25.10.2015, 10:46   #2 (permalink)
Николай_С
Member
 
Аватар для Николай_С
 
Регистрация: 25.09.2012
Адрес: г.Дзержинск Нижегородской обл.
Сообщений: 21,118
Записей в дневнике: 7
Сказал(а) спасибо: 215
Поблагодарили 189 раз(а) в 59 сообщениях
Репутация: 77688
По умолчанию

Вот тут,например, открывают с комментарием четыре потока (файла) для записи:
Код:
 #Открытие файлов для записи
f1=open ('1.csv','w')
f2=open ('2.csv','w')
f3=open ('3.csv','w')
f4=open ('4.csv','w')
Николай_С вне форума   Ответить с цитированием
Старый 25.10.2015, 11:31   #3 (permalink)
AID_GEN
Новичок
 
Регистрация: 14.09.2015
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Николай_С Посмотреть сообщение
Вот тут,например, открывают с комментарием четыре потока (файла) для записи:
Код:
 #Открытие файлов для записи
f1=open ('1.csv','w')
f2=open ('2.csv','w')
f3=open ('3.csv','w')
f4=open ('4.csv','w')
К сожалению, так не получается, в цикле значения PI и PID остаются нулями, а должны изменяться
AID_GEN вне форума   Ответить с цитированием
Старый 25.10.2015, 12:34   #4 (permalink)
Николай_С
Member
 
Аватар для Николай_С
 
Регистрация: 25.09.2012
Адрес: г.Дзержинск Нижегородской обл.
Сообщений: 21,118
Записей в дневнике: 7
Сказал(а) спасибо: 215
Поблагодарили 189 раз(а) в 59 сообщениях
Репутация: 77688
По умолчанию

Я просто обескуражен вашим стилем программирования. Кто ж так пишет?
Открытие потока в одном классе, закрытие - в другом.
Ничего удивительного что у Вас.теряются данные.
Запомните раз и навсегда: все логически связанные действия делаются в одном программном модуле.
Николай_С вне форума   Ответить с цитированием
Старый 25.10.2015, 13:00   #5 (permalink)
AID_GEN
Новичок
 
Регистрация: 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()
AID_GEN вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 25.10.2015, 15:25   #6 (permalink)
Николай_С
Member
 
Аватар для Николай_С
 
Регистрация: 25.09.2012
Адрес: г.Дзержинск Нижегородской обл.
Сообщений: 21,118
Записей в дневнике: 7
Сказал(а) спасибо: 215
Поблагодарили 189 раз(а) в 59 сообщениях
Репутация: 77688
По умолчанию

Не на много лучше.
Потоки открываются в самом начале и закрываются в одной из функций. А если функция будет вызвана несколько раз? (Она ведь именно для этого предназначена.)
Вы взяли за основу неудачный пример для своего задания. Пишите заново - будет легче разобраться.
Николай_С вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 04:33.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.