𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
495 subscribers
1 link
⚡️ آموزش تخصصی DIgSILENT PowerFactory
📚 از پایه تا پیشرفته | پروژه‌محور و کاربردی
💻 تحلیل شبکه | DPL | اتوماسیون
🎯 آموزش واقعی برای مهندسان برق قدرت

ارتباط با ما:
👥 @ElectricalDocumentAdmin
Download Telegram
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 ادامه سطح 1 - بخش 10 🔰 🔹 مقداردهی می‌تواند مرحله‌ای باشد فرض کنید می‌خواهیم مجموع سه مقدار را محاسبه کنیم. می‌توانیم این کار را مرحله‌به‌مرحله انجام دهیم: ! =================================== ! Telegram: @PowerFactoryDIgSILENT ! ===================================…
🔰 ادامه سطح 1 - بخش 10 🔰

🧠 یک مثال ترکیبی
در مثال زیر چند مفهوم قبلی را هم‌زمان می‌بینیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

! Define variables
int basePower, additionalPower, totalPower;

! Initial values
basePower = 500;
additionalPower = 150;

! Calculate total power
totalPower = basePower + additionalPower;

printf('Base Power = %d MW', basePower);
printf('Additional Power = %d MW', additionalPower);
printf('Total Power = %d MW', totalPower);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Base Power       = 500 MW
Additional Power = 150 MW
Total Power = 650 MW

ساختار برنامه:
Variable Definition

Assignment

Expression

Assignment

Output


⚠️ نکات مهم
1️⃣ Variable باید از قبل تعریف شده باشد
قبل از:
power = 100;

باید Variable مناسب تعریف شده باشد.

2️⃣ نوع داده باید مناسب باشد
اگر قرار است مقدار اعشاری ذخیره کنیم، نمی‌توانیم بدون توجه به نوع داده، آن را مانند یک عدد صحیح مدیریت کنیم.
انواع داده و تفاوت Integer و Real را در پست‌های بعدی به‌صورت دقیق بررسی خواهیم کرد.

3️⃣ مقدار قبلی ممکن است با مقدار جدید جایگزین شود
وقتی می‌نویسیم:
power = 100;
power = 200;

در نهایت مقدار فعلی power برابر 200 خواهد بود.

🎯 جمع‌بندی
در این پست یاد گرفتیم:
☜ ‏Assignment چیست؟
☜ چگونه یک Variable را مقداردهی کنیم.
☜ چگونه مقدار Variable را تغییر دهیم.
☜ چگونه از Variable دیگر برای مقداردهی استفاده کنیم.
☜ چگونه یک Expression را به Variable اختصاص دهیم.
☜ چرا ترتیب Assignmentها اهمیت دارد.
☜ مفهوم = در Assignment چیست؟
☜ ‏Assignment چگونه در پردازش اطلاعات PowerFactory کاربرد پیدا می‌کند.

⭐️ قانون طلایی
در Assignment، نتیجه سمت راست محاسبه می‌شود و مقدار حاصل در Variable سمت چپ قرار می‌گیرد.


#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق

@PowerFactoryDIgSILENT
🔰 سطح 1 - بخش 11 🔰

📌 انواع داده در DPL
تا اینجا با Variable، Assignment و Expression آشنا شدیم.
اما یک سؤال مهم وجود دارد:
🔹 وقتی می‌خواهیم یک Variable تعریف کنیم، از کجا بدانیم باید

int
استفاده کنیم یا

double
یا

string
یا یک نوع دیگر؟

پاسخ در مفهوم Data Type یا نوع داده است.

در DPL، انتخاب نوع داده اهمیت زیادی دارد؛ چون داده‌ای که با آن کار می‌کنیم ممکن است یک عدد صحیح، عدد اعشاری، متن، مقدار منطقی، یک Object از PowerFactory یا مجموعه‌ای از Objectها باشد.

1️⃣ ‏Integer — عدد صحیح
برای نگهداری مقادیر عددی بدون بخش اعشاری از نوع صحیح استفاده می‌کنیم.
مثلاً:
تعداد خطوط = 125
تعداد Busها = 48
تعداد ترانسفورماتورها = 12

یک مثال مرتبط با PowerFactory:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int lineCount;

lineCount = 125;

printf('Number of Lines = %d', lineCount);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Number of Lines = 125

کاربردهای رایج Integer
☜ تعداد تجهیزات
☜ شماره سناریو
☜ شمارنده حلقه‌ها
☜ تعداد Busها
☜ تعداد خطوط
☜ تعداد ترانسفورماتورها
☜ ‏Indexها

2️⃣ ‏Real — عدد اعشاری
در مطالعات سیستم قدرت، با مقادیر اعشاری بسیار زیاد سروکار داریم.
مثلاً:
Voltage = 0.987 pu
Loading = 87.35 %
Power = 125.6 MW
Current = 456.72 A

بنابراین برای چنین داده‌هایی باید از نوع عددی مناسب برای مقادیر اعشاری استفاده کنیم.
در DPL این مقادیر با نوع double تعریف می‌شوند.
مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double voltage;

voltage = 0.987;

printf('Bus Voltage = %.3f pu', voltage);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Bus Voltage = 0.987 pu

مثال واقعی‌تر
فرض کنید حد مجاز Loading را 100 درصد در نظر گرفته‌ایم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double loading;

loading = 103.75;

printf('Line Loading = %.2f %%', loading);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Line Loading = 103.75 %

این نوع داده در پروژه‌های Load Flow، Short Circuit و Voltage Analysis بسیار پرکاربرد خواهد بود.

⚠️‏ Integer یا Double؟
این تفاوت را جدی بگیرید.
اگر داده ما:
125

باشد، یک مقدار صحیح است.
اما اگر:
125.75

باشد، باید از نوعی استفاده کنیم که بتواند بخش اعشاری را نگهداری کند.
مثلاً در یک پروژه واقعی:
Number of Lines → Integer
Bus Voltage → Double
Line Loading → Double
Active Power → Double


3️⃣ ‏String — داده متنی
گاهی داده‌ای که با آن کار می‌کنیم عدد نیست؛ بلکه متن است.
در PowerFactory با نام تجهیزات بسیار زیاد سروکار داریم.
مثلاً:
Line_230kV_01
Bus_230_01
TR_230_63_01
Substation_A

برای نگهداری چنین اطلاعاتی از string استفاده می‌کنیم.
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

string lineName;

lineName = 'Line_230kV_01';

printf('Line Name = %s', lineName);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Line Name = Line_230kV_01

🔹‏ String در گزارش‌گیری
فرض کنید می‌خواهیم نام یک تجهیز را همراه با نتیجه تحلیل نمایش دهیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

string lineName;
double loading;

lineName = 'Line_230kV_01';
loading = 108.42;

printf('Line: %s | Loading: %.2f %%', lineName, loading);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Line: Line_230kV_01 | Loading: 108.42 %

این ترکیب String + Double در گزارش‌گیری‌های آینده بسیار مهم خواهد بود.

#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق

@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 سطح 1 - بخش 11 🔰 📌 انواع داده در DPL تا اینجا با Variable، Assignment و Expression آشنا شدیم. اما یک سؤال مهم وجود دارد: 🔹 وقتی می‌خواهیم یک Variable تعریف کنیم، از کجا بدانیم باید int استفاده کنیم یا double یا string یا یک نوع دیگر؟ پاسخ در مفهوم…
🔰 ادامه سطح 1 - بخش 11 🔰

