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

ارتباط با ما:
👥 @ElectricalDocumentAdmin
Download Telegram
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 سطح 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
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 ادامه سطح 1 - بخش 15 🔰 🔹 یک مثال واقعی‌تر فرض کنید می‌خواهیم نام تمام خطوط شبکه را چاپ کنیم: ! =================================== ! Telegram: @PowerFactoryDIgSILENT ! =================================== set Lines; object Line; Lines = GetCalcRelev…
🎯 تمرین شماره 15

بدون استفاده از مثال خطوط این پست، یک Script بنویسید که:
مجموعه‌ای از ترانسفورماتورهای دو سیم‌پیچه را پیدا کند.
تعداد آن‌ها را نمایش دهد.
با استفاده از First() و Next() روی آن‌ها پیمایش کند.
نام هر ترانسفورماتور را چاپ کند.

🎯 نکته
این بار فقط کد را کپی نکنید.
خودتان این زنجیره را بسازید:
Transformer Objects

Set

Count

Loop

Current Object

loc_name


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

📌 توابع پایه ریاضی در DPL
در این بخش با اولین گروه از توابع ریاضی در DPL آشنا می‌شویم؛ توابعی که در پردازش نتایج، محاسبات مهندسی و اتوماسیون مطالعات سیستم قدرت بسیار کاربردی هستند.

👈 توابع این بخش
abs()
ceil()
floor()
frac()
max()
min()
modulo()
round()
trunc()

در این پیام، سه تابع اول را بررسی می‌کنیم:

1️⃣ ‏()abs — قدرمطلق

تابع ()abs قدرمطلق یک مقدار را محاسبه می‌کند.

ورودی
x → مقدار عددی
خروجی
قدر مطلق مقدار x

مثال ساده
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double x;
double result;

x = -15.7;
result = abs(x);

printf('Absolute value = %.2f', result);

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

خروجی:
15.70

⚡️ مثال سیستم قدرت
فرض کنید ولتاژ یک باس 0.94 pu و ولتاژ مرجع 1.00 pu است و می‌خواهیم مقدار انحراف ولتاژ را بدون توجه به علامت محاسبه کنیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double U;
double Uref;
double deviation;

U = 0.94;
Uref = 1.00;

deviation = abs(U - Uref);

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

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

نتیجه:
Voltage deviation = 0.060 pu


📌 نکته: اگر علامت اختلاف برای تحلیل مهم باشد، نباید از abs() استفاده کنیم؛ زیرا علامت را حذف می‌کند.

2️⃣ ‏()ceil — گرد کردن به بالا
تابع ()ceil کوچک‌ترین عدد صحیح بزرگ‌تر یا مساوی مقدار ورودی را برمی‌گرداند.

ورودی
x → مقدار عددی
خروجی
کوچک‌ترین عدد صحیح بزرگ‌تر یا مساوی x

مثال ساده
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double x;
double result;

x = 4.2;
result = ceil(x);

printf('Result = %.0f', result);

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

نتیجه:
5


⚡️ مثال سیستم قدرت
فرض کنید بار یک پست 83MVA است و ظرفیت هر ترانسفورماتور 25MVA است.
برای اینکه تعداد ترانسفورماتورها را به عدد صحیحی برسانیم که ظرفیت کل کمتر از بار نباشد:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double load;
double transformerCapacity;
double numberOfTransformers;

load = 83.0;
transformerCapacity = 25.0;

numberOfTransformers = ceil(load / transformerCapacity);

printf('Required transformers = %.0f',
numberOfTransformers);

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

نتیجه:
Required transformers = 4

📌 چون 3 ترانس فقط 75MVA ظرفیت ایجاد می‌کنند و برای 83MVA کافی نیستند.

3️⃣ ‏()floor — گرد کردن به پایین
تابع ()floor بزرگ‌ترین عدد صحیح کوچک‌تر یا مساوی مقدار ورودی را برمی‌گرداند.

ورودی
x → مقدار عددی
خروجی
بزرگ‌ترین عدد صحیح کوچک‌تر یا مساوی x

مثال ساده
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double x;
double result;

