← العودة إلى المعهد
في نافذة الطباعة اختر حفظ كـ PDF · حجم الورق A4 · هامش افتراضي
SunNile
شمس النيل · معهد فنيي الطاقة الشمسية
المستوى الثالث — متقدم · الوحدة ٣ من ٨
بروتوكولات SunSpec Modbus — التحدث مع الإنفرتر
SunSpec Modbus Protocols — Speaking to the Inverter
5 دروس مجاني بالكامل معايير شمس النيل يشترط إتمام المستوى الثاني
🎯 ماذا ستتعلم في هذه الوحدة؟
الدرس الأول
ما هو Modbus ولماذا هو لغة الطاقة الشمسية

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

لماذا صمد Modbus كل هذه السنوات؟

نسختان رئيسيتان تحتاج معرفتهما:

Modbus RTU
RS-485 Serial
عبر سلك RS-485
للتوصيل المباشر
مسافات طويلة (1.2 كم)
أجهزة متعددة على نفس الخط

شائع في العدادات القديمة
Modbus TCP
Ethernet / WiFi
عبر شبكة Ethernet أو WiFi
Port 502 القياسي
الأسرع والأسهل اليوم
يعمل مع أي شبكة IP

الأكثر شيوعاً الآن ✓
Register
وحدة البيانات
كل قيمة في عنوان محدد
كل Register = 16 bit
القراءة: Read Holding
الكتابة: Write Single/Multiple

المفهوم الأساسي

كيف يعمل Modbus TCP بشكل مبسط:

دورة طلب-استجابة في Modbus TCP
حاسوب / Droplet Master يسأل اقرأ Register 40069 القيمة = 4500 الإنفرتر Slave يُجيب Port 502 المنفذ القياسي لـModbus TCP
🔑 SunSpec Alliance — من أسّسها ولماذا

في أوائل 2000s، أدركت شركات الطاقة الشمسية الكبرى (Fronius، SMA، SunPower، وغيرها) أن كل شركة تستخدم عناوين Modbus مختلفة — مما يعني أن كل تطبيق مراقبة يحتاج كوداً خاصاً لكل إنفرتر. SunSpec Alliance أسّست معيار موحّد يجعل Register 40069 تعني نفس الشيء في أي إنفرتر معتمد — AC Power الإجمالي. هذا التوحيد غيّر الصناعة.

الدرس الثاني
SunSpec — التوحيد الذي غيّر الصناعة

قبل SunSpec، كان المطوّر الذي يريد بناء نظام مراقبة لمزيج من الإنفرترات يواجه كابوساً. Fronius يضع AC Power في عنوان مختلف عن SMA الذي يضعه في عنوان مختلف عن Sungrow. كل شركة لها Register Map خاصة بها وتوثيق مختلف.

بعد SunSpec: عنوان 40002 دائماً هو نقطة البداية — يحمل توقيع SunSpec الذي يؤكد أن الجهاز متوافق مع المعيار، ثم تأتي المودلات بترتيب قياسي.

🔑 التوقيع الذهبي — 53756e53

عند أول قراءة من الإنفرتر على عنوان 40002، إذا حصلت على القيمة 0x53756e53 — هذا يعني "SunS" بالـHex (S=53, u=75, n=6e, S=53). هذا التوقيع يؤكد أن الجهاز يدعم SunSpec ويمكنك الوثوق بعناوينه القياسية.

المودلات القياسية في SunSpec — ما تحتاج معرفته:

رقم المودلالاسممحتواه
Model 1Commonمعلومات الجهاز — اسم الشركة، الموديل، الرقم التسلسلي، نسخة Firmware
Model 101/103Inverterالبيانات التشغيلية — جهد DC، تيار DC، AC Power، تردد، درجة حرارة، الحالة
Model 120Nameplateالقدرة الاسمية للإنفرتر (Watt) وحدود التشغيل
Model 123Immediate Controlأوامر التحكم الفوري — تحديد الإنتاج، Power Factor، Reactive Power
Model 160Multiple MPPTبيانات كل سلسلة (String) بشكل منفصل — مفيد لتشخيص أداء كل String

بنية SunSpec في الذاكرة — كيف تقرأها بالترتيب:

خريطة الذاكرة — SunSpec Memory Map
عنوان 400010x5375 (جزء أول من "SunS")
عنوان 400020x6e53 (جزء ثاني — اكتمل التوقيع)
عنوان 40003Model ID = 1 (بداية Common Model)
عناوين 40004–40069بيانات Common Model (اسم الشركة، الموديل، السيريال...)
عنوان 40070Model ID = 101 أو 103 (بداية Inverter Model)
عناوين 40071+بيانات الإنفرتر التشغيلية
💡 Fronius — المرجع الذهبي لتطوير SunSpec