4️⃣ ‏Boolean — مقدار منطقی

گاهی لازم نیست یک عدد یا متن ذخیره کنیم.
فقط می‌خواهیم بدانیم:
آیا یک شرط برقرار است یا خیر؟

برای این نوع داده از مقدار منطقی استفاده می‌کنیم.
مثلاً:
Overloaded = True

یا:
Overloaded = False

یک مثال مفهومی:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int loading;
bool overloaded;

loading = 105;
overloaded = loading > 100;

if (overloaded)
{
printf('Line is overloaded');
}

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

منطق برنامه:
Loading = 105

105 > 100

True

Overloaded = True

Line is overloaded

⚠️ توجه: در مثال‌های آموزشی این پست هدف نشان دادن نقش نوع داده منطقی است؛ جزئیات Syntax مربوط به Boolean و شرط‌ها را در بخش Operator و if دقیق‌تر بررسی خواهیم کرد.

5️⃣ ‏Object — نگهداری Reference به یک Object
اینجا وارد بخش بسیار مهم DPL می‌شویم.
در PowerFactory تجهیزات پروژه به‌صورت Object وجود دارند.
مثلاً:
ElmLne → Line
ElmTerm → Terminal / Bus
ElmTr2 → 2-Winding Transformer
ElmLod → Load
ElmSym → Synchronous Machine

در DPL می‌توانیم یک Variable داشته باشیم که به یک Object اشاره کند.
به‌صورت مفهومی:
line

Line Object

Line_230kV_01

این مفهوم بعداً برای کار با Objectهای واقعی PowerFactory بسیار مهم خواهد بود.
مثلاً وقتی می‌خواهیم:
«خط موردنظر را پیدا کن و Loading آن را بخوان»

باید بتوانیم Reference آن Object را در یک Variable نگهداری کنیم.

6️⃣ ‏Set — مجموعه‌ای از Objectها
حالا فرض کنید فقط یک خط نداریم.
شبکه ما شامل:
Line 1
Line 2
Line 3
...
Line 500

است.
نمی‌توانیم برای هر خط یک Variable مستقل تعریف کنیم.
اینجاست که Set اهمیت پیدا می‌کند.
Set را می‌توان به‌صورت ساده این‌گونه تصور کرد:
Set

├── Line 1
├── Line 2
├── Line 3
├── Line 4
└── ...

در آینده می‌توانیم مثلاً مجموعه‌ای از خطوط مرتبط را پیدا کنیم و سپس با یک Loop روی آن‌ها حرکت کنیم.
این موضوع یکی از مهم‌ترین کاربردهای Set در DPL است.
🔥 یک مثال واقعی‌تر از ترکیب انواع داده
فرض کنید می‌خواهیم اطلاعات یک خط را برای گزارش نگهداری کنیم:
‎نام خط → String‌‎
‎طول خط → Double
‎Loading → Double
‎تعداد خطوط‎ → Integer
‎وضعیت‎ → Boolean
‌‎خود خط → Object
‎مجموع خطوط → Set

یعنی:
Line Name → String
Length → Double
Loading → Double
Line Count → Integer
Overloaded → Boolean
Line → Object
Lines → Set

این دقیقاً همان چیزی است که در پروژه‌های واقعی DPL با آن روبه‌رو خواهیم شد.

#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق

@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 ادامه سطح 1 - بخش 11 🔰 4️⃣ ‏Boolean — مقدار منطقی گاهی لازم نیست یک عدد یا متن ذخیره کنیم. فقط می‌خواهیم بدانیم: آیا یک شرط برقرار است یا خیر؟ برای این نوع داده از مقدار منطقی استفاده می‌کنیم. مثلاً: Overloaded = True یا: Overloaded = False یک مثال مفهومی:…
🔰 ادامه سطح 1 - بخش 11 🔰

🧠 یک سناریوی PowerFactory را تصور کنیم
فرض کنید می‌خواهیم یک برنامه برای بررسی Loading خطوط بسازیم.
منطق برنامه:
                 Lines

Set

انتخاب یک Line

Object

Loading

Double

Loading > 100 ?
⬋ ⬊
True False
↓ ↓
Overloaded Normal

در این فرآیند تقریباً تمام انواع داده‌ای که امروز یاد گرفتیم درگیر می‌شوند.

🔹 مثال ترکیبی
مثلاً اطلاعات یک خط را به‌صورت مفهومی در Variableهای مختلف نگهداری می‌کنیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

string lineName;
double loading;
int lineNumber;
bool overloaded;

lineNumber = 1;
lineName = 'Line_230kV_01';
loading = 108.42;

overloaded = loading > 100;

printf('Line %d: %s', lineNumber, lineName);
printf('Loading = %.2f %%', loading);

if (overloaded)
{
printf('Status = OVERLOADED');
}

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

منطق برنامه:
lineNumber → 1
lineName → Line_230kV_01
loading → 108.42
overloaded → True

و خروجی تقریباً به این شکل خواهد بود:
Line 1: Line_230kV_01
Loading = 108.42 %
Status = OVERLOADED


⚠️ یک نکته بسیار مهم
در DPL، Object و Set را با یکدیگر اشتباه نگیرید.
مثلاً:
Object

‎یک تجهیز

ولی:
Set

‎مجموعه‌ای از تجهیزات

مثلاً:
‏line
↓‏
یک Line

‏lines‌‏
↓‏
مجموعه‌ای از Lineها

در بخش‌های بعدی این تفاوت را به‌صورت عملی و با Objectهای واقعی PowerFactory بررسی خواهیم کرد.

🎯 جمع‌بندی
در این پست با انواع داده مهم DPL آشنا شدیم:
int
برای مقادیر صحیح مثل تعداد تجهیزات
double
برای مقادیر اعشاری مثل ولتاژ، توان و Loading
string
برای متن و نام تجهیزات.
bool
برای وضعیت‌های منطقی مثل Overloaded / Normal
object
برای نگهداری Reference یک Object از PowerFactory
set
برای نگهداری مجموعه‌ای از Objectها.
و مهم‌تر از همه یاد گرفتیم که انتخاب Data Type باید بر اساس ماهیت واقعی داده انجام شود.

#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق

@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 ادامه سطح 1 - بخش 11 🔰 🧠 یک سناریوی PowerFactory را تصور کنیم فرض کنید می‌خواهیم یک برنامه برای بررسی Loading خطوط بسازیم. منطق برنامه: Lines ↓ Set ↓ انتخاب یک Line …
🎯 تمرین شماره 11

فرض کنید می‌خواهیم اطلاعات یک ترانسفورماتور را برای تحلیل نگهداری کنیم.
برای هر مورد مشخص کنید چه نوع داده‌ای مناسب است:
نام ترانسفورماتور
توان نامی، مثلاً 160 MVA
تعداد ترانسفورماتورها
وضعیت Overload
خود Object ترانسفورماتور
مجموعه تمام ترانسفورماتورها

💡 راهنمای تمرین
به این سؤال فکر کنید:
آیا داده عدد صحیح است، عدد اعشاری است، متن است، مقدار منطقی است، یک Object است یا مجموعه‌ای از Objectها؟

پاسخ صحیح این تمرین پایه بسیاری از Scriptهای آینده ما خواهد بود.

#تمرین_سطح_1
#تمرین
🔰 سطح 1 - بخش 12 🔰