x = 4.8;
result = floor(x);

printf('Result = %.0f', result);

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

نتیجه:
4

⚡️ مثال سیستم قدرت
فرض کنید ظرفیت هر واحد ترانسفورماتور 25 MVA و بار 87 MVA است. اگر بخواهیم تعداد واحدهای کامل 25 مگاولت‌آمپری موجود در این مقدار را به دست آوریم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double load;
double transformerCapacity;
double completeUnits;

load = 87.0;
transformerCapacity = 25.0;

completeUnits = floor(load / transformerCapacity);

printf('Complete units = %.0f',
completeUnits);

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

نتیجه:
Complete units = 3


🔎 تفاوت ()ceil و ()floor
برای مقدار 4.8:
ceil(4.8) = 5
floor(4.8) = 4

پس به‌صورت ساده:
ceil() → گرد کردن به سمت بالا
floor() → گرد کردن به سمت پایین

#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق
@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 سطح 1 - بخش 16 🔰 📌 توابع پایه ریاضی در DPL در این بخش با اولین گروه از توابع ریاضی در DPL آشنا می‌شویم؛ توابعی که در پردازش نتایج، محاسبات مهندسی و اتوماسیون مطالعات سیستم قدرت بسیار کاربردی هستند. 👈 توابع این بخش abs() ceil() floor() frac() max() min()…
🔰 ادامه سطح 1 - بخش 16 🔰

4️⃣ ‏()frac — بخش کسری
تابع ()frac برای به‌دست‌آوردن بخش کسری یک مقدار استفاده می‌شود.
ورودی
x → مقدار عددی
خروجی
بخش کسری مقدار x

مثال ساده
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double x;
double result;

x = 7.35;
result = frac(x);

printf('Fractional part = %.2f', result);

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

نتیجه مورد انتظار:
Fractional part = 0.35


⚡️ مثال سیستم قدرت
فرض کنید یک محاسبه، تعداد تقریبی پله‌های موردنیاز یک تجهیز را برابر 6.35 نشان داده است. با ()frac می‌توان بخش اعشاری این مقدار را جدا کرد:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double requiredSteps;
double fractionalPart;

requiredSteps = 6.35;

fractionalPart = frac(requiredSteps);

printf('Required steps = %.2f', requiredSteps);
printf('Fractional part = %.2f', fractionalPart);

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


📌 نکته: در مستندات برخی نسخه‌های PowerFactory، توضیح خروجی ()frac به‌صورت ناسازگار با تعریف رایج این تابع درج شده است. بنابراین اگر در پروژه از این تابع استفاده می‌کنید، رفتار آن را در نسخه PowerFactory خودتان یک‌بار تست کنید.

5️⃣ ()‏max — بیشینه دو مقدار
تابع ()max مقدار بزرگ‌تر بین دو ورودی را برمی‌گرداند.

ورودی
x → مقدار اول
y → مقدار دوم
خروجی
بزرگ‌ترِ x و y

مثال ساده
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double x;
double y;
double result;

x = 12.5;
y = 18.7;

result = max(x, y);

printf('Maximum = %.2f', result);

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

نتیجه:
Maximum = 18.70


⚡️ مثال سیستم قدرت
فرض کنید جریان دو فیدر را از نتایج مطالعه داریم و می‌خواهیم بیشترین جریان را مشخص کنیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double I1;
double I2;
double Imax;

I1 = 425.0;
I2 = 510.0;

Imax = max(I1, I2);

printf('Maximum feeder current = %.1f A', Imax);

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

نتیجه:
Maximum feeder current = 510.0 A

📌 در یک اسکریپت واقعی DPL می‌توان این منطق را روی نتایج چندین تجهیز اعمال کرد تا بیشترین جریان، بیشترین بارگذاری یا بیشترین انحراف ولتاژ شناسایی شود.

6️⃣ ()‏min — کمینه دو مقدار
تابع ()min مقدار کوچک‌تر بین دو ورودی را برمی‌گرداند.
ورودی
x → مقدار اول
y → مقدار دوم
خروجی
کوچک‌ترِ x و y