Fronius يُعدّ الأفضل في تنفيذ SunSpec من بين جميع الشركات المصنّعة. توثيقه دقيق، تنفيذه كامل، والـRegisters دائماً في مكانها الصحيح. عند تطوير أي أداة Modbus، ابدأ باختبارها على Fronius كمرجع — إذا عملت معه ستعمل مع باقي الإنفرترات بشكل أكثر موثوقية.

الدرس الثالث
قراءة بيانات الإنفرتر عبر Modbus TCP — عملياً

ما تحتاجه للبدء:

العناوين الأساسية في SunSpec Model 101:

العنوان (Register)القيمةالوحدة
40069AC Power الإجماليWatt × SF
40072AC Frequency (تردد)Hz × SF
40073AC Energy الكلية (طاقة منتجة)Wh × SF
40078DC Voltage (جهد الألواح)Volt × SF
40080DC Current (تيار الألواح)Ampere × SF
40094درجة حرارة الإنفرتر°C × SF
40107حالة الإنفرتر (Operating State)كود رقمي

مثال Python — قراءة AC Power من الإنفرتر:

from pymodbus.client import ModbusTcpClient # الاتصال بالإنفرتر client = ModbusTcpClient('192.168.1.100', port=502) client.connect() # قراءة 4 Registers ابتداءً من عنوان 40069 # slave=1 هو Unit ID القياسي لـSunSpec result = client.read_holding_registers(40069, 4, slave=1) if not result.isError(): print("AC Power (raw):", result.registers[0]) print("AC Frequency (raw):", result.registers[2]) else: print("خطأ في القراءة:", result) client.close()
📌 لماذا تظهر أرقام كبيرة غريبة؟

القيمة الخام من Register قد تكون مثلاً 4500 لكن AC Power الفعلي هو 450.0 Watt. هذا بسبب Scale Factor — الـRegisters تحفظ أعداداً صحيحة فقط، فيُضرب العدد في 10^SF للحصول على القيمة الحقيقية. سنشرح Scale Factors بالتفصيل في الدرس الخامس.

أدوات بديلة لمن لا يريد كتابة كود:

💡 تحقق من Port 502 قبل الكود

قبل كتابة أي كود، تحقق أن Port 502 مفتوح على الإنفرتر. من Linux/Mac: timeout 2 bash -c "echo > /dev/tcp/192.168.1.100/502" && echo OPEN — ملاحظة: بعض الإنفرترات تغلق الاتصال الفارغ فوراً (مثل Fronius Datamanager) لكن هذا طبيعي ولا يعني الإغلاق.

الدرس الرابع
التحكم في الإنفرتر عبر SunSpec

حتى الآن تعلمنا قراءة البيانات من الإنفرتر. في هذا الدرس نتعلم الكتابة — إرسال أوامر تحكم للإنفرتر عبر SunSpec Model 123.

SunSpec Model 123 — أوامر التحكم الفوري:

الحقلالوظيفةمثال
WMaxLimPctتحديد الإنتاج كنسبة مئوية من القدرة القصوى50 = الإنفرتر ينتج 50% فقط
OutPFSetضبط Power Factor-0.95 = تصحيح Power Factor
VArPctضبط Reactive Power كنسبة مئوية30 = 30% Reactive Power
Connالاتصال/الفصل0 = افصل، 1 = اتصل

دورة التحكم الصحيحة — أربع خطوات:

مثال عملي — DRED عبر Modbus (تحديد الإنتاج إلى 50%):

from pymodbus.client import ModbusTcpClient client = ModbusTcpClient('192.168.1.100', port=502) client.connect() # WMaxLimPct = 5000 (يمثل 50.00% — Scale Factor = -2) # WMaxLimPct_Ena = 1 (تفعيل الأمر) client.write_register(40232, 5000, slave=1) # 50% client.write_register(40236, 1, slave=1) # تفعيل print("تم إرسال أمر تحديد الإنتاج إلى 50%") client.close()

Watchdog Timer — الحماية الذكية في الإنفرتر:

معظم الإنفرترات الحديثة تُطبّق Watchdog Timer — مؤقت حراسة يراقب استمرار أوامر التحكم. إذا توقفت الأوامر لمدة معينة (عادةً 30-60 ثانية)، يعود الإنفرتر تلقائياً إلى قيمه الافتراضية (إنتاج كامل 100%). هذه ميزة أمان — تمنع بقاء الإنفرتر في وضع مقيّد إلى الأبد إذا انقطع نظام التحكم.

