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

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

در کد زیر Expressionها را پیدا کنید:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int a, b, result;

a = 20;
b = 30;

result = a + b;

if (result > 40)
{
printf('Result is greater than 40');
}

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

سؤال:
☜ ‏Expression موجود در محاسبه result چیست؟
☜ ‏Expression موجود در شرط if چیست؟
☜ مقدار نهایی result چقدر است؟
☜ آیا پیام نمایش داده می‌شود؟

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

📌 ‏Variable در DPL
در پست‌های قبلی با Comment، Statement و Expression آشنا شدیم.

حالا به یکی از مهم‌ترین مفاهیم برنامه‌نویسی می‌رسیم:
🔹Variable یا متغیر چیست؟

تقریباً در تمام برنامه‌های DPL که در ادامه دوره می‌نویسیم، با Variableها سروکار خواهیم داشت.

🔹 ‏Variable چیست؟
‏Variable را می‌توان یک محل نام‌گذاری‌شده برای نگهداری یک مقدار در نظر گرفت.
فرض کنید می‌خواهیم عدد 100 را در برنامه نگهداری کنیم.

می‌توانیم یک Variable به نام power داشته باشیم:
power → 100

حالا هرجا در برنامه از power استفاده کنیم، مقدار ذخیره‌شده در آن را در اختیار خواهیم داشت.

🔹 چرا به Variable نیاز داریم؟
فرض کنید می‌خواهیم چند بار از عدد 100 استفاده کنیم.
اگر مقدار را مستقیماً در همه‌جا بنویسیم:
100
100
100
100

مدیریت برنامه سخت می‌شود.
اما اگر آن را داخل یک Variable قرار دهیم:
power = 100

از این به بعد فقط کافی است از:
power

استفاده کنیم.
اگر مقدار power تغییر کند، فقط مقدار Variable را تغییر می‌دهیم.

🔹 تعریف Variable
در DPL باید نوع Variable را مشخص کنیم.

برای مثال یک Variable از نوع int:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int power;

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

در اینجا:
int

نوع Variable است.
و:
power

نام Variable است.
بنابراین:
int power;

یعنی یک Variable عدد صحیح به نام power تعریف کن.

🔹 مقداردهی به Variable
بعد از تعریف Variable می‌توانیم به آن مقدار بدهیم.
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int power;

power = 100;

printf('Power = %d MW', power);

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

در این برنامه:
1️⃣ مرحله اول
‏Variable تعریف می‌شود:
int power;

2️⃣ مرحله دوم
مقدار 100 به آن داده می‌شود:
power = 100;

3️⃣ مرحله سوم
مقدار Variable چاپ می‌شود:
printf('Power = %d MW', power);

خروجی:
power = 100 MW


🔄 مقدار Variable می‌تواند تغییر کند
یکی از ویژگی‌های مهم Variable این است که مقدار آن ثابت نیست.
مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int power;

power = 100;

printf('Power = %d MW', power);

power = 150;

printf('Power = %d MW', power);

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

خروجی:
Power = 100 MW
Power = 150 MW

یعنی ابتدا:
power → 100

و بعد:
power → 150


🔹 نام‌گذاری Variableها
انتخاب نام مناسب برای Variable بسیار مهم است.
نام‌هایی مانند:
x
a
b
n

ممکن است در مثال‌های خیلی ساده قابل قبول باشند، اما در پروژه‌های واقعی خوانایی کد را کاهش می‌دهند.

بهتر است نام Variable نشان‌دهنده مفهوم آن باشد.
مثلاً:
power
voltage
current
loading
lineCount
busCount
totalPower

این نام‌ها خیلی خواناتر هستند.

مثلاً وقتی می‌بینیم:
totalPower = power1 + power2;

تقریباً بدون توضیح هم متوجه منطق برنامه می‌شویم.

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

@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 سطح 1 - بخش 9 🔰 📌 ‏Variable در DPL در پست‌های قبلی با Comment، Statement و Expression آشنا شدیم. حالا به یکی از مهم‌ترین مفاهیم برنامه‌نویسی می‌رسیم: 🔹 ‏Variable یا متغیر چیست؟ تقریباً در تمام برنامه‌های DPL که در ادامه دوره می‌نویسیم، با Variableها سروکار…
🔰 ادامه سطح 1 - بخش 9 🔰

🔹 ‏Variable و Expression
حالا ارتباط Variable و Expression را که در پست قبل یاد گرفتیم ببینیم.
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int power1, power2, totalPower;