مثال ساده
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double x;
double y;
double result;

x = 12.5;
y = 18.7;

result = min(x, y);

printf('Minimum = %.2f', result);

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

نتیجه:
Minimum = 12.50


⚡️ مثال سیستم قدرت
فرض کنید ولتاژ دو باس را داریم و می‌خواهیم پایین‌ترین ولتاژ را مشخص کنیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double U1;
double U2;
double Umin;

U1 = 0.98;
U2 = 0.93;

Umin = min(U1, U2);

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

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

نتیجه:
Minimum voltage = 0.930 pu

📌 این منطق در اسکریپت‌های ارزیابی شبکه می‌تواند برای پیدا کردن ضعیف‌ترین باس از نظر ولتاژ استفاده شود.

🧠 جمع‌بندی
frac(x)
استخراج بخش کسری
max(x,y)
انتخاب مقدار بزرگ‌تر
min(x,y)
انتخاب مقدار کوچک‌تر

#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق
@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 ادامه سطح 1 - بخش 16 🔰 4️⃣ ‏()frac — بخش کسری تابع ()frac برای به‌دست‌آوردن بخش کسری یک مقدار استفاده می‌شود. ورودی x → مقدار عددی خروجی بخش کسری مقدار x مثال ساده ! =================================== ! Telegram: @PowerFactoryDIgSILENT ! ==========…
🔰 ادامه سطح 1 - بخش 16 🔰

7️⃣ ‏()modulo — باقی‌مانده تقسیم
تابع ()modulo باقی‌مانده تقسیم یک عدد بر عدد دیگر را محاسبه می‌کند.

ورودی
x → عدد اول
y → عدد دوم یا مقسوم‌علیه
خروجی
باقی‌مانده تقسیم x بر y

مثال ساده
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double result;

result = modulo(17, 5);

printf('17 modulo 5 = %.0f', result);

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

خروجی:
17 modulo 5 = 2


⚡️ مثال سیستم قدرت
فرض کنید در یک مطالعه، 20 سناریوی مختلف داریم و می‌خواهیم بعد از هر 5 سناریو یک عملیات خاص انجام دهیم.
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

int i;

for (i = 1; i <= 20; i += 1) {

if (modulo(i, 5) == 0) {
printf('Checkpoint reached at scenario %d', i);
}

}

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


در این حالت، شرط برای سناریوهای زیر برقرار می‌شود:
5 → 10 → 15 → 20


📌 ‏()modulo در حلقه‌ها برای ایجاد الگوهای تکرارشونده بسیار کاربردی است.

8️⃣ ()‏round — گرد کردن
تابع ()round مقدار ورودی را به نزدیک‌ترین عدد صحیح گرد می‌کند.
ورودی
x → مقدار عددی
خروجی
نزدیک‌ترین عدد صحیح به x

مثال ساده
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double x;
double result;

x = 7.6;

result = round(x);

printf('Rounded value = %.0f', result);

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

نتیجه:
Rounded value = 8


⚡️ مثال سیستم قدرت
فرض کنید در یک محاسبه، تعداد تقریبی پله‌های موردنیاز یک بانک خازنی 7.6 به دست آمده است:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double requiredSteps;
double steps;

requiredSteps = 7.6;

steps = round(requiredSteps);

printf('Required capacitor steps = %.0f', steps);

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

نتیجه:
Required capacitor steps = 8


⚠️ تفاوت با ()ceil
این دو تابع را با هم اشتباه نگیریم:


ceil(7.2) → 8

round(7.2) → 7

‏()ceil همیشه به سمت بالا می‌رود، اما ()round نزدیک‌ترین عدد صحیح را انتخاب می‌کند.

9️⃣ ‏()trunc — حذف بخش اعشاری
تابع trunc() بخش اعشاری عدد را حذف می‌کند و قسمت صحیح آن را برمی‌گرداند.
ورودی
x → مقدار عددی
خروجی
قسمت صحیح مقدار x

مثال ساده
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double x;
double result;

x = 7.89;

result = trunc(x);

printf('Truncated value = %.0f', result);

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

