İçeriği Atla

Php de veritabanındaki bilgiler için bir pid sınıfı ve fonksiyonlar nasıl oluşturulur?

Php de veritabanındaki bilgiler için bir pid sınıfı ve fonksiyonlar nasıl oluşturulur?

PID (Proportional-Integral-Derivative) denetleyici, bir kontrol sistemi içindeki hata sinyalini minimize etmek için kullanılan yaygın bir yöntemdir. PID denetleyici; oransal (P), integral (I) ve türev (D) bileşenlerini bir arada kullanarak sistemin kararlılığını ve doğruluğunu artırır.

Aşağıda, bir PID kontrol döngüsünü PHP'de bir sınıf olarak nasıl kodlayabileceğimizi gösteriyorum:

Kullanım Senaryosu: Sıcaklık Kontrol Sistemi

Sıcaklık hedef değeri (setpoint) veri tabanında saklanır ve PID, gerçek sıcaklık değerine göre gerekli ayarlamaları yapar.

Veri tabanı Yapısı:

CREATE TABLE control_data (
    id INT AUTO_INCREMENT PRIMARY KEY,
    setpoint FLOAT NOT NULL, -- Hedef sıcaklık
    measured_value FLOAT NOT NULL, -- Ölçülen sıcaklık
    output_value FLOAT NOT NULL, -- PID çıktısı
    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- Güncelleme zamanı
);

PHP Kod:

<?php


// Database bağlantı sınıfı
class Database {
    private $connection;


    public function __construct($host, $dbName, $username, $password) {
        try {
            $this->connection = new PDO("mysql:host=$host;dbname=$dbName", $username, $password);
            $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            die("Veritabanı bağlantı hatası: " . $e->getMessage());
        }
    }


    public function getConnection() {
        return $this->connection;
    }
}


// PID Denetleyici Sınıfı
class PIDController {
    private $kp;
    private $ki;
    private $kd;
    private $previousError;
    private $integral;


    public function __construct($kp, $ki, $kd) {
        $this->kp = $kp;
        $this->ki = $ki;
        $this->kd = $kd;
        $this->previousError = 0;
        $this->integral = 0;
    }


    public function compute($setpoint, $measuredValue, $deltaTime) {
        $error = $setpoint - $measuredValue;
        $proportional = $this->kp * $error;
        $this->integral += $error * $deltaTime;
        $integral = $this->ki * $this->integral;
        $derivative = $this->kd * (($error - $this->previousError) / $deltaTime);


        $this->previousError = $error;


        return $proportional + $integral + $derivative;
    }


    public function reset() {
        $this->previousError = 0;
        $this->integral = 0;
    }
}


// Veritabanından PID çalıştırma
$database = new Database('localhost', 'test_db', 'root', 'password');
$conn = $database->getConnection();


$pid = new PIDController(1.0, 0.5, 0.1); // Kp, Ki, Kd değerleri


// PID döngüsü
while (true) {
    // Veritabanından veriyi al
    $stmt = $conn->prepare("SELECT setpoint, measured_value FROM control_data WHERE id = 1");
    $stmt->execute();
    $row = $stmt->fetch(PDO::FETCH_ASSOC);


    $setpoint = $row['setpoint'];
    $measuredValue = $row['measured_value'];


    $deltaTime = 0.1; // Döngü süresi (saniye)
    $output = $pid->compute($setpoint, $measuredValue, $deltaTime);


    // PID çıkışını güncelle
    $updateStmt = $conn->prepare("UPDATE control_data SET output_value = :output, timestamp = NOW() WHERE id = 1");
    $updateStmt->bindParam(':output', $output, PDO::PARAM_STR);
    $updateStmt->execute();


    echo "Setpoint: $setpoint, Ölçülen: $measuredValue, Çıkış: $output\n";


    // Döngüyü yavaşlat
    usleep(100000); // 0.1 saniye bekle
}
?>


Açıklamalar:

  1. Veritabanı Entegrasyonu:
  • control_data tablosu, PID denetleyici tarafından kullanılan setpoint (hedef), measured_value (ölçülen değer) ve PID çıktısını saklar.
  1. PID İşlemi:
  • PID denetleyici, veritabanından setpoint ve measured_value değerlerini alır.
  • Çıkış (output) hesaplanır ve veritabanına geri yazılır.
  1. Sürekli Çalışma:
  • Kod bir döngü içerisinde sürekli çalışır ve veritabanı üzerinden kontrol sağlar.
  • usleep(100000) ile döngü her 0.1 saniyede bir güncellenir.
  1. Kullanım Alanları:
  • PID kontrolör, sistemdeki bir aktüatörün (ör. bir motor veya ısıtıcı) veritabanındaki output_value değerine göre çalışmasını sağlar.