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:
- 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.
- PID İşlemi:
- PID denetleyici, veritabanından
setpoint
vemeasured_value
değerlerini alır. - Çıkış (
output
) hesaplanır ve veritabanına geri yazılır.
- 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.
- 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.