في نافذة الطباعة اختر حفظ كـ PDF · حجم الورق A4 · هامش افتراضي
SunNile
شمس النيل · معهد فنيي الطاقة الشمسية
المستوى الثالث — متقدم · الوحدة ٣ من ٨
بروتوكولات SunSpec Modbus — التحدث مع الإنفرتر
SunSpec Modbus Protocols — Speaking to the Inverter
5 دروسمجاني بالكاملمعايير شمس النيليشترط إتمام المستوى الثاني
🎯 ماذا ستتعلم في هذه الوحدة؟
فهم بروتوكول Modbus وسبب هيمنته على صناعة الطاقة الشمسية منذ عقود
معرفة الفرق بين Modbus RTU وModbus TCP واستخدامات كل منهما
فهم كيف وحّد SunSpec عناوين الـRegisters عبر مختلف الشركات المصنّعة
قراءة بيانات إنفرتر حقيقي عبر Modbus TCP باستخدام Python
إرسال أوامر تحكم للإنفرتر عبر SunSpec Model 123
بناء نظام مراقبة بسيط يجمع البيانات ويحفظها تلقائياً
الدرس الأول
ما هو Modbus ولماذا هو لغة الطاقة الشمسية
في عام 1979، طوّرت شركة Modicon بروتوكول اتصالات بسيطاً للتحكم في أجهزتها الصناعية. لم يكن أحد يتوقع أن هذا البروتوكول سيستمر لأكثر من 40 سنة ليصبح اللغة المشتركة لملايين الأجهزة الصناعية حول العالم — بما فيها الإنفرترات الشمسية.
لماذا صمد Modbus كل هذه السنوات؟
البساطة: المفهوم الأساسي بسيط جداً — هناك Master يسأل وSlave يُجيب. لا تعقيد في المصافحة أو الجلسات
الموثوقية: بروتوكول خفيف الوزن يعمل على أي شبكة بدون أعباء إضافية
الانتشار الواسع: تقريباً كل إنفرتر شمسي في السوق يدعم 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
🔑 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 1
Common
معلومات الجهاز — اسم الشركة، الموديل، الرقم التسلسلي، نسخة Firmware
Model 101/103
Inverter
البيانات التشغيلية — جهد DC، تيار DC، AC Power، تردد، درجة حرارة، الحالة
Model 120
Nameplate
القدرة الاسمية للإنفرتر (Watt) وحدود التشغيل
Model 123
Immediate Control
أوامر التحكم الفوري — تحديد الإنتاج، Power Factor، Reactive Power
Model 160
Multiple 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 — عملياً
ما تحتاجه للبدء:
حاسوب أو جهاز Raspberry Pi على نفس الشبكة المحلية للإنفرتر
IP الإنفرتر — يمكن الحصول عليه من واجهة الإنفرتر أو من جهاز التوجيه
Port 502 مفتوح — المنفذ القياسي لـModbus TCP
Python 3 مع مكتبة pymodbus: pip install pymodbus
العناوين الأساسية في SunSpec Model 101:
العنوان (Register)
القيمة
الوحدة
40069
AC Power الإجمالي
Watt × SF
40072
AC Frequency (تردد)
Hz × SF
40073
AC Energy الكلية (طاقة منتجة)
Wh × SF
40078
DC Voltage (جهد الألواح)
Volt × SF
40080
DC 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 بالتفصيل في الدرس الخامس.
ModScan: واجهة رسومية لـWindows — مفيدة للاستكشاف الأولي وفهم البيانات
Modscan32 / QModMaster: أدوات مفتوحة المصدر بواجهات رسومية متقدمة
💡 تحقق من 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 = اتصل
دورة التحكم الصحيحة — أربع خطوات:
اقرأ الحالة الحالية: قبل أي أمر، اقرأ القيم الحالية وتأكد من حالة الإنفرتر (Model 101)
احسب القيمة المطلوبة: بناءً على متطلبات الشبكة أو السياسة المطلوبة
اكتب الأمر: اكتب القيمة في Register المناسب في Model 123
تحقق من التنفيذ: اقرأ مرة أخرى بعد ثوانٍ للتأكد أن الإنفرتر نفّذ الأمر
مثال عملي — 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 مجاور.
القيمة الحقيقية = القيمة الخام × 10^SF
مثال: AC Power خام = 45000، SF = -1 → القيمة الحقيقية = 45000 × 10^(-1) = 4500.0 Watt
مثال: Frequency خام = 4998، SF = -2 → القيمة الحقيقية = 4998 × 10^(-2) = 49.98 Hz
Scale Factor يكون عادةً -1، -2، أو -3 — وأحياناً 0 (لا تغيير)
سكريبت المراقبة — الكامل:
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 Nonetry:
# قراءة 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)
التوسع التدريجي للمشروع:
عرض البيانات بيانياً: استخدم مكتبة matplotlib لرسم منحنى الإنتاج اليومي من ملف CSV
قاعدة بيانات: بدلاً من CSV، استخدم SQLite لتخزين أكثر كفاءة وإمكانية الاستعلام
تنبيهات فورية: إضافة إشعارات عبر WhatsApp API إذا انخفض الإنتاج فجأة أو انقطع الإنفرتر
لوحة تحكم ويب: مكتبة Streamlit أو Flask تحوّل السكريبت لتطبيق ويب بسيط
متعدد الإنفرترات: حلقة تكرار على قائمة IPs لمراقبة موقع بإنفرترات متعددة
💡 هذا هو ما تفعله منصات مثل 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 يُعيد الإنفرتر للقيم الافتراضية عند انقطاع الأوامر — يمنع الإنفرتر من البقاء في وضع خاطئ إلى الأبد