نتیجه:
Truncated value = 7


⚡️ مثال سیستم قدرت
فرض کنید نسبت ظرفیت محاسبه‌شده برای چند واحد تجهیز برابر 5.87 است و فقط تعداد واحدهای کامل برایمان اهمیت دارد:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double capacityRatio;
double completeUnits;

capacityRatio = 5.87;

completeUnits = trunc(capacityRatio);

printf('Complete units = %.0f', completeUnits);

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

نتیجه:
Complete units = 5

🔎 مقایسه سه تابع
اگر مقدار ورودی 7.6 باشد:

ceil(7.6) = 8

گرد کردن به بالا

round(7.6) = 8

نزدیک‌ترین عدد صحیح

trunc(7.6) = 7

حذف بخش اعشاری

🧠 جمع‌بندی بخش 16
در این بخش با 9 تابع پایه ریاضی DPL آشنا شدیم:

abs() → قدرمطلق
ceil() → گرد کردن به بالا
floor() → گرد کردن به پایین
frac() → بخش کسری
max() → بیشینه
min() → کمینه
modulo() → باقی‌مانده تقسیم
round() → نزدیک‌ترین عدد صحیح
trunc() → حذف بخش اعشاری

📌 این توابع از پایه‌ای‌ترین ابزارهای DPL برای انجام محاسبات و پردازش نتایج مطالعات سیستم قدرت هستند.

#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق
@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 ادامه سطح 1 - بخش 16 🔰 7️⃣ ‏()modulo — باقی‌مانده تقسیم تابع ()modulo باقی‌مانده تقسیم یک عدد بر عدد دیگر را محاسبه می‌کند. ورودی x → عدد اول y → عدد دوم یا مقسوم‌علیه خروجی باقی‌مانده تقسیم x بر y مثال ساده ! =================================== ! Telegram:…
🎯 تمرین شماره 16

بدون استفاده از مثال‌های خود این پست، یک Script بنویسید که:
مقدار بار یک ترانسفورماتور را بر اساس توان ظاهری و ظرفیت نامی آن محاسبه کند.
با استفاده از ()ceil تعداد ترانسفورماتورهای موردنیاز برای تأمین بار را به دست آورد.
با استفاده از ()round مقدار بارگذاری را به نزدیک‌ترین عدد صحیح گرد کند.
با استفاده از ()abs میزان اختلاف بارگذاری با مقدار مرجع 80% را محاسبه کند.
با استفاده از ()max و ()min بیشترین و کمترین مقدار بارگذاری را بین چند مقدار مشخص پیدا کند.
با استفاده از ()modulo مشخص کند کدام شماره‌های سناریو مضرب 5 هستند.
با استفاده از ()trunc بخش صحیح یک نسبت محاسباتی را استخراج کند.

🎯 نکته
هدف تمرین فقط استفاده از چند تابع به‌صورت جداگانه نیست؛ سعی کنید چند تابع را در یک محاسبه ترکیب کنید.

⚠️ محدودیت: در این تمرین از توابعی که هنوز آموزش نداده‌ایم استفاده نکنید.

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

📌 توان و ریشه در DPL
در این بخش با سه تابع مهم برای انجام محاسبات توان و ریشه در DPL آشنا می‌شویم:
pow()
sqr()
sqrt()
این توابع در محاسبات مهندسی سیستم قدرت، به‌خصوص در محاسبات توان، امپدانس، جریان، ولتاژ و کمیت‌های فازوری کاربرد زیادی دارند.

1️⃣ ‏()pow — توان
تابع pow() مقدار x را به توان y می‌رساند.
ورودی
x → پایه
y → توان
خروجی
مقدار

مثال ساده
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double x;
double y;
double result;

x = 2.0;
y = 5.0;

result = pow(x, y);

printf('%.1f ^ %.1f = %.1f', x, y, result);

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

خروجی:
2.0 ^ 5.0 = 32.0


⚡️ مثال سیستم قدرت
در محاسبات سیستم قدرت، توان ظاهری سه‌فاز از رابطه زیر به دست می‌آید:
S = √3 × V × I