📌 ‏Integer‏ در DPL
در پست قبل با انواع داده در DPL آشنا شدیم.

در این پست می‌خواهیم یکی از ساده‌ترین و در عین حال پرکاربردترین انواع داده را بررسی کنیم:
🔹Integer یا عدد صحیح

نوع int زمانی استفاده می‌شود که بخواهیم یک مقدار بدون بخش اعشاری را در Variable نگهداری کنیم.

1️⃣ ‏Integer چیست؟
Integer به اعداد صحیح گفته می‌شود؛ یعنی مقادیری مانند:
0
1
2
10
100
-5
-20

اما مقادیری مانند:
10.5
0.95
125.75

عدد صحیح نیستند.

در DPL برای تعریف یک Variable از نوع Integer از:
int

استفاده می‌کنیم.

2️⃣ تعریف یک Integer
ساختار کلی:
int VariableName;

مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int busCount;

busCount = 25;

printf('Number of Buses = %d', busCount);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

در اینجا:
int

نوع داده است و:
busCount

نام Variable است.
مقدار آن نیز:
25

است.

3️⃣ کاربرد Integer در PowerFactory
در پروژه‌های واقعی PowerFactory، Integer کاربردهای بسیار زیادی دارد.
مثلاً برای نگهداری:
☜ تعداد Busها
☜ تعداد خطوط
☜ تعداد ترانسفورماتورها
☜ شماره سناریو
☜ شماره مرحله تحلیل
☜ شمارنده Loop
☜ ‏Index یک عضو
☜ تعداد Contingencyها
☜ تعداد خطاهای شناسایی‌شده
استفاده می‌شود.

4️⃣ شمارش تجهیزات
یکی از اولین کاربردهای واقعی Integer، شمارش Objectها است.
فرض کنید یک Set از تجهیزات داریم.

به‌صورت مفهومی:
Set

├── Bus 1
├── Bus 2
├── Bus 3
├── ...
└── Bus N

برای نگهداری تعداد اعضای این مجموعه، به یک Integer نیاز داریم.
مثلاً:
busCount

می‌تواند تعداد Busها را نگهداری کند.
در ادامه دوره که با Set و Objectها به‌صورت عملی کار کنیم، همین مفهوم را روی Objectهای واقعی PowerFactory پیاده‌سازی خواهیم کرد.

5️⃣ ‏Integer در شمارنده‌ها
یکی از مهم‌ترین کاربردهای int، استفاده به‌عنوان Counter است.
مثلاً فرض کنید می‌خواهیم تعداد تجهیزات بررسی‌شده را بشماریم.
منطق:
شروع

Counter = 0

بررسی تجهیز

Counter = Counter + 1

تجهیز بعدی

...

‏Variable مربوط به Counter باید بتواند اعداد صحیح را نگهداری کند.

مثلاً:
counter = 0

و بعد:
counter = counter + 1


6️⃣ یک مثال مهندسی: شمارش Violations
فرض کنید در یک مطالعه Load Flow می‌خواهیم تعداد تجهیزات دارای مشکل را بشماریم.
مثلاً:
Voltage Violation
Loading Violation

یک Counter می‌تواند تعداد موارد شناسایی‌شده را نگهداری کند.
منطق:
Violation Count = 0

اگر تجهیز مشکل داشت:
Violation Count = Violation Count + 1

در پایان مثلاً:
Total Violations = 7

این یکی از کاربردهای بسیار مهم Integer در پروژه‌های اتوماسیون خواهد بود.

7️⃣ ‏Integer در شماره‌گذاری
فرض کنید می‌خواهیم تجهیزات یک گزارش را شماره‌گذاری کنیم:
1. Line A
2. Line B
3. Line C
4. Line D

شماره هر ردیف می‌تواند توسط یک Integer نگهداری شود.
مثلاً:
reportIndex

که از 1 شروع می‌شود و با پردازش هر تجهیز افزایش پیدا می‌کند.

8️⃣‏ Integer در Loop
در آینده با حلقه‌های for و while به‌صورت کامل کار خواهیم کرد.
در بسیاری از Loopها به یک Variable صحیح برای کنترل تکرار نیاز داریم.
مثلاً مفهوم کلی:
counter = 1

تا زمانی ک‏ه counter به حد مشخص نرسیده:
عملیات
counter = counter + 1

بنابراین Integer یکی از پایه‌های اصلی Loop و Automation است.

9️⃣ عملیات ریاضی روی Integer
روی مقادیر Integer می‌توان عملیات ریاضی انجام داد.
مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int feeders, transformers, totalEquipment;

feeders = 12;
transformers = 4;

totalEquipment = feeders + transformers;

printf('Total Equipment = %d', totalEquipment);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

اینجا:
12 + 4

محاسبه شده و نتیجه در:
totalEquipment

قرار گرفته است.

#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق

@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 سطح 1 - بخش 12 🔰 📌 ‏Integer‏ در DPL در پست قبل با انواع داده در DPL آشنا شدیم. در این پست می‌خواهیم یکی از ساده‌ترین و در عین حال پرکاربردترین انواع داده را بررسی کنیم: 🔹 ‏Integer یا عدد صحیح نوع int زمانی استفاده می‌شود که بخواهیم یک مقدار بدون بخش اعشاری…
🔰 ادامه سطح 1 - بخش 12 🔰

🔹 افزایش مقدار Integer

یکی از الگوهای بسیار مهم:
counter = counter + 1;

یا
counter += 1;

است.
مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int equipmentCount;

equipmentCount = 0;

equipmentCount = equipmentCount + 1;
equipmentCount = equipmentCount + 1;
equipmentCount = equipmentCount + 1;

printf('Equipment Count = %d', equipmentCount);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

در نهایت:
Equipment Count = 3

خواهیم داشت.

🔹 کاهش مقدار Integer
همین مفهوم برای کاهش مقدار نیز وجود دارد:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int remaining;

remaining = 10;

remaining = remaining - 1; ! OR remaining -= 1

printf('Remaining = %d', remaining);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

نتیجه:
Remaining = 9


🔹 ‏Integer و مقادیر منفی
‏Integer فقط برای اعداد مثبت نیست.
مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int difference;

difference = -15;

printf('Difference = %d', difference);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Difference = -15


⚠️ ‏Integer برای همه اعداد مناسب نیست
یکی از اشتباهات رایج این است که چون یک مقدار «عدد» است، آن را int تعریف کنیم.
مثلاً:
Voltage = 0.987 pu
Loading = 87.35 %
Power = 125.6 MW

این‌ها دارای بخش اعشاری هستند.
بنابراین int انتخاب مناسبی برای چنین داده‌هایی نیست.
در این موارد از نوع عددی اعشاری مناسب، یعنی double، استفاده خواهیم کرد.

🔥 یک مثال کاربردی‌تر
فرض کنید در یک فرآیند تحلیل، سه نوع تجهیز را بررسی کرده‌ایم:
Bus → 45
Line → 38
Transformer → 12

می‌توانیم تعداد کل تجهیزات را محاسبه کنیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int busCount;
int lineCount;
int transformerCount;
int totalCount;

busCount = 45;
lineCount = 38;
transformerCount = 12;

totalCount = busCount + lineCount + transformerCount;

printf('Bus Count = %d', busCount);
printf('Line Count = %d', lineCount);
printf('Transformer Count = %d', transformerCount);
printf('Total Count = %d', totalCount);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

