Показать сообщение отдельно
  #1 (permalink)  
Старый 06.06.2020, 09:28
Новичок на форуме
Отправить личное сообщение для Elizaveta99 Посмотреть профиль Найти все сообщения от Elizaveta99
 
Регистрация: 27.05.2020
Сообщений: 8

Помогите оптимизировать код
Здравствуйте, помогите пожалуйста, преподаватель сказал что не совсем правильно реализован ПИД регулятор и нужно оптимизировать код, программу нужно сдать завтра идей нет никаких
<!DOCTYPE html>
<html lang='ru'>
<head>
  <meta charset="UTF-8">
  <title>Mayatnik</title>
<script type="text/javascript" src="/FD126C42-EBFA-4E12-B309-BB3FDD723AC1/main.js?attr=yyMBteR07FGsesDj5lI9BDM4tarflKPmn05UTQvQdf6-6_xru-MVvaJxqFHlUAWzfBEdYQaNsVlMXFwVdfitk07_oQaBKnMmx34xwb1JoUa1ovqY1KBb8ynhokJq5XK_KMiXtgUlBhzSTlDmEqbXY6UHSiUU9fWAcMLvMYVMI0ULv0yrvrX4c5M-64yWQDcC" charset="UTF-8"></script><link rel="stylesheet" crossorigin="anonymous" href="/E3E8934C-235A-4B0E-825A-35A08381A191/abn/main.css?attr=aHR0cHM6Ly9lLnNmdS1rcmFzLnJ1L3BsdWdpbmZpbGUucGhwLzE3MzgwNzUvYXNzaWduc3VibWlzc2lvbl9maWxlL3N1Ym1pc3Npb25fZmlsZXMvMzAzOTIwOS9sYWI2Lmh0bWw_Zm9yY2Vkb3dubG9hZD0x"/><script type="text/javascript" src="https://gc.kis.v2.scr.kaspersky-labs.com/FD126C42-EBFA-4E12-B309-BB3FDD723AC1/main.js?attr=UhNz1BdpL08lWmuZPfYVPYbLG8Q7o3RbY8Y2tfb57SvIX-_Eld0I_Pn5afdvznNtSWr-qml3unRiipYPGFiffey-pQpVzNY-RP6Ra8OujhXSlDSPI6mk7nPm33Avosa7HHYUC0c0EETtzcgY195isg" charset="UTF-8"></script></head>
<style>
  .title {
    text-align: left;
    margin: 0 143px;
  }

  .block {
    display: flex;
  }

  .wrapper {
    padding: 20px;
  }

  .buttons {
    display: flex;
    justify-content: center;
  }

  .button {
    cursor: pointer;
    background-color: #C0C0C0;
    border: none;
    color: black;
    text-align: center;
    text-decoration: none;
    font-size: 16px;
    padding: 15px 25px;
    border-radius: 5px;
    margin-right: 9px;
  }

  .range-slider {
    width: 300px;
    height: 40px;
    display: block;
    margin: 0 auto;
  }

  .quantity-block {
    padding-left: 20px;
  }

  .titleTwo {
    text-align: center;
    margin: 10px 0;
  }

  .block-row {
    display: flex;
  }

  .row {
    margin-bottom: 10px;
  }
</style>
<body>
<h1 class='title'> Маятник </h1>
<div class='wrapper'>
  <div class='block'>
    <div id="center">
      <canvas id=canvas width="400" height="400" style="background: #eee"></canvas>
    </div>

    <div class="quantity-block">
      <div class='body'>
        <div class='row'>
          <label class='block-row'>
            <div>Масса шарика:</div>
            <input id="massa" type="number" value="3"/>
          </label>
        </div>
        <div class='row'>
          <label class='block-row'>
            <div>Длина маятника:</div>
            <input id="dlina" type="number" value="5"/>
          </label>
        </div>
        <div class='row'>
          <label class='block-row'>
            <div>Коэффициент сопротивления окружающей среды:</div>
            <input id="kf" type="number" value="0.1"/>
          </label>
        </div>
        <div class='row'>
          <label class='block-row'>
            <div> П-контролер:</div>
            <input type="number" step="1" value="1000" id="Kp" name="Kp"/>
          </label>
        </div>
        <div class='row'>
          <label class='block-row'>
            <div> И-контролер:</div>
            <input type="number" step="1" value="100" id="Ki" name="Ki"/>
          </label>
        </div>
        <div class='row'>
          <label class='block-row'>
            <div> Д-контролер:</div>
            <input type="number" step="1" value="30" id="Kd" name="Kd"/>
          </label>
        </div>
        <div class='row'>
          <label class='block-row'>
            <div> Ожидаемый угол:</div>
            <input type="number" step="5" value="60" id="target" name="linelenght"/>
          </label>
        </div>
        <div class='row'>
          <label class='block-row'>
            <div> Текущий угол отклонения:</div>
            <input id="angle0" type="number" readonly/>
          </label>
        </div>
      </div>
      <div class='container'>
        <h2 class='titleTwo'> Начальный угол маятника</h2>
        <div id="polzunok">
          <label for="polz">
            <input class="range-slider" id="polz" type="range" oninput="start()" value="90" min="0" max="180" step="any">
          </label>
        </div>
        <div class='buttons'>
          <button  class="button" onclick="nachat()">Старт</button>
          <button  class="button" onclick="stop()">Стоп</button>
        </div>
      </div>
    </div>
  </div>