power1 = 100;
power2 = 150;

totalPower = power1 + power2;

printf('Total Power = %d MW', totalPower);

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

در اینجا:
power1 + power2

یک Expression است.
و:
totalPower

یک Variable است که نتیجه Expression را نگهداری می‌کند.
در نتیجه:
power1 = 100
power2 = 150

power1 + power2

totalPower = 250


🔹 چند Variable در یک تعریف
در صورت هم‌نوع بودن Variableها می‌توان آن‌ها را در یک Statement تعریف کرد.
مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int voltage, current, power;

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

در اینجا سه Variable از نوع int داریم:
voltage
current
power

البته در پروژه‌های مهندسی واقعی باید نوع داده را متناسب با ماهیت مقدار انتخاب کنیم؛ مثلاً برای مقادیر اعشاری معمولاً به نوع مناسب عددی نیاز خواهیم داشت که در پست‌های بعدی بررسی می‌کنیم.

🔹 ‏Variableها فقط عدد نیستند
یکی از نکات بسیار مهم در DPL این است که Variable می‌تواند انواع مختلفی داشته باشد.
در ادامه دوره با مواردی مانند:
Integer
Real
String
Boolean
Object
Set

کار خواهیم کرد.
مثلاً:
‏Integer ☜ عدد صحیح
‏Real ☜ عدد اعشاری
‏String ☜ متن
‏Boolean ☜ مقدار منطقی
‌‏Object ☜ یک Object از PowerFactory
‏Set ☜ مجموعه‌ای از Objectها


و این بخش یکی از پایه‌های اصلی دوره خواهد بود.‏

🔥 ‏Variable در PowerFactory
اینجا Variableها اهمیت بسیار بیشتری پیدا می‌کنند.

فرض کنید در آینده می‌خواهیم تعداد خطوط شبکه را نگهداری کنیم:
lineCount

یا مقدار Loading یک خط را:
loading

یا یک Object مربوط به خط را:
line

یا مجموعه‌ای از خطوط را:
lines

در نتیجه Variableها پل ارتباطی بین منطق برنامه DPL و اطلاعات PowerFactory هستند.

⚠️ یک اشتباه رایج
نباید قبل از تعریف Variable از آن استفاده کنیم.
مثلاً این ساختار صحیح نیست:
power = 100;

اگر power قبلاً تعریف نشده باشد.
ابتدا باید Variable را تعریف کنیم:
int power;

و سپس مقداردهی کنیم:
power = 100;

یعنی:
تعریف

مقداردهی

استفاده


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

! Define variables
int power1, power2, totalPower;

! Assign values
power1 = 100;
power2 = 150;

! Calculate total power
totalPower = power1 + power2;

! Display result
printf('Total Power = %d MW', totalPower);

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

ساختار برنامه:
Comment

Variable Definition

Assignment

Expression

Result

Output

این الگو را در بسیاری از برنامه‌های آینده نیز خواهیم دید.

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

⭐️ قانون طلایی
‌‏Variable یک نام برای نگهداری و استفاده مجدد از یک مقدار در برنامه است.


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

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

📌 مقداردهی و تغییر مقدار Variable
در پست قبلی با مفهوم Variable آشنا شدیم و دیدیم که متغیر محلی برای نگهداری یک مقدار است.
اما یک سؤال مهم وجود دارد:
🔹 چگونه یک مقدار را داخل Variable قرار دهیم و بعداً مقدار آن را تغییر دهیم؟

پاسخ این سؤال در مفهوم Assignment یا مقداردهی قرار دارد.

🔹 ‏Assignment چیست؟
وقتی یک مقدار را به یک Variable نسبت می‌دهیم، در حال انجام Assignment هستیم.

ساختار کلی:
Variable = Value;

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

int power;

power = 100;

printf('Power = %d MW', power);

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

در اینجا:
power = 100;

یعنی:
مقدار

100
را در Variable به نام

power
قرار بده.


🔹 ‏Assignment شامل دو طرف است
به این Statement دقت کنید:
power = 100;

سمت چپ:
power

‏Variable است.
سمت راست:
100

مقداری است که قرار است در Variable قرار بگیرد.
بنابراین:
        Assignment

┌──────┴──────┐
↓ ↓
Variable Value
power 100


🔹 مقدار Variable قابل تغییر است
همان‌طور که گفتیم، Variable یک مقدار ثابت نیست.
مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int power;

power = 100;
printf('Power = %d MW', power);