نتیجه:
Bus Count = 45
Line Count = 38
Transformer Count = 12
Total Count = 95

نکته مهم این مثال این است که Integer برای تعداد تجهیزات کاملاً مناسب است.

🧠‏ Integer در پروژه‌های آینده DPL
در پروژه‌های واقعی دوره، int را در مواردی مثل این خواهیم دید:
Set تجهیزات

Loop

Counter

بررسی Object

اگر شرط برقرار بود

Violation Count++

بنابراین ممکن است یک Script هم‌زمان چند Integer داشته باشد:
objectCount
lineCount
busCount
errorCount
...

هرکدام نقش مشخصی در برنامه خواهند داشت.

⚠️ نکته مهم درباره Integer و تقسیم

در محاسبات، هنگام کار با اعداد صحیح باید به نوع نتیجه عملیات توجه داشته باشیم.
به‌خصوص در تقسیم، نباید بدون توجه به نوع داده فرض کنیم نتیجه همیشه یک عدد اعشاری خواهد بود.

مثلاً اگر هدف ما محاسبه یک نسبت مهندسی باشد:
Loading / Limit

و نتیجه باید اعشاری باشد، باید نوع داده مناسب برای نتیجه را در نظر بگیریم.
این موضوع را هنگام بررسی double با مثال‌های دقیق‌تر بررسی خواهیم کرد.

🎯 جمع‌بندی
در این پست یاد گرفتیم:
☜ ‏int برای نگهداری اعداد صحیح استفاده می‌شود.
☜ ‏Integer می‌تواند مثبت، صفر یا منفی باشد.
☜ برای شمارش تجهیزات بسیار مناسب است.
☜ برای Counterها کاربرد زیادی دارد.
☜ در Loopها بسیار پرکاربرد است.
☜ برای شماره‌گذاری و Indexها استفاده می‌شود.
☜ برای شمارش خطاها و Violations کاربرد دارد.
☜ برای مقادیر اعشاری مانند Voltage و Loading نباید از Integer استفاده کنیم.

⭐️ قانون طلایی
اگر داده ماهیت «تعداد، شمارنده، شماره یا مقدار صحیح» دارد، Integer یکی از گزینه‌های اصلی شماست.


#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق

@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 ادامه سطح 1 - بخش 12 🔰 🔹 افزایش مقدار Integer یکی از الگوهای بسیار مهم: counter = counter + 1; یا counter += 1; است. مثلاً: ! =================================== ! Telegram: @PowerFactoryDIgSILENT ! =================================== int equipmentCount;…
🎯 تمرین شماره 12

فرض کنید یک فرآیند بررسی شبکه انجام داده‌اید و این نتایج به دست آمده است:
6 خط دارای Overload هستند.
4 ترانسفورماتور دارای Overload هستند.
3 ‏Bus دارای Undervoltage هستند.
2 ‏Bus دارای Overvoltage هستند.

برنامه DPL بنویسید که:
☜ برای هرکدام یک Variable از نوع int تعریف کند.
☜ تعداد کل Equipment Violations را محاسبه کند.
☜ تعداد کل Voltage Violations را جداگانه محاسبه کند.
☜ تعداد کل Violations را در یک Variable دیگر ذخیره کند.
☜ نتیجه را با printf نمایش دهد.

🎯 نکته تمرین
جواب را فقط با جمع چهار عدد ننویسید؛ هدف این است که ساختار منطقی زیر را خودتان پیاده کنید:
Overload Violations
+
Voltage Violations

Total Violations


#تمرین_سطح_1
#تمرین
🔰 سطح 1 - بخش 13 🔰

📌 ‏Double‏ در DPL
در پست قبلی با Integer آشنا شدیم؛ نوع داده‌ای که برای اعداد صحیح مثل تعداد تجهیزات، شمارنده‌ها و شماره سناریوها استفاده می‌شود.

اما در مطالعات سیستم قدرت، بیشتر مقادیر مهم ما اعشاری هستند:
☜ ولتاژ: 0.98pu
‏‌‏☜ بارگذاری: 87.35%
☜ توان اکتیو: 125.6MW
☜ توان راکتیو: 42.75MVAr
☜ جریان: 456.82A
برای چنین مقادیری در DPL از نوع:
double

استفاده می‌کنیم.

🔹 ‏Double چیست؟
double برای نگهداری اعداد اعشاری استفاده می‌شود.
مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double voltage;

voltage = 0.985;

printf('Voltage = %.3f pu', voltage);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Voltage = 0.985 pu

🔹 چرا در PowerFactory به Double نیاز داریم؟
فرض کنید ولتاژ یک Bus برابر باشد با:
0.973 pu

اگر بخواهیم این مقدار را برای تحلیل در Variable نگهداری کنیم، باید بتوانیم بخش اعشاری آن را حفظ کنیم.
یا مثلاً Loading یک خط:
103.72 %

است.
اگر فقط به اعداد صحیح محدود باشیم، اطلاعات اعشاری از بین می‌رود.
بنابراین:
Voltage → double
Loading → double
Power → double
Current → double

🔹 تعریف و مقداردهی Double
ساختار کلی:
double VariableName;

مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double loading;

loading = 87.35;

printf('Loading = %.2f %%', loading);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Loading = 87.35 %

🔹 ‏Double و محاسبات مهندسی
یکی از مهم‌ترین کاربردهای Double انجام محاسبات روی نتایج مطالعات است.
مثلاً فرض کنید توان تولیدی یک واحد:
P = 125.5 MW

و توان مصرفی:
P = 87.25 MW

باشد.
می‌توانیم اختلاف آن‌ها را محاسبه کنیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double generation;
double load;
double surplus;

generation = 125.5;
load = 87.25;

surplus = generation - load;

printf('Generation = %.2f MW', generation);
printf('Load = %.2f MW', load);
printf('Surplus = %.2f MW', surplus);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================


نتیجه:
Generation = 125.50 MW
Load = 87.25 MW
Surplus = 38.25 MW


🔹 محاسبه Loading
حالا یک مثال بسیار نزدیک‌تر به کاری که در PowerFactory انجام خواهیم داد.
فرض کنید:
Actual Loading = 87.5 %

و حد مجاز:
Limit = 100 %

است.
می‌توانیم درصد باقی‌مانده تا حد مجاز را محاسبه کنیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double loading;
double limit;
double margin;

loading = 87.5;
limit = 100.0;

margin = limit - loading;

printf('Loading = %.2f %%', loading);
printf('Margin = %.2f %%', margin);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Loading = 87.50 %
Margin = 12.50 %

این نوع محاسبه بعدها در ساخت گزارش تجهیزات بحرانی بسیار کاربردی خواهد بود.

🔹 ‏Double در تحلیل ولتاژ
فرض کنید محدوده مجاز ولتاژ را این‌گونه تعریف کرده‌ایم:
Minimum = 0.95 pu
Maximum = 1.05 pu

و ولتاژ یک Bus:
0.928 pu

است.
می‌توانیم فاصله آن از حد پایین را محاسبه کنیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double voltage;
double minVoltage;
double deviation;

voltage = 0.928;
minVoltage = 0.950;

deviation = minVoltage - voltage;

printf('Voltage = %.3f pu', voltage);
printf('Deviation = %.3f pu', deviation);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

نتیجه:
Voltage = 0.928 pu
Deviation = 0.022 pu