همچنین برای محاسبه مربع یک کمیت، می‌توان از ()pow استفاده کرد.
فرض کنید ولتاژ فاز 230kV و جریان 500A باشد و بخواهیم مقدار را محاسبه کنیم:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double U;
double U2;

U = 230.0;

U2 = pow(U, 2.0);

printf('U = %.1f kV', U);
printf('U^2 = %.1f kV^2', U2);

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

👈 ‏()pow زمانی مفید است که توان موردنظر یک مقدار ثابت یا متغیر باشد.

2️⃣ ‏()sqr — مربع
تابع ()sqr مربع مقدار ورودی را محاسبه می‌کند.
ورودی
x → مقدار عددی
خروجی


مثال ساده
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double x;
double result;

x = 7.0;

result = sqr(x);

printf('Square of %.1f = %.1f', x, result);

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

خروجی:
Square of 7.0 = 49.0


⚡️ مثال سیستم قدرت
یکی از کاربردهای مهم مربع در سیستم قدرت، محاسبه تلفات اهمی است:
P_loss = I² × R

فرض کنید جریان یک خط 500A و مقاومت آن 0.08Ω باشد:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double I;
double R;
double Ploss;

I = 500.0;
R = 0.08;

Ploss = sqr(I) * R;

printf('Line loss = %.1f W', Ploss);

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


نتیجه:
Line loss = 20000.0 W

یعنی:
20kW

📌 در اینجا sqr(I) مستقیماً برای محاسبه استفاده شده است.

3️⃣ ‏()sqrt — ریشه دوم
تابع ()sqrt ریشه دوم یک مقدار را محاسبه می‌کند.
ورودی
x → مقدار عددی
خروجی
ریشه دوم x

مثال ساده
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double x;
double result;

x = 81.0;

result = sqrt(x);

printf('sqrt(%.1f) = %.1f', x, result);

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

خروجی:
sqrt(81.0) = 9.0

⚡️ مثال سیستم قدرت
اگر یک فازور به صورت:
Z = R + jX

باشد، اندازه آن از رابطه زیر به دست می‌آید:
|Z| = √(R² + X²)

مثلاً:
R = 3 Ω
X = 4 Ω

بنابراین:
|Z| = 5 Ω

در DPL:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double R;
double X;
double Z;

R = 3.0;
X = 4.0;

Z = sqrt(sqr(R) + sqr(X));

printf('Impedance magnitude = %.2f Ohm', Z);

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

نتیجه:
Impedance magnitude = 5.00 Ohm

📌 این مثال نشان می‌دهد چگونه می‌توان چند تابع DPL را با یکدیگر ترکیب کرد:
R و X

sqr()

جمع مربعات

sqrt()

|Z|


🔎 تفاوت ()pow و ()sqr
هر دو می‌توانند مربع یک مقدار را محاسبه کنند:
pow(x, 2)

و:
sqr(x)

اما وقتی هدف مشخصاً مربع کردن است، استفاده از ()sqr ساده‌تر و خواناتر است.
در مقابل، زمانی که توان متغیر باشد، ()pow انتخاب مناسب‌تری است:
result = pow(x, n);


🧠 جمع‌بندی
pow(x,y)
محاسبه

sqr(x)
محاسبه

sqrt(x)
محاسبه x√

این سه تابع از ابزارهای مهم DPL برای انجام محاسبات ریاضی در اسکریپت‌های مهندسی هستند.

#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق
@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 سطح 1 - بخش 17 🔰 📌 توان و ریشه در DPL در این بخش با سه تابع مهم برای انجام محاسبات توان و ریشه در DPL آشنا می‌شویم: pow() sqr() sqrt() این توابع در محاسبات مهندسی سیستم قدرت، به‌خصوص در محاسبات توان، امپدانس، جریان، ولتاژ و کمیت‌های فازوری کاربرد زیادی…
🎯 تمرین شماره 17

یک سیستم سه‌فاز متعادل را در نظر بگیرید که:
ولتاژ خط به خط: V = 132 kV
توان اکتیو: P = 75 MW
ضریب توان: PF = 0.85
مقاومت معادل هر فاز: R = 0.12 Ω

