الرئيسية قاعدة المعرفة البرمجة والمنطق تقنيات الويب في الصناعة: لوحات المراقبة الحديثة
البرمجة والمنطق

تقنيات الويب في الصناعة: لوحات المراقبة الحديثة

لماذا تقنيات الويب في المصنع؟

قبل سنوات، كانت لوحات التحكم الصناعية تعمل بتطبيقات مكتبية ثقيلة — تحتاج تثبيتاً على كل جهاز، ولا تعمل إلا على Windows، وتحديثها كابوس. اليوم، لوحات المراقبة المبنية على الويب غيّرت كل شيء: تفتحها من أي متصفح، على أي جهاز، من أي مكان.

تخيّل أن مدير المصنع يفتح هاتفه ويرى حالة كل الماكينات لحظياً — درجات الحرارة، الإنذارات، كفاءة الإنتاج. هذا بالضبط ما تبنيه بتقنيات الويب.

HTML: هيكل الصفحة

HTML (HyperText Markup Language) هو الهيكل العظمي لأي صفحة ويب. يُحدد ماذا يوجد في الصفحة: عناوين، جداول، أزرار، حاويات بيانات.

<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>لوحة مراقبة المصنع</title>
  <link rel="stylesheet" href="dashboard.css">
</head>
<body>
  <header>
    <h1>لوحة مراقبة خط الإنتاج 3</h1>
    <span id="clock">--:--:--</span>
  </header>

  <main>
    <!-- بطاقات حالة الماكينات -->
    <section class="machine-cards">
      <div class="card" id="machine-42">
        <h2>CNC Lathe #42</h2>
        <div class="status running">يعمل</div>
        <div class="readings">
          <div class="reading">
            <span class="label">الحرارة</span>
            <span class="value" id="temp-42">--</span>
            <span class="unit">°C</span>
          </div>
          <div class="reading">
            <span class="label">الاهتزاز</span>
            <span class="value" id="vib-42">--</span>
            <span class="unit">mm/s</span>
          </div>
          <div class="reading">
            <span class="label">الطاقة</span>
            <span class="value" id="power-42">--</span>
            <span class="unit">kW</span>
          </div>
        </div>
      </div>
    </section>

    <!-- جدول الإنذارات -->
    <section class="alarms">
      <h2>الإنذارات النشطة</h2>
      <table>
        <thead>
          <tr>
            <th>الوقت</th>
            <th>الماكينة</th>
            <th>النوع</th>
            <th>الرسالة</th>
          </tr>
        </thead>
        <tbody id="alarm-table">
          <!-- تُملأ تلقائياً بـ JavaScript -->
        </tbody>
      </table>
    </section>
  </main>

  <script src="dashboard.js"></script>
</body>
</html>

عناصر HTML المهمة للوحات التحكم

العنصر الاستخدام
<div> حاوية عامة لتجميع العناصر
<span> نص داخل سطر (قيمة حساس)
<table> عرض بيانات مجدولة (إنذارات، سجلات)
<canvas> رسم بياني مخصص (Charts)
<progress> شريط تقدم (نسبة إنتاج)
<meter> مقياس (مستوى خزان)

CSS: المظهر والتنسيق

CSS (Cascading Style Sheets) يتحكم بشكل الصفحة: الألوان، الأحجام، التخطيط، الحركات.

/* dashboard.css */

/* متغيرات الألوان - سهلة التعديل */
:root {
  --bg-primary: #0f172a;
  --bg-card: #1e293b;
  --text-primary: #f1f5f9;
  --text-secondary: #94a3b8;
  --status-running: #22c55e;
  --status-stopped: #ef4444;
  --status-warning: #f59e0b;
  --accent: #3b82f6;
}

body {
  margin: 0;
  font-family: 'Segoe UI', Tahoma, sans-serif;
  background: var(--bg-primary);
  color: var(--text-primary);
  direction: rtl;
}

/* شبكة بطاقات الماكينات */
.machine-cards {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: 1rem;
  padding: 1rem;
}