power = 200;
printf('Power = %d MW', power);

power = 350;
printf('Power = %d MW', power);

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

خروجی:
Power = 100 MW
Power = 200 MW
Power = 350 MW

یعنی مقدار Variable در طول اجرای برنامه تغییر کرده است:
power = 100

power = 200

power = 350


🔹 مقداردهی می‌تواند با یک Expression انجام شود
مقدار سمت راست = الزاماً یک عدد ثابت نیست.
می‌توانیم یک Expression داشته باشیم.
مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int power1, power2, totalPower;

power1 = 100;
power2 = 150;

totalPower = power1 + power2;

printf('Total Power = %d MW', totalPower);

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

در اینجا:
totalPower = power1 + power2;

سمت راست:
power1 + power2

یک Expression است.
ابتدا Expression محاسبه می‌شود:
100 + 150 = 250

سپس نتیجه در totalPower قرار می‌گیرد:
totalPower = 250


🔹 مقداردهی یک Variable با Variable دیگر

می‌توان مقدار یک Variable را در Variable دیگری قرار داد.
مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int power1, power2;

power1 = 250;
power2 = power1;

printf('Power 1 = %d MW', power1);
printf('Power 2 = %d MW', power2);

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

در اینجا ابتدا:
power1 = 250

و سپس:
power2 = power1

بنابراین مقدار 250 در power2 نیز قرار می‌گیرد.

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

int power1, power2;

power1 = 250;
power2 = power1;

power1 = 500;

printf('Power 1 = %d MW', power1);
printf('Power 2 = %d MW', power2);

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

در اینجا بعد از اجرای:
power2 = power1;

مقدار 250 در power2 قرار گرفته است.
بعداً:
power1 = 500;

باعث تغییر power2 نمی‌شود.
نتیجه:
Power 1 = 500 MW
Power 2 = 250 MW


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

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

🔹 مقداردهی می‌تواند مرحله‌ای باشد

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

int power1, power2, power3, totalPower;

power1 = 100;
power2 = 200;
power3 = 300;

totalPower = power1;
totalPower = totalPower + power2;
totalPower = totalPower + power3;

printf('Total Power = %d MW', totalPower);

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

مقدار totalPower به ترتیب تغییر می‌کند:
totalPower = 100

totalPower = 100 + 200
= 300

totalPower = 300 + 300
= 600

در نتیجه:
Total Power = 600 MW


🔹 ‏Assignment با عملگرهای ریاضی

در Assignment می‌توانیم از Expressionهای مختلف استفاده کنیم.
مثلاً:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int value;

value = 100;
value = value + 20;

printf('Value = %d', value);

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

ابتدا:
value = 100

سپس:
value = value + 20

یعنی:
value = 100 + 20

و در نهایت:
value = 120


⚠️ یک اشتباه بسیار مهم
علامت = در Assignment به معنی «برابر بودن» در مفهوم ریاضی نیست.
در این دستور:
power = 100;

ما نمی‌گوییم:
‏power از نظر ریاضی برابر 100 است.

بلکه می‌گوییم:
مقدار 100 را در Variable به نام Power قرار بده.

در نتیجه = را در این مرحله بهتر است عملگر مقداردهی در نظر بگیریم.
مقایسه‌ها و عملگرهای مقایسه‌ای را در بخش مربوط به Operatorها بررسی خواهیم کرد.

🔹 ترتیب اجرای Assignmentها مهم است
به این مثال توجه کنید:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int value, result;

value = 10;
result = value + 5;

printf('Result = %d', result);

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

ابتدا:
value = 10

سپس:
result = value + 5

بنابراین:
result = 15

اما اگر ترتیب را اشتباه کنیم، نتیجه مورد انتظار را نخواهیم داشت.
مثلاً در برنامه‌های واقعی باید قبل از استفاده از یک Variable، مطمئن شویم مقدار مناسبی در آن قرار گرفته است.

🔥 ‏Assignment در پروژه‌های PowerFactory
حالا این مفهوم ساده را به کاربردهای واقعی DPL نزدیک کنیم.
فرض کنید در آینده مقدار Loading یک تجهیز را از PowerFactory دریافت کرده‌ایم و در یک Variable ذخیره می‌کنیم.

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

Attribute

Value

Variable

Analysis

مثلاً:
Line

Loading

loading

loading > 100

Overload

در اینجا Assignment یکی از مراحل اصلی پردازش اطلاعات خواهد بود.

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

@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 ادامه سطح 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