یک Script بنویسید که موارد زیر را حساب کند:
S = P / PF

I = S / (√3 × V)

P_loss = 3 × I² × R

%Loss = (P_loss / P) × 100
تمام مقادیر محاسبه‌شده را با واحد مناسب چاپ کنید.

👈 نکته
در این تمرین فقط به خود توابع فکر نکنید؛ سعی کنید زنجیره محاسبات یک مطالعه بار ساده در شبکه سه‌فاز را بسازید:
P + PF

S

I



P_loss

%Loss


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

📌 توابع لگاریتمی و نمایی در DPL
در این بخش با سه تابع زیر آشنا می‌شویم:
exp()
ln()
log()

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

1️⃣ ‏()exp — تابع نمایی
تابع ()exp مقدار e را به توان x می‌رساند.
ورودی
x → توان عدد e
🔹 این آرگومان اختیاری است و اگر وارد نشود، مقدار پیش‌فرض آن 1 است.
خروجی
مقدار:


مثال ساده
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double x;
double result;

x = 2.0;

result = exp(x);

printf('exp(%.1f) = %.4f', x, result);

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

نتیجه تقریباً:
exp(2) = 7.3891


⚡️ مثال سیستم قدرت
رفتار برخی کمیت‌های مهندسی را می‌توان با مدل نمایی نمایش داد. برای مثال، فرض کنید یک کمیت با رابطه زیر تغییر می‌کند:
y = y0 × e^(-t/T)

این نوع رابطه در مدل‌سازی پاسخ گذرا و کاهش نمایی دیده می‌شود.
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double y0;
double t;
double T;
double y;

y0 = 1.0;
t = 0.5;
T = 0.2;

y = y0 * exp(-t / T);

printf('y = %.4f', y);

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

📌 نکته: در این مثال ()exp برای ایجاد بخش نمایی مدل استفاده شده است.

2️⃣ ‏()ln — لگاریتم طبیعی
تابع ()ln لگاریتم طبیعی یک مقدار را محاسبه می‌کند.
مبنای لگاریتم طبیعی عدد e است.
ورودی
x → مقدار مثبت
خروجی
ln(x)

مثال ساده
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double x;
double result;

x = 10.0;

result = ln(x);

printf('ln(%.1f) = %.4f', x, result);

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

نتیجه تقریباً:
ln(10) = 2.3026


⚡️ مثال سیستم قدرت
یکی از کاربردهای لگاریتم طبیعی در مهندسی برق، حل روابط نمایی است.
اگر رابطه‌ای به شکل زیر داشته باشیم:
y = eˣ

برای به‌دست‌آوردن x می‌توانیم از ()ln استفاده کنیم:
x = ln(y)

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

double y;
double x;

y = 5.0;

x = ln(y);

printf('x = %.4f', x);

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

👈 بنابراین ()ln در واقع می‌تواند عملیات معکوس ()exp را انجام دهد.

#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق
@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 سطح 1 - بخش 18 🔰 📌 توابع لگاریتمی و نمایی در DPL در این بخش با سه تابع زیر آشنا می‌شویم: exp() ln() log() این توابع در محاسبات مهندسی، مدل‌سازی رفتارهای نمایی و برخی محاسبات مرتبط با سیستم‌های قدرت و تجهیزات الکتریکی کاربرد دارند. 1️⃣ ‏()exp — تابع نمایی…
🔰 ادامه سطح 1 - بخش 18 🔰

3️⃣ ()‏log — لگاریتم پایه 10

تابع ()log لگاریتم یک مقدار را با پایه 10 محاسبه می‌کند.
ورودی
x → مقدار مثبت
خروجی
log₁₀(x)

مثال ساده
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double x;
double result;

x = 1000.0;

result = log(x);

printf('log10(%.1f) = %.1f', x, result);

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

نتیجه:
log10(1000) = 3


⚡️ مثال سیستم قدرت
یکی از کاربردهای بسیار مهم لگاریتم پایه 10 در مهندسی برق، تبدیل کمیت‌ها به مقیاس لگاریتمی است.
برای مثال در محاسبات دسی‌بل:
dB = 20 × log₁₀(V₂/V₁)