.card {
  background: var(--bg-card);
  border-radius: 12px;
  padding: 1.5rem;
  border: 1px solid rgba(255, 255, 255, 0.1);
  transition: transform 0.2s, box-shadow 0.2s;
}

.card:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
}

/* حالة الماكينة */
.status {
  display: inline-block;
  padding: 0.25rem 0.75rem;
  border-radius: 20px;
  font-size: 0.85rem;
  font-weight: 600;
}

.status.running { background: var(--status-running); color: #000; }
.status.stopped { background: var(--status-stopped); color: #fff; }
.status.warning { background: var(--status-warning); color: #000; }

/* قراءات الحساسات */
.readings {
  display: flex;
  justify-content: space-between;
  margin-top: 1rem;
}

.reading .value {
  font-size: 2rem;
  font-weight: 700;
  color: var(--accent);
}

.reading .unit {
  font-size: 0.8rem;
  color: var(--text-secondary);
}

/* تنبيه قيمة عالية */
.reading .value.high {
  color: var(--status-stopped);
  animation: pulse 1s infinite;
}

@keyframes pulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.5; }
}

التصميم المتجاوب: كل الشاشات

المهندس يراقب من شاشة كبيرة في غرفة التحكم، والمدير من هاتفه. التصميم المتجاوب (Responsive Design) يضمن أن لوحة التحكم تعمل على كل الأحجام.

/* شاشات صغيرة (هواتف) */
@media (max-width: 768px) {
  .machine-cards {
    grid-template-columns: 1fr;
  }

  .readings {
    flex-direction: column;
    gap: 0.5rem;
  }

  .reading .value {
    font-size: 1.5rem;
  }
}

/* شاشات متوسطة (تابلت) */
@media (min-width: 769px) and (max-width: 1024px) {
  .machine-cards {
    grid-template-columns: repeat(2, 1fr);
  }
}

/* شاشات كبيرة (شاشة غرفة التحكم) */
@media (min-width: 1025px) {
  .machine-cards {
    grid-template-columns: repeat(4, 1fr);
  }
}

JavaScript: الحياة والتفاعل

JavaScript يُحوّل الصفحة الثابتة إلى لوحة تحكم حية — يجلب البيانات، يُحدّث الأرقام، يُطلق الإنذارات.

تحديث البيانات عبر REST API

// جلب بيانات الماكينات كل 5 ثوانٍ
async function fetchMachineData() {
  try {
    const response = await fetch('/api/machines', {
      headers: { 'X-API-Key': 'sk_prod_abc123' }
    });
    const machines = await response.json();

    machines.forEach(machine => {
      updateCard(machine);
    });
  } catch (error) {
    console.error('فشل جلب البيانات:', error);
    showConnectionError();
  }
}

function updateCard(machine) {
  const tempEl = document.getElementById(`temp-${machine.id}`);
  const vibEl = document.getElementById(`vib-${machine.id}`);
  const powerEl = document.getElementById(`power-${machine.id}`);

  tempEl.textContent = machine.temperature_c.toFixed(1);
  vibEl.textContent = machine.vibration_mm_s.toFixed(1);
  powerEl.textContent = machine.power_kw.toFixed(1);

  // تمييز القيم العالية
  tempEl.classList.toggle('high', machine.temperature_c > 80);
  vibEl.classList.toggle('high', machine.vibration_mm_s > 8);
}

// تحديث كل 5 ثوانٍ
setInterval(fetchMachineData, 5000);
fetchMachineData(); // تحديث فوري عند التحميل

بيانات لحظية عبر WebSocket

// اتصال WebSocket لبيانات حية
const ws = new WebSocket('ws://factory-server:8080/live');

ws.onopen = () => {
  document.getElementById('connection-status').textContent = 'متصل';
  document.getElementById('connection-status').classList.add('connected');
};

ws.onmessage = (event) => {
  const data = JSON.parse(event.data);

  switch (data.type) {
    case 'sensor_update':
      updateCard(data.payload);
      break;

    case 'alarm':
      addAlarmRow(data.payload);
      playAlarmSound();
      showNotification(data.payload.message);
      break;

    case 'machine_status':
      updateMachineStatus(data.payload.id, data.payload.status);
      break;
  }
};

ws.onclose = () => {
  document.getElementById('connection-status').textContent = 'غير متصل';
  // إعادة الاتصال بعد 3 ثوانٍ
  setTimeout(() => {
    location.reload();
  }, 3000);
};

function addAlarmRow(alarm) {
  const table = document.getElementById('alarm-table');
  const row = table.insertRow(0);
  row.innerHTML = `
    <td>${new Date(alarm.timestamp).toLocaleTimeString('ar-SA')}</td>
    <td>${alarm.machine_name}</td>
    <td class="severity-${alarm.severity}">${alarm.severity}</td>
    <td>${alarm.message}</td>
  `;
}

Canvas: رسوم بيانية حية

HTML <canvas> يسمح لك برسم رسوم بيانية مخصصة بدون مكتبات خارجية:

// رسم بياني بسيط لتاريخ الحرارة
const canvas = document.getElementById('temp-chart');
const ctx = canvas.getContext('2d');
const readings = []; // مصفوفة القراءات
const MAX_POINTS = 60; // آخر 60 قراءة

function addReading(temp) {
  readings.push(temp);
  if (readings.length > MAX_POINTS) readings.shift();
  drawChart();
}

function drawChart() {
  const w = canvas.width;
  const h = canvas.height;
  ctx.clearRect(0, 0, w, h);

  // خط الحد الأقصى
  const maxLine = h - (85 / 100) * h;
  ctx.strokeStyle = '#ef4444';
  ctx.setLineDash([5, 5]);
  ctx.beginPath();
  ctx.moveTo(0, maxLine);
  ctx.lineTo(w, maxLine);
  ctx.stroke();
  ctx.setLineDash([]);

  // رسم القراءات
  ctx.strokeStyle = '#3b82f6';
  ctx.lineWidth = 2;
  ctx.beginPath();
  readings.forEach((temp, i) => {
    const x = (i / MAX_POINTS) * w;
    const y = h - (temp / 100) * h;
    if (i === 0) ctx.moveTo(x, y);
    else ctx.lineTo(x, y);
  });
  ctx.stroke();
}

أطر العمل الشائعة للوحات التحكم

لمشاريع أكبر، استخدم أطر عمل جاهزة بدلاً من البناء من الصفر:

الأداة الاستخدام المميزات
Chart.js رسوم بيانية سهل، تفاعلي، متجاوب
D3.js تصورات متقدمة مرن جداً، منحنى تعلم عالٍ
Grafana لوحات مراقبة جاهزة يربط بأي قاعدة بيانات
HTMX تفاعلية بدون JS معقد خفيف، يعمل مع أي خادم
Tailwind CSS تنسيق سريع أصناف جاهزة، متجاوب

خلاصة

التقنية الدور في لوحة المراقبة
HTML هيكل الصفحة — بطاقات، جداول، عناصر
CSS المظهر — ألوان، تخطيط، حركات
JavaScript المنطق — جلب بيانات، تحديث، إنذارات
WebSocket اتصال حي — بيانات لحظية بدون تأخير
Canvas رسوم بيانية — تاريخ القراءات، منحنيات
Responsive توافق — يعمل على شاشة التحكم والهاتف

تقنيات الويب حوّلت المراقبة الصناعية من تطبيقات مغلقة ومكلفة إلى لوحات تحكم مرنة يمكن لأي مهندس بناؤها. المتصفح أصبح هو لوحة التحكم الجديدة للمصنع الذكي.

web HTML CSS JavaScript WebSocket dashboard تقنيات الويب لوحات المراقبة الواجهات التفاعلية البيانات الحية المتصفح التصميم المتجاوب