در آینده می‌توانیم همین منطق را با if ترکیب کنیم تا Busهای دارای Undervoltage را شناسایی کنیم.

#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق

@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 سطح 1 - بخش 13 🔰 📌 ‏Double‏ در DPL در پست قبلی با Integer آشنا شدیم؛ نوع داده‌ای که برای اعداد صحیح مثل تعداد تجهیزات، شمارنده‌ها و شماره سناریوها استفاده می‌شود. اما در مطالعات سیستم قدرت، بیشتر مقادیر مهم ما اعشاری هستند: ☜ ولتاژ: 0.98pu ‏‌‏☜ بارگذاری:…
🔰 ادامه سطح 1 - بخش 13 🔰

🔹 ‏Double و درصد

فرض کنید توان فعلی یک تجهیز:
75 MW

و ظرفیت آن:
100 MW

است.
درصد استفاده از ظرفیت:
75 / 100 × 100 = 75 %

می‌شود.
در DPL:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double actualPower;
double capacity;
double utilization;

actualPower = 75.0;
capacity = 100.0;

utilization = actualPower / capacity * 100.0;

printf('Utilization = %.2f %%', utilization);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Utilization = 75.00 %


🔹 ‏Double و محاسبات چندمرحله‌ای
می‌توانیم چند محاسبه را پشت سر هم انجام دهیم.
مثلاً فرض کنید توان یک ژنراتور از:
120 MW

به:
138.5 MW

افزایش یافته است.
مقدار افزایش:
18.5 MW

و درصد افزایش:
15.42 %

خواهد بود.
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double oldPower;
double newPower;
double difference;
double percentage;

oldPower = 120.0;
newPower = 138.5;

difference = newPower - oldPower;
percentage = difference / oldPower * 100.0;

printf('Old Power = %.2f MW', oldPower);
printf('New Power = %.2f MW', newPower);
printf('Difference = %.2f MW', difference);
printf('Increase = %.2f %%', percentage);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Old Power = 120.00 MW
New Power = 138.50 MW
Difference = 18.50 MW
Increase = 15.42 %

این الگو بعدها برای مقایسه Study Caseها و سناریوها بسیار مفید خواهد بود.

🔹 ‏Double و دقت نمایش
در printf می‌توانیم مشخص کنیم چند رقم اعشار نمایش داده شود.
مثلاً:
%.1f

یعنی یک رقم اعشار.
%.2f

یعنی دو رقم اعشار.
%.3f

یعنی سه رقم اعشار.
مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double voltage;

voltage = 0.987654;

printf('%.1f', voltage);
printf('%.2f', voltage);
printf('%.3f', voltage);
printf('%.6f', voltage);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

به‌صورت مفهومی خروجی به شکل زیر خواهد بود:
1.0
0.99
0.988
0.987654

⚠️ توجه کنید که این فقط نحوه نمایش مقدار است؛ با محدود کردن تعداد ارقام در printf، خود مقدار Variable تغییر نمی‌کند.

🔹 ‏Double در مقایسه با یک Limit
یکی از کاربردهای مهم Double در تحلیل شبکه، مقایسه یک مقدار با حد مجاز است.
مثلاً:
Loading = 108.6 %
Limit = 100 %

در آینده می‌توانیم بنویسیم:
اگر Loading > Limit

تجهیز Overloaded است

یعنی:
Double

Measurement

Comparison

Decision

این ساختار پایه بسیاری از Scriptهای تحلیلی ما خواهد بود.

#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق

@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 ادامه سطح 1 - بخش 13 🔰 🔹 ‏Double و درصد فرض کنید توان فعلی یک تجهیز: 75 MW و ظرفیت آن: 100 MW است. درصد استفاده از ظرفیت: 75 / 100 × 100 = 75 % می‌شود. در DPL: ! =================================== ! Telegram: @PowerFactoryDIgSILENT ! ===============…
🔰 ادامه سطح 1 - بخش 13 🔰

⚠️ یک اشتباه رایج
نباید برای مقدار اعشاری، صرفاً به این دلیل که «عدد است»، از int استفاده کنیم.
مثلاً اگر:
voltage = 0.973

باشد، این داده ماهیت اعشاری دارد.
در تحلیل سیستم قدرت، تفاوت بین:
0.973

و:
1.000

بسیار مهم است.
پس باید نوع داده را بر اساس ماهیت داده انتخاب کنیم، نه صرفاً بر اساس اینکه داده عددی است.

🧠 یک مثال ترکیبی PowerFactory
فرض کنید نتیجه یک مطالعه Load Flow برای یک تجهیز این مقادیر را به ما داده است:
Voltage = 0.942 pu
Loading = 96.75 %
Power = 184.35 MW

برای نگهداری این مقادیر:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double voltage;
double loading;
double power;

voltage = 0.942;
loading = 96.75;
power = 184.35;

printf('Voltage = %.3f pu', voltage);
printf('Loading = %.2f %%', loading);
printf('Power = %.2f MW', power);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

اینجا هر سه Variable از یک نوع هستند، چون هر سه مقدار اعشاری هستند.

🎯 نکته بسیار مهم برای ادامه دوره
در پروژه‌های واقعی DPL معمولاً داده‌ها را به‌صورت منفرد بررسی نمی‌کنیم.
مثلاً ممکن است برای یک Line داشته باشیم:
Line Object

Name → String
Length → Double
Status → Boolean

و برای مجموعه خطوط:
All Lines

Set

بنابراین در Scriptهای واقعی، انواع داده مختلف دائماً کنار یکدیگر قرار می‌گیرند.

🎯 جمع‌بندی
در این پست یاد گرفتیم:
☜ ‏double برای مقادیر اعشاری استفاده می‌شود.
☜ ‏Voltage، Loading، ‏Power و Current نمونه‌های مهم آن هستند.
☜ ‏Double در محاسبات مهندسی بسیار پرکاربرد است.
☜ می‌توان با Double اختلاف، درصد تغییر، Margin و نسبت‌ها را محاسبه کرد.
☜ تعداد ارقام نمایش داده‌شده با printf قابل کنترل است.
☜ نباید داده‌های اعشاری را صرفاً به دلیل عددی بودن، Integer در نظر گرفت.

⭐️ قانون طلایی
هرجا با یک مقدار اندازه‌گیری‌شده یا محاسبه‌شده با بخش اعشاری سروکار داریم، باید نوع داده مناسب اعشاری را در نظر بگیریم.


#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق

@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 ادامه سطح 1 - بخش 13 🔰 ⚠️ یک اشتباه رایج نباید برای مقدار اعشاری، صرفاً به این دلیل که «عدد است»، از int استفاده کنیم. مثلاً اگر: voltage = 0.973 باشد، این داده ماهیت اعشاری دارد. در تحلیل سیستم قدرت، تفاوت بین: 0.973 و: 1.000 بسیار مهم است. پس باید نوع…
🎯 تمرین شماره 13

در یک مطالعه فرضی، مشخص شده است که یک فیدر در دو حالت مختلف دارای شرایط زیر است:
حالت اول
Power = 72.5 MW
Loading = 68.4 %

حالت دوم
Power = 91.8 MW
Loading = 86.7 %

برنامه‌ای بنویسید که:
☜ توان حالت اول و دوم را در دو Variable از نوع double ذخیره کند.
☜ ‏Loading هر دو حالت را در دو Variable جداگانه ذخیره کند.
افزایش توان بین دو حالت را محاسبه کند.
درصد افزایش توان را محاسبه کند.
☜ تغییر Loading را محاسبه کند.
☜ تمام نتایج را با تعداد مناسب ارقام اعشار نمایش دهد.