می‌توان از ()log استفاده کرد:
! ===================================
! Telegram: @PowerFactoryDIgSILENT
! ===================================

double V1;
double V2;
double dB;

V1 = 1.0;
V2 = 2.0;

dB = 20.0 * log(V2 / V1);

printf('Voltage ratio = %.2f', V2 / V1);
printf('Level = %.2f dB', dB);

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

نتیجه تقریباً:
Level = 6.02 dB


🔎 تفاوت ()ln و ()log
این دو تابع را نباید با هم اشتباه گرفت:
‎مثال -------------- پا---------- تابع
ln(x) ------- e ------- ln(10) ≈ 2.3026
log(x) ------- 10 ------- log(1000) = 3


📌 در DPL
ln() → لگاریتم طبیعی
log() → لگاریتم پایه 10

⚠️ نکات و محدودیت‌ها
🔸 آرگومان ln() و log() باید در محدوده مجاز تابع قرار داشته باشد؛ برای مقادیر حقیقی، مقدار ورودی باید مثبت باشد.
🔸 exp(x) برای مقادیر بسیار بزرگ می‌تواند باعث Overflow عددی شود.
🔸 هنگام استفاده از روابط نمایی و لگاریتمی در محاسبات مهندسی، واحدها و مقیاس کمیت‌ها را به‌درستی بررسی کنید.

🧠 جمع‌بندی
exp(x)
محاسبه
ln(x)
لگاریتم طبیعی
log(x)
لگاریتم پایه 10

#سطح_1
#DIgSILENT #PowerFactory #DPL #PowerSystems #مهندسی_برق
@PowerFactoryDIgSILENT
𝐏𝐨𝐰𝐞𝐫𝐅𝐚𝐜𝐭𝐨𝐫𝐲 𝐃𝐈𝐠𝐒𝐈𝐋𝐄𝐍𝐓 | آموزش نرم افزار دیگسایلنت پاورفکتوری
🔰 ادامه سطح 1 - بخش 18 🔰 3️⃣ ()‏log — لگاریتم پایه 10 تابع ()log لگاریتم یک مقدار را با پایه 10 محاسبه می‌کند. ورودی x → مقدار مثبت خروجی log₁₀(x) مثال ساده ! =================================== ! Telegram: @PowerFactoryDIgSILENT ! ===================…
🎯 تمرین شماره 18

در یک خط انتقال، مقدار یک کمیت در طول خط به‌صورت نمایی کاهش می‌یابد.
فرض کنید مقدار اولیه کمیت 100 بوده و پس از طی مسافت 80 km به 40 رسیده است.

یک Script بنویسید که:
مقدار ثابت کاهش α را از رابطه زیر به دست آورد:
V(x) = V₀ × e^(-αx)

و سپس مقدار کمیت را در فاصله 120km پیش‌بینی کنید.
و در ادامه زیر را نیز محاسبه کنید:
20 × log₁₀(V₀ / V120)

مقدار α، مقدار پیش‌بینی‌شده در 120km و مقدار دسی‌بل را نمایش دهید.

🎯 نکته
اینجا قرار نیست فقط سه تابع را جداگانه امتحان کنید؛ باید از آن‌ها برای حل یک مدل واقعی مهندسی استفاده کنید:
مقدار اولیه + مقدار اندازه‌گیری‌شده

ln()

استخراج ضریب کاهش α

exp()

پیش‌بینی مقدار جدید

log()

بیان کاهش در مقیاس dB


💡 مفهوم جدیدی که در این تمرین یاد می‌گیرید:
مدل‌های نمایی کاهش کمیت‌ها و ارتباط آن‌ها با مقیاس لگاریتمی و dB.
⚠️ هدف تمرین این نیست که فرمول‌ها را عیناً کپی کنید؛ ابتدا روابط مهندسی را روی کاغذ بنویسید و سپس آن‌ها را با توابع DPL پیاده‌سازی کنید.

#تمرین_سطح_1
#تمرین