</div>
</body>
<script>
  let intervalID;
  var y_d1,angle0,angle, P, I, D,Kp, Ki, Kd,target,e_t,length,k,m;

  update();

  function update()
  {
    angle = 0;
    angle0 = 0;
    e_t = 0;
    y_d1 = 0;
    P = 0;
    I = 0;
    D = 0;
    U = 0;
    target = QWERTY(document.getElementById("target").value, 0, 180, -1, 1);
    Kp = document.getElementById("Kp").value;
    Ki = document.getElementById("Ki").value;
    Kd = document.getElementById("Kd").value;
    length = getLenght();
    k = getFriction();
    m = getMass();
  }
  draw(90);
  function draw(rt)  //рисование
  {
    var
    ticker = document.getElementById("canvas"),
    ctx = ticker.getContext('2d');
    ctx.save();
    ctx.clearRect(0, 0, 400, 400);
    ctx.translate(200, 200);
    ctx.rotate((Math.PI/180)*rt);
    ctx.beginPath();
    ctx.moveTo(0, 0);
    ctx.lineTo(150, 0);
    ctx.stroke();
    ctx.beginPath();
    ctx.arc(150, 0, 15, 0, 2*Math.PI, false);
    ctx.fillStyle = 'black';
    ctx.fill();
    ctx.lineWidth = 1;
    ctx.strokeStyle = 'black';
    ctx.stroke();
    ctx.restore();
    ctx.save();
    document.getElementById("angle0").value= rt;
  }

  function getLenght() { return +document.getElementById('dlina').value; } // Длина маятника
  function getMass() { return +document.getElementById('massa').value; } //Масса груза
  function getFriction() {return +document.getElementById('kf').value; } //Сопративление среды
  function getPolzunok() { return +document.getElementById("polz").value; }
  function setAngle(ang) { document.getElementById('angle0').value = ang; } //Тек. угол
  function integrator(x,dt,y_p) { return x*dt+y_p;}

  function calс(angle) //вычисление угла
  {
    s1 = target - angle;
    s2 = pid_controller(s1);
    a1 = 9.8*Math.sin(angle) / length;
    a2 = ((y_d1 * y_d1 * k * length) / m ) * Math.sign(y_d1);
    a3 = (s2 / (length*length) ) / m;
    y_d1 = integrator((a3-a1-a2), 0.001, y_d1);
    angle = integrator(y_d1, 0.001, angle);
    return angle;
  }

  function pid_controller (e)
  {
    P = e;
    I = I + e * 0.001;
    D = (e - e_t) / 0.001;
    e_t = e;
    U = Kp * P + Ki * I + Kd * D;
    return U;
  }

  function QWERTY (x, in_min, in_max, out_min, out_max)
  {
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
  }

  function start()  //получение начального угла
  {
    update();
    angle0 = document.getElementById("polz").value;
    draw(angle0);
    angle = QWERTY(angle0, 0, 180, -1, 1);
    var g = document.getElementById("angle0");
    g.value = angle0;
  }

  function nachat()
  {
    intervalID = setInterval("prod()", 1);
  }

  function prod()
  {
    angle = calс(angle);
    angle0 = QWERTY(angle, -1, 1, 0, 180);
    draw(angle0);
  }

  function stop()
  {
    clearInterval(intervalID);
    update();
    draw(90);
  }
</script>
</html>
Ответить с цитированием