💡 دقت کنید
این بار هدف فقط نمایش مقادیر نیست؛ باید از double برای انجام محاسبات واقعی بین دو حالت استفاده کنید.

#تمرین_سطح_1
#تمرین
🔰 سطح 1 - بخش 14 🔰

📌 ‏String در DPL
در پست‌های قبلی با int و double آشنا شدیم.
تا اینجا بیشتر با اعداد و محاسبات کار کردیم؛ اما در PowerFactory دائماً با اطلاعات متنی هم سروکار داریم:
نام خط
نام باس
نام پست
نام ترانسفورماتور
نام Study Case
نام سناریو
پیام‌های گزارش
متن‌های خروجی
برای نگهداری این نوع اطلاعات از String استفاده می‌کنیم.

🔹 ‏String چیست؟
String برای نگهداری داده‌های متنی استفاده می‌شود.
مثلاً:
Line_230kV_01
Bus_230_05
Substation_A
Base Case
Peak Load

یک Variable از نوع String به این شکل تعریف می‌شود:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

string lineName;

lineName = 'Line_230kV_01';

printf('Line Name = %s', lineName);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Line Name = Line_230kV_01


🔹 تعریف String
ساختار کلی:
string VariableName;

مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

string substationName;
string studyCaseName;

substationName = 'Substation_A';
studyCaseName = 'Peak_Load';

printf('Substation = %s', substationName);
printf('Study Case = %s', studyCaseName);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Substation = Substation_A
Study Case = Peak_Load


🔹 متن در String چگونه نوشته می‌شود؟

در مثال‌های DPL، متن را داخل کوتیشن قرار می‌دهیم:
'Line_230kV_01'

مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

string voltageLevel;

voltageLevel = '230 kV';

printf('Voltage Level = %s', voltageLevel);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

نکته مهم این است که:
230

یک عدد است، ولی:
'230'

یک String است.

🔹 3. تفاوت Number و String
این تفاوت در PowerFactory بسیار مهم است.
فرض کنید:
230

را داریم.
این یک مقدار عددی است و می‌توانیم روی آن محاسبات انجام دهیم.
اما:
'230 kV'

یک متن است.
نمی‌توانیم آن را مستقیماً مانند یک عدد در محاسبات ریاضی استفاده کنیم.
مثلاً این دو مفهوم کاملاً متفاوت‌اند:
voltage = 230

و:
voltageText = '230 kV'

اولی برای محاسبه مناسب است.
دومی برای نمایش و گزارش مناسب است.

🔹 ‏String در نام تجهیزات
یکی از مهم‌ترین کاربردهای String در DPL، کار با نام تجهیزات است.
فرض کنید نام یک خط را داریم:
Line_400kV_North_01

می‌توانیم آن را در یک Variable ذخیره کنیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

string lineName;

lineName = 'Line_400kV_North_01';

printf('Equipment: %s', lineName);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Equipment: Line_400kV_North_01

این مفهوم بعداً زمانی که از Objectهای واقعی PowerFactory نام آن‌ها را استخراج کنیم، اهمیت زیادی پیدا می‌کند.

🔹 ترکیب String با عدد
یکی از کاربردهای بسیار مهم String، ساخت گزارش است.
فرض کنید:
Line Name = Line_230kV_05
Loading = 108.35 %

می‌خواهیم این دو را در یک پیام نمایش دهیم.
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

string lineName;
double loading;

lineName = 'Line_230kV_05';
loading = 108.35;

printf('Line %s has a loading of %.2f %%', lineName, loading);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Line Line_230kV_05 has a loading of 108.35 %

اینجا سه مفهوم با هم ترکیب شده‌اند:
String
+
Double
+
printf

این الگو در گزارش‌های DPL بسیار پرکاربرد خواهد بود.

#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق

@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 سطح 1 - بخش 14 🔰 📌 ‏String در DPL در پست‌های قبلی با int و double آشنا شدیم. تا اینجا بیشتر با اعداد و محاسبات کار کردیم؛ اما در PowerFactory دائماً با اطلاعات متنی هم سروکار داریم: نام خط نام باس نام پست نام ترانسفورماتور نام Study Case نام سناریو پیام‌های…
🔰 ادامه سطح 1 - بخش 14 🔰

🔹 ساخت پیام‌های خوانا

فرض کنید می‌خواهیم وضعیت یک تجهیز را گزارش کنیم:
Transformer TR_63_20_01 is overloaded.

می‌توانیم نام تجهیز را در یک String نگهداری کنیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

string transformerName;

transformerName = 'TR_63_20_01';

printf('Transformer %s is overloaded.', transformerName);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

این روش باعث می‌شود Script ما بتواند برای تجهیزات مختلف، پیام‌های متفاوت و خوانا تولید کند.

🔹 چند String در یک برنامه
می‌توانیم چند Variable از نوع String داشته باشیم.
مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

string region;
string substation;
string voltageLevel;
string studyCase;

region = 'North';
substation = 'Substation_01';
voltageLevel = '230 kV';
studyCase = 'Peak_Load';

printf('Region : %s', region);
printf('Substation : %s', substation);
printf('Voltage Level: %s', voltageLevel);
printf('Study Case : %s', studyCase);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Region : North
Substation : Substation_01
Voltage Level: 230 kV
Study Case : Peak_Load

چنین ساختاری بعدها برای گزارش‌گیری خودکار بسیار مفید خواهد بود.

🔹 ترکیب چند String
گاهی می‌خواهیم چند قطعه متن را به یک متن تبدیل کنیم.
مثلاً:
North
+
Substation_01
+
230 kV

و به یک متن مانند:
North - Substation_01 - 230 kV

برسیم.

در DPL برای کار با Stringها توابع و امکانات مختلفی وجود دارد که در بخش مربوط به String Operations به‌صورت دقیق بررسی خواهیم کرد.

نکته مهم این است که فعلاً مفهوم را در ذهن داشته باشید:
‏String 1 + String 2
‏ ↓
‏String جدید


🔹 ‏String و گزارش تجهیزات

فرض کنید در آینده یک Script داریم که خطوط دارای Overload را پیدا می‌کند.
برای هر خط می‌توانیم اطلاعاتی مانند:
Line Name
Loading
Status

را در گزارش قرار دهیم.
مثلاً خروجی:
Line_230_01 | 104.52 % | OVERLOADED
Line_230_07 | 112.35 % | OVERLOADED
Line_400_02 | 101.18 % | OVERLOADED

در اینجا:
Line Name → String
Loading → Double
Status → String

یعنی String بخش مهمی از سیستم گزارش‌گیری ما خواهد بود.
🔥 10. یک مثال واقعی‌تر
فرض کنید اطلاعات یک تجهیز به این صورت است:
Equipment Name = TR_230_63_01
Type = Transformer
Voltage Level = 230 kV / 63 kV
Loading = 96.75 %

می‌توانیم اطلاعات متنی و عددی را کنار هم قرار دهیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

string equipmentName;
string equipmentType;
string voltageLevel;

double loading;

equipmentName = 'TR_230_63_01';
equipmentType = 'Transformer';
voltageLevel = '230 kV / 63 kV';

loading = 96.75;