⚠ تحذير — أوامر التحكم ليست للتجربة العشوائية

أوامر التحكم الخاطئة (مثل فصل إنفرتر مفاجئ أو ضبط Power Factor خاطئ) قد تُضر بالشبكة، تُتلف المعدات، أو تُعرّض البطاريات للضرر. دائماً اختبر في بيئة محاكاة أو على إنفرتر معزول قبل التطبيق في موقع حقيقي. في السودان — أي تدخل على شبكة حية يجب أن يكون بموافقة الكهربائي المسؤول.

الدرس الخامس
بناء نظام مراقبة بسيط بـPython وSunSpec

الآن نجمع كل ما تعلمناه في مشروع عملي — سكريبت Python يقرأ بيانات الإنفرتر كل دقيقة، يُطبّق Scale Factors، ويحفظ البيانات في ملف CSV يمكنك فتحه بـExcel لاحقاً.

فهم Scale Factors — الخطوة الأهم:

SunSpec يحفظ الأرقام كأعداد صحيحة (16-bit integers) لتوفير الذاكرة. لكن القيم الفعلية قد تكون كسرية (مثل 49.98 Hz). الحل: كل مجموعة قيم لها Scale Factor (SF) مخزّن في Register مجاور.

سكريبت المراقبة — الكامل:

import csv, time from datetime import datetime from pymodbus.client import ModbusTcpClient INVERTER_IP = '192.168.1.100' OUTPUT_FILE = 'inverter_log.csv' INTERVAL = 60 # ثانية def read_inverter(): client = ModbusTcpClient(INVERTER_IP, port=502) if not client.connect(): return None try: # قراءة AC Power وSF (40069 + 40075 للـSF) r = client.read_holding_registers(40069, 10, slave=1) if r.isError(): return None regs = r.registers sf_power = regs[6] # Scale Factor للطاقة if sf_power > 32767: sf_power -= 65536 # تحويل لعدد موقّع ac_power = regs[0] * (10 ** sf_power) return { 'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'ac_power_w': round(ac_power, 2), } finally: client.close() # كتابة رأس الملف with open(OUTPUT_FILE, 'w', newline='') as f: csv.DictWriter(f, fieldnames=['timestamp','ac_power_w']).writeheader() while True: data = read_inverter() if data: with open(OUTPUT_FILE, 'a', newline='') as f: csv.DictWriter(f, fieldnames=data.keys()).writerow(data) print(data['timestamp'], '|', data['ac_power_w'], 'W') time.sleep(INTERVAL)

التوسع التدريجي للمشروع:

💡 هذا هو ما تفعله منصات مثل SwitchDin وSolarEdge Monitoring

المنصات التجارية الكبرى تبني فوق نفس المفهوم — Modbus TCP + SunSpec + قاعدة بيانات. الفرق هو الحجم (آلاف الإنفرترات)، الموثوقية (إعادة المحاولة، الأخطاء، الشبكات غير المستقرة)، والواجهات المتقدمة. لكن الأساس التقني هو ما تعلمته في هذه الوحدة بالضبط.

🧠 اختبار الوحدة — بروتوكولات SunSpec Modbus
١. ما المنفذ القياسي لـModbus TCP؟
أ
80
ب
443
ج
502
د
8080
٢. ما معنى القيمة 53756e53 في أول قراءة من الإنفرتر؟
أ
رقم تسلسلي للجهاز
ب
توقيع SunSpec — يؤكد أن الجهاز يدعم بروتوكول SunSpec
ج
إصدار Firmware
د
كود خطأ
٣. في SunSpec Model 101، ما الذي يقيسه Register 40069؟
أ
درجة حرارة الإنفرتر
ب
AC Power الإجمالي
ج
DC Voltage
د
Serial Number
٤. ما وظيفة Scale Factor في SunSpec؟
أ
تحديد عدد الـRegisters المقروءة
ب
ضرب القيمة الخام فيه للحصول على القيمة الحقيقية — لأن الـRegisters تحفظ أعداداً صحيحة فقط
ج
تحديد سرعة الاتصال
د
إعداد أمان الشبكة
٥. لماذا يُعاد الإنفرتر لوضعه الطبيعي تلقائياً عند توقف أوامر التحكم؟
أ
بسبب خلل في البرنامج
ب
Watchdog Timer يُعيد الإنفرتر للقيم الافتراضية عند انقطاع الأوامر — يمنع الإنفرتر من البقاء في وضع خاطئ إلى الأبد
ج
ارتفاع درجة الحرارة
د
انتهاء جلسة Modbus
السابقة← الشبكات الافتراضية VPP ☰ قائمة الوحدات التاليةمراقبة الأداء →