Advertisement
rbpp

Programa para cálculo P-I-D com Flask

Nov 23rd, 2013
254
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.82 KB | None
  1. # coding=UTF-8
  2. import csv
  3. import matplotlib
  4. matplotlib.use('Agg')
  5. import matplotlib.pyplot as plt
  6. import numpy as np
  7. from cStringIO import StringIO
  8. import os
  9. from flask import Flask, request, redirect, url_for
  10. from werkzeug import secure_filename
  11.  
  12.  
  13.  
  14. UPLOAD_FOLDER = '/home/renato/mysite'
  15. ALLOWED_EXTENSIONS = set(['csv'])
  16.  
  17. app = Flask(__name__)
  18. app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
  19.  
  20. def allowed_file(filename):
  21.     return '.' in filename and \
  22.            filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
  23.  
  24.  
  25.  
  26. @app.route('/', methods=['GET', 'POST'])
  27.  
  28.  
  29.  
  30. def upload_file():
  31.  
  32.     global filename, CONtempo
  33.  
  34.     if request.method == 'POST':
  35.         CONtempo = int(request.form['CONtempo'])
  36.  
  37.  
  38.  
  39.     if request.method == 'POST':
  40.         file = request.files['file']
  41.  
  42.         if file and allowed_file(file.filename):
  43.             filename = secure_filename(file.filename)
  44.             print filename
  45.             file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
  46.             return redirect("http://renato.pythonanywhere.com/grafico")
  47.  
  48.  
  49.     return '''
  50.    <!doctype html>
  51.    <title>P-I-D</title>
  52.    <h1>Carregar arquivo de dados (.csv)</h1>
  53.  
  54.    <form action=""
  55. method="post" enctype="multipart/form-data">
  56. Constante de tempo: <input type="number" name="CONtempo" value="1"><br><br>
  57.  <input type="file" name="file">
  58.  
  59.  <input type="submit" value="Enviar">
  60.  </form>
  61.  
  62.  
  63.  
  64.  
  65.    <h3>A constante de tempo será utilizada como divisor para o tempo morto e tau, servindo como ajuste para certos controladores, deixe o valor em 1 caso esta alteração não seja necessária.<h3>
  66.    <h3>O arquivo .csv deve respeitar a seguinte formatação: O valor da PV deve estar na primeira coluna, o valor de MV deve estar na segunda coluna, sendo ambas separadas por tabulação.<h3>
  67.    <h3>Arquivos de exemplo podem ser baixados em: </h3>
  68.    <a href="https://mega.co.nz/#!dJQhUbYZ!Hl766E418-lchr6R9w7f1H-WEPo3VO9DIk9GFK4UQcE" target="_blank">Arquivo de exemplo 1</a>
  69.    <a href="https://mega.co.nz/#!YI5DmbzI!WXYSTV2_xbHoa-CFou9DnS6ksmUrzCwx-GiPNp2RDEI" target="_blank">Arquivo de exemplo 2</a>
  70.    </form>
  71.    '''
  72.  
  73. @app.route("/grafico")
  74. def Calcular():
  75.  
  76.     html = '''
  77.        <html>
  78.            <body>
  79.                <img src="data:image/png;base64,{}" NAME="k" /> <br/>
  80.                <iframe src="http://renato.pythonanywhere.com/ZPID" height = 30 width = 800 scrolling="no"></iframe>
  81.                <iframe src="http://renato.pythonanywhere.com/ZPI" height = 30 width = 800 scrolling="no"></iframe>
  82.                <iframe src="http://renato.pythonanywhere.com/ZP" height = 30 width = 800 scrolling="no"></iframe>
  83.                <iframe src="http://renato.pythonanywhere.com/CPID" height = 30 width = 800 scrolling="no"></iframe>
  84.                <iframe src="http://renato.pythonanywhere.com/CPI" height = 30 width = 800 scrolling="no"></iframe>
  85.                <iframe src="http://renato.pythonanywhere.com/CPD" height = 30 width = 800 scrolling="no"></iframe>
  86.                <iframe src="http://renato.pythonanywhere.com/CP" height = 30 width = 800 scrolling="no"></iframe>
  87.                <iframe src="http://renato.pythonanywhere.com/APID" height = 30 width = 800 scrolling="no"></iframe>
  88.            </body>
  89.        </html>
  90.        '''
  91.  
  92.     global np, tau, tempoMorto, k, ifl, PVmudanca, mudancaPV, MVmudanca, mudancaMV, MVmax, MVmin, PVmax, PVmin, infl, coluna,coluna2, tauPV
  93.     try:
  94.         plt.delaxes()
  95.  
  96.         coluna = np.array(list(csv.reader(open('/home/renato/mysite/%(1)s' % {"1":filename},"rb"),delimiter='\t'))).astype('float')
  97.         coluna2 = np.array(list(csv.reader(open('/home/renato/mysite/%(1)s' % {"1":filename},"rb"),delimiter='\t'))).astype('float')
  98.  
  99.  
  100.         ConTempo = CONtempo
  101.         coluna = coluna/1000
  102.         coluna = np.round(coluna)
  103.  
  104.         PV = coluna[:,0]
  105.  
  106.         MV = coluna[:,1]
  107.  
  108.         PVmax = np.amax(PV)
  109.         PVmin = np.amin(PV)
  110.  
  111.         MVmax = np.amax(MV)
  112.         MVmin = np.amin(MV)
  113.  
  114.         k = (PVmax - PVmin)/(MVmax - MVmin)
  115.         print k
  116.  
  117.         MudancaPV = np.nditer(PV, flags=['f_index'])
  118.         MudancaMV = np.nditer(MV, flags=['f_index'])
  119.  
  120.         while MudancaPV == PVmin:
  121.             PVmudanca = ("%d") % (MudancaPV.index)
  122.             PVmudanca = float(PVmudanca)
  123.             MudancaPV.iternext()
  124.         print PVmudanca
  125.  
  126.         while MudancaMV == MVmin:
  127.             MVmudanca = ("%d") % (MudancaMV.index)
  128.             MVmudanca = float(MVmudanca)
  129.             MudancaMV.iternext()
  130.         print MVmudanca
  131.  
  132.         tempoMorto = PVmudanca - MVmudanca
  133.         tempoMorto = float(tempoMorto)
  134.         tempoMorto = tempoMorto/ConTempo
  135.         print tempoMorto
  136.  
  137.         infl = ((PVmax-PVmin)*0.632)+PVmin
  138.         print infl
  139.  
  140.         while MudancaPV <= infl:
  141.             tauPV = ("%d") % (MudancaPV.index)
  142.             tauPV = float(tauPV)
  143.             MudancaPV.iternext()
  144.         print tauPV
  145.  
  146.         tau = tauPV - PVmudanca
  147.         tau = float(tau)
  148.         tau = tau/ConTempo
  149.         print tau
  150.  
  151.         fig = plt.figure("Resposta do Sistema")
  152.         plt.xlabel("k = %(1)s Tempo Morto = %(2)s Tau = %(3)s" % {"1":k, "2":tempoMorto, "3":tau})
  153.         plt.ylabel("%")
  154.         plt.axhline(infl, color='blue', ls = ':', lw = 3, label = "63,2% (PV)")
  155.         plt.axvline(PVmudanca, color='green', ls = ':', lw = 3, label = "Tempo morto")
  156.         plt.axvline(tauPV, color='magenta', ls = ':', lw = 3, label = "Tau")
  157.         plt.plot(coluna2[:,0]/1000, color='red', label = "PV")
  158.         plt.plot(coluna2[:,1]/1000, color='black', label = "MV")
  159.         plt.legend(["63,2%(PV)","Tempo Morto", "Tau", "PV", "MV"],loc='upper center', bbox_to_anchor=(0.485, +1.13), fancybox=False, ncol=5)
  160.         plt.axvline(MVmudanca, color='green', ls = ':', lw = 3)
  161.         plt.xticks([np.around(MVmudanca), np.around(PVmudanca), np.around(tauPV)])
  162.         plt.yticks([PVmax, PVmin, MVmax, MVmin,np.around(infl)])
  163.         io = StringIO()
  164.         fig.savefig(io, format='png')
  165.         data = io.getvalue().encode('base64')
  166.  
  167.         return html.format(data)
  168.     except:
  169.         return "Erro, verifique o arquivo selecionado"
  170.  
  171.  
  172. @app.route("/ZPID")
  173. def ZieglerPID():
  174.     try:
  175.         global Kp, Ti, Td
  176.         Kp = (1.2 * tau)/(tempoMorto*k)
  177.         Ti = 2 * tempoMorto
  178.         Td = 0.5 * tempoMorto
  179.         return  "Kp = %(1)s\nTi = %(2)s\nTd = %(3)s - Ziegler Nichols (P.I.D)" % {"1":Kp, "2":Ti, "3":Td}
  180.     except:
  181.         return "Erro, verifique o arquivo selecionado"
  182.  
  183. @app.route("/ZPI")
  184. def ZieglerPI():
  185.     try:
  186.         global Kp, Ti
  187.         Kp = (0.9 * tau)/(tempoMorto*k)
  188.         Ti = 3.33 * tempoMorto
  189.         return "Kp = %(1)s\nTi = %(2)s - Ziegler Nichols (P.I)" % {"1":Kp, "2":Ti}
  190.     except:
  191.         return "Erro, verifique o arquivo selecionado"
  192.  
  193. @app.route("/ZP")
  194. def ZieglerP():
  195.     try:
  196.         global Kp
  197.         Kp = tau/(k*tempoMorto)
  198.         return "Kp = %(1)s - Ziegler Nichols (P)" % {"1":Kp}
  199.     except:
  200.         return "Erro, verifique o arquivo selecionado"
  201.  
  202. @app.route("/CPID")
  203. def CohenPID():
  204.     try:
  205.         global Kp, Ti, Td
  206.         Kp = (1.35/k)*((tau/tempoMorto)+0.185)
  207.         Ti = (2.5 * tempoMorto)*((tau+(0.185*tempoMorto))/(tau+(0.611*tempoMorto)))
  208.         Td = (0.37 * tempoMorto)/(tau/(tau+(0.185*tempoMorto)))
  209.         return "Kp = %(1)s\nTi = %(2)s\nTd = %(3)s - Cohen Coon (P.I.D)" % {"1":Kp, "2":Ti, "3":Td}
  210.     except:
  211.         return "Erro, verifique o arquivo selecionado"
  212.  
  213. @app.route("/CPI")
  214. def CohenPI():
  215.     try:
  216.         global Kp, Ti
  217.         Kp = (0.9/k)*((tau/tempoMorto)+0.092)
  218.         Ti = (3.33 * tempoMorto)*((tau+(0.092*tempoMorto))/(tau+(2.22*tempoMorto)))
  219.         return "Kp = %(1)s\nTi = %(2)s - Cohen Coon (P.I)" % {"1":Kp, "2":Ti}
  220.     except:
  221.         return "Erro, verifique o arquivo selecionado"
  222.  
  223. @app.route("/CPD")
  224. def CohenPD():
  225.     try:
  226.         global Kp, Td
  227.         Kp = (1.24/k)*((tau/tempoMorto)+0.129)
  228.         Td = (0.27 * tempoMorto)/(tau-(0.34*tempoMorto/(tau+(0.185*tempoMorto))))
  229.         return "Kp = %(1)s\nTd = %(2)s - Cohen Coon (P.D)" % {"1":Kp, "2":Td}
  230.     except:
  231.         return "Erro, verifique o arquivo selecionado"
  232.  
  233. @app.route("/CP")
  234. def CohenP():
  235.     try:
  236.         global Kp
  237.         Kp = (1.03/k)*((tau/tempoMorto)+0.34)
  238.         return "Kp = %(1)s - Cohen Coon (P)" % {"1":Kp}
  239.     except:
  240.         return "Erro, verifique o arquivo selecionado"
  241.  
  242. @app.route("/APID")
  243. def AmigoPID():
  244.     try:
  245.         global Kp, Ti, Td
  246.         Kp = (1/k)*(0.2+(0.45*(tau/tempoMorto)))
  247.         Ti = (((0.4 * tempoMorto)+0.8*tau)/(tempoMorto+(0.1*tau)))*tempoMorto
  248.         Td = (0.5 * tempoMorto*tau)/(0.3*tempoMorto+tau)
  249.         return "Kp = %(1)s\nTi = %(2)s\nTd = %(3)s - AMIGO (P.I.D)" % {"1":Kp, "2":Ti, "3":Td}
  250.     except:
  251.         return "Erro, verifique o arquivo selecionado"
  252.  
  253. if __name__ == "__main__":
  254.     app.debug = True
  255.     app.run(host= 'renato.pythonanywhere.com')
Advertisement
RAW Paste Data Copied
Advertisement