printf('Equipment : %s', equipmentName);
printf('Type : %s', equipmentType);
printf('Voltage : %s', voltageLevel);
printf('Loading : %.2f %%', loading);

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
Equipment : TR_230_63_01
Type : Transformer
Voltage : 230 kV / 63 kV
Loading : 96.75 %

این دقیقاً شبیه ساختار اطلاعاتی است که در پروژه‌های واقعی DPL با آن کار خواهیم کرد.

#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق

@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 ادامه سطح 1 - بخش 14 🔰 🔹 ساخت پیام‌های خوانا فرض کنید می‌خواهیم وضعیت یک تجهیز را گزارش کنیم: Transformer TR_63_20_01 is overloaded. می‌توانیم نام تجهیز را در یک String نگهداری کنیم: ! =================================== ! Telegram: @PowerFactoryDIgSILENT…
🔰 ادامه سطح 1 - بخش 14 🔰

🔹 ‏String و Objectهای PowerFactory

یکی از کاربردهای مهم String این است که بتوانیم اطلاعات متنی مربوط به Objectها را ذخیره یا نمایش دهیم.
در PowerFactory یک Object مانند یک خط، ترانس یا Bus دارای اطلاعاتی مانند نام است.
به‌صورت مفهومی:
PowerFactory Object

Name

String

مثلاً:
ElmLne

Line_230kV_01

String

در بخش Object و Attribute یاد خواهیم گرفت که چگونه این اطلاعات را از Objectهای واقعی PowerFactory دریافت کنیم.

🔹 ‏String برای ساخت عنوان گزارش

فرض کنید Script ما قرار است نتایج یک Study Case را گزارش کند.
می‌توانیم عنوان گزارش را در یک String نگهداری کنیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

string reportTitle;

reportTitle = 'Load Flow Analysis - Peak Load';

printf('====================================');
printf('%s', reportTitle);
printf('====================================');

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

خروجی:
====================================
Load Flow Analysis - Peak Load
====================================

این مفهوم در پروژه‌های گزارش‌گیری پیشرفته بسیار کاربردی خواهد بود.

⚠️ ‏String را با Object اشتباه نگیرید
این دو یکی نیستند:
'Line_230kV_01'

و:
Line Object

اولی:
String

است و فقط متن نام خط را نگهداری می‌کند.
دومی:
Object

است و به خود Object موجود در PowerFactory اشاره می‌کند.
به زبان ساده:
‏String
↓‏
"نام خط چیست؟"

‏Object‌‏
↓‏
"خود خط کدام است؟"

این تفاوت زمانی که وارد بخش Objectهای PowerFactory شویم بسیار مهم خواهد شد.
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 ادامه سطح 1 - بخش 14 🔰 🔹 ‏String و Objectهای PowerFactory یکی از کاربردهای مهم String این است که بتوانیم اطلاعات متنی مربوط به Objectها را ذخیره یا نمایش دهیم. در PowerFactory یک Object مانند یک خط، ترانس یا Bus دارای اطلاعاتی مانند نام است. به‌صورت مفهومی:…
🎯 تمرین شماره 14

فرض کنید در یک پروژه سه ناحیه داریم:
North
Center
South

و می‌خواهیم برای یک گزارش، اطلاعات زیر را نگهداری کنیم:
☜ نام ناحیه
☜ نام پست
☜ سطح ولتاژ
☜ نام Study Case
☜ نوع تجهیز

برنامه‌ای بنویسید که این اطلاعات را در ۵ Variable از نوع String ذخیره کند و سپس یک گزارش خوانا با printf تولید کند.

اما یک شرط مهم دارد:
🔸 مقادیر تمرین را خودتان انتخاب کنید و از مقادیر مثال‌های این پست استفاده نکنید.

مثلاً می‌توانید یک پست 132 کیلوولت در ناحیه‌ای فرضی انتخاب کنید.

👈 هدف تمرین
تمرکز این تمرین روی این چهار موضوع است:
String Definition

Assignment

Multiple Strings

Formatted Output


#تمرین_سطح_1
#تمرین
بچه‌ها اگر پیشنهادی دارید در مورد مطالب و روند کانال بگین
@ElectricalDocumentAdmin
اگر هم میتونید در تولید محتوا کمک ما کنید، بگین.
نگین کم کار شدیما 😅

سرمون به شدت شلوغه برای دوتا کانال جدید دیگه 😎

البته حواسمون به این سمت هم هست 😉
🔰 سطح 1 - بخش 15 🔰

📌 ‏Set در DPL

در PowerFactory تقریباً هیچ پروژه اتوماسیونی را نمی‌توان بدون کار با مجموعه‌ای از Objectها انجام داد.

فرض کنید می‌خواهیم:
☜ تمام خطوط شبکه را پیدا کنیم.
☜ تمام ترانسفورماتورها را بررسی کنیم.
☜ همه Busها را پیمایش کنیم.
☜ تجهیزات یک Substation را پردازش کنیم.
☜ روی چند صد یا چند هزار Object یک عملیات انجام دهیم.
در این شرایط نمی‌توانیم برای هر Object یک Variable جداگانه تعریف کنیم.

اینجاست که Set وارد می‌شود.

🔹 ‌‌‏Set چیست؟
در DPL، یک set برای نگهداری مجموعه‌ای از Objectها استفاده می‌شود.
به‌صورت مفهومی:
Set

├── Line 1
├── Line 2
├── Line 3
└── Line 4

بنابراین:
Object → یک تجهیز
Set → مجموعه‌ای از تجهیزات

مثلاً:
Line_01
Line_02
Line_03
Line_04

می‌توانند اعضای یک Set باشند.

🔹 تعریف Set
در DPL یک Set را با set تعریف می‌کنیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

set Lines;

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

در این مرحله فقط یک Variable به نام Lines ساخته‌ایم که قرار است مجموعه‌ای از Objectها را نگهداری کند.

🔹 چرا Set مهم است؟
فرض کنید در یک شبکه 500 خط داریم.
روش اشتباه این است که بخواهیم چیزی شبیه این داشته باشیم:
Line1
Line2
Line3
...
Line500

این روش اصلاً برای Automation مناسب نیست.
بهتر است:
‏500 Line Objects‌‏
‏↓
Set‌‏
↓‏
پردازش با Loop

یعنی یک Set داشته باشیم که تمام خطوط موردنظر داخل آن قرار گرفته باشند.

🔹 ‏Set و Object چه تفاوتی دارند؟
این دو مفهوم را باید کاملاً از هم جدا کنیم.

👈 ‏Object
یک تجهیز مشخص:
Line_230_01

👈 ‏Set
مجموعه‌ای از تجهیزات:
Line_230_01
Line_230_02
Line_230_03

به‌صورت مفهومی:
‏Object
↓‏
یک تجهیز

Set‏
↓‏
چند Object


🔹 پیدا کردن مجموعه‌ای از تجهیزات
یکی از مهم‌ترین کاربردهای Set در DPL، دریافت مجموعه‌ای از Objectها از PowerFactory است.

مثلاً می‌توانیم مجموعه‌ای از خطوط شبکه را دریافت کنیم.
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

set Lines;

Lines = GetCalcRelevantObjects('*.ElmLne');

printf('Number of lines = %d', Lines.Count());

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

اینجا:
*.ElmLne

یعنی Objectهای کلاس ElmLne را جستجو کن.
نتیجه جستجو در:
Lines

قرار می‌گیرد.
🔹 ‏()Count چیست؟
وقتی چند Object داخل یک Set داریم، یکی از اطلاعاتی که معمولاً به آن نیاز داریم، تعداد Objectها است.

برای این کار می‌توانیم از:
Count()

استفاده کنیم.
مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

set Lines;

Lines = GetCalcRelevantObjects('*.ElmLne');

printf('Total Lines = %d', Lines.Count());

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

اگر 127 خط پیدا شده باشد:
Total Lines = 127


🔹 پیمایش اعضای Set
حالا قسمت مهم‌تر شروع می‌شود.
فرض کنید 127 خط داریم.
می‌خواهیم تک‌تک آن‌ها را بررسی کنیم.
اینجا از Loop استفاده می‌کنیم.
ساختار مفهومی:
Set

Line 1

Line 2

Line 3

...

Line 127

برای این کار یک Variable از نوع object به‌عنوان اشاره‌گر به Object فعلی نیاز داریم.
مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

set Lines;
object Line;

Lines = GetCalcRelevantObjects('*.ElmLne');

for (Line = Lines.First(); Line; Line = Lines.Next())
{
printf('%s', Line.loc_name);
}

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

اینجا چند مفهوم مهم را هم‌زمان می‌بینیم:
Set

First()

Object

Next()

Object بعدی

و این دقیقاً همان الگویی است که بعدها برای پردازش تعداد زیادی تجهیز در PowerFactory استفاده خواهیم کرد.

🔹 ‏First() و Next()
در پیمایش Set:
First()

اولین Object مجموعه را در اختیار ما قرار می‌دهد.
سپس:
Next()

به Object بعدی می‌رود.
مثلاً:
Set

├── Line_01 ← First()
├── Line_02 ← Next()
└── Line_03 ← Next()

به همین دلیل می‌توانیم تمام اعضای Set را یکی‌یکی پردازش کنیم.

#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق

@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 سطح 1 - بخش 15 🔰 📌 ‏Set در DPL در PowerFactory تقریباً هیچ پروژه اتوماسیونی را نمی‌توان بدون کار با مجموعه‌ای از Objectها انجام داد. فرض کنید می‌خواهیم: ☜ تمام خطوط شبکه را پیدا کنیم. ☜ تمام ترانسفورماتورها را بررسی کنیم. ☜ همه Busها را پیمایش کنیم. ☜…
🔰 ادامه سطح 1 - بخش 15 🔰

🔹 یک مثال واقعی‌تر
فرض کنید می‌خواهیم نام تمام خطوط شبکه را چاپ کنیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

set Lines;
object Line;

Lines = GetCalcRelevantObjects('*.ElmLne');

for (Line = Lines.First(); Line; Line = Lines.Next())
{
printf('Line: %s', Line.loc_name);
}

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

اگر شبکه شامل این خطوط باشد:
Line_North_01
Line_North_02
Line_Center_05
Line_South_03

خروجی چیزی شبیه این خواهد بود:
Line: Line_North_01
Line: Line_North_02
Line: Line_Center_05
Line: Line_South_03


🔥 ‏Set فقط برای خطوط نیست
Set ‏می‌تواند مجموعه‌ای از انواع مختلف Objectهای PowerFactory را نگهداری کند.
مثلاً:
خطوط
*.ElmLne

ترانسفورماتورها
*.ElmTr2

‏Busها
*.ElmTerm

ژنراتورها
*.ElmSym

بارها
*.ElmLod

البته انتخاب دقیق Class به نوع تجهیز و ساختار مدل PowerFactory بستگی دارد.

🔹 ‏Set و تحلیل سیستم قدرت

فرض کنید می‌خواهیم تمام خطوط را بررسی کنیم و Loading آن‌ها را بخوانیم.
منطق کلی:
GetCalcRelevantObjects

Set Lines

Loop

Current Line

Read Attribute

Loading

در نتیجه Set تبدیل می‌شود به نقطه شروع بسیاری از Scriptهای تحلیلی.
مثلاً:
تمام خطوط
↓‏
‏Set
‏↓
Load Flow‏
↓‏
خواندن Loading

پیدا کردن خطوط Overloaded


🔹 ‏Set خالی
ممکن است جستجو هیچ Objectای پیدا نکند.
مثلاً:
‏Set
↓‏
هیچ Objectی وجود ندارد

این وضعیت باید در Scriptهای حرفه‌ای مدیریت شود.

مثلاً قبل از پردازش، تعداد اعضا را بررسی کنیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

set Lines;

Lines = GetCalcRelevantObjects('*.ElmLne');

if (Lines.Count() == 0)
{
printf('No lines were found.');
}

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

این کار از بروز بسیاری از خطاهای منطقی در Script جلوگیری می‌کند.

⚠️ یک نکته بسیار مهم
‏Set خودش تجهیز نیست.
مثلاً:
Lines

یک Set است.
اما:
Line_230_01

یک Object است.
پس نمی‌توانیم Attributeهایی مثل:
loc_name
uknom
loading

را مستقیماً از خود Set بخوانیم.

ابتدا باید یک Object از Set بگیریم:
Set

Object

Attribute

مثلاً:
Lines

Line

Line.loc_name


🔥 ‏Set + Object + Attribute
این سه مفهوم از پایه‌های DPL هستند.
مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

set Lines;
object Line;

Lines = GetCalcRelevantObjects('*.ElmLne');

for (Line = Lines.First(); Line; Line = Lines.Next())
{
printf('Name = %s', Line.loc_name);
}

! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

در این Script
Lines
مجموعه خطوط
Line
خط فعلی
Line.loc_name
نام خط فعلی

این الگو را به خاطر بسپارید:
SET

OBJECT

ATTRIBUTE

بعدها تقریباً تمام Automationهای PowerFactory را بر اساس همین منطق توسعه خواهیم داد.

🔹 ‏Set و حجم بالای تجهیزات
فرض کنید یک شبکه داریم با:
5,000 Line
2,000 Transformer
8,000 Load
1,500 Generator

ما نمی‌خواهیم برای هر Object یک Variable جداگانه بسازیم.
بلکه:
5,000 Lines

Set Lines

2,000 Transformers

Set Transformers

8,000 Loads

Set Loads

سپس با Loop روی هر Set عملیات موردنظر را انجام می‌دهیم.
این یکی از دلایل اصلی اهمیت Set در پروژه‌های بزرگ PowerFactory است.

🧠 جمع‌بندی
در این پست یاد گرفتیم:
☜ ‏Set برای نگهداری مجموعه‌ای از Objectها استفاده می‌شود.
☜ یک Set می‌تواند تعداد زیادی Object داشته باشد.
☜ می‌توان مجموعه تجهیزات را با توابع جستجو دریافت کرد.
☜ ‏()Count تعداد اعضای Set را مشخص می‌کند.
☜ با ()First و ()Next می‌توان اعضای Set را پیمایش کرد.
☜ برای پردازش Objectهای داخل Set از Loop استفاده می‌کنیم.
☜ ‏Set با Object تفاوت دارد.
برای دسترسی به Attribute باید از Object موجود در Set استفاده کنیم.

⭐️ الگوی طلایی این بخش
Search

Set

Object

Attribute

Process

این الگو یکی از مهم‌ترین پایه‌های برنامه‌نویسی DPL در PowerFactory است.

#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق

@PowerFactoryDIgSILENT