close

Вход

Забыли?

вход по аккаунту

?

записка (2)

код для вставкиСкачать
СОДЕРЖАНИЕ
ВВЕДЕНИЕ......................................................................................................5 1. ТЕХНИЧЕСКОЕ ЗАДАНИЕ..............................................................................6
1.1. Назначение и область применения программного продукта....................................6
1.2. Основание для разработки программного продукта..............................................6
1.3. Источники входной информации.....................................................................6
1.4. Выходная информация..................................................................................6
1.5. Методы решения задачи.................................................................................7
1.5.1. Методы поиска информации, применяемые для разрабатываемого программного продукта...................................................................................................................9
1.5.2. Расчётные формулы для получения промежуточных результатов...........................9
1.5.3. Описание методики решения задачи..............................................................11
1.6. Требования к программному продукту.............................................................12
1.6.1. Требования к конфигурации электронно-вычислительных средств.......................12
1.6.2. Требования к операционной системе.............................................................12
1.6.3. Требования к языку программирования.........................................................12
2. РАЗРАБОТКА ПРОГРАММНОГО ПРОДУКТА...................................................13
2.1. Постановка задачи.......................................................................................13
2.1.1. Разработка структуры входных данных.........................................................13
2.1.2. Разработка диаграмм.................................................................................13
2.1.3. Построение связей между объектами............................................................16
2.1.4. Создание программных модулей...................................................................17
2.2. Пример контрольного теста...........................................................................19
3. ЭКОНОМИЧЕСКАЯ ЧАСТЬ...........................................................................31
3.1. Обоснование сметной себестоимости программного обеспечения (ПО)....................31
3.1.1. Определение трудоемкости разработки ПО......................................................31
3.2. Определение стоимости машинного времени....................................................32
3.2.1. Исходная информация...............................................................................32
3.2.2. Определение стоимости потребляемой электроэнергии, руб...............................33
3.2.3. Определение суммы амортизационных отчислений, руб....................................33
3.2.4. Определяем затраты на текущий ремонт оборудования, руб................................33
3.2.5. Расчет затрат на 1 машино-час...........................................................................................33
3.2.6. Расчет стоимости машинного времени, руб...................................................333.3. Определение себестоимости программного обеспечения (ПО), как базы для формирования цены..................................................................................................34
3.3.1. Затраты на материалы................................................................................35
3.3.2. Расчет затрат на оплату труда......................................................................36
3.3.3. Расчет себестоимости программного обеспечения............................................37
ЗАКЛЮЧЕНИЕ...............................................................................................39
ЛИТЕРАТУРА................................................................................................40
ПРИЛОЖЕНИЕ 1. Исходный текст программы.......................................................41
ПРИЛОЖЕНИЕ 2. Структурная схема программного продукта.................................114
ПРИЛОЖЕНИЕ 3. Блок-схема алгоритма работы основных расчётных модулей............115
ПРИЛОЖЕНИЕ 4. Распечатка контрольных тестов.................................................116
ПРИЛОЖЕНИЕ 5. Руководство пользователя........................................................117
ПРИЛОЖЕНИЕ 6. Протокол испытаний программного продукта..............................143
ВВЕДЕНИЕ
Программа для автоматизированного расчета параметров трехфазных электрических цепей предназначена для учебных и рабочих целей.
Трехфазная цепь является частным случаем многофазных систем электрических цепей, представляющих собой совокупность электрических цепей, в которых действуют синусоидальные электродвижущие силы одинаковой частоты, отличающиеся по фазе одна от другой и создаваемые общим источником энергии. Каждую из частей многофазной системы, характеризующуюся одинаковым током, принято называть фазой. Трехфазные цепи - наиболее распространенные в современной электроэнергетике. Это объясняется рядом их преимуществ по сравнению, как с однофазными, так и с другими многофазными цепями:
- экономичность производства и передачи энергии по сравнению с однофазными цепями;
- возможность сравнительно простого получения кругового вращающегося магнитного поля, необходимого для трехфазного асинхронного двигателя;
- возможность получения в одной установке двух эксплуатационных напряжений - фазного и линейного.
Трехфазный генератор (трансформатор) имеет три выходных обмотки, одинаковые по числу витков, но развивающие электродвижущие силы, сдвинутые по фазе на 1200. Можно было бы использовать систему, в которой фазы обмотки генератора не были бы гальванически соединены друг с другом. Это так называемая несвязная система. В этом случае каждую фазу генератора необходимо соединять с приемником двумя проводами, т.е. будет иметь место шестипроводная линия, что неэкономично. В этой связи подобные системы не получили широкого применения на практике. Для уменьшения количества проводов в линии фазы генератора гальванически связывают между собой. Различают два вида соединений: в "звезду" и в "треугольник". В свою очередь при соединении в "звезду" система может быть трехпроводной ("звезда" без нулевого провода) и четырехпроводной ("звезда" с нулевым проводом).
В трехфазной цепи могут иметь место два режима: симметричный и несимметричный. Расчет трехфазной цепи в симметричном режиме сводится к расчету одной фазы и производится аналогично расчету обычной цепи синусоидального переменного тока. При несимметричном режиме трехфазной цепи также может быть применен расчет обычной цепи синусоидального переменного тока.
В практике расчёта цепей переменного тока широко используются комплексные числа. Комплексными числами и векторами на комплексной плоскости изображаются изменяющиеся синусоидально электродвижущие силы, ток и напряжение, а также полные сопротивление и проводимость, полная мощность и некоторые другие параметры цепи. Использование комплексных чисел при расчете электрических цепей переменного тока позволяет заменить графические действия над векторами алгебраическими действиями над комплексными числами. В этом и заключается актуальность программы.
Продукт может применяться для анализа трехфазных цепей переменного тока по следующим схемам: "треугольник", "звезда" с нулевым проводом, "звезда" без нулевого провода - при реализации производственных задач в организациях, а также для решения задач по электротехническим дисциплинам в учреждениях образования любого уровня.
ТЕХНИЧЕСКОЕ ЗАДАНИЕ
Назначение и область применения программного продукта
Программа предназначена для автоматизации расчета трехфазных цепей переменного тока с использованием комплексных чисел. Применяется в организациях любой отрасли промышленности, содержащих на своем балансе электрические машины, а так же в учреждениях образования, учащиеся которых изучают электротехнические дисциплины.
Основание для разработки программного продукта
Задание на дипломное проектирование, согласно которому, целью проекта является разработка программы "Программа для автоматизированного расчета параметров трехфазной цепи", позволяющей рассчитывать трехфазные цепи переменного тока.
Источники входной информации
Тип трехфазной цепи: "треугольник", "звезда" с нулевым проводом и "звезда" без нулевого провода. Номинальное линейное напряжение, номинальная частота, сопротивления резисторов в фазах, сопротивление катушек индуктивности или индуктивность катушек в фазах, сопротивление конденсаторов или емкость конденсаторов в фазах. Количество ветвей в фазах, конфигурация соединения ветвей в фазах.
Выходная информация
Тип схемы - "треугольник": фазные сопротивления, фазные напряжения, фазные токи, линейные токи, активные фазные мощности, реактивные фазные мощности, полные фазные мощности, трехфазная активная мощность, трехфазная реактивная мощность и трехфазная полная мощность. Тип схемы - "звезда" без нулевого провода: фазные сопротивления, фазные напряжения, комплексы проводимых фаз нагрузки, напряжение между нейтральными точками приемника и источника питания, напряжения на зажимах, фазные токи, активные фазные мощности, реактивные фазные мощности, полные фазные мощности, трехфазная активная мощность, трехфазная реактивная мощность и трехфазная полная мощность. Тип схемы - "звезда" с нулевым проводом: фазные сопротивления, фазные напряжения, фазные токи, ток нулевого провода, активные фазные мощности, реактивные фазные мощности, полные фазные мощности, трехфазная активная мощность, трехфазная реактивная мощность и трехфазная полная мощность. Также векторные диаграммы линейных токов по фазам.
Методы решения задачи
Совокупность трехфазной системы электродвижущей силы и трехфазной нагрузки (или нагрузок и соединительных проводов) называют трехфазной цепью. Токи, протекающие по отдельным участкам трехфазной цепи, сдвинуты относительно друг друга по фазе. Под фазой трехфазной цепи понимают участок цепи, по которому протекает один и тот же ток. Три обмотки генератора должны быть соединены с нагрузкой. Существуют различные способы соединения обмоток. Самым неэкономичным способом было бы соединение каждой обмотки генератора с нагрузкой двумя проводами, на что потребовалось бы шесть соединительных проводов. В целях экономии обмотки трехфазного генератора соединяют в "звезду" или "треугольник", вследствие чего количество соединительных проводов от генератора к нагрузке уменьшается с шести до трех или до четырех.
Таким образом, в программе применены следующие методы решения поставленной задачи:
- При соединении "звездой" одноименные зажимы (например, концы) трех обмоток объединяются в один узел, который называют нулевой точкой генератора и обозначают буквой 0'. Начала обмоток генератора обозначают буквами А, В, С. Схема соединения "звезда" - "звезда" с нулевым проводом представлена на рис.1.1:
Рисунок 1.1 - Схема соединения "звезда" с нулевым проводом
Схема соединения "звезда" - "звезда" без нулевого провода представлена на рис.1.2:
Рисунок 1.2 - Схема соединения "звезда" без нулевого провода
Электоровижущиеся силы, наводимые в фазных обмотках генератора, напряжения на их зажимах, напряжения на фазах нагрузки и токи в них называются соответственно фазными электродвижущимися силами (EА , EВ , EС), напряжениями (UА , UВ , UС) и токами (IA , IB , IC).
Напряжения между линейными проводами и токи в них называются линейными напряжениями (UAB , UBC , UCA) и токами (IA , IB , IC).
- При соединении обмоток генератора "треугольником" конец первой обмотки генератора соединяется с началом второй, конец второй - с началом третьей, конец третьей - с началом первой. Схема "треугольник" представлена на рис.1.3:
Рисунок 1.3 - Схема соединения "треугольник" Токи, протекающие в фазах приемника, называются фазными (IАВ, IВС, IСА). Токи, протекающие в линейных проводах, которые соединяют генератор с приемником, называются линейными (IA, IB, IC).
1.5.1. Методы поиска информации, применяемые для разрабатываемого программного продукта
Методы поиска информации заключались в правильном понимании электрических схем, знании необходимых формул для расчета электрических цепей, а также использовании комплексных чисел.
1.5.2. Расчётные формулы для получения промежуточных результатов
Вычисление фазных токов в нагрузке осуществляется по закону Ома для участка цепи согласно формуле (1.1):
〖 I〗_ф= U_ф/Z_ф , (1.1)
где Uф - фазное напряжение на нагрузке (соответствующее линейное напряжение источника питания); Zф - полное сопротивление соответствующей фазы нагрузки.
Токи в линейных проводах определяют через фазные на основании первого закона Кирхгофа для каждого узла (точки a,b,c) схемы согласно формулам (1.2 - 1.4):
I_A=I_ab-I_ca ; (1.2) I_B=I_bc-I_ab ; (1.3)
I_C=I_ca-I_bc , (1.4)
где Iab, Ibc, Ica - фазные токи.
При соединении по схеме "треугольник" линейные напряжения равны геометрическим разностям соответствующих фазных напряжений согласно формулам (1.5 - 1.7):
〖 U〗_AB=U_A-U_B ; (1.5)
U_BC=U_B-U_C ; (1.6)
U_CA=U_C-U_A , (1.7)
где UAB, UBC, UCA - фазные напряжения. В трехфазной четырехпроводной цепи "звезда" с нулевым проводом ток в нейтральном проводе определяется на основании первого закона Кирхгофа согласно формуле (1.8):
〖 I〗_N= I_A+ I_B+ I_C , (1.8)
где IA, IB, IC - линейные токи.
При соединении по схеме "звезда" в соответствии со вторым законом Кирхгофа для линейных напряжений можно записать следующие формулы (1.9 - 1.11):
〖 U〗_AB=U_AN-U_BN ; (1.9)
U_BC=U_BN-U_CN ; (1.10)
U_CA=U_CN-U_AN , (1.11)
где UAN, UBN, UCN - фазные напряжения нагрузки. Расчет активной мощности в трехфазной цепи при несимметричной нагрузке определяется по формулам (1.12-1.14):
〖 P〗_A= U_A× I_A× 〖cosφ〗_A ; (1.12)
〖 P〗_B= U_B× I_B× 〖cosφ〗_B ; (1.13)
〖 P〗_C= U_C× I_C× 〖cosφ〗_C , (1.14)
где UA, UB, UC - фазное напряжение; IA, IB, IC - линейные токи;
φA, φB, φC - углы сдвига фаз между напряжением и током.
Активная мощность трехфазной цепи равна сумме активных мощностей отдельных фаз (1.15):
P= P_A+ P_B+ P_C , (1.15)
где PA, PB, PC - активные мощности; Расчет реактивной мощности в трехфазной цепи при несимметричной нагрузке определяется по формулам (1.16-1.18):
〖 Q〗_A= U_A× I_A× 〖sinφ〗_A ; (1.16)
〖 Q〗_B= U_B× I_B× 〖sinφ〗_B ; (1.17)
〖 Q〗_C= U_C× I_C× 〖sinφ〗_C , (1.18)
где UA, UB, UC - фазное напряжение; IA, IB, IC - линейные токи;
φA, φB, φC - углы сдвига фаз между напряжением и током.
Реактивная мощность соответственно равна алгебраической сумме реактивных мощностей отдельных фаз (1.19):
Q= Q_A+ Q_B+ Q_C , (1.19)
где QA, QB, QC - реактивные мощности; Полная мощность отдельных фаз определяется по формулам (1.20-1.22):
S_A= U_A× I_A ; (1.20)
〖 S〗_B= U_B× I_B ; (1.21)
〖 S〗_C= U_C× I_C , (1.22)
где UA, UB, UC - фазное напряжение; IA, IB, IC - линейные токи;
Полная мощность трехфазного приемника определяется по формуле (1.23):
S= √(P^2+ Q^2 ) , (1.23)
где P - трехфазная активная мощность ; Q - трехфазная реактивная мощность;
1.5.3. Описание методики решения задачи
В практике расчета цепей переменного тока широко используются комплексные числа.
Комплексными числами и векторами на комплексной плоскости изображаются изменяющиеся синусоидально электродвижущую силу, ток и напряжение, а также полные сопротивление и проводимость, полная мощность и некоторые другие параметры цепи.
Использование комплексных чисел при расчете электрических цепей переменного тока позволяет заменить графические действия над векторами алгебраическими действиями над комплексными числами. Кроме того, при использовании комплексных чисел возникает полная аналогия записей уравнений по законам Ома и Кирхгофа и методов расчета цепей переменного тока с цепями постоянного тока.
В цепях постоянного тока в уравнения входят действительные значения Е, U, I, r, в цепях переменного тока - комплексные значения U, E, I, Z.
Как известно из курса математики, комплексное число C = a + jb, где j= √-1, имеет две составляющие - действительную а и мнимую b, которые являются координатами точки на комплексной плоскости. Комплексная плоскость представляет собой прямоугольною систему координат. По одной оси, называемой действительной и обозначаемой ( + ), ( - ), откладывается действительная составляющая комплекса (a), по другой оси, называемой мнимой и обозначаемой (+j), (-j), - мнимая составляющая комплекса (b).
Комплексное число обозначается чертой под буквенным обозначением. Комплексное число может быть представлено вектором, длина которого является модулем комплекса, а положение определяется углом α относительно положительной действительной оси комплексной плоскости.
Выразив а и b через модуль (длину вектора) и угол, можно записать комплексное число в тригонометрической форме: С = а + jb = с cos α + jc sin α, где с = √а2 + b2 - модуль комплексного числа.
Согласно формуле Эйлера комплексное число можно записать в показательной форме:
С = сеjα, где e - основание натуральных логарифмов.
Требования к программному продукту
Программный продукт должен отвечать всем описанным требованиям.
Требования к конфигурации электронно-вычислительных средств
Наличие мышки, монитора, клавиатуры, DVD-ROM, USB- порт.
Требования к операционной системе
Операционная система Microsoft Windows 98.
Требования к языку программирования
Для написания программы использовался язык программирования С и среда разработки Embarcadero RAD Studio С++ Builder 2010.
РАЗРАБОТКА ПРОГРАММНОГО ПРОДУКТА
Постановка задачи
Программа должна содержать интерфейс, окошки, в которые вводятся числовые значения исходных данных для расчета. Выбор единиц измерения должен осуществляться из раскрывающего списка. При вычислениях используются единицы измерения в системе СИ. Результат расчета выводится в отдельное окно с текстовыми пояснениями и принятыми обозначениями расчетных величин.
По результатам расчета должны быть получены необходимые расчетные данные и векторные диаграммы токов.
Разработка структуры входных данных
Структура входных данных представлена в таблице 2.1
Таблица 2.1 - Структура входных данных
Имя поляТип поляРазмер поляОписаниеUлЧисловой3Номинальное линейное напряжениеFЧисловой3Номинальная частотаRiЧисловой3Сопротивление резисторов XLmЧисловой3Сопротивление катушек индуктивностиXCnЧисловой3Сопротивление ёмкости конденсаторовLmЧисловой3Индуктивность катушекCnЧисловой3Ёмкость конденсаторов Разработка диаграмм
2.1.2.1. Диаграмма вариантов использования
Вариант использования - это связанный функциональный блок, выраженный в виде транзакции между пользователем (актантом) и системой. Назначение вариантов использования - выявить всех актантов системы и все варианты ее использования, а также указать, какие актанты в каких вариантах использования фигурируют. На рис. 2.1 изображена диаграмма использования данного программного продукта. Актантом здесь является пользователь. Варианты использования программного продукта включают в себя выбор пользователем относительно того, как он вносит данные в программу. Либо это просто корректное внесение данных и расчет, либо редактирование исходных данных и просмотр векторных диаграмм. Рисунок 2.1 - Диаграмма вариантов использования
2.1.2.2. Диаграмма классов Класс - это категория или группа вещей, которая имеет сходные атрибуты и общие свойства. Класс представляется прямоугольником, разделенным на три области. Самая верхняя область содержит имя, в средней располагаются атрибуты, а в самой нижней - операции. Диаграмма классов состоит из определенного количества таких прямоугольников, соединенных линиями, которые показывают, как классы между собой связаны.
Диаграмма классов представляет собой отправную точку процесса разработки. На рис. 2.2 изображена диаграмма классов. Эта диаграмма отражает работу с входными и выходными данными программы. Существует несколько вариантов использования данных: просмотр, редактирование, добавление, удаление, загрузка, сохранение. Над каждым классом можно выполнить одну или несколько операций.
Рисунок 2.2 - Диаграмма классов
2.1.2.3. Диаграмма последовательности
Диаграмма последовательности - диаграмма, на которой показаны взаимодействия объектов, упорядоченные по времени их проявления. Используется в языке UML.
Основными элементами диаграммы последовательностей являются обозначения объектов (прямоугольники), вертикальные линии, отображающие течение времени при деятельности объекта, и стрелки, показывающие выполнение действий объектами. На рис. 2.3 изображена диаграмма последовательности, объекты на которой располагаются слева направо. Ее недостатком является то, что она занимает много места.
Рисунок 2.3 - Диаграмма последовательности
Построение связей между объектами
Объекты в программе представлены в виде модулей, объединенные между собой. Модули - файлы с расширением *.cpp. Связь между модулями представлена на рисунке 2.4.
Рисунок 2.4 - Схема модулей программы
Описание модулей программы:
Main - модуль, который содержит исходные данные и производит расчеты
3-AC calc - главный модуль программы
Help - модуль, который хранит меню программы
Создание программных модулей
Существует различные методы разработки программных продуктов:
метод нисходящего проектирования;
метод восходящего проектирования;
метод расширения ядра;
- метод Джексона
2.1.4.1. Метод нисходящего проектировании
Разработка программы методом нисходящего проектирования (функциональной декомпозиции), основана на двух стратегиях: пошаговом уточнении, анализе сообщений. Эти стратегии отличаются способами определения начальных спецификаций и методами, используемыми при разбиении задачи на части. При разработке нисходящим методом система рассматривается как древовидная структура, составленная из программных модулей. Модуль, расположенный наверху, содержит логику управления и решения самого высокого уровня. Ликвидируется отдельный этап интеграции - стыковки системы, т.к. отдельные части системы интегрируются постоянно. Модули более высоких уровней постоянно используются для кодирования модулей более низких уровней. В результате - критические модули оттестированы. Таким образом, нисходящий способ разработки позволяет получать программы, обладающие свойствами модульности и структурированности. Однако недостатком данного метода можно считать многократные корректировки модулей самого низкого уровня в связи с уточнениями, вносимыми в модули самого высокого уровня. Т.е. состав и способ решения поставленной задачи определяется модулями самого высокого уровня.
2.1.4.2. Метод восходящего проектирования
При разработке программ первыми пишутся программы обработки самого низкого уровня, а затем они отлаживаются и подготавливаются к стыковке. На этапе стыковки задачи определения данных возникают снова: стыковка задерживается до тех пор, пока не принимаются правильные определения данных и интерфейсы, после чего в свете внесённых изменений перерабатываются программы обработки с выполнением повторной отладки. К достоинствам данного метода можно отнести исправление недостатка нисходящего проектирования: модули самого низкого уровня проектируются самыми первыми и, как правило, несут на себе решение специфической отдельной задачи, не зависящей от других модулей. Модули же более высокого уровня в идеале собираются из модулей более низкого уровня подобно конструктору. Серьезным недостатком является необходимость определения всех необходимых для работы программы модулей самого низкого уровня. Такой подход хорош при проектировании сравнительно небольших программ, либо программ со стабильным техническим заданием (если заказчик захочет изменить или дополнить техническое задание в процессе разработки программного продукта, то многие модули самого низкого уровня окажутся либо ненужными, либо недостаточно функциональными). При проектировании в первую очередь определяются вспомогательные функции, которые реализуются с помощью модулей самых нижних уровней. После того, как модули низкого уровня, предназначенные для управления внешней и оперативной памятью, разработаны, они используются для определения функций более высокого уровня, пока не будет завершена разработка всей программы.
2.1.4.3. Метод расширения ядра
В этом методе больше внимания уделяется выявлению множества вспомогательных функций, а не определению функции всей программы в целом. Эти функции можно получить, применяя методы проектирования структур данных. На начальной стадии выделяется круг проблем, которые формируют отдельные модули. Область определения указанных проблем зависит от организации данных и спецификации алгоритма.
2.1.4.4. Методика Джексона
Метод иерархического проектирования модулей, разработанный Джексоном, применяется при построении структуры программы на основе структур входных и выходных данных. В основе этого метода лежит допущение, что структуры данных определяют структуру программы. Он наиболее эффективен в случае высокой степени структуризации данных (например, в задачах печати экономических отчётов). Методика Джексона основывается на возможности представлять структуры данных и программ единым набором основных конструкций [36, c. 116].
Наиболее оптимальным вариантом для разработки данного программного продукта я считаю метод нисходящего проектирования. Метод нисходящего проектирования был выбран за схожесть с естественным представлением эвристического процесса разработки программного продукта, так как при получении технического задания сначала определяется основная цель, основное поведение программы, после чего уточняются способы достижения заданной цели и определяются функциональные блоки, каждый из которых будет отвечать за достижение определенного результата. Пример контрольного теста
При запуске файла 3-AC calc.exe перед пользователем откроется главное окно программы - рис. 2.5:
Рисунок 2.5 - Форма входа в программу
Данная форма представляет собой своего рода вкладки, в которые мы поочередно заносим исходные данные. На вкладке "Общие параметры" пользователь указывает или изменяет номинальное линейное напряжение и номинальную частоту, из выпадающего списка выбирает единицы измерения сопротивления, которые будут использоваться в характеристиках элементов, а также при расчетах и выдаче результата. А также он указывает тип трехфазной цепи, исходя из которого, будет производен расчет. После того, как пользователь ввел эти данные, можно переходить к заполнению фаз, что происходит на вкладках "Фаза AB", "Фаза ВC", "Фаза CA" - рис. 2.6:
Рисунок 2.6 - Вкладка "Фаза АВ"
На этой вкладке пользователь, исходя из исходных данных и схемы радиоэлектронных компонентов, добавляет ветви с присутствующими на них элементами. Для того чтобы стало доступно это действие необходимо нажать кнопку "Добавить ветвь" - рис. 2.7:
Рисунок 2.7 - Добавление ветви в фазу
Всего 3 типа элементов: R - резистор, C - конденсатор, L - катушка индуктивности. При этом в каждой ветви может быть до 3-х элементов, по одному каждого типа. При выборе элемента появляется возможность указать его характеристики (рис.2.8): Рисунок 2.8 - Добавление элементов в ветвь
Если поставить галочку "Комплексное сопротивление для катушек и конденсаторов", то катушка L и конденсатор C примут вид XL и XC соответственно, а вместо индуктивности и емкости в характеристики нужно будет вводить сопротивление (рис.2.9): Рисунок 2.9 - Ввод значения комплексного сопротивления
Ветви по умолчанию соединены последовательно. Чтобы соединить рядом стоящие ветви параллельно, нужно установить соответствующие галочки в области "Соединить параллельно". Слева - соединить с предыдущей ветвью, справа - со следующей (рис.2.10): Рисунок 2.10 - Соединение ветвей в фазе
Выбранную ветвь также можно удалить. Для этого нужно нажать кнопку "Удалить" в правой верхней части окна. Если в настройках включено подтверждение действий, то перед удалением появится сообщение для подтверждения или отмены удаления - рис.2.11:
Рисунок 2.11 - Подтверждение удаления ветви
Для того чтобы рассчитать параметры, нужно перейти на вкладку "Расчеты", расчет/перерасчет будет произведен автоматически при переходе на нее - рис.2.12:
Рисунок 2.12 - Вкладка "Расчет" (результат)
На вкладке "Расчет" предусмотрен вывод не только числовых значений полученного результата, но и векторной диаграммы на основании полученных линейных токов. Диаграмма представляет собой координатную ось, в которой строятся 3 вектора, соответствующие фазам цепи. За X берется значение действительной части комплексного значения силы тока фазы, а за Y - значение мнимой части (рис.2.13):
Рисунок 2.13 - Вкладка "Расчет" (диаграмма)
В случае если не во всех фазах имеются ветви, расчет производиться не будет - рис.2.14:
Рисунок 2.14 - Вкладка "Расчет" (информационное сообщение)
Созданную цепь можно сохранить на диск для последующего использования. Для этого в Меню необходимо выбрать пункт "Сохранить цепь", далее нужно выбрать путь для сохранения и ввести имя файла, после этого нажать кнопку "Сохранить" - рис.2.15:
Рисунок 2.15 - Сохранение цепи
Для загрузки ранее сохраненной цепи в "Меню" необходимо выбрать пункт "Загрузить цепь" - рис.2.16:
Рисунок 2.16 - Загрузка цепи
Если в настройках включено подтверждение действий, то перед загрузкой цепи будет предложено сохранить изменения - рис.2.17:
Рисунок 2.17 - Подтверждения общего сброса
Результат и диаграмму также можно сохранить. Для этого нужно кликнуть правой кнопкой мыши на странице с результатом/диаграммой и выбрать в появившемся меню (появляется, если цепь полностью построена и расчет произведен) пункт "Сохранить" (рис.2.18 - 2.19):
Рисунок 2.18 - Сохранение расчета
Рисунок 2.19 - Сохранение диаграммы
В меню программы, выбрав пункт Настройки, можно выбрать тему оформления на свой вкус, отключить/включить подтверждения некоторых действий (удаление ветви) - рис.2.20:
Рисунок 2.20 - Пункт Настройки
3. ЭКОНОМИЧЕСКИЙ РАЗДЕЛ
3.1. Обоснование сметной себестоимости программного обеспечения (ПО) "Программа для автоматизированного расчета параметров трехфазных электрических цепей"
Расчет произведён по данным на 29 апреля 2012 года.
3.1.1. Определение трудоемкости разработки ПО
Определение трудоемкости разработки ПО ведется следующим образом: на основании опытно-статистического (суммарного) метода, в целом на всю разработку, исходя из того, что ее выполняет один программист II категории. Распределение трудоемкости по стадиями разработки ведется в соответствии с ГОСТ 19.102-77 "Стадии разработки" исходя из ориентировочного распределения затрат времени и приведено в таблице 3.1. Таблица 3.1 - Трудоемкость разработки программного обеспечения
Вид работПроцент от трудоемкости работТрудоемкость в часах Всего Время машинноеТехническое задание, эскизный проект1016 -Технический проект2032 -Рабочий проект
(машинное время)6096 96Внедрение в т. ч. машинное время
немашинное время10
5
516
8
8 8
-Итого:100160 104 Примечание - рабочий проект - машинное время является перекрываемым, т.е. учитывается и в немашинном времени для расчета оплаты труда программиста.
Данные о трудоемкости разработки, определенные опытно-статическим путем подтверждаю:
Общий объем программного обеспечения (количество команд (VкПО)) - 3000 команд.
Руководитель дипломного проекта _____________________ Баранова Г.Н.
(подпись)
3.2. Определение стоимости машинного времени
Исходная информация
Исходная информация для расчета экономической части получена в бухгалтерском отделе ГУЗ "Витебская городская центральная поликлиника №1" по состоянию на 20 апреля 2012
Таблица 3.2 - Исходная информация ПоказательУсловное обозначениеЕдиницы измеренияЗначение, рублейБалансовая стоимость компьютераБКРублей1895192Мощность, потребляемая компьютеромМККВт0,045Полезный фонд времени работы компьютера за годFKЧас2040Балансовая стоимость принтераБПРублей904950Мощность, потребляемая принтеромМПКВт0,055Полезный фонд времени работы принтера за годFПЧас1020Стоимость 1 кВт/часСРублей250,900Площадь на 1 рабочее место Spmм26Стоимость 1 м2 производственной площадиСплРублей9548200Норма амортизации для оборудованияНаоПроценты20Норма амортизации для зданийНаплПроценты1,700Отчисления на текущий ремонт оборудования (в процентах от балансовой стоимости)РОПроценты0Часовая тарифная ставка 13 разрядаЧТС13Рублей13095,238
Данные подтверждаю ________________________________________________________________
(Фамилия, имя, отчество, должность)
____________________
(печать, подпись) 3.2.2. Определение стоимости потребляемой электроэнергии, руб.:
, где (3.1) Квр - коэффициент, учитывающий использование по времени (Квр=0,80)
Кс - коэффициент, учитывающий потери в сети (Кс=1,05)
Сэл = (0,045 × 2040 + 0,055 × 1020) × 250,900 × 0,80 ×1,05 = 31170,812
3.2.3. Определение суммы амортизационных отчислений, руб.:
;(3.2) Сао = (1895192 + 904950) × "20" /"100" + 6 × 9548200 × "1,700" /"100" = 1533944,800
3.2.4. Определяем затраты на текущий ремонт оборудования, руб.:
;(3.3) Зр = (1895192 + 904950) × "0" /"100" = 0
Результаты расчетов сводим в таблицу 3.3
3.2.5. Расчет затрат на 1 машино-час
Расчет затрат на 1 машино-час ведется исходя из полезного фонда времени работы компьютера за год. То есть итог графы 3 таблицы 3.3 деленный на полезный фонд времени работы компьютера (FK) из (таблицы 3.2).
3.2.6. Расчет стоимости машинного времени, руб.:
〖СМ〗_вр= Т_м× 〖СМ〗_ч , (3.5)
где Тм - машинное время работы ПК в расчете на программу, час (из таблицы 3.1 итог графы 4)
Смч - стоимость 1 машино-часа, руб. (из таблицы 3.3 итог графы 4)
СМвр = 104 × 767,214 = 79790,256
Показатель Условное обозначениеЗначение, рублей На год (ЗМг)На 1 машино-час (СМч)Стоимость потребляемой электроэнергии Сэл 31170,81215,280Сумма ежегодных амортизационных отчислений Сао 1533944,800751,934Затраты на текущий ремонт оборудования Зр 00 Итого: 1565115,612767,214Таблица 3.3 - Результаты расчетов
Затраты на 1 машино-час, руб.:
;(3.4) СМч (для С эл) = "31170,812" /"2040" = 15,280
СМч (для С ао) = "1533944,800" /"2040" = 751,934
СМч (для З р) = "0" /"2040" = 0
3.3. Определение себестоимости программного обеспечения (ПО)
В современных рыночных экономических условиях ПО выступает преимущественно в виде продукции научно-технических организаций, представляющие собой функционально завершенное и имеющее товарный вид ПО ВТ, реализуемое покупателям по рыночным отпускным ценам, установленным в результате анализа рыночных условий и переговоров с заказчиком и возможностей тиражирования. Все завершенные разработки ПО ВТ являются научно - технической продукцией. Широкое применение ВТ требует постоянного обновления и совершенствования ПО. Выбор эффективных проектов ПО связан с их экономической оценкой и расчетом экономического эффекта, который может определяться как у разработчика, так и у пользователя.
У разработчика экономический эффект выступает в виде чистой прибыли, остающейся в распоряжении предприятия от реализации ПО, а у пользователя в виде экономии трудовых, материальных и финансовых ресурсов, получаемой за счет:
снижения трудоемкости расчетов и алгоритмизации программирования и отладки программ за счет использования ПО в процессе разработки автоматизированных систем обработки данных;
сокращение расходов на оплату машинного времени и других ресурсов на отладку программ;
снижение расходов на материалы (магнитные ленты, магнитные диски и прочие материалы);
ускорение ввода в эксплуатацию новых систем;
улучшение показателей основной деятельности предприятий в результате использования ПО.
Стоимостная оценка ПО у разработчиков предполагает составление сметы затрат, которая включает следующие статьи:
затраты на материалы;
стоимость машинного времени;
дополнительная заработная плата;
отчисления в фонд социальной защиты населения;
обязательное страхование о несчастных случаев на производстве и профессиональных заболеваний;
прочие затраты;
расходы на сопровождение и адаптацию.
На основании сметы затрат рассчитывается себестоимость и отпускная цена ПО.
3.3.1 Расчет затрат на материалы
По статье "Материалы" отражаются расходы на магнитные носители, бумагу, красящие ленты и другие материалы, необходимые для разработки ПО.
Расчет затрат на материалы (М), необходимые для разработки программного обеспечения (ПО) осуществляется по нормативу (Нр) на 100 команд (принимается равным 4000 руб.), с учетом общего объема команд (VкПО) - 3000 команд.
Расчет осуществляется по формуле, руб.: М= (VkПО×Нр)/100 ; (3.6)
М= (3000×4000)/100 3.3.2. Расчет затрат на оплату труда
Расчет основной заработной платы ведется по видам работ в таблице 3.4.
〖 З〗_п= Т_i× 〖ЧТС〗_i , (3.5)
где Ti - трудоемкость, час;
ЧТСi - часовая тарифная ставка, руб. Таблица 3.4 - Расчет затрат на оплату труда
Вид работТрудоемкость, часКвалификационный разрядЧасовая тарифная ставка, руб.Зарплата прямая, руб.Техническое задание, эскизный проект 161313095,238209523,808Технический проект321313095,238419047,616Рабочий проект961313095,2381257142,848Внедрение в т.ч. немашинное время машинное время16
8
8
13
13
13095,238
13095,238
104761,904
104761,904Итого прямая заработная плата (Зпр)2095238,080Премии и доплаты (30% от прямой заработной платы) (Пр)628571,424Итого, основная заработная плата (Зпр+Пр)2723809,504 Примечание: инженер - программист II категории - 13 разряд.
Дополнительная заработная плата на конкретное ПО (ЗД) включает выплаты, предусмотренные законодательством о труде (оплата отпусков, льготных часов, времени выполнения государственных обязанностей и других выплат, не связанных с основной деятельностью исполнителей), и определяется по нормативу в процентах к основной заработной плате, в рублях:
З_д=(З_ос ∙〖 Н〗_д)/100 , (3.8) где З_ос - основная заработная плата;
ЗД - дополнительная заработная плата на конкретное ПО в руб.;
НД - норматив дополнительной заработной платы принимается 10 % от основной.
Зд = "2723809,504 × 10" /"100" = 272380,950 3.3.3. Расчет себестоимости программного обеспечения ведется в таблице 3.5
Отчисления в фонд социальной защиты населения (ЗСЗ) определяются в соответствии с действующими законодательными актами по нормативу в процентном отношении к фонду основной и дополнительной зарплаты исполнителей в рублях:
З_сз=(( З_ос + З_д ) ∙ Н_сз )/100 , (3.9) где - норматив отчислений в фонд социальной защиты населения (34 %).
ЗСЗ = "(2723809,504 + 272380,950) × 34" /"100" = 1018704,754 Обязательное страхование от несчастных случаев на производстве и профессиональных заболеваний ( Зстр) берется по нормативу, установленному в целом по организации
( Нстр - 0,69 %), в рублях:
З_стр=(( З_ос + З_д ) ∙ Н_стр )/100 ;
(3.10) З_стр= "(2723809,504 + 272380,950) × 0,69" /"100" = 20673,714
Прочие затраты (П_З) включают расходы, связанные с необходимостью содержания аппарата управления, организационные расходы и расходы на общехозяйственные нужды. Относятся на конкретное ПО по нормативу (Н_ПЗ) в процентом отношении к основной заработной плате исполнителей. Норматив устанавливается в целом по организации (принимаем 98 %). Определяем П_Зв рублях: П_з=(З_ос×Н_пз)/100,
(3.11)
П_З ="2723809,504 × 98" /"100" = 2669333,313
Общая сумма всех расходов по статьям сметы рассчитывается в таблице 3.5.
Кроме того, организация разработчик осуществляет затраты на сопровождение и адаптацию ПО ( Рса), которые определяются по нормативу Нрса (принимаем 4 %):
Р_са= (С × Н_рса)/100 , (3.12)
где С - полная себестоимость ПО без учета расходов на сопровождение и адаптацию, руб.
Рса = "(690492,491) × 4" /"100" = 276187,699
Общая сумма расходов на разработку (с затратами на сопровождение и адаптацию) (Спл) определяется по формуле: С_пл= Р_са+ С ; (3.13)
Спл = 6904692,491+276187,699=7180880,190
Результаты всех расчетов сведены в таблицу 3.5.
Таблица 3.5 - Себестоимость программного обеспечения.
Наименование статей затратСумма, руб.Обоснование расчета1. Затраты на материалы120000,000Раздел 3.1.3.12. Стоимость машинного времени79790,256Раздел 3.1.2.63. Основная заработная плата2723809,504Таблица 3.44. Дополнительная заработная плата272380,95010% от п.35. Итого: фонд оплаты труда (ФОТ)2996190,454п.3+п.46. Отчисление в фонд социальной защиты1018704,75434% от п.57. Обязательное страхование от несчастных случаев на производстве и профессиональных заболеваний20673,7140,69% от п.58. Итого: отчисления на социальные нужды1039378,468п.6+п.79. Прочие затраты (арендная плата, услуги связи, коммунальные услуги и др.)2669333,31398% от п.310. Полная себестоимость без учета расходов на сопровождение и адаптацию6904692,491п.1+п.2+п.5+п.8+п.911. Расходы на сопровождение и адаптацию276187,6994% от п.1012. Полная себестоимость с учетом расходов на сопровождение и адаптацию7180880,190п.10+п.11 ЗАКЛЮЧЕНИЕ
За время написания дипломного проекта мною были детально изучены функции и возможности языка программирования С и среды разработки Embarcadero RAD Studio С++ Builder 2010, приобретены навыки рационального использования программного обеспечения современных персональных компьютеров при решении разнообразных задач; проверена подготовка к работе в учебном заведении. "Программа для автоматизированного расчета параметров трехфазной электрической цепи" соответствует исходному техническому заданию. На основе выполненных тестов можно сделать вывод: отвечает эксплуатационным, экономическим и технологическим требованиям. Обладает высокой надёжностью, наглядностью и универсальностью. Данное программное обеспечение будет в дальнейшем усовершенствоваться и использоваться.
ЛИТЕРАТУРА
ГОСТ 19.101-77. ЕСПД. Программа и методика испытаний. - Введ. 01.01. 1981 г. - М. : Изд-во стандартов, 2001.
ГОСТ 19.102-77. ЕСПД. Стадии разработки. - Введ. 81-07-01. - М. : Изд-во стандартов, 2001.
ГОСТ 19.104-78. ЕСПД. Единая система программной документации. Основные надписи. - Введ. 81-07-01. - М. : Изд-во стандартов, 2001.
ГОСТ 19.106-78. ЕСПД. Единая система программной документации. Требования к программным документам, выполненным печатным способом. - Введ 81-07-01. - М. : Изд-во стандартов, 2001.
ГОСТ 19.201-78. ЕСПД. Техническое задание. Требования к содержанию и оформлению. - Введ. 81-07-01. - М. : Изд-во стандартов, 2001.
ГОСТ 19.103-80. ЕСПД. Единая система программной документации. Схемы алгоритмов и программ. Обозначение условные графические. - Введ. 81-07-01. - М. : Изд-во стандартов, 2001.
ГОСТ 19.701-80. ЕСПД. Единая система программной документации. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения. - Введ 81-07-01 - М. : Изд-во стандартов, 2001.
ГОСТ 7.1-2003. ЕСПД. Библиографическая запись. Библиографическое описание. Общие требования и правила составления. - Взамен ГОСТ 7.1-84. ЕСПД, ГОСТ 7.16-79. ЕСПД, ГОСТ 7.18-79. ЕСПД, ГОСТ 7.34-81. ЕСПД., ГОСТ 7.40-82. ЕСПД.; Введ. 2004-10-01. - Мн. : Госстандарт Республики Беларусь, 2004. - 47 с.
Архангельский А.Я. Приемы программирования в С++ на основе VC/ А.Я. Архангельский. - М. : ООО "Бином-Пресс", 2006. - 944 с. : ил
Архангельский А.Я. Программирование в С++. Учебник по классическим версиям С++/ А.Я. Архангельский. - М. : ООО "Бином-Пресс", 2006. - 1152 с. : ил.
Бессонов Л.А. Теоретические основы электротехники: Электрические цепи. Учеб. для студентов электротехнических, энергетических и приборостроительных специальностей вузов/ Л.А. Бессонов - 7-е изд., перераб. и доп. -М.: Высш. шк., 1978. -528с. Брябин В.М. Программное обеспечение персональных ЭВМ/ В.М Брябин. - М. : Наука, 1990. - 400 с. : ил.
Объектно-ориентированный анализ и проектирование с примерами пользователя/ Пер. с англ. Г.Г. Буг. - М. : ДМК, 2000. - 224 с. : ил.
Глушаков С.В. Базы данных: учебный курс/ С.В. Глушаков Д.В. Ломотько. - Киев. : Абрис, 2000. - 480 с. : ил. Гофман В.Э. С++. Быстрый старт./ В.Э.Гофман, А.Д. Хоменко. - СПб. : БХВ-Петербург, 2003. - 288 с. : ил.
Григорий С.А. Windows XP изнутри/ С.А. Григорий. - Ульяновск : 2003. - 520 с. : ил.
Дарахвелидзе П.Г. Программирование в Delphi 7/ П.Г. Дарахвелидзе, Е.П. Макров. - СПб. : БХВ-Петербург, 2003. - 784 с. : ил.
Жарков С.В. Shareware: Профессиональная разработка и продвижение программ/ С.В. Жарков. - СПб. : БХВ-Петербург, 2003. - 320 с. : ил.
Зевеке Г.В: Основы теории цепей: Учеб. для вузов/ Г.В.Зевеке, П.А.Ионкин, А.В.Нетушил, С.В.Страхов. -5-е изд., перераб. -М.: Энергоатомиздат, 1989. -528с.
Зелковец М.В. Принципы разработки программного обеспечения/ М.В. Земковец. - Москва : Мир, 1982. - 400 с. : ил.
Зиглер К.К. Методы проектирования программных систем/ К.К. Зиглер - М. : Мир, 1985. - 520 с. : ил.
Карпей Т.В. Экономика. Организация и планирование промышленного производства/ Т.В. Карпей - М. : Дизайн ПРО, 2004г. - 321 с. : ил.
ПРИЛОЖЕНИЕ 1
ИСХОДНЫЙ ТЕКСТ ПРОГРАММЫ
#include "vitems.h"
class VBranch
{
private:
VResistor Resistor;
VInductor Inductor;
VCondenser Condenser;
bool CheckResistor;
bool CheckInductor;
bool CheckCondenser;
public:
VBranch(){
CheckResistor=false;
CheckInductor=false;
CheckCondenser=false;}
VBranch(
double r,double lorxl,double corxc,bool IssetR,bool IssetL,bool IssetC,
bool _lorxl, bool _corxc,double f){
SetBranch(r,lorxl,corxc,IssetR,IssetL,IssetC,_lorxl,_corxc,f);}
void SetBranch(
double r,double lorxl,double corxc,bool IssetR,bool IssetL,bool IssetC,
bool _lorxl, bool _corxc,double f){
if (IssetR) {
Resistor.SetResistor(r);
CheckResistor = true;}
if (IssetL) {
if (_lorxl) {
Inductor.SetInductor(lorxl);
} else {
Inductor.SetInductor(lorxl,f);}
CheckInductor = true;}
if (IssetC) {
if (_corxc) {
Condenser.SetCondenser(corxc);
} else {
Condenser.SetCondenser(corxc,f);}
CheckCondenser = true;}
}
VResistor GetResistor(){
if (CheckResistor) {
return Resistor;
} else {
return NULL;}
}
VInductor GetInductor(){
if (CheckInductor) {
return Inductor;
} else {
return NULL;}
}
VCondenser GetCondenser(){
if (CheckCondenser) {
return Condenser;
} else {
return NULL;}
}
VComplex GetComplexResistance(){
VComplex buf(0,0);
if (CheckResistor) {
buf=buf+Resistor.complex();}
if (CheckInductor) {
buf=buf+Inductor.complex();}
if (CheckCondenser) {
buf=buf+Condenser.complex();}
return buf;
}
UnicodeString GetString(){
UnicodeString buf;
buf=buf+" ///-Ветвь--\r\n";
if (CheckResistor) {
buf=buf+" R["+FloatToStr(Resistor.r)+"Ом, complex:"+VComplexToStr(Resistor.complex())+"]\r\n";
}
if (CheckInductor) {
buf=buf+" XL["+FloatToStr(Inductor.xl)+"Ом, complex:"+VComplexToStr(Inductor.complex())+"]\r\n";
}
if (CheckCondenser) {
buf=buf+"XC["+FloatToStr(Condenser.xc)+"Ом,complex:"+VComplexToStr(Condenser.complex())+"]\r\n";}
buf=buf+" Комплексное сопротивление ветви:"+VComplexToStr(GetComplexResistance())+"\r\n";
buf=buf+" ///--------\r\n";
return buf;}
};
#include <math.h>
class VComplex {
public:
double real; // Действительная часть
double image; // Мнимая часть
VComplex() {
real = 0;
image = 0;} // Конструктор по умолчанию
VComplex(double r) {
real = r;
image = 0;} // Конструктор
VComplex(double r, double i) {
real = r, image = i;} // Конструктор
~VComplex() {} // Деструктор
void Set(double r) {
real = r, image = 0;}
void Set(double r, double i) {
real = r, image = i;}
float abs() // Модуль комплексного числа
{
return sqrt(real * real + image * image);}
VComplex operator +(VComplex); // Перегрузка оператора сложения
VComplex operator -(VComplex); // Перегрузка оператора вычитания
VComplex operator*(VComplex); // Перегрузка оператора умножения
VComplex operator / (VComplex); // Перегрузка оператора деления
VComplex operator && (VComplex); };
// Перегрузка +
VComplex VComplex:: operator +(VComplex fp1) {
fp1.real = real + fp1.real;
fp1.image = image + fp1.image;
return fp1;}
// Перегрузка -
VComplex VComplex:: operator -(VComplex fp1) {
fp1.real = real - fp1.real;
fp1.image = image - fp1.image;
return fp1;}
// Перегрузка *
VComplex VComplex:: operator*(VComplex fp1) {
double i, j;
i = real * fp1.real - image * fp1.image;
j = real * fp1.image + fp1.real * image;
fp1.real = i;
fp1.image = j;
return fp1;}
// Перегрузка /
VComplex VComplex::operator/(VComplex fp1)
{
double k, i, j;
k = fp1.real * fp1.real + fp1.image * fp1.image;
if (k==0) {
fp1.real = 0;
fp1.image = 0;
} else {
i = (real * fp1.real + image * fp1.image) / k;
j = (fp1.real * image - real * fp1.image) / k;
fp1.real = i;
fp1.image = j; }
return fp1; }
VComplex VComplex:: operator && (VComplex fp1) {
double mi, mj;
mi = real * fp1.real - image * fp1.image;
mj = real * fp1.image + fp1.real * image;
double si, sj;
si = real + fp1.real;
sj = image + fp1.image;
double dk, di, dj;
dk = si * si + sj * sj;
double i, j;
i = (mi * si + mj * sj) / dk;
j = (si * mj - mi * sj) / dk;
fp1.real = i;
fp1.image = j;
return fp1;}
UnicodeString VComplexToStr(VComplex fp1) {
UnicodeString fp1tostr = FloatToStr(fp1.real);
if (fp1.image >= 0.0) {
fp1tostr = fp1tostr + "+" + FloatToStr(fp1.image) + "i";}
else {
fp1tostr = fp1tostr + "-" + FloatToStr(abs(fp1.image)) + "i";}
return fp1tostr;}
double sin_grad(double x) {
bool plus;
if (x >= 0) {
plus = true;}
else {
plus = false;}
if (x < 0) {
x = -x;}
double pi = 3.1415926535;
double rad;
while (x >= 360) {
x -= 360;}
if (plus) {
if (x >= 180) {
rad = ((x - 180) * (pi / 180));
return -sin(rad);}
else {
rad = (x * (pi / 180));
return sin(rad);}
}
else {
if (x >= 180) {
rad = ((x - 180) * (pi / 180));
return sin(rad);}
else {
rad = (x * (pi / 180));
return -sin(rad);}
}}
double cos_grad(double x) {
x += 90;
return sin_grad(x);}
VComplex ToConjugate(VComplex fp1) {
fp1.image = -fp1.image;
return fp1;}
UnicodeString MyToStr(double x) {
UnicodeString str;
str = FloatToStrF(x, ffFixed, 18, 2);
return str;}
UnicodeString MyToStr(VComplex fp1) {
UnicodeString fp1tostr = FloatToStrF(fp1.real, ffFixed, 18, 2);
if (fp1.image >= 0.0) {
fp1tostr = fp1tostr + "+" + FloatToStrF(abs(fp1.image), ffFixed, 18,2) + "i";}
else {
fp1tostr = fp1tostr + "-" + FloatToStrF(abs(fp1.image), ffFixed, 18, 2) + "i";}
return fp1tostr;}
float MyAbs(VComplex fp1) // Модуль комплексного числа
{
return sqrt(fp1.real * fp1.real + fp1.image * fp1.image);}
#include <vector.h>
#include "vbranch.h"
class VContForBranch
{
public:
vector<VBranch> Branches;
vector<VBranch>::iterator VIterator;
VContForBranch(){}
void Add(
double r,double lorxl,double corxc,bool IssetR,bool IssetL,bool IssetC,
bool _lorxl, bool _corxc,double f){
VBranch buf;
buf.SetBranch(r,lorxl,corxc,IssetR,IssetL,IssetC,_lorxl,_corxc,f);
Branches.push_back(buf);}
VComplex GetComplexResistance(){
VComplex buf(0,0);
if (Branches.size()>=1) {
VIterator=Branches.begin();
VBranch CycleBuf;
CycleBuf=*VIterator;
buf=CycleBuf.GetComplexResistance();
VIterator++;
while(VIterator!=Branches.end()){
CycleBuf=*VIterator;
buf=buf&&CycleBuf.GetComplexResistance();
VIterator++;}}
return buf;}
UnicodeString GetString(){
UnicodeString strbuf;
if (Branches.size()>=1) {
VIterator=Branches.begin();
VBranch CycleBuf;
while(VIterator!=Branches.end()){
CycleBuf=*VIterator;
strbuf=strbuf+CycleBuf.GetString();
VIterator++;}}
return strbuf;}};
#include "vcomplex.h"
class VResistor
{
public:
double r;
VResistor(){}
VResistor(double user_r){
SetResistor(user_r);}
void SetResistor(double user_r){
r=user_r;}
VComplex complex(){
VComplex res(r,0);
return res;}};
class VInductor
{
public:
double xl;
double l;
double f;
VInductor(){}
VInductor(double user_xl){
SetInductor(user_xl);}
VInductor(double user_l,double user_f){
SetInductor(user_l,user_f);}
void SetInductor(double user_xl){
xl=user_xl;}
void SetInductor(double user_l,double user_f){
f=user_f;
l=user_l;
ltoxl();}
void ltoxl(){
xl=2*M_PI*f*l;}
void xltol(){
l=xl/(2*M_PI*f);}
VComplex complex(){
VComplex res(0,xl);
return res;}};
class VCondenser
{
public:
double xc;
double c;
double f;
VCondenser(){}
VCondenser(double user_xc){
SetCondenser(user_xc);}
VCondenser(double user_c,double user_f){
SetCondenser(user_c,user_f);}
void SetCondenser(double user_xc){
xc=user_xc;}
void SetCondenser(double user_c,double user_f){
f=user_f;
c=user_c;
ctoxc();}
void ctoxc(){
xc=1/(2*M_PI*f*c);}
void xctoc(){
c=1/(2*M_PI*f*xc);}
VComplex complex(){
VComplex res(0,-xc);
return res;}};
#include "vcontfb.h"
class VPhase {
public:
vector<VContForBranch>CfB;
vector<VContForBranch>::iterator VIterator;
VPhase() {}
void AddContForBranch() {
VContForBranch buf;
CfB.push_back(buf);}
void AddBranchToLastCfB(double r, double lorxl, double corxc, bool IssetR, bool IssetL, bool IssetC, bool _lorxl, bool _corxc, double f) {
if ((r == 0 & IssetR == true) || (lorxl == 0 & IssetL == true) || (corxc == 0 & IssetC == true)) {}
else {
VIterator = CfB.end();
VIterator --;
VContForBranch buf;
buf = *VIterator;
buf.Add(r, lorxl, corxc, IssetR, IssetL, IssetC, _lorxl, _corxc, f);
*VIterator = buf;}}
VComplex GetComplexResistance() {
VComplex buf(0, 0);
VIterator = CfB.begin();
while (VIterator != CfB.end()) {
VContForBranch CycleBuf;
CycleBuf = *VIterator;
buf = buf + CycleBuf.GetComplexResistance();
VIterator++;}
return buf;}
UnicodeString GetString() {
UnicodeString strbuf;
VIterator = CfB.begin();
while (VIterator != CfB.end()) {
VContForBranch CycleBuf;
CycleBuf = *VIterator;
strbuf = strbuf + "/-Несколько параллельных веток----\r\n";
strbuf = strbuf + CycleBuf.GetString();
strbuf = strbuf + "Комплексное сопротивление ветвей:" + VComplexToStr(CycleBuf.GetComplexResistance()) + "\r\n";
strbuf = strbuf + "/---------------------------------\r\n";
VIterator++;}
strbuf = strbuf + "/!!!------------------------------\r\n";
strbuf = strbuf + "Комплексное сопротивление фазы:" + VComplexToStr(GetComplexResistance()) + "\r\n";
return strbuf;}};
class VStarNoNull {
public:
VPhase PhA;
VPhase PhB;
VPhase PhC;
double Un;
VStarNoNull() {}
void SetUn(double U) {
Un = U;}
VComplex GetU_A() {
VComplex buf;
buf.Set(Un, 0);
return buf;}
VComplex GetU_B() {
VComplex buf;
buf.Set(Un*cos_grad(120), -Un*sin_grad(120));
return buf;}
VComplex GetU_C() {
VComplex buf;
buf.Set(Un*cos_grad(120), -Un*sin_grad(120));
return buf;}
VComplex GetZ_A() {
return PhA.GetComplexResistance();}
VComplex GetZ_B() {
return PhB.GetComplexResistance();}
VComplex GetZ_C() {
return PhC.GetComplexResistance();}
VComplex GetY_A() {
VComplex buf, one;
one.Set(1);
buf = one / GetZ_A();
return buf;}
VComplex GetY_B() {
VComplex buf, one;
one.Set(1);
buf = one / GetZ_B();
return buf;}
VComplex GetY_C() {
VComplex buf, one;
one.Set(1);
buf = one / GetZ_C();
return buf;}
VComplex GetU_n() {
VComplex buf;
buf = (((GetY_A() * GetU_A()) + (GetY_B() * GetU_B()) + (GetY_C() * GetU_C())) / (GetY_A() + GetY_B() + GetY_C()));
return buf;}
VComplex GetU_nA() {
VComplex buf;
buf = GetU_A() - GetU_n();
return buf;}
VComplex GetU_nB() {
VComplex buf;
buf = GetU_B() - GetU_n();
return buf;}
VComplex GetU_nC() {
VComplex buf;
buf = GetU_C() - GetU_n();
return buf;}
VComplex GetI_A() {
VComplex buf;
buf = GetU_nA() / GetZ_A();
return buf;}
VComplex GetI_B() {
VComplex buf;
buf = GetU_nB() / GetZ_B();
return buf;}
VComplex GetI_C() {
VComplex buf;
buf = GetU_nC() / GetZ_C();
return buf;}
VComplex GetS_A() {
VComplex buf;
buf = GetU_A() * ToConjugate(GetI_A());
return buf;}
VComplex GetS_B() {
VComplex buf;
buf = GetU_B() * ToConjugate(GetI_B());
return buf;}
VComplex GetS_C() {
VComplex buf;
buf = GetU_C() * ToConjugate(GetI_C());
return buf;}
double GetP_A() {
double buf;
buf = GetS_A().real;
return buf;}
double GetP_B() {
double buf;
buf = GetS_B().real;
return buf;}
double GetP_C() {
double buf;
buf = GetS_C().real;
return buf;}
double GetQ_A() {
double buf;
buf = GetS_A().image;
return buf;}
double GetQ_B() {
double buf;
buf = GetS_B().image;
return buf;}
double GetQ_C() {
double buf;
buf = GetS_C().image;
return buf;}
double GetFullP() {
double buf;
buf = GetP_A() + GetP_B() + GetP_C();
return buf;}
double GetFullQ() {
double buf;
buf = GetQ_A() + GetQ_B() + GetQ_C();
return buf;}
double GetFullS() {
double buf;
buf = sqrt(pow(GetFullP(), 2) + pow(GetFullQ(), 2));
return buf;}
UnicodeString GetString() {
UnicodeString bufstr;
// Комплексные сопротивления фазы
bufstr += "|_Z(A)=" + MyToStr(GetZ_A()) + " Ом;\r\n";
bufstr += "|_Z(B)=" + MyToStr(GetZ_B()) + " Ом;\r\n";
bufstr += "|_Z(C)=" + MyToStr(GetZ_C()) + " Ом;\r\n";
bufstr += "\r\n";
// Комплексные фазные напряжения
bufstr += "|_U(A)=" + MyToStr(GetU_A()) + " В;\r\n";
bufstr += "|_U(B)=" + MyToStr(GetU_B()) + " В;\r\n";
bufstr += "|_U(C)=" + MyToStr(GetU_C()) + " В;\r\n";
bufstr += "\r\n";
// NEW >>>>>>>>>>>>>>>>
// Y
bufstr += "|_Y(A)=" + MyToStr(GetY_A()) + " В;\r\n";
bufstr += "|_Y(B)=" + MyToStr(GetY_B()) + " В;\r\n";
bufstr += "|_Y(C)=" + MyToStr(GetY_C()) + " В;\r\n";
bufstr += "\r\n";
// Un
bufstr += "|_U(n)=" + MyToStr(GetU_n()) + " В;\r\n";
bufstr += "\r\n";
// Напряжения на зажимах
bufstr += "|_U(nA)=" + MyToStr(GetU_nA()) + " В;\r\n";
bufstr += "|_U(nB)=" + MyToStr(GetU_nB()) + " В;\r\n";
bufstr += "|_U(nC)=" + MyToStr(GetU_nC()) + " В;\r\n";
bufstr += "\r\n";
// NEW >>>>>>>>>>>>>>>>
// Комплексные фазные токи
bufstr += "|_I(A)=" + MyToStr(GetI_A()) + " А;\r\n";
bufstr += "|_I(B)=" + MyToStr(GetI_B()) + " А;\r\n";
bufstr += "|_I(C)=" + MyToStr(GetI_C()) + " А;\r\n";
bufstr += "\r\n";
// Активные фазные мощности
bufstr += "P(A)=" + MyToStr(GetP_A()) + " Вт;\r\n";
bufstr += "P(B)=" + MyToStr(GetP_B()) + " Вт;\r\n";
bufstr += "P(C)=" + MyToStr(GetP_C()) + " Вт;\r\n";
bufstr += "\r\n";
// Реактивные фазные мощности
bufstr += "Q(A)=" + MyToStr(GetQ_A()) + " вар;\r\n";
bufstr += "Q(B)=" + MyToStr(GetQ_B()) + " вар;\r\n";
bufstr += "Q(C)=" + MyToStr(GetQ_C()) + " вар;\r\n";
bufstr += "\r\n";
// Полные фазные мощности
bufstr += "|_S(A)=" + MyToStr(GetS_A()) + " в-а;\r\n";
bufstr += "|_S(B)=" + MyToStr(GetS_B()) + " в-а;\r\n";
bufstr += "|_S(C)=" + MyToStr(GetS_C()) + " в-а;\r\n";
bufstr += "\r\n";
// Трехфазная активная мощность
bufstr += "P=" + MyToStr(GetFullP()) + " Вт;\r\n";
// Трехфазная реактивная мощность
bufstr += "Q=" + MyToStr(GetFullQ()) + " вар;\r\n";
// Трехфазная полная мощность
bufstr += "S=" + MyToStr(GetFullS()) + " в-а;\r\n";
bufstr += "\r\n";
return bufstr;}};
class VStarNull
{
public:
VPhase PhA;
VPhase PhB;
VPhase PhC;
double Un;
VStarNull(){}
void SetUn(double U){
Un=U;}
VComplex GetU_A(){
VComplex buf;
buf.Set(Un,0);
return buf;}
VComplex GetU_B(){
VComplex buf;
buf.Set(Un*cos_grad(120),-Un*sin_grad(120));
return buf;}
VComplex GetU_C(){
VComplex buf;
buf.Set(Un*cos_grad(120),-Un*sin_grad(120));
return buf;}
VComplex GetZ_A(){
return PhA.GetComplexResistance();}
VComplex GetZ_B(){
return PhB.GetComplexResistance();}
VComplex GetZ_C(){
return PhC.GetComplexResistance();}
VComplex GetI_A(){
VComplex buf;
buf=GetU_A()/GetZ_A();
return buf;}
VComplex GetI_B(){
VComplex buf;
buf=GetU_B()/GetZ_B();
return buf;}
VComplex GetI_C(){
VComplex buf;
buf=GetU_C()/GetZ_C();
return buf;}
VComplex GetI_N(){
VComplex buf;
buf=GetI_A()+GetI_B()+GetI_C();
return buf;}
VComplex GetS_A(){
VComplex buf;
buf=GetU_A()*ToConjugate(GetI_A());
return buf;}
VComplex GetS_B(){
VComplex buf;
buf=GetU_B()*ToConjugate(GetI_B());
return buf;}
VComplex GetS_C(){
VComplex buf;
buf=GetU_C()*ToConjugate(GetI_C());
return buf;}
double GetP_A(){
double buf;
buf=GetS_A().real;
return buf;}
double GetP_B(){
double buf;
buf=GetS_B().real;
return buf;}
double GetP_C(){
double buf;
buf=GetS_C().real;
return buf;}
double GetQ_A(){
double buf;
buf=GetS_A().image;
return buf;}
double GetQ_B(){
double buf;
buf=GetS_B().image;
return buf;}
double GetQ_C(){
double buf;
buf=GetS_C().image;
return buf;}
double GetFullP(){
double buf;
buf=GetP_A()+GetP_B()+GetP_C();
return buf;}
double GetFullQ(){
double buf;
buf=GetQ_A()+GetQ_B()+GetQ_C();
return buf;}
double GetFullS(){
double buf;
buf=sqrt(pow(GetFullP(),2)+pow(GetFullQ(),2));
return buf;}
UnicodeString GetString(){
UnicodeString bufstr;
//Комплексные сопротивления фазы
bufstr+="|_Z(A)="+MyToStr(GetZ_A())+" Ом;\r\n";
bufstr+="|_Z(B)="+MyToStr(GetZ_B())+" Ом;\r\n";
bufstr+="|_Z(C)="+MyToStr(GetZ_C())+" Ом;\r\n";
bufstr+="\r\n";
//Комплексные фазные напряжения
bufstr+="|_U(A)="+MyToStr(GetU_A())+" В;\r\n";
bufstr+="|_U(B)="+MyToStr(GetU_B())+" В;\r\n";
bufstr+="|_U(C)="+MyToStr(GetU_C())+" В;\r\n";
bufstr+="\r\n";
//Комплексные фазные токи
bufstr+="|_I(A)="+MyToStr(GetI_A())+" А;\r\n";
bufstr+="|_I(B)="+MyToStr(GetI_B())+" А;\r\n";
bufstr+="|_I(C)="+MyToStr(GetI_C())+" А;\r\n";
bufstr+="\r\n";
//Ток нулевого провода
bufstr+="|_I(N)="+MyToStr(GetI_N())+" А;\r\n";
bufstr+="\r\n";
//Активные фазные мощности
bufstr+="P(A)="+MyToStr(GetP_A())+" Вт;\r\n";
bufstr+="P(B)="+MyToStr(GetP_B())+" Вт;\r\n";
bufstr+="P(C)="+MyToStr(GetP_C())+" Вт;\r\n";
bufstr+="\r\n";
//Реактивные фазные мощности
bufstr+="Q(A)="+MyToStr(GetQ_A())+" вар;\r\n";
bufstr+="Q(B)="+MyToStr(GetQ_B())+" вар;\r\n";
bufstr+="Q(C)="+MyToStr(GetQ_C())+" вар;\r\n";
bufstr+="\r\n";
//Полные фазные мощности
bufstr+="|_S(A)="+MyToStr(GetS_A())+" в-а;\r\n";
bufstr+="|_S(B)="+MyToStr(GetS_B())+" в-а;\r\n";
bufstr+="|_S(C)="+MyToStr(GetS_C())+" в-а;\r\n";
bufstr+="\r\n";
//Трехфазная активная мощность
bufstr+="P="+MyToStr(GetFullP())+" Вт;\r\n";
//Трехфазная реактивная мощность
bufstr+="Q="+MyToStr(GetFullQ())+" вар;\r\n";
//Трехфазная полная мощность
bufstr+="S="+MyToStr(GetFullS())+" в-а;\r\n";
bufstr+="\r\n";
return bufstr;}};
#include "vphase.h"
class VTriangle
{
public:
VPhase PhAB;
VPhase PhBC;
VPhase PhCA;
double Un;
VTriangle(){}
void SetUn(double U){
Un=U;}
VComplex GetU_AB(){
VComplex buf;
buf.Set(Un,0);
return buf;}
VComplex GetU_BC(){
VComplex buf;
buf.Set(Un*cos_grad(120),-Un*sin_grad(120));
return buf;}
VComplex GetU_CA(){
VComplex buf;
buf.Set(Un*cos_grad(240),-Un*sin_grad(240));
return buf;}
VComplex GetZ_AB(){
return PhAB.GetComplexResistance();}
VComplex GetZ_BC(){
return PhBC.GetComplexResistance();}
VComplex GetZ_CA(){
return PhCA.GetComplexResistance();}
VComplex GetI_AB(){
VComplex buf;
buf=GetU_AB()/GetZ_AB();
return buf;}
VComplex GetI_BC(){
VComplex buf;
buf=GetU_BC()/GetZ_BC();
return buf;}
VComplex GetI_CA(){
VComplex buf;
buf=GetU_CA()/GetZ_CA();
return buf;}
VComplex GetI_A(){
VComplex buf;
buf=GetI_AB()-GetI_CA();
return buf;}
VComplex GetI_B(){
VComplex buf;
buf=GetI_BC()-GetI_AB();
return buf;}
VComplex GetI_C(){
VComplex buf;
buf=GetI_CA()-GetI_BC();
return buf;}
VComplex GetS_AB(){
VComplex buf;
buf=GetU_AB()*ToConjugate(GetI_AB());
return buf;}
VComplex GetS_BC(){
VComplex buf;
buf=GetU_BC()*ToConjugate(GetI_BC());
return buf;}
VComplex GetS_CA(){
VComplex buf;
buf=GetU_CA()*ToConjugate(GetI_CA());
return buf;}
double GetP_AB(){
double buf;
buf=GetS_AB().real;
return buf;}
double GetP_BC(){
double buf;
buf=GetS_BC().real;
return buf;}
double GetP_CA(){
double buf;
buf=GetS_CA().real;
return buf;}
double GetQ_AB(){
double buf;
buf=GetS_AB().image;
return buf;}
double GetQ_BC(){
double buf;
buf=GetS_BC().image;
return buf;}
double GetQ_CA(){
double buf;
buf=GetS_CA().image;
return buf;}
double GetFullP(){
double buf;
buf=GetP_AB()+GetP_BC()+GetP_CA();
return buf;}
double GetFullQ(){
double buf;
buf=GetQ_AB()+GetQ_BC()+GetQ_CA();
return buf;}
double GetFullS(){
double buf;
buf=sqrt(pow(GetFullP(),2)+pow(GetFullQ(),2));
return buf;}
UnicodeString GetString(){
UnicodeString bufstr;
//Комплексные сопротивления фазы
bufstr+="|_Z(AB)="+MyToStr(GetZ_AB())+" Ом;\r\n";
bufstr+="|_Z(BC)="+MyToStr(GetZ_BC())+" Ом;\r\n";
bufstr+="|_Z(CA)="+MyToStr(GetZ_CA())+" Ом;\r\n";
bufstr+="\r\n";
//Комплексные фазные напряжения
bufstr+="|_U(AB)="+MyToStr(GetU_AB())+" В;\r\n";
bufstr+="|_U(BC)="+MyToStr(GetU_BC())+" В;\r\n";
bufstr+="|_U(CA)="+MyToStr(GetU_CA())+" В;\r\n";
bufstr+="\r\n";
//Комплексные фазные токи
bufstr+="|_I(AB)="+MyToStr(GetI_AB())+" А;\r\n";
bufstr+="|_I(BC)="+MyToStr(GetI_BC())+" А;\r\n";
bufstr+="|_I(CA)="+MyToStr(GetI_CA())+" А;\r\n";
bufstr+="\r\n";
//Линейные токи, равны фазным (по треугольнику) только переведены в обычные значения.
bufstr+="I(A)="+MyToStr(GetI_A())+" А;\r\n";
bufstr+="I(B)="+MyToStr(GetI_B())+" А;\r\n";
bufstr+="I(C)="+MyToStr(GetI_C())+" А;\r\n";
bufstr+="\r\n";
//Активные фазные мощности
bufstr+="P(AB)="+MyToStr(GetP_AB())+" Вт;\r\n";
bufstr+="P(BC)="+MyToStr(GetP_BC())+" Вт;\r\n";
bufstr+="P(CA)="+MyToStr(GetP_CA())+" Вт;\r\n";
bufstr+="\r\n";
//Реактивные фазные мощности
bufstr+="Q(AB)="+MyToStr(GetQ_AB())+" вар;\r\n";
bufstr+="Q(BC)="+MyToStr(GetQ_BC())+" вар;\r\n";
bufstr+="Q(CA)="+MyToStr(GetQ_CA())+" вар;\r\n";
bufstr+="\r\n";
//Полные фазные мощности
bufstr+="|_S(AB)="+MyToStr(GetS_AB())+" в-а;\r\n";
bufstr+="|_S(BC)="+MyToStr(GetS_BC())+" в-а;\r\n";
bufstr+="|_S(CA)="+MyToStr(GetS_CA())+" в-а;\r\n";
bufstr+="\r\n";
//Трехфазная активная мощность
bufstr+="P="+MyToStr(GetFullP())+" Вт;\r\n";
//Трехфазная реактивная мощность
bufstr+="Q="+MyToStr(GetFullQ())+" вар;\r\n";
//Трехфазная полная мощность
bufstr+="S="+MyToStr(GetFullS())+" в-а;\r\n";
bufstr+="\r\n";
return bufstr;}};
// формы :
#include "Main.h"
#include "Help.h";
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <ComCtrls.hpp>
#include <Tabs.hpp>
#include <Vcl.Menus.hpp>
#include <Vcl.Dialogs.hpp>
#include <Vcl.ExtDlgs.hpp>;
#include <vcl.h>
#include <inifiles.hpp>
#include <math.hpp>
// V_Lib :
#include <vtriangle.h>
#include <vstarnonull.h>
#include <vstarnull.h>
int v_Frame = -1; // текущее окно программы
// константы, чисто для удобства
const c_FRAME_GENERAL = 0;
const c_FRAME_PHASE_1 = 1; // AC
const c_FRAME_PHASE_2 = 2; // CB
const c_FRAME_PHASE_3 = 3; // BA
const c_FRAME_RESULT = 4;
// типы компонентов
const c_ELEMENT_OFF = -1;
const c_ELEMENT_R = 0;
const c_ELEMENT_C = 1;
const c_ELEMENT_L = 2;
const c_ELEMENT_NULL = 3;
// единицы измерения
const c_UNIT_OM = 0;
const c_UNIT_kOM = 1;
int v_Units_Resist = c_UNIT_OM; // стандартные измерения сопротивления
struct TBrElement {
int Type;
double Value;
};
struct TBranch {
TBrElement Element[3];
bool Use_X;
bool PConnect_Left; // параллельное соединение с предыдущей ветвью
bool PConnect_Right; // параллельное соединение со следующей
Free() {
Use_X = false;
PConnect_Left = false;
PConnect_Right = false;
for (int i = 0; i < 3; i++) {
Element[i].Type = c_ELEMENT_OFF;
Element[i].Value = 0;}}};
struct TPhase {
TBranch BranchList[50];
int BranchCount;
int BranchID;
double GPoints[2];
Free() {
for (int i = 0; i < BranchCount; i++) {
BranchList[i].Free();}
BranchCount = 0;
BranchID = -1;
GPoints[0]=0;
GPoints[1]=0;}};
TPhase v_Phase[4];
bool ReadParams = false;
bool ConfirmActions = true; // подтверждение действий
UnicodeString Phase_1_name = "AB";
UnicodeString Phase_2_name = "BC";
UnicodeString Phase_3_name = "CA";
class TMainForm : public TForm {
__published: // IDE-managed Components
TPanel *Pan_Top;
TButton *Btn_Help;
TPanel *Frame_General;
TLabel *Text_Head;
TScrollBox *Frame_Phase;
TPanel *Frame_Result;
TTabSet *Tabs;
TButton *Btn_AddBr;
TLabel *Text_BrCount;
TLabel *Text_BrID;
TButton *Btn_DelBr;
TPanel *Group_General;
TGroupBox *Group_Params;
TLabel *Text_V;
TLabel *Text_F;
TEdit *Value_F;
TEdit *Value_V;
TGroupBox *Group_Units;
TLabel *Text_Units_R;
TComboBox *Sel_UResist;
TPanel *Group_Phase;
TPanel *vBranch;
TLabel *Text_Parallel;
TRadioGroup *Element_1;
TRadioGroup *Element_2;
TRadioGroup *Element_3;
TCheckBox *Check_PLeft;
TCheckBox *Check_PRight;
TCheckBox *Check_Use_X;
TStaticText *Text_Units_1;
TEdit *Value_El_2;
TEdit *Value_El_3;
TStaticText *Text_Units_2;
TStaticText *Text_Units_3;
TEdit *Value_El_1;
TStaticText *Text_UID_1;
TStaticText *Text_UID_2;
TStaticText *Text_UID_3;
TButton *Btn_Prev;
TImage *Img_CLeft;
TImage *Img_CRight;
TButton *Btn_Next;
TRadioGroup *Group_Mode;
TPopupMenu *Menu_Main;
TMenuItem *N1;
TMenuItem *N2;
TMenuItem *N3;
TMenuItem *N4;
TMenuItem *N5;
TMenuItem *N6;
TMenuItem *N7;
TPopupMenu *Menu_Result;
TMenuItem *N8;
TMenuItem *N9;
TMenuItem *N10;
TSaveDialog *Dlg_SaveData;
TSaveDialog *Dlg_SaveResult;
TOpenDialog *Dlg_OpenData;
TPageControl *Pages;
TTabSheet *Page_Result;
TTabSheet *Page_Graph;
TImage *Img_Graph;
TRichEdit *Text_Result;
TPopupMenu *Menu_Graph;
TMenuItem *N11;
TSaveDialog *Dlg_SaveGraph;
void __fastcall Value_VChange(TObject *Sender);
void __fastcall Value_FChange(TObject *Sender);
void __fastcall TabsChange(TObject *Sender, int NewTab, bool &AllowChange);
void __fastcall Btn_PrevClick(TObject *Sender);
void __fastcall Btn_NextClick(TObject *Sender);
void __fastcall Check_Use_XClick(TObject *Sender);
void __fastcall Value_El_1Change(TObject *Sender);
void __fastcall Value_El_2Change(TObject *Sender);
void __fastcall Value_El_3Change(TObject *Sender);
void __fastcall Check_PLeftClick(TObject *Sender);
void __fastcall Check_PRightClick(TObject *Sender);
void __fastcall Element_1Click(TObject *Sender);
void __fastcall Element_2Click(TObject *Sender);
void __fastcall Element_3Click(TObject *Sender);
void __fastcall Sel_UResistSelect(TObject *Sender);
void __fastcall Value_VExit(TObject *Sender);
void __fastcall Value_FExit(TObject *Sender);
void __fastcall Value_El_1Exit(TObject *Sender);
void __fastcall Value_El_2Exit(TObject *Sender);
void __fastcall Value_El_3Exit(TObject *Sender);
void __fastcall FormResize(TObject *Sender);
void __fastcall Group_ModeClick(TObject *Sender);
void __fastcall N6Click(TObject *Sender);
void __fastcall N4Click(TObject *Sender);
void __fastcall N7Click(TObject *Sender);
void __fastcall N9Click(TObject *Sender);
void __fastcall N8Click(TObject *Sender);
void __fastcall N2Click(TObject *Sender);
void __fastcall N1Click(TObject *Sender);
void __fastcall Page_GraphResize(TObject *Sender);
void __fastcall N11Click(TObject *Sender);
protected: // User declarations
void __fastcall EditChange(TEdit *Sender); // для фильтрации вводимых символов
void __fastcall EditExit(TEdit *Sender);
void __fastcall ShowMenu(TObject *Sender);
void __fastcall ShowSettings(TObject *Sender);
void __fastcall ShowHelp(TObject *Sender); // вызов справочной информации
void __fastcall ShowAbout(TObject *Sender);
void __fastcall SelectFrame(int Frame);
// работа с фазами
void __fastcall SelectPhase(int PhaseId);
void __fastcall UpdatePhaseInfo();
// работа с ветвями
void __fastcall ToggleBranchCtrl(bool _Enabled); // вкл/выкл управление ветвями (отключено, если нет ветвей)
void __fastcall Branch_Explore(bool Reverse, bool GoEnd); // переключение ветвей. Reverse false - следующая, true - предыдущая
void __fastcall Branch_UpdateInfo();
void __fastcall Branch_Create();
void __fastcall Branch_Destroy(int BrID);
void __fastcall Branch_Add(TObject *Sender);
void __fastcall Branch_Delete(TObject *Sender);
void __fastcall Branch_CheckParall(int BrID, int Side, bool _Checked); // Side = 1 - слева, Side = 2 - справа
// украшательство
void __fastcall DrawConnect();
// расчеты
bool __fastcall DoCalculate();
void Echo_Result_Triangle();
void Echo_Result_StarWONull();
void Echo_Result_StarWNull();
bool __fastcall DrawGraph();
// настройки
void __fastcall LoadConfig();
// разное
bool __fastcall Reset(); // сброс всех значений на стандартные
// сохранение/загрузка
void __fastcall LoadData();
void __fastcall SaveData();
void __fastcall SaveResult();
void __fastcall SaveGraph();
public: // User declarations
__fastcall TMainForm(TComponent* Owner);
};
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//инициализация void __fastcall TMainForm::LoadConfig() {
TIniFile *CfgFile;
CfgFile = new TIniFile(ExtractFilePath(Application->ExeName) + "Config.cfg");
ConfirmActions = CfgFile->ReadBool("Misc", "ConfirmActions", true);
UnicodeString ThemeName = CfgFile->ReadString("Interface", "Theme", "Windows");
CfgFile->Free();
TStyleManager::TrySetStyle(ThemeName);}
__fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner) {
Btn_Help->OnClick = ShowMenu;
Btn_AddBr->OnClick = Branch_Add;
Btn_DelBr->OnClick = Branch_Delete;
// инициализация фаз
v_Phase[c_FRAME_PHASE_1].BranchID = -1;
v_Phase[c_FRAME_PHASE_1].BranchCount = 0;
v_Phase[c_FRAME_PHASE_2].BranchID = -1;
v_Phase[c_FRAME_PHASE_2].BranchCount = 0;
v_Phase[c_FRAME_PHASE_3].BranchID = -1;
v_Phase[c_FRAME_PHASE_3].BranchCount = 0;
// запуск
Tabs->TabIndex = c_FRAME_GENERAL;
LoadConfig();}
//загр/сохр
void __fastcall TMainForm::SaveResult() {
if (Dlg_SaveResult->Execute()) {
Text_Result->Lines->SaveToFile(Dlg_SaveResult->FileName + ".rtf");}}
void __fastcall TMainForm::SaveData() {
if (Dlg_SaveData->Execute()) {
Screen->Cursor = crHourGlass;
TIniFile * DataFile = new TIniFile(Dlg_SaveData->FileName + ".3dt");
DataFile->WriteFloat("General", "V", Value_V->Text.ToDouble());
DataFile->WriteFloat("General", "F", Value_F->Text.ToDouble());
DataFile->WriteInteger("General", "UResist", Sel_UResist->ItemIndex);
DataFile->WriteInteger("General", "Mode", Group_Mode->ItemIndex);
DataFile->WriteInteger("Phases","Phase_1.BranchCount",v_Phase[1].BranchCount);
DataFile->WriteInteger("Phases", "Phase_2.BranchCount", v_Phase[2].BranchCount);
DataFile->WriteInteger("Phases", "Phase_3.BranchCount", v_Phase[3].BranchCount);
DataFile->WriteInteger("Phases", "Phase_1.BranchID", v_Phase[1].BranchID);
DataFile->WriteInteger("Phases", "Phase_2.BranchID", v_Phase[2].BranchID);
DataFile->WriteInteger("Phases", "Phase_3.BranchID", v_Phase[3].BranchID);
for (int p = 1; p < 4; p++) {
if (v_Phase[p].BranchCount > 0)
for (int i = 0; i < v_Phase[p].BranchCount; i++) {
DataFile->WriteBool("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "Use_X", v_Phase[p].BranchList[i].Use_X);
DataFile->WriteBool("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "PConnect_Left", v_Phase[p].BranchList[i].PConnect_Left);
DataFile->WriteBool("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "PConnect_Right", v_Phase[p].BranchList[i].PConnect_Right);
DataFile->WriteInteger("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "Element_1.Type", v_Phase[p].BranchList[i].Element[0].Type);
DataFile->WriteFloat("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "Element_1.Value", v_Phase[p].BranchList[i].Element[0].Value);
DataFile->WriteInteger("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "Element_2.Type", v_Phase[p].BranchList[i].Element[1].Type);
DataFile->WriteFloat("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "Element_2.Value", v_Phase[p].BranchList[i].Element[1].Value);
DataFile->WriteInteger("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "Element_3.Type", v_Phase[p].BranchList[i].Element[2].Type);
DataFile->WriteFloat("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "Element_3.Value", v_Phase[p].BranchList[i].Element[2].Value);}}
DataFile->Free();
Screen->Cursor = crDefault;}}
void __fastcall TMainForm::LoadData() {
if (Reset()) {
if (Dlg_OpenData->Execute()) {
Screen->Cursor = crHourGlass;
TIniFile * DataFile = new TIniFile(Dlg_OpenData->FileName);
ReadParams = true;
Value_V->Text = UnicodeString(DataFile->ReadFloat("General", "V", 220));
Value_F->Text = UnicodeString(DataFile->ReadFloat("General", "F", 50));
Sel_UResist->ItemIndex = DataFile->ReadInteger("General", "UResist", 0);
Group_Mode->ItemIndex = DataFile->ReadInteger("General", "Mode", 0);
v_Phase[1].BranchCount = DataFile->ReadInteger("Phases", "Phase_1.BranchCount", 0);
v_Phase[2].BranchCount = DataFile->ReadInteger("Phases", "Phase_2.BranchCount", 0);
v_Phase[3].BranchCount = DataFile->ReadInteger("Phases", "Phase_3.BranchCount", 0);
v_Phase[1].BranchID = DataFile->ReadInteger("Phases", "Phase_1.BranchID", 0);
v_Phase[2].BranchID = DataFile->ReadInteger("Phases", "Phase_2.BranchID", 0);
v_Phase[3].BranchID = DataFile->ReadInteger("Phases", "Phase_3.BranchID", 0);
for (int p = 1; p < 4; p++) {
if (v_Phase[p].BranchCount > 0)
for (int i = 0; i < v_Phase[p].BranchCount; i++) {
v_Phase[p].BranchList[i].Use_X = DataFile->ReadBool("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "Use_X", false);
v_Phase[p].BranchList[i].PConnect_Left = DataFile->ReadBool("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "PConnect_Left", false);
v_Phase[p].BranchList[i].PConnect_Right = DataFile->ReadBool("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "PConnect_Right", false);
v_Phase[p].BranchList[i].Element[0].Type = DataFile->ReadInteger("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "Element_1.Type", 0);
v_Phase[p].BranchList[i].Element[0].Value = DataFile->ReadFloat("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "Element_1.Value", 0);
v_Phase[p].BranchList[i].Element[1].Type = DataFile->ReadInteger("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "Element_2.Type", 3);
v_Phase[p].BranchList[i].Element[1].Value = DataFile->ReadFloat("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "Element_2.Value", 0);
v_Phase[p].BranchList[i].Element[2].Type = DataFile->ReadInteger("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "Element_3.Type", 3);
v_Phase[p].BranchList[i].Element[2].Value = DataFile->ReadFloat("Phase_" + UnicodeString(p) + ".Branch_" + UnicodeString(i), "Element_3.Value", 0);}}
DataFile->Free();
ReadParams = false;
Screen->Cursor = crDefault;}}}
//специальное void __fastcall TMainForm::SaveGraph() {
if (Dlg_SaveGraph->Execute()) {
Img_Graph->Picture->SaveToFile(Dlg_SaveGraph->FileName + ".bmp");}}
void __fastcall TMainForm::N11Click(TObject *Sender) {
SaveGraph();}
void __fastcall TMainForm::N1Click(TObject *Sender) {
LoadData();}
void __fastcall TMainForm::N2Click(TObject *Sender) {
SaveData();}
void __fastcall TMainForm::N8Click(TObject *Sender) {
SaveResult();}
void __fastcall TMainForm::N6Click(TObject *Sender) {
ShowHelp(this);}
void __fastcall TMainForm::N4Click(TObject *Sender) {
ShowSettings(this);}
void __fastcall TMainForm::N7Click(TObject *Sender) {
ShowAbout(this);}
void __fastcall TMainForm::N9Click(TObject *Sender) {
Reset();}
void __fastcall TMainForm::FormResize(TObject *Sender) {
Tabs->StartMargin = (Tabs->Width - 334) / 2;}
void __fastcall TMainForm::ShowMenu(TObject *Sender) {
TPoint MenuPos;
MenuPos = Btn_Help->ClientToScreen(Point(Btn_Help->Width, Btn_Help->Height));
Menu_Main->Popup(MenuPos.X, MenuPos.Y);}
void __fastcall TMainForm::ShowSettings(TObject *Sender) {
Application->CreateForm(__classid(THelpForm), &HelpForm);
HelpForm->Pan_Tabs->TabIndex = 0;
HelpForm->ShowModal();
ConfirmActions = HelpForm->Check_ConfirmActions->Checked;
HelpForm->Free();}
void __fastcall TMainForm::ShowAbout(TObject *Sender) {
Application->CreateForm(__classid(THelpForm), &HelpForm);
HelpForm->Pan_Tabs->TabIndex = 2;
HelpForm->ShowModal();
HelpForm->Free();}
void __fastcall TMainForm::ShowHelp(TObject *Sender) {
Application->CreateForm(__classid(THelpForm), &HelpForm);
HelpForm->Pan_Tabs->TabIndex = 1;
HelpForm->ShowModal();
HelpForm->Free();}
void __fastcall TMainForm::EditChange(TEdit *Sender) {
bool Dot = false;
int LastPos = 0;
UnicodeString str;
str = Sender->Text;
TSysCharSet CharSet, CharSet_;
CharSet << ',' << '0' << '1' << '2' << '3' << '4' << '5' << '6' << '7' << '8' << '9';
CharSet_ << '0' << '1' << '2' << '3' << '4' << '5' << '6' << '7' << '8' << '9';
int i = 1;
if (str.Length() > 0) {
while (true) {
if ((str[i] == '.') & (!Dot)) {
str[i] = ',';
LastPos = 1;}
if ((!Dot && (!CharInSet(str[i], CharSet))) || (Dot && (!CharInSet(str[i], CharSet_)))) {
str.Delete(i, 1);}
else {
if (str[i] == ',') {
Dot = true;}
i++;}
if (i >= str.Length() + 1)
break;}
if (Sender->Text != str) {
LastPos = LastPos + Sender->SelStart;
Sender->Text = str;
Sender->SelStart = LastPos - 1;}}}
void __fastcall TMainForm::EditExit(TEdit *Sender) {
double Val = 0;
TryStrToFloat(Sender->Text, Val);
if (Val == 0) {
Sender->Text = "0";}}
void __fastcall TMainForm::Value_VChange(TObject * Sender) {
EditChange(Value_V);}
void __fastcall TMainForm::Value_VExit(TObject *Sender) {
EditExit(Value_V);}
void __fastcall TMainForm::Value_FChange(TObject * Sender) {
EditChange(Value_F);}
void __fastcall TMainForm::Value_FExit(TObject *Sender) {
EditExit(Value_F);}
void __fastcall TMainForm::Value_El_1Exit(TObject *Sender) {
EditExit(Value_El_1);}
void __fastcall TMainForm::Value_El_2Exit(TObject *Sender) {
EditExit(Value_El_2);}
void __fastcall TMainForm::Value_El_3Exit(TObject *Sender) {
EditExit(Value_El_3);}
//работа интерфейса void __fastcall TMainForm::SelectFrame(int Frame) {
if (v_Frame != Frame) {
switch (v_Frame) {
case c_FRAME_GENERAL: {
Frame_General->Visible = false;
Frame_General->Align = alNone;}
case c_FRAME_PHASE_1: {
if ((Frame == c_FRAME_GENERAL) || (Frame == c_FRAME_RESULT)) {
Frame_Phase->Visible = false;
Frame_Phase->Align = alNone;}}
case c_FRAME_PHASE_2: {
if ((Frame == c_FRAME_GENERAL) || (Frame == c_FRAME_RESULT)) {
Frame_Phase->Visible = false;
Frame_Phase->Align = alNone;}}
case c_FRAME_PHASE_3: {
if ((Frame == c_FRAME_GENERAL) || (Frame == c_FRAME_RESULT)) {
Frame_Phase->Visible = false;
Frame_Phase->Align = alNone;}}
case c_FRAME_RESULT: {
Frame_Result->Visible = false;
Frame_Result->Align = alNone;}}
v_Frame = Frame;
switch (Frame) {
case c_FRAME_GENERAL: {
Text_Head->Caption = "Общие параметры";
Frame_General->Align = alClient;
Frame_General->Visible = true;
break;}
case c_FRAME_PHASE_1: {
Text_Head->Caption = "Первая фаза (" + Phase_1_name + ")";
Frame_Phase->Align = alClient;
SelectPhase(Frame);
Frame_Phase->Visible = true;
break;}
case c_FRAME_PHASE_2: {
Text_Head->Caption = "Вторая фаза (" + Phase_2_name + ")";
Frame_Phase->Align = alClient;
SelectPhase(Frame);
Frame_Phase->Visible = true;
break;}
case c_FRAME_PHASE_3: {
Text_Head->Caption = "Третья фаза (" + Phase_3_name + ")";
Frame_Phase->Align = alClient;
SelectPhase(Frame);
Frame_Phase->Visible = true;
break;}
case c_FRAME_RESULT: {
Text_Head->Caption = "Результаты расчетов";
Frame_Result->Align = alClient;
Frame_Result->Visible = true;
DoCalculate();}}}}
void __fastcall TMainForm::TabsChange(TObject *Sender, int NewTab, bool &AllowChange) {
SelectFrame(NewTab);}
void __fastcall TMainForm::Btn_PrevClick(TObject *Sender) {
Branch_Explore(true, false);}
void __fastcall TMainForm::Btn_NextClick(TObject *Sender) {
Branch_Explore(false, false);}
void __fastcall TMainForm::Group_ModeClick(TObject *Sender) {
switch (Group_Mode->ItemIndex) {
case 0: {
Phase_1_name = "AB";
Phase_2_name = "BC";
Phase_3_name = "CA";
break;}
case 1: {
Phase_1_name = "A";
Phase_2_name = "B";
Phase_3_name = "C";
break;}
case 2: {
Phase_1_name = "A";
Phase_2_name = "B";
Phase_3_name = "C";}}
Tabs->Tabs->Strings[1] = "Фаза " + Phase_1_name;
Tabs->Tabs->Strings[2] = "Фаза " + Phase_2_name;
Tabs->Tabs->Strings[3] = "Фаза " + Phase_3_name;}
//фазы/ветви bool __fastcall TMainForm::Reset() {
int Action = 1;
if (ConfirmActions == true) {
Action = MessageBox(Application->Handle, UnicodeString("Это приведет к потере всех изменений в начальных параметрах, ветвях и фазах. Хотите сохранить изменения перед сбросом?").w_str(),
UnicodeString("Общий сброс").w_str(), MB_YESNOCANCEL + MB_ICONWARNING);}
if (Action == 6) {
SaveData();}
if (Action != 2) {
Tabs->TabIndex = 0;
Value_V->Text = "220";
Value_F->Text = "50";
Group_Mode->ItemIndex = 0;
Sel_UResist->ItemIndex = 0;
v_Phase[1].Free();
v_Phase[2].Free();
v_Phase[3].Free();
return true;}
else
return false;}
void __fastcall TMainForm::UpdatePhaseInfo() {
Text_BrCount->Caption = "Ветвей : " + IntToStr(v_Phase[v_Frame].BranchCount);
if (v_Phase[v_Frame].BranchCount == 0) {
ToggleBranchCtrl(false);}
else
ToggleBranchCtrl(true);}
void __fastcall TMainForm::SelectPhase(int PhaseId) {
UpdatePhaseInfo();
Branch_UpdateInfo();}
void __fastcall TMainForm::ToggleBranchCtrl(bool _Enabled) {
switch (_Enabled) {
case true: {
vBranch->Enabled = true;
Text_BrID->Visible = true;
Btn_DelBr->Visible = true;
break;}
case false: {
Text_Units_1->Visible = false;
Value_El_1->Visible = false;
Text_UID_1->Visible = false;
Text_Units_2->Visible = false;
Value_El_2->Visible = false;
Text_UID_2->Visible = false;
Text_Units_3->Visible = false;
Value_El_3->Visible = false;
Text_UID_3->Visible = false;
Text_Units_1->Caption = "";
Text_UID_1->Caption = "";
Value_El_1->Text = "0";
Text_Units_2->Caption = "";
Text_UID_2->Caption = "";
Value_El_2->Text = "0";
Text_Units_3->Caption = "";
Text_UID_3->Caption = "";
Value_El_3->Text = "0";
vBranch->Enabled = false;
Text_BrID->Visible = false;
Btn_DelBr->Visible = false;}}}
void __fastcall TMainForm::Branch_Explore(bool Reverse, bool GoEnd) {
if (v_Phase[v_Frame].BranchCount == 1) {
if (v_Phase[v_Frame].BranchID != 0) {
v_Phase[v_Frame].BranchID = 0;
Branch_UpdateInfo();}}
else
switch (Reverse) {
// вперед
case false: {
if (v_Phase[v_Frame].BranchID < v_Phase[v_Frame].BranchCount - 1) {
if (GoEnd) {
v_Phase[v_Frame].BranchID = v_Phase[v_Frame].BranchCount - 1;}
else
v_Phase[v_Frame].BranchID++;
Branch_UpdateInfo();
break;}}
// назад
case true: {
if (v_Phase[v_Frame].BranchID > 0) {
if (GoEnd) {
v_Phase[v_Frame].BranchID = 0;}
else
v_Phase[v_Frame].BranchID--;
Branch_UpdateInfo();}}}}
void __fastcall TMainForm::Branch_UpdateInfo() {
if (v_Phase[v_Frame].BranchCount > 1) {
if (v_Phase[v_Frame].BranchID == 0) {
Btn_Prev->Enabled = false;
Btn_Next->Enabled = true;
Check_PLeft->Visible = false;
Check_PRight->Visible = true;}
else if (v_Phase[v_Frame].BranchID == v_Phase[v_Frame].BranchCount - 1) {
Btn_Prev->Enabled = true;
Btn_Next->Enabled = false;
Check_PLeft->Visible = true;
Check_PRight->Visible = false;}
else {
Btn_Prev->Enabled = true;
Btn_Next->Enabled = true;
Check_PLeft->Visible = true;
Check_PRight->Visible = true;}}
else {
Btn_Prev->Enabled = false;
Btn_Next->Enabled = false;
Check_PLeft->Visible = false;
Check_PRight->Visible = false;}
// если есть ветви
if (v_Phase[v_Frame].BranchCount > 0) {
Text_BrID->Caption = " Ветвь # " + IntToStr(v_Phase[v_Frame].BranchID + 1);
// считываем параметры ветви
ReadParams = true;
Check_Use_X->Checked = v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].Use_X;
Check_PLeft->Checked = v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].PConnect_Left;
Check_PRight->Checked= Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].PConnect_Right;
DrawConnect();
Element_1->ItemIndex = v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].Element[0].Type;
Value_El_1->Text = FloatToStr(v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].Element[0].Value);
Element_2->ItemIndex = v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].Element[1].Type;
Value_El_2->Text = FloatToStr(v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].Element[1].Value);
Element_3->ItemIndex = v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].Element[2].Type;
Value_El_3->Text = FloatToStr(v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].Element[2].Value);
ReadParams = false;}
// если нет, то все отключаем
else {
ReadParams = true;
Text_BrID->Caption = " ";
Check_Use_X->Checked = false;
Check_PLeft->Checked = false;
Check_PRight->Checked = false;
DrawConnect();
Element_1->ItemIndex = -1;
Value_El_1->Text = "";
Element_2->ItemIndex = -1;
Value_El_2->Text = "";
Element_3->ItemIndex = -1;
Value_El_3->Text = "";
ReadParams = false;}}
void __fastcall TMainForm::Branch_Create() {
int BrID = v_Phase[v_Frame].BranchCount - 1;
v_Phase[v_Frame].BranchList[BrID].Element[0].Type = c_ELEMENT_R;
v_Phase[v_Frame].BranchList[BrID].Element[0].Value = 0;
v_Phase[v_Frame].BranchList[BrID].Element[1].Type = c_ELEMENT_NULL;
v_Phase[v_Frame].BranchList[BrID].Element[1].Value = 0;
v_Phase[v_Frame].BranchList[BrID].Element[2].Type = c_ELEMENT_NULL;
v_Phase[v_Frame].BranchList[BrID].Element[2].Value = 0;
v_Phase[v_Frame].BranchList[BrID].Use_X = false;
v_Phase[v_Frame].BranchList[BrID].PConnect_Left = false;
v_Phase[v_Frame].BranchList[BrID].PConnect_Right = false;}
void __fastcall TMainForm::Branch_Destroy(int BrID) {
v_Phase[v_Frame].BranchList[BrID].Element[0].Type = c_ELEMENT_R;
v_Phase[v_Frame].BranchList[BrID].Element[0].Value = 0;
v_Phase[v_Frame].BranchList[BrID].Element[1].Type = c_ELEMENT_NULL;
v_Phase[v_Frame].BranchList[BrID].Element[1].Value = 0;
v_Phase[v_Frame].BranchList[BrID].Element[2].Type = c_ELEMENT_NULL;
v_Phase[v_Frame].BranchList[BrID].Element[2].Value = 0;
v_Phase[v_Frame].BranchList[BrID].Use_X = false;
v_Phase[v_Frame].BranchList[BrID].PConnect_Left = false;
v_Phase[v_Frame].BranchList[BrID].PConnect_Right = false;}
void __fastcall TMainForm::Branch_Add(TObject *Sender) {
if (v_Phase[v_Frame].BranchCount < 50) {
v_Phase[v_Frame].BranchCount++;
Branch_Create();
UpdatePhaseInfo();
Branch_Explore(false, true);}
else
MessageBox(Handle, UnicodeString("Невозможно добавить ветвь. В программе установлено ограничение на 50 ветвей в одной фазе.").w_str(),
UnicodeString("Ошибка : Невозможно добавить ветвь").w_str(), 16);}
void __fastcall TMainForm::Branch_Delete(TObject *Sender) {
if (v_Phase[v_Frame].BranchCount > 0) {
bool Accept = true; // для подтверждения действий
if (ConfirmActions) {
if (MessageBox(Application->Handle, UnicodeString("Вы действительно хотите удалить ветвь?").w_str(), UnicodeString("Подтверждение удаления").w_str(), MB_YESNO + MB_ICONWARNING) != 6)
Accept = false;}
if (Accept) {
Branch_CheckParall(v_Phase[v_Frame].BranchID, 3, false);
if (v_Phase[v_Frame].BranchID == v_Phase[v_Frame].BranchCount - 1) {
Branch_Destroy(v_Phase[v_Frame].BranchID);
v_Phase[v_Frame].BranchCount--;
v_Phase[v_Frame].BranchID--;}
else {
for (int i = v_Phase[v_Frame].BranchID; i < v_Phase[v_Frame].BranchCount; i++) {
v_Phase[v_Frame].BranchList[i] = v_Phase[v_Frame].BranchList[i + 1];}
v_Phase[v_Frame].BranchCount--;
if (v_Phase[v_Frame].BranchID > v_Phase[v_Frame].BranchCount - 1) {
v_Phase[v_Frame].BranchID = v_Phase[v_Frame].BranchCount - 1;}}
UpdatePhaseInfo();
Branch_UpdateInfo();}}}
void __fastcall TMainForm::Branch_CheckParall(int BrID, int Side, bool _Checked) {
if (v_Phase[v_Frame].BranchCount > 1) {
if ((Side == 1) || (Side == 3)) {
if (BrID > 0) {
v_Phase[v_Frame].BranchList[BrID].PConnect_Left = _Checked;
v_Phase[v_Frame].BranchList[BrID - 1].PConnect_Right = _Checked;}}
if ((Side == 2) || (Side == 3)) {
if (BrID < v_Phase[v_Frame].BranchCount - 1) {
v_Phase[v_Frame].BranchList[BrID].PConnect_Right = _Checked;
v_Phase[v_Frame].BranchList[BrID + 1].PConnect_Left = _Checked;}}}}
// обработка событий применения параметров ветви void __fastcall TMainForm::Sel_UResistSelect(TObject *Sender) {
v_Units_Resist = Sel_UResist->ItemIndex;
Element_1->ItemIndex = -1;
Element_2->ItemIndex = -1;
Element_3->ItemIndex = -1;}
void __fastcall TMainForm::Check_Use_XClick(TObject *Sender) {
if (!ReadParams) {
v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].Use_X = Check_Use_X->Checked;
if ((Element_1->ItemIndex == c_ELEMENT_L) || (Element_1->ItemIndex == c_ELEMENT_C)) {
Element_1->OnClick(this);}
if ((Element_2->ItemIndex == c_ELEMENT_L) || (Element_2->ItemIndex == c_ELEMENT_C)) {
Element_2->OnClick(this);}
if ((Element_3->ItemIndex == c_ELEMENT_L) || (Element_3->ItemIndex == c_ELEMENT_C)) {
Element_3->OnClick(this);}}
// переключаем названия элементов (L/XL)
switch (Check_Use_X->Checked) {
case false: {
Element_1->Items->Strings[1] = "C";
Element_1->Items->Strings[2] = "L";
Element_2->Items->Strings[1] = "C";
Element_2->Items->Strings[2] = "L";
Element_3->Items->Strings[1] = "C";
Element_3->Items->Strings[2] = "L";
break;}
case true: {
Element_1->Items->Strings[1] = "XC";
Element_1->Items->Strings[2] = "XL";
Element_2->Items->Strings[1] = "XC";
Element_2->Items->Strings[2] = "XL";
Element_3->Items->Strings[1] = "XC";
Element_3->Items->Strings[2] = "XL";}}}
void __fastcall TMainForm::Check_PLeftClick(TObject *Sender) {
if (!ReadParams) {
Branch_CheckParall(v_Phase[v_Frame].BranchID, 1, Check_PLeft->Checked);
DrawConnect();}}
void __fastcall TMainForm::Check_PRightClick(TObject *Sender) {
if (!ReadParams) {
Branch_CheckParall(v_Phase[v_Frame].BranchID, 2, Check_PRight->Checked);
DrawConnect();}}
void __fastcall TMainForm::Element_1Click(TObject *Sender) {
if (!ReadParams) {
v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].Element[0].Type = Element_1->ItemIndex;if ((Element_1->ItemIndex == Element_2->ItemIndex) || (Element_1->ItemIndex == Element_3->ItemIndex)) {
if ((Element_2->ItemIndex != 0) & (Element_3->ItemIndex != 0)) {
Element_1->ItemIndex = 0;}
else if ((Element_2->ItemIndex != 1) & (Element_3->ItemIndex != 1)) {
Element_1->ItemIndex = 1;}
else if ((Element_2->ItemIndex != 2) & (Element_3->ItemIndex != 2)) {
Element_1->ItemIndex = 2;}}}
switch (Element_1->ItemIndex) {
case c_ELEMENT_R: {
Text_Units_1->Caption = "Сопротивление : ";
if (v_Units_Resist == c_UNIT_OM) {
Text_UID_1->Caption = "Ом";}
else if (v_Units_Resist == c_UNIT_kOM) {
Text_UID_1->Caption = "кОм";}
Value_El_1->Text = "0";
Text_Units_1->Visible = true;
Value_El_1->Visible = true;
Text_UID_1->Visible = true;
break;}
case c_ELEMENT_C: {
if (!Check_Use_X->Checked) {
Text_Units_1->Caption = "Емкость : ";
Text_UID_1->Caption = "мкФ";}
else {
Text_Units_1->Caption = "Сопротивление : ";
if (v_Units_Resist == c_UNIT_OM) {
Text_UID_1->Caption = "Ом";}
else if (v_Units_Resist == c_UNIT_kOM) {
Text_UID_1->Caption = "кОм";}}
Value_El_1->Text = "0";
Text_Units_1->Visible = true;
Value_El_1->Visible = true;
Text_UID_1->Visible = true;
break;}
case c_ELEMENT_L: {
if (!Check_Use_X->Checked) {
Text_Units_1->Caption = "Индуктивность : ";
Text_UID_1->Caption = "Гн";}
else {
Text_Units_1->Caption = "Сопротивление : ";
if (v_Units_Resist == c_UNIT_OM) {
Text_UID_1->Caption = "Ом";}
else if (v_Units_Resist == c_UNIT_kOM) {
Text_UID_1->Caption = "кОм";}}
Value_El_1->Text = "0";
Text_Units_1->Visible = true;
Value_El_1->Visible = true;
Text_UID_1->Visible = true;
break;}
case c_ELEMENT_OFF: {
Text_Units_2->Visible = false;
Value_El_2->Visible = false;
Text_UID_2->Visible = false;
Text_Units_2->Caption = "";
Text_UID_2->Caption = "";
Value_El_2->Text = "0";
break;}}}
void __fastcall TMainForm::Element_2Click(TObject *Sender) {
if (!ReadParams) {
v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].Element[1].Type = Element_2->ItemIndex;
if (Element_2->ItemIndex != 3)
if ((Element_2->ItemIndex == Element_1->ItemIndex) || (Element_2->ItemIndex == Element_3->ItemIndex)) {
if ((Element_1->ItemIndex != 0) & (Element_3->ItemIndex != 0)) {
Element_2->ItemIndex = 0;}
else if ((Element_1->ItemIndex != 1) & (Element_3->ItemIndex != 1)) {
Element_2->ItemIndex = 1;}
else if ((Element_1->ItemIndex != 2) & (Element_3->ItemIndex != 2)) {
Element_2->ItemIndex = 2;}}}
switch (Element_2->ItemIndex) {
case c_ELEMENT_R: {
Text_Units_2->Caption = "Сопротивление : ";
if (v_Units_Resist == c_UNIT_OM) {
Text_UID_2->Caption = "Ом";}
else if (v_Units_Resist == c_UNIT_kOM) {
Text_UID_2->Caption = "кОм";}
Value_El_2->Text = "0";
Text_Units_2->Visible = true;
Value_El_2->Visible = true;
Text_UID_2->Visible = true;
break;}
case c_ELEMENT_C: {
if (!Check_Use_X->Checked) {
Text_Units_2->Caption = "Емкость : ";
Text_UID_2->Caption = "мкФ";}
else {
Text_Units_2->Caption = "Сопротивление : ";
if (v_Units_Resist == c_UNIT_OM) {
Text_UID_2->Caption = "Ом";}
else if (v_Units_Resist == c_UNIT_kOM) {
Text_UID_2->Caption = "кОм";}}
Value_El_2->Text = "0";
Text_Units_2->Visible = true;
Value_El_2->Visible = true;
Text_UID_2->Visible = true;
break;}
case c_ELEMENT_L: {
if (!Check_Use_X->Checked) {
Text_Units_2->Caption = "Индуктивность : ";
Text_UID_2->Caption = "Гн";}
else {
Text_Units_2->Caption = "Сопротивление : ";
if (v_Units_Resist == c_UNIT_OM) {
Text_UID_2->Caption = "Ом";}
else if (v_Units_Resist == c_UNIT_kOM) {
Text_UID_2->Caption = "кОм";}}
Value_El_2->Text = "0";
Text_Units_2->Visible = true;
Value_El_2->Visible = true;
Text_UID_2->Visible = true;
break;}
case c_ELEMENT_NULL: {
Text_Units_2->Visible = false;
Value_El_2->Visible = false;
Text_UID_2->Visible = false;
Text_Units_2->Caption = "";
Text_UID_2->Caption = "";
Value_El_2->Text = "0";
break;}
case c_ELEMENT_OFF: {
Text_Units_3->Visible = false;
Value_El_3->Visible = false;
Text_UID_3->Visible = false;
Text_Units_3->Caption = "";
Text_UID_3->Caption = "";
Value_El_3->Text = "0";
break;}}}
void __fastcall TMainForm::Element_3Click(TObject *Sender) {
if (!ReadParams) {
v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].Element[2].Type = Element_3->ItemIndex;
if (Element_3->ItemIndex != 3)
if ((Element_3->ItemIndex == Element_1->ItemIndex) || (Element_3->ItemIndex == Element_2->ItemIndex)) {
if ((Element_1->ItemIndex != 0) & (Element_2->ItemIndex != 0)) {
Element_3->ItemIndex = 0;}
else if ((Element_1->ItemIndex != 1) & (Element_2->ItemIndex != 1)) {
Element_3->ItemIndex = 1;}
else if ((Element_1->ItemIndex != 2) & (Element_2->ItemIndex != 2)) {
Element_3->ItemIndex = 2;}}}
switch (Element_3->ItemIndex) {
case c_ELEMENT_R: {
Text_Units_3->Caption = "Сопротивление : ";
if (v_Units_Resist == c_UNIT_OM) {
Text_UID_3->Caption = "Ом";}
else if (v_Units_Resist == c_UNIT_kOM) {
Text_UID_3->Caption = "кОм";}
Value_El_3->Text = "0";
Text_Units_3->Visible = true;
Value_El_3->Visible = true;
Text_UID_3->Visible = true;
break;}
case c_ELEMENT_C: {
if (!Check_Use_X->Checked) {
Text_Units_3->Caption = "Емкость : ";
Text_UID_3->Caption = "мкФ";}
else {
Text_Units_3->Caption = "Сопротивление : ";
if (v_Units_Resist == c_UNIT_OM) {
Text_UID_3->Caption = "Ом";}
else if (v_Units_Resist == c_UNIT_kOM) {
Text_UID_3->Caption = "кОм";}}
Value_El_3->Text = "0";
Text_Units_3->Visible = true;
Value_El_3->Visible = true;
Text_UID_3->Visible = true;
break;}
case c_ELEMENT_L: {
if (!Check_Use_X->Checked) {
Text_Units_3->Caption = "Индуктивность : ";
Text_UID_3->Caption = "Гн";}
else {
Text_Units_3->Caption = "Сопротивление : ";
if (v_Units_Resist == c_UNIT_OM) {
Text_UID_3->Caption = "Ом";}
else if (v_Units_Resist == c_UNIT_kOM) {
Text_UID_3->Caption = "кОм";}}
Value_El_3->Text = "0";
Text_Units_3->Visible = true;
Value_El_3->Visible = true;
Text_UID_3->Visible = true;
break;}
case c_ELEMENT_NULL: {
Text_Units_3->Visible = false;
Value_El_3->Visible = false;
Text_UID_3->Visible = false;
Text_Units_3->Caption = "";
Text_UID_3->Caption = "";
Value_El_3->Text = "0";
break;}
case c_ELEMENT_OFF: {
Text_Units_3->Visible = false;
Value_El_3->Visible = false;
Text_UID_3->Visible = false;
Text_Units_3->Caption = "";
Text_UID_3->Caption = "";
Value_El_3->Text = "0";
break;}}}
void __fastcall TMainForm::Value_El_1Change(TObject *Sender) {
EditChange(Value_El_1);
if (!ReadParams) {
TryStrToFloat(Value_El_1->Text, v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].Element[0].Value);}}
void __fastcall TMainForm::Value_El_2Change(TObject *Sender) {
EditChange(Value_El_2);
if (!ReadParams) {
TryStrToFloat(Value_El_2->Text, v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].Element[1].Value);}}
void __fastcall TMainForm::Value_El_3Change(TObject *Sender) {
EditChange(Value_El_3);
if (!ReadParams) {
TryStrToFloat(Value_El_3->Text, v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].Element[2].Value);}}
// украшательства
void __fastcall TMainForm::DrawConnect() {
// рисуем тип связи слева
if (v_Phase[v_Frame].BranchCount == 0) {
Img_CLeft->Canvas->Brush->Color = Frame_Phase->Color;
Img_CLeft->Canvas->FillRect(Img_CLeft->Canvas->ClipRect);
Img_CRight->Canvas->Brush->Color = Frame_Phase->Color;
Img_CRight->Canvas->FillRect(Img_CRight->Canvas->ClipRect);}
else {
Img_CLeft->Canvas->Brush->Color = Frame_Phase->Color;
Img_CLeft->Canvas->FillRect(Img_CLeft->Canvas->ClipRect);
Img_CRight->Canvas->Brush->Color = Frame_Phase->Color;
Img_CRight->Canvas->FillRect(Img_CRight->Canvas->ClipRect);
Img_CLeft->Canvas->Pen->Color = clBlue;
Img_CRight->Canvas->Pen->Color = clBlue;
switch (v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].PConnect_Left) {
case false: {
Img_CLeft->Canvas->MoveTo(20, 26);
Img_CLeft->Canvas->LineTo(0, 26);
break;}
case true: {
Img_CLeft->Canvas->MoveTo(20, 26);
Img_CLeft->Canvas->LineTo(14, 26);
Img_CLeft->Canvas->MoveTo(14, 0);
Img_CLeft->Canvas->LineTo(14, 50);
Img_CLeft->Canvas->LineTo(0, 50);
Img_CLeft->Canvas->MoveTo(14, 0);
Img_CLeft->Canvas->LineTo(0, 0);}}
switch (v_Phase[v_Frame].BranchList[v_Phase[v_Frame].BranchID].PConnect_Right) {
case false: {
Img_CRight->Canvas->MoveTo(0, 26);
Img_CRight->Canvas->LineTo(20, 26);
break;}
case true: {
Img_CRight->Canvas->MoveTo(0, 26);
Img_CRight->Canvas->LineTo(6, 26);
Img_CRight->Canvas->MoveTo(6, 0);
Img_CRight->Canvas->LineTo(6, 50);
Img_CRight->Canvas->LineTo(20, 50);
Img_CRight->Canvas->MoveTo(6, 0);
Img_CRight->Canvas->LineTo(20, 0);}}}}
//расчеты bool __fastcall TMainForm::DoCalculate() {
// если ветви не заполнены, сообщаем и выходим
if ((v_Phase[c_FRAME_PHASE_1].BranchCount == 0) || (v_Phase[c_FRAME_PHASE_2].BranchCount == 0) || (v_Phase[c_FRAME_PHASE_3].BranchCount == 0)) {
Text_Result->Clear(); // чистим предыдущий результат
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Strings[0] = "Невозможно выполнить расчеты, так как одна или несколько фаз не имеют ветвей : -(";
Menu_Result->AutoPopup = false;
Menu_Graph->AutoPopup = false;
// MessageBox(Handle, UnicodeString(" Невозможно выполнить расчеты, так как одна или несколько фаз не имеют ветвей.").w_str(), UnicodeString(" Ошибка : Невозможно выполнить расчеты ").w_str(), 16);
return false;}
else {
Screen->Cursor = crHourGlass;
Menu_Result->AutoPopup = true;
Menu_Graph->AutoPopup = true;
Text_Result->Clear(); // чистим предыдущий результат
switch (Group_Mode->ItemIndex) {
case 0: {
Echo_Result_Triangle();
break;}
case 1: {
Echo_Result_StarWONull();
break;}
case 2: {
Echo_Result_StarWNull();}}
Text_Result->Lines->Add(" ");
DrawGraph();
Screen->Cursor = crDefault;
return true;}}
// вывод графика ---------------------------------------------------------------
void __fastcall TMainForm::Page_GraphResize(TObject *Sender) {
DrawGraph();}
bool __fastcall TMainForm::DrawGraph() {
TBitmap *Tmp = new TBitmap();
Tmp->SetSize(Img_Graph->Width, Img_Graph->Height);
Tmp->Canvas->Brush->Color = clWhite;
Tmp->Canvas->FillRect(Tmp->Canvas->ClipRect);
Tmp->Canvas->Font->Name = "Trebushed MS";
Tmp->Canvas->Font->Size = 9;
TPoint NullP = Point(5 + (Tmp->Width - 10) / 2, (Tmp->Height - 50) / 2);
// рисуем ось
Tmp->Canvas->TextOut(NullP.X - 10, 1, "Y");
Tmp->Canvas->TextOut(Tmp->Width - 15, NullP.Y + 2, "X");
Tmp->Canvas->MoveTo(5, NullP.Y);
Tmp->Canvas->LineTo(Tmp->Width - 10, NullP.Y);
Tmp->Canvas->MoveTo(NullP.X, 5);
Tmp->Canvas->LineTo(NullP.X, Tmp->Height - 50);
// если ветви заполнены
if ((v_Phase[c_FRAME_PHASE_1].BranchCount != 0) && (v_Phase[c_FRAME_PHASE_2].BranchCount != 0) && (v_Phase[c_FRAME_PHASE_3].BranchCount != 0)) {
// вектор A
Tmp->Canvas->Brush->Style = bsClear;
Tmp->Canvas->Font->Size = 7;
Tmp->Canvas->Font->Color = clRed;
Tmp->Canvas->TextOut(NullP.X + 4, NullP.Y - (v_Phase[1].GPoints[1])*5 - 6, UnicodeString(v_Phase[1].GPoints[1]));
Tmp->Canvas->MoveTo(NullP.X - 1, NullP.Y - (v_Phase[1].GPoints[1])*5);
Tmp->Canvas->LineTo(NullP.X + 2, NullP.Y - (v_Phase[1].GPoints[1])*5);
Tmp->Canvas->TextOut(NullP.X + (v_Phase[1].GPoints[0])*5 - 5, NullP.Y + 2, UnicodeString(v_Phase[1].GPoints[0]));
Tmp->Canvas->MoveTo(NullP.X + (v_Phase[1].GPoints[0])*5, NullP.Y - 1);
Tmp->Canvas->LineTo(NullP.X + (v_Phase[1].GPoints[0])*5, NullP.Y + 2);
Tmp->Canvas->Pen->Color = clRed;
Tmp->Canvas->MoveTo(NullP.X + (v_Phase[1].GPoints[0])*5, NullP.Y - (v_Phase[1].GPoints[1])*5);
Tmp->Canvas->LineTo(NullP.X, NullP.Y);
Tmp->Canvas->Font->Size = 9;
Tmp->Canvas->MoveTo(10, Tmp->Height - 15);
Tmp->Canvas->LineTo(50, Tmp->Height - 15);
Tmp->Canvas->TextOut(55, Tmp->Height - 22, Phase_1_name);
Tmp->Canvas->Pen->Color = clBlack;
// вектор B
Tmp->Canvas->Brush->Style = bsClear;
Tmp->Canvas->Font->Size = 7;
Tmp->Canvas->Font->Color = clBlue;
Tmp->Canvas->TextOut(NullP.X + 4, NullP.Y - (v_Phase[2].GPoints[1])*5 - 6, UnicodeString(v_Phase[2].GPoints[1]));
Tmp->Canvas->MoveTo(NullP.X - 1, NullP.Y - (v_Phase[2].GPoints[1])*5);
Tmp->Canvas->LineTo(NullP.X + 2, NullP.Y - (v_Phase[2].GPoints[1])*5);
Tmp->Canvas->TextOut(NullP.X + (v_Phase[2].GPoints[0])*5 - 5, NullP.Y + 2, UnicodeString(v_Phase[2].GPoints[0]));
Tmp->Canvas->MoveTo(NullP.X + (v_Phase[2].GPoints[0])*5, NullP.Y - 1);
Tmp->Canvas->LineTo(NullP.X + (v_Phase[2].GPoints[0])*5, NullP.Y + 2);
Tmp->Canvas->Pen->Color = clBlue;
Tmp->Canvas->MoveTo(NullP.X + (v_Phase[2].GPoints[0])*5, NullP.Y - (v_Phase[2].GPoints[1])*5);
Tmp->Canvas->LineTo(NullP.X, NullP.Y);
Tmp->Canvas->Font->Size = 9;
Tmp->Canvas->MoveTo(110, Tmp->Height - 15);
Tmp->Canvas->LineTo(150, Tmp->Height - 15);
Tmp->Canvas->TextOut(155, Tmp->Height - 22, Phase_2_name);
Tmp->Canvas->Pen->Color = clBlack;
// вектор C
Tmp->Canvas->Brush->Style = bsClear;
Tmp->Canvas->Font->Size = 7;
Tmp->Canvas->Font->Color = clGreen;
Tmp->Canvas->TextOut(NullP.X + 4, NullP.Y - (v_Phase[3].GPoints[1])*5 - 6, UnicodeString(v_Phase[3].GPoints[1]));
Tmp->Canvas->MoveTo(NullP.X - 1, NullP.Y - (v_Phase[3].GPoints[1])*5);
Tmp->Canvas->LineTo(NullP.X + 2, NullP.Y - (v_Phase[3].GPoints[1])*5);
Tmp->Canvas->TextOut(NullP.X + (v_Phase[3].GPoints[0])*5 - 5, NullP.Y + 2, UnicodeString(v_Phase[3].GPoints[0]));
Tmp->Canvas->MoveTo(NullP.X + (v_Phase[3].GPoints[0])*5, NullP.Y - 1);
Tmp->Canvas->LineTo(NullP.X + (v_Phase[3].GPoints[0])*5, NullP.Y + 2);
Tmp->Canvas->Pen->Color = clGreen;
Tmp->Canvas->MoveTo(NullP.X + (v_Phase[3].GPoints[0])*5, NullP.Y - (v_Phase[3].GPoints[1])*5);
Tmp->Canvas->LineTo(NullP.X, NullP.Y);
Tmp->Canvas->Font->Size = 9;
Tmp->Canvas->MoveTo(210, Tmp->Height - 15);
Tmp->Canvas->LineTo(250, Tmp->Height - 15);
Tmp->Canvas->TextOut(255, Tmp->Height - 22, Phase_3_name);}
Img_Graph->Picture->Assign(Tmp);
Tmp->Free();}
// вывод треугольника ----------------------------------------------------------
void TMainForm::Echo_Result_Triangle() {
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold << fsItalic;
Text_Result->Lines->Strings[0] = "Треугольник :";
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsItalic;
Text_Result->Lines->Add(" ");
// переменные для значений:
double _V = Value_V->Text.ToDouble(); // Номинальное напряжение
double _F = Value_F->Text.ToDouble(); // Частота
VTriangle OneTriangle; // треугольник
bool Parallel = false; // флаг параллельного соединения
UnicodeString LogStr = " "; // строка отчета
// номинальное напряжение :
OneTriangle.SetUn(_V);
// Начальная входная информация
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Исходные данные ");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->Lines->Add("Номинальное линейное напряжение U(л) = " + FloatToStr(_V) + " В");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->Lines->Add("Номинальная частота F(н) = " + FloatToStr(_F) + " Гц");
Text_Result->Lines->Add(" ");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Формулы фаз");
Text_Result->Paragraph->FirstIndent = 5;
// заполняем фазы
for (int thisPhase = 1; thisPhase < 4; thisPhase++) {
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
switch (thisPhase) {
case c_FRAME_PHASE_1: {
Text_Result->Lines->Add("AB = ");
Text_Result->Paragraph->FirstIndent = 15;
break;}
case c_FRAME_PHASE_2: {
Text_Result->Lines->Add("BC = ");
Text_Result->Paragraph->FirstIndent = 15;
break;}
case c_FRAME_PHASE_3: {
Text_Result->Lines->Add("CA = ");
Text_Result->Paragraph->FirstIndent = 15;
break;}}
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
for (int i = 0; i < v_Phase[thisPhase].BranchCount; i++) {
// для элементов
double _R = 0, _L = 0, _C = 0; // значение
bool _eR = false, _eL = false, _eC = false; // есть ли в фазе
bool _X = v_Phase[thisPhase].BranchList[i].Use_X;
if (i == 0) {
LogStr = LogStr + "[";}
else {
if (Parallel) {
LogStr = LogStr + " * [";}
else
LogStr = LogStr + " + [";}
// если параллельно с предыдущим, то добавляем в тот же контейнер
if (!Parallel) {
switch (thisPhase) {
case c_FRAME_PHASE_1: {
OneTriangle.PhAB.AddContForBranch();
break;}
case c_FRAME_PHASE_2: {
OneTriangle.PhBC.AddContForBranch();
break;}
case c_FRAME_PHASE_3: {
OneTriangle.PhCA.AddContForBranch();
break;}}}
// если параллельно со следующим, то ставим флаг
if (v_Phase[thisPhase].BranchList[i].PConnect_Right) {
Parallel = true;}
else
Parallel = false;
// заполняем параметры
for (int j = 0; j < 3; j++) {
switch (v_Phase[thisPhase].BranchList[i].Element[j].Type) {
case c_ELEMENT_R: {
_R = v_Phase[thisPhase].BranchList[i].Element[j].Value;
double _Rstr = _R;
_eR = true;
UnicodeString RUnits = " ";
switch (v_Units_Resist) {
case c_UNIT_OM: {
RUnits = " Ом";
break;}
case c_UNIT_kOM: {
_R = _R * 1000; // переводим в омы
RUnits = " кОм";}}
LogStr = LogStr + " R = " + FloatToStr(_Rstr) + RUnits + " ;";
break;}
case c_ELEMENT_C: {
_C = v_Phase[thisPhase].BranchList[i].Element[j].Value;
double _Cstr = _C;
_eC = true;
UnicodeString _nC = " C";
UnicodeString CUnits = " мкФ";
if (_X) {
switch (v_Units_Resist) {
case c_UNIT_OM: {
CUnits = " Ом";
break;}
case c_UNIT_kOM: {
_C = _C * 1000;
CUnits = " кОм";}}
_nC = " XC";}
else
_C = _C / 1000000; // переводим в фарады
LogStr = LogStr + _nC + " = " + FloatToStr(_Cstr) + CUnits + " ;";
break;}
case c_ELEMENT_L: {
_L = v_Phase[thisPhase].BranchList[i].Element[j].Value;
double _Lstr = _L;
_eL = true;
UnicodeString _nL = " L";
UnicodeString LUnits = " Гн";
// если сопротивление вместо индуктивности:
if (_X) {
switch (v_Units_Resist) {
case c_UNIT_OM: {
LUnits = " Ом";
break;}
case c_UNIT_kOM: {
_L = _L * 1000;
LUnits = " кОм";}}
_nL = " XL";}
LogStr = LogStr + _nL + " = " + FloatToStr(_Lstr) + LUnits + " ;";
break;}}}
// добавляем в контейнер
switch (thisPhase) {
case c_FRAME_PHASE_1: {
OneTriangle.PhAB.AddBranchToLastCfB(_R, _L, _C, _eR, _eL, _eC, _X, _X, _F);
break;}
case c_FRAME_PHASE_2: {
OneTriangle.PhBC.AddBranchToLastCfB(_R, _L, _C, _eR, _eL, _eC, _X, _X, _F);
break;}
case c_FRAME_PHASE_3: {
OneTriangle.PhCA.AddBranchToLastCfB(_R, _L, _C, _eR, _eL, _eC, _X, _X, _F);
break;}}
// оформляем конец ветви для формулы
LogStr.Delete(LogStr.Length(), 1);
LogStr = LogStr + "]";}
Text_Result->SetSelText(LogStr); // отчет по фазе
LogStr = " ";}
Text_Result->Lines->Add(" ");
// выводим расчеты
// Комплексные сопротивления фазы
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Фазные сопротивления");
Text_Result->Paragraph->FirstIndent = 5;
// рассчитываем сопротивление, учитывая единицы измерения
UnicodeString RStrAB, RStrBC, RStrCA;
switch (v_Units_Resist) {
case c_UNIT_OM: {
RStrAB = " = " + MyToStr(OneTriangle.GetZ_AB()) + " Ом";
RStrBC = " = " + MyToStr(OneTriangle.GetZ_BC()) + " Ом";
RStrCA = " = " + MyToStr(OneTriangle.GetZ_CA()) + " Ом";
break;}
case c_UNIT_kOM: {
VComplex buf;
buf = OneTriangle.GetZ_AB();
buf.real = buf.real / 1000;
buf.image = buf.image / 1000;
RStrAB = " = " + MyToStr(buf) + " кОм";
buf = OneTriangle.GetZ_BC();
buf.real = buf.real / 1000;
buf.image = buf.image / 1000;
RStrBC = " = " + MyToStr(buf) + " кОм";
buf = OneTriangle.GetZ_CA();
buf.real = buf.real / 1000;
buf.image = buf.image / 1000;
RStrCA = " = " + MyToStr(buf) + " кОм";}}
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline;
Text_Result->Lines->Add("Z(AB)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(RStrAB);
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("Z(BC)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(RStrBC);
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("Z(CA)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(RStrCA);
Text_Result->Lines->Add(" ");
// Комплексные фазные напряжения
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Фазные напряжения");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline;
Text_Result->Lines->Add("U(AB)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetU_AB()) + " В");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("U(BC)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetU_BC()) + " В");Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("U(CA)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetU_CA()) + " В");
Text_Result->Lines->Add(" ");
// Комплексные фазные токи
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Фазные токи");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline;
Text_Result->Lines->Add("I(AB)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetI_AB()) + " А");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("I(BC)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetI_BC()) + " А");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("I(CA)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetI_CA()) + " А");
Text_Result->Lines->Add(" ");
// Линейные токи, равны фазным (по треугольнику) только переведены в обычные значения.
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Линейные токи");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->Lines->Add("I(A)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetI_A()) + " А");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("I(B)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetI_B()) + " А");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("I(C)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetI_C()) + " А");
Text_Result->Lines->Add(" ");
// Активные фазные мощности
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Активные фазные мощности");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->Lines->Add("P(AB)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetP_AB()) + " Вт");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("P(BC)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetP_BC()) + " Вт");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("P(CA)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetP_CA()) + " Вт");
Text_Result->Lines->Add(" ");
// Реактивные фазные мощности
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Реактивные фазные мощности ");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->Lines->Add("Q(AB)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetQ_AB()) + " вар");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Q(BC)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetQ_BC()) + " вар");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Q(CA)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetQ_CA()) + " вар");
Text_Result->Lines->Add(" ");
// Полные фазные мощности
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Полные фазные мощности");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline;
Text_Result->Lines->Add("S(AB)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetS_AB()) + " в-а");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("S(BC)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetS_BC()) + " в-а");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("S(CA)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetS_CA()) + " в-а");
Text_Result->Lines->Add(" ");
// Трехфазная активная мощность
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Трехфазная активная мощность");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->Lines->Add("P");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetFullP()) + " Вт");
Text_Result->Lines->Add(" ");
// Трехфазная реактивная мощность
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Трехфазная реактивная мощность");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->Lines->Add("Q");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetFullQ()) + " вар");
Text_Result->Lines->Add(" ");
// Трехфазная полная мощность
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Трехфазная полная мощность");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->Lines->Add("S");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetFullS()) + " в-а");
for (int thisPhase = 1; thisPhase < 4; thisPhase++) {
switch (thisPhase) {
case c_FRAME_PHASE_1: {
v_Phase[thisPhase].GPoints[0] = RoundTo(OneTriangle.GetI_A().real, -2);
v_Phase[thisPhase].GPoints[1] = RoundTo(OneTriangle.GetI_A().image, -2);
break;}
case c_FRAME_PHASE_2: {
v_Phase[thisPhase].GPoints[0] = RoundTo(OneTriangle.GetI_B().real, -2);
v_Phase[thisPhase].GPoints[1] = RoundTo(OneTriangle.GetI_B().image, -2);
break;}
case c_FRAME_PHASE_3: {
v_Phase[thisPhase].GPoints[0] = RoundTo(OneTriangle.GetI_C().real, -2);
v_Phase[thisPhase].GPoints[1] = RoundTo(OneTriangle.GetI_C().image, -2);
break;}}}
OneTriangle.~VTriangle();}
// вывод звезды без нулевого провода -------------------------------------------
void TMainForm::Echo_Result_StarWONull() {
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold << fsItalic;
Text_Result->Lines->Strings[0] = "Звезда без нулевого провода :";
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsItalic;
Text_Result->Lines->Add(" ");
// переменные для значений:
double _V = Value_V->Text.ToDouble(); // Номинальное напряжение
double _F = Value_F->Text.ToDouble(); // Частота
VStarNoNull OneTriangle; // звезда без нулевого провода
bool Parallel = false; // флаг параллельного соединения
UnicodeString LogStr = " "; // строка отчета
// номинальное напряжение :
OneTriangle.SetUn(_V);
// Начальная входная информация
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Исходные данные ");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->Lines->Add("Номинальное линейное напряжение U(л) = " + FloatToStr(_V) + " В");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->Lines->Add("Номинальная частота F(н) = " + FloatToStr(_F) + " Гц");
Text_Result->Lines->Add(" ");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Формулы фаз");
Text_Result->Paragraph->FirstIndent = 5;
// заполняем фазы
for (int thisPhase = 1; thisPhase < 4; thisPhase++) {
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
switch (thisPhase) {
case c_FRAME_PHASE_1: {
Text_Result->Lines->Add("A = ");
Text_Result->Paragraph->FirstIndent = 15;
break;}
case c_FRAME_PHASE_2: {
Text_Result->Lines->Add("B = ");
Text_Result->Paragraph->FirstIndent = 15;
break;}
case c_FRAME_PHASE_3: {
Text_Result->Lines->Add("C = ");
Text_Result->Paragraph->FirstIndent = 15;
break;}}
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
for (int i = 0; i < v_Phase[thisPhase].BranchCount; i++) {
// для элементов
double _R = 0, _L = 0, _C = 0; // значение
bool _eR = false, _eL = false, _eC = false; // есть ли в фазе
bool _X = v_Phase[thisPhase].BranchList[i].Use_X;
if (i == 0) {
LogStr = LogStr + "[";}
else {
if (Parallel) {
LogStr = LogStr + " * [";}
else
LogStr = LogStr + " + [";}
// если параллельно с предыдущим, то добавляем в тот же контейнер
if (!Parallel) {
switch (thisPhase) {
case c_FRAME_PHASE_1: {
OneTriangle.PhA.AddContForBranch();
break;}
case c_FRAME_PHASE_2: {
OneTriangle.PhB.AddContForBranch();
break;}
case c_FRAME_PHASE_3: {
OneTriangle.PhC.AddContForBranch();
break;}}}
// если параллельно со следующим, то ставим флаг
if (v_Phase[thisPhase].BranchList[i].PConnect_Right) {
Parallel = true;}
else
Parallel = false;
// заполняем параметры
for (int j = 0; j < 3; j++) {
switch (v_Phase[thisPhase].BranchList[i].Element[j].Type) {
case c_ELEMENT_R: {
_R = v_Phase[thisPhase].BranchList[i].Element[j].Value;
double _Rstr = _R;
_eR = true;
UnicodeString RUnits = " ";
switch (v_Units_Resist) {
case c_UNIT_OM: {
RUnits = " Ом";
break;}
case c_UNIT_kOM: {
_R = _R * 1000; // переводим в омы
RUnits = " кОм";}}
LogStr = LogStr + " R = " + FloatToStr(_Rstr) + RUnits + " ;";
break;}
case c_ELEMENT_C: {
_C = v_Phase[thisPhase].BranchList[i].Element[j].Value;
double _Cstr = _C;
_eC = true;
UnicodeString _nC = " C";
UnicodeString CUnits = " мкФ";
if (_X) {
switch (v_Units_Resist) {
case c_UNIT_OM: {
CUnits = " Ом";
break;}
case c_UNIT_kOM: {
_C = _C * 1000;
CUnits = " кОм";}}
_nC = " XC";}else
_C = _C / 1000000; // переводим в фарады
LogStr = LogStr + _nC + " = " + FloatToStr(_Cstr) + CUnits + " ;";
break;}
case c_ELEMENT_L: {
_L = v_Phase[thisPhase].BranchList[i].Element[j].Value;
double _Lstr = _L;
_eL = true;
UnicodeString _nL = " L";
UnicodeString LUnits = " Гн";
// если сопротивление вместо индуктивности:
if (_X) {
switch (v_Units_Resist) {
case c_UNIT_OM: {
LUnits = " Ом";
break;}
case c_UNIT_kOM: {
_L = _L * 1000;
LUnits = " кОм";}}
_nL = " XL";}
LogStr = LogStr + _nL + " = " + FloatToStr(_Lstr) + LUnits + " ;";
break;}}}
// добавляем в контейнер
switch (thisPhase) {
case c_FRAME_PHASE_1: {
OneTriangle.PhA.AddBranchToLastCfB(_R, _L, _C, _eR, _eL, _eC, _X, _X, _F);
break;}
case c_FRAME_PHASE_2: {
OneTriangle.PhB.AddBranchToLastCfB(_R, _L, _C, _eR, _eL, _eC, _X, _X, _F);
break;}
case c_FRAME_PHASE_3: {
OneTriangle.PhC.AddBranchToLastCfB(_R, _L, _C, _eR, _eL, _eC, _X, _X, _F);
break;}}
// оформляем конец ветви для формулы
LogStr.Delete(LogStr.Length(), 1);
LogStr = LogStr + "]";}
Text_Result->SetSelText(LogStr); // отчет по фазе
LogStr = " ";}
Text_Result->Lines->Add(" ");
// выводим расчеты
// Комплексные сопротивления фазы
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Фазные сопротивления");
Text_Result->Paragraph->FirstIndent = 5;
// рассчитываем сопротивление, учитывая единицы измерения
UnicodeString RStrAB, RStrBC, RStrCA;
switch (v_Units_Resist) {
case c_UNIT_OM: {
RStrAB = " = " + MyToStr(OneTriangle.GetZ_A()) + " Ом";
RStrBC = " = " + MyToStr(OneTriangle.GetZ_B()) + " Ом";
RStrCA = " = " + MyToStr(OneTriangle.GetZ_C()) + " Ом";
break;}
case c_UNIT_kOM: {
VComplex buf;
buf = OneTriangle.GetZ_A();
buf.real = buf.real / 1000;
buf.image = buf.image / 1000;
RStrAB = " = " + MyToStr(buf) + " кОм";
buf = OneTriangle.GetZ_B();
buf.real = buf.real / 1000;
buf.image = buf.image / 1000;
RStrBC = " = " + MyToStr(buf) + " кОм";
buf = OneTriangle.GetZ_C();
buf.real = buf.real / 1000;
buf.image = buf.image / 1000;
RStrCA = " = " + MyToStr(buf) + " кОм";}}
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline;
Text_Result->Lines->Add("Z(A)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(RStrAB);
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("Z(B)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(RStrBC);
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("Z(C)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(RStrCA);
Text_Result->Lines->Add(" ");
// Комплексные фазные напряжения
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Фазные напряжения");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline;
Text_Result->Lines->Add("U(A)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetU_A()) + " В");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("U(B)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetU_B()) + " В");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("U(C)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetU_C()) + " В");
Text_Result->Lines->Add(" ");
// Комплексы проводимостей фаз нагрузки
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Комплексы проводимостей фаз нагрузки");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline;
Text_Result->Lines->Add("Y(A)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetY_A()) + " В");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("Y(B)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetY_B()) + " В");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("Y(C)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetY_C()) + " В");
Text_Result->Lines->Add(" ");
// Напряжение между нейтральными точками приемника и источника питания
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Напряжение между нейтральными точками приемника и источника питания");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline;
Text_Result->Lines->Add("U(n)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetU_n()) + " В");
Text_Result->Lines->Add(" ");
// Напряжения на зажимах
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Напряжения на зажимах");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline;
Text_Result->Lines->Add("U(nA)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetU_nA()) + " В");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("U(nB)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetU_nB()) + " В");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("U(nC)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetU_nC()) + " В");
Text_Result->Lines->Add(" ");
// Комплексные фазные токи
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Фазные токи");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline;
Text_Result->Lines->Add("I(A)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetI_A()) + " А");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("I(B)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetI_B()) + " А");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("I(C)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetI_C()) + " А");
Text_Result->Lines->Add(" ");
// Активные фазные мощности
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Активные фазные мощности");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->Lines->Add("P(A)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetP_A()) + " Вт");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("P(B)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetP_B()) + " Вт");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("P(C)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetP_C()) + " Вт");
Text_Result->Lines->Add(" ");
// Реактивные фазные мощности
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Реактивные фазные мощности");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->Lines->Add("Q(A)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetQ_A()) + " вар");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Q(B)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetQ_B()) + " вар");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Q(C)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetQ_C()) + " вар");
Text_Result->Lines->Add(" ");
// Полные фазные мощности
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Полные фазные мощности");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline;
Text_Result->Lines->Add("S(A)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetS_A()) + " в-а");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("S(B)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetS_B()) + " в-а");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("S(C)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetS_C()) + " в-а");
Text_Result->Lines->Add(" ");
// Трехфазная активная мощность
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Трехфазная активная мощность");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->Lines->Add("P ");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetFullP()) + " Вт");
Text_Result->Lines->Add(" ");
// Трехфазная реактивная мощность
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Трехфазная реактивная мощность");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->Lines->Add("Q");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetFullQ()) + " вар");
Text_Result->Lines->Add(" ");
// Трехфазная полная мощность
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Трехфазная полная мощность");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->Lines->Add("S");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetFullS()) + " в-а");
for (int thisPhase = 1; thisPhase < 4; thisPhase++) {
switch (thisPhase) {
case c_FRAME_PHASE_1: {
v_Phase[thisPhase].GPoints[0] = RoundTo(OneTriangle.GetI_A().real, -2);
v_Phase[thisPhase].GPoints[1] = RoundTo(OneTriangle.GetI_A().image, -2);
break;}
case c_FRAME_PHASE_2: {
v_Phase[thisPhase].GPoints[0] = RoundTo(OneTriangle.GetI_B().real, -2);
v_Phase[thisPhase].GPoints[1] = RoundTo(OneTriangle.GetI_B().image, -2);
break;}
case c_FRAME_PHASE_3: {
v_Phase[thisPhase].GPoints[0] = RoundTo(OneTriangle.GetI_C().real, -2);
v_Phase[thisPhase].GPoints[1] = RoundTo(OneTriangle.GetI_C().image, -2);
break;}}}
OneTriangle.~VStarNoNull();}
// вывод звезды с нулевым проводом ---------------------------------------------
void TMainForm::Echo_Result_StarWNull() {
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold << fsItalic;
Text_Result->Lines->Strings[0] = "Звезда с нулевым проводом :";
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsItalic;
Text_Result->Lines->Add(" ");
// переменные для значений:
double _V = Value_V->Text.ToDouble(); // Номинальное напряжение
double _F = Value_F->Text.ToDouble(); // Частота
VStarNull OneTriangle; // звезда без нулевого провода
bool Parallel = false; // флаг параллельного соединения
UnicodeString LogStr = " "; // строка отчета
// номинальное напряжение :
OneTriangle.SetUn(_V);
// Начальная входная информация
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Исходные данные ");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->Lines->Add("Номинальное линейное напряжение U(л) = " + FloatToStr(_V) + " В");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->Lines->Add("Номинальная частота F(н) = " + FloatToStr(_F) + " Гц");
Text_Result->Lines->Add(" ");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Формулы фаз");
Text_Result->Paragraph->FirstIndent = 5;
// заполняем фазы
for (int thisPhase = 1; thisPhase < 4; thisPhase++) {
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
switch (thisPhase) {
case c_FRAME_PHASE_1: {
Text_Result->Lines->Add("A = ");
Text_Result->Paragraph->FirstIndent = 15;
break;}
case c_FRAME_PHASE_2: {
Text_Result->Lines->Add("B = ");
Text_Result->Paragraph->FirstIndent = 15;
break;}
case c_FRAME_PHASE_3: {
Text_Result->Lines->Add("C = ");
Text_Result->Paragraph->FirstIndent = 15;
break;}}
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
for (int i = 0; i < v_Phase[thisPhase].BranchCount; i++) {
// для элементов
double _R = 0, _L = 0, _C = 0; // значение
bool _eR = false, _eL = false, _eC = false; // есть ли в фазе
bool _X = v_Phase[thisPhase].BranchList[i].Use_X;
if (i == 0) {
LogStr = LogStr + "[";}
else {
if (Parallel) {
LogStr = LogStr + " * [";}
else
LogStr = LogStr + " + [";}
// если параллельно с предыдущим, то добавляем в тот же контейнер
if (!Parallel) {
switch (thisPhase) {
case c_FRAME_PHASE_1: {
OneTriangle.PhA.AddContForBranch();
break;}
case c_FRAME_PHASE_2: {
OneTriangle.PhB.AddContForBranch();
break;}
case c_FRAME_PHASE_3: {
OneTriangle.PhC.AddContForBranch();
break;}}}
// если параллельно со следующим, то ставим флаг
if (v_Phase[thisPhase].BranchList[i].PConnect_Right) {
Parallel = true;}
else
Parallel = false;
// заполняем параметры
for (int j = 0; j < 3; j++) {
switch (v_Phase[thisPhase].BranchList[i].Element[j].Type) {
case c_ELEMENT_R: {
_R = v_Phase[thisPhase].BranchList[i].Element[j].Value;
double _Rstr = _R;
_eR = true;
UnicodeString RUnits = " ";
switch (v_Units_Resist) {
case c_UNIT_OM: {
RUnits = " Ом";
break;}
case c_UNIT_kOM: {
_R = _R * 1000; // переводим в омы
RUnits = " кОм";}}
LogStr = LogStr + " R = " + FloatToStr(_Rstr) + RUnits + " ;";
break;}
case c_ELEMENT_C: {
_C = v_Phase[thisPhase].BranchList[i].Element[j].Value;
double _Cstr = _C;
_eC = true;
UnicodeString _nC = " C";
UnicodeString CUnits = " мкФ";
if (_X) {
switch (v_Units_Resist) {
case c_UNIT_OM: {
CUnits = " Ом";
break;}
case c_UNIT_kOM: {
_C = _C * 1000;
CUnits = " кОм";}}
_nC = " XC";}
else
_C = _C / 1000000; // переводим в фарады
LogStr = LogStr + _nC + " = " + FloatToStr(_Cstr) + CUnits + " ;";
break;}
case c_ELEMENT_L: {
_L = v_Phase[thisPhase].BranchList[i].Element[j].Value;
double _Lstr = _L;
_eL = true;
UnicodeString _nL = " L";
UnicodeString LUnits = " Гн";
// если сопротивление вместо индуктивности:
if (_X) {
switch (v_Units_Resist) {
case c_UNIT_OM: {
LUnits = " Ом";
break;}
case c_UNIT_kOM: {
_L = _L * 1000;
LUnits = " кОм";}}
_nL = " XL";}
LogStr = LogStr + _nL + " = " + FloatToStr(_Lstr) + LUnits + " ;";
break;}}}
// добавляем в контейнер
switch (thisPhase) {
case c_FRAME_PHASE_1: {
OneTriangle.PhA.AddBranchToLastCfB(_R, _L, _C, _eR, _eL, _eC, _X, _X, _F);
break;}
case c_FRAME_PHASE_2: {
OneTriangle.PhB.AddBranchToLastCfB(_R, _L, _C, _eR, _eL, _eC, _X, _X, _F);
break;}
case c_FRAME_PHASE_3: {
OneTriangle.PhC.AddBranchToLastCfB(_R, _L, _C, _eR, _eL, _eC, _X, _X, _F);
break;}}
// оформляем конец ветви для формулы
LogStr.Delete(LogStr.Length(), 1);
LogStr = LogStr + "]";}
Text_Result->SetSelText(LogStr); // отчет по фазе
LogStr = " ";}
Text_Result->Lines->Add(" ");
// выводим расчеты
// Комплексные сопротивления фазы
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Фазные сопротивления");
Text_Result->Paragraph->FirstIndent = 5;
// рассчитываем сопротивление, учитывая единицы измерения
UnicodeString RStrAB, RStrBC, RStrCA;
switch (v_Units_Resist) {
case c_UNIT_OM: {
RStrAB = " = " + MyToStr(OneTriangle.GetZ_A()) + " Ом";
RStrBC = " = " + MyToStr(OneTriangle.GetZ_B()) + " Ом";
RStrCA = " = " + MyToStr(OneTriangle.GetZ_C()) + " Ом";
break;}
case c_UNIT_kOM: {
VComplex buf;
buf = OneTriangle.GetZ_A();
buf.real = buf.real / 1000;
buf.image = buf.image / 1000;
RStrAB = " = " + MyToStr(buf) + " кОм";
buf = OneTriangle.GetZ_B();
buf.real = buf.real / 1000;
buf.image = buf.image / 1000;
RStrBC = " = " + MyToStr(buf) + " кОм";
buf = OneTriangle.GetZ_C();
buf.real = buf.real / 1000;
buf.image = buf.image / 1000;
RStrCA = " = " + MyToStr(buf) + " кОм";}}
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline;
Text_Result->Lines->Add("Z(A)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(RStrAB);
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("Z(B)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(RStrBC);
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("Z(C)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(RStrCA);
Text_Result->Lines->Add(" ");
// Комплексные фазные напряжения
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Фазные напряжения");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline;
Text_Result->Lines->Add("U(A)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetU_A()) + " В");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("U(B)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetU_B()) + " В");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("U(C)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetU_C()) + " В");
Text_Result->Lines->Add(" ");
// Комплексные фазные токи
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Фазные токи");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline;
Text_Result->Lines->Add("I(A)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetI_A()) + " А");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("I(B)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetI_B()) + " А");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("I(C)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetI_C()) + " А");
Text_Result->Lines->Add(" ");
// Ток нулевого провода
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Ток нулевого провода");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline;
Text_Result->Lines->Add("I(N)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetI_N()) + " А");
Text_Result->Lines->Add(" ");
// Активные фазные мощности
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Активные фазные мощности");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->Lines->Add("P(A)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetP_A()) + " Вт");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("P(B)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetP_B()) + " Вт");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("P(C)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetP_C()) + " Вт");
Text_Result->Lines->Add(" ");
// Реактивные фазные мощности
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Реактивные фазные мощности");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->Lines->Add("Q(A)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetQ_A()) + " вар");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Q(B)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetQ_B()) + " вар");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Q(C)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetQ_C()) + " вар");
Text_Result->Lines->Add(" ");
// Полные фазные мощности
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Полные фазные мощности");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline;
Text_Result->Lines->Add("S(A)");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetS_A()) + " в-а");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("S(B)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetS_B()) + " в-а");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsUnderline << fsBold;
Text_Result->Lines->Add("S(C)");
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold >> fsUnderline;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetS_C()) + " в-а");
Text_Result->Lines->Add(" ");
// Трехфазная активная мощность
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Трехфазная активная мощность");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->Lines->Add("P");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetFullP()) + " Вт");
Text_Result->Lines->Add(" ");
// Трехфазная реактивная мощность
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Трехфазная реактивная мощность");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->Lines->Add("Q");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetFullQ()) + " вар");
Text_Result->Lines->Add(" ");
// Трехфазная полная мощность
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style << fsBold;
Text_Result->Lines->Add("Трехфазная полная мощность");
Text_Result->Paragraph->FirstIndent = 5;
Text_Result->Lines->Add("S");
Text_Result->Paragraph->FirstIndent = 15;
Text_Result->SelAttributes->Style = Text_Result->SelAttributes->Style >> fsBold;
Text_Result->SetSelText(" = " + MyToStr(OneTriangle.GetFullS()) + " в-а");
for (int thisPhase = 1; thisPhase < 4; thisPhase++) {
switch (thisPhase) {
case c_FRAME_PHASE_1: {
v_Phase[thisPhase].GPoints[0] = RoundTo(OneTriangle.GetI_A().real, -2);
v_Phase[thisPhase].GPoints[1] = RoundTo(OneTriangle.GetI_A().image, -2);
break;}
case c_FRAME_PHASE_2: {
v_Phase[thisPhase].GPoints[0] = RoundTo(OneTriangle.GetI_B().real, -2);
v_Phase[thisPhase].GPoints[1] = RoundTo(OneTriangle.GetI_B().image, -2);
break;}
case c_FRAME_PHASE_3: {
v_Phase[thisPhase].GPoints[0] = RoundTo(OneTriangle.GetI_C().real, -2);
v_Phase[thisPhase].GPoints[1] = RoundTo(OneTriangle.GetI_C().image, -2);
break;}}}
OneTriangle.~VStarNull();}
#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
#include <Vcl.Styles.hpp>
#include <Vcl.Themes.hpp>
USEFORM("Main.cpp", MainForm);
USEFORM("Help.cpp", HelpForm);
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{try{
Application->Initialize();
Application->MainFormOnTaskBar = true;
Application->Title = "3-AC calc";
Application->CreateForm(__classid(TMainForm), &MainForm);
Application->Run();}
catch (Exception &exception){
Application->ShowException(&exception);}
catch (...){
try{
throw Exception("");}
catch (Exception &exception){
Application->ShowException(&exception);}}
return 0;}
#include "Help.h"
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <vcl.h>
#include <inifiles.hpp>
#include <ExtCtrls.hpp>
#include <Vcl.ExtCtrls.hpp>
class THelpForm : public TForm {
__published: // IDE-managed Components
TPageControl *Pan_Tabs;
TTabSheet *Tab_About;
TTabSheet *Tab_Help;
TRichEdit *Text_About;
TRichEdit *Text_Help;
TTabSheet *Tab_Cfg;
TGroupBox *Group_Intrfc;
TComboBox *Sel_Theme;
TLabel *Text_Theme;
TButton *Btn_Accept;
TPanel *Group_Settings;
TGroupBox *Group_Misk;
TCheckBox *Check_ConfirmActions;
void __fastcall Sel_ThemeChange(TObject *Sender);
void __fastcall Btn_AcceptClick(TObject *Sender);
void __fastcall Check_ConfirmActionsClick(TObject *Sender);
public: // User declarations
__fastcall THelpForm(TComponent* Owner);
void UpdateTextColor();
void __fastcall LoadConfig();
void __fastcall SaveConfig();};
#pragma package(smart_init)
#pragma resource "*.dfm"
THelpForm *HelpForm;
void __fastcall THelpForm::LoadConfig() {
TIniFile *CfgFile;
CfgFile = new TIniFile(ExtractFilePath(Application->ExeName) + "Config.cfg");
UnicodeString ThemeName = CfgFile->ReadString("Interface", "Theme", "Windows");
Check_ConfirmActions->Checked = CfgFile->ReadBool("Misc", "ConfirmActions", true);
CfgFile->Free();
Sel_Theme->ItemIndex = Sel_Theme->Items->IndexOf(ThemeName);}
void __fastcall THelpForm::SaveConfig() {
TIniFile *CfgFile;
CfgFile = new TIniFile(ExtractFilePath(Application->ExeName) + "Config.cfg");
CfgFile->WriteString("Interface", "Theme", Sel_Theme->Text);
CfgFile->WriteBool("Misc", "ConfirmActions", Check_ConfirmActions->Checked);
CfgFile->Free();}
__fastcall THelpForm::THelpForm(TComponent* Owner) : TForm(Owner) {
if (FileExists(ExtractFilePath(Application->ExeName) + "\Info\\About.rtf")) {
Text_About->Lines->LoadFromFile(ExtractFilePath(Application->ExeName) + "\Info\\About.rtf");}
if (FileExists(ExtractFilePath(Application->ExeName) + "\Info\\Help.rtf")) {
Text_Help->Lines->LoadFromFile(ExtractFilePath(Application->ExeName) + "\Info\\Help.rtf");}
UpdateTextColor();
LoadConfig();
Btn_Accept->Enabled = false;}
void THelpForm::UpdateTextColor() {
Text_About->SelectAll();
Text_About->SelAttributes->Color = clWindowText;
Text_About->SelStart = 1;
Text_Help->SelectAll();
Text_Help->SelAttributes->Color = clWindowText;
Text_Help->SelStart = 1;}
void __fastcall THelpForm::Sel_ThemeChange(TObject *Sender) {
Btn_Accept->Enabled = true;}
void __fastcall THelpForm::Btn_AcceptClick(TObject *Sender) {
TStyleManager::TrySetStyle(Sel_Theme->Text);
UpdateTextColor();
Btn_Accept->Enabled = false;
SaveConfig();}
void __fastcall THelpForm::Check_ConfirmActionsClick(TObject *Sender)
{Btn_Accept->Enabled = true;}
ПРИЛОЖЕНИЕ 2
Структурная схема программного продукта представлена на рис. П2.1
Рисунок П2.1 - Структурная схема программного обеспечения
ПРИЛОЖЕНИЕ 3
Блок-схема алгоритма работы программного обеспечения представлена на рисунке П3.1.
Рисунок П3.1 - Блок-схема алгоритма работы программного обеспечения
ПРИЛОЖЕНИЕ 4
РАСПЕЧАТКА КОНТРОЛЬНЫХ ТЕСТОВ
При запуске файла 3-AC calc.exe на экране появится форма (см.рис. 2.5), которая состоит из 5 вкладок. На вкладках "Общие параметры", "Фаза АВ" (см.рис. 2.6), "Фаза ВС", "Фаза СА" необходимо вводить исходные данные. Также на первой вкладке присутствует выбор единиц измерения сопротивления из выпадающего списка, которые будут использоваться в характеристиках элементов, при расчетах и выдаче результата. В каждую фазу пользователь добавляет ветви с присутствующими на них элементами. Для того чтобы стало доступно это действие необходимо нажать на кнопку "Добавить ветвь" (см.рис. 2.7). Программа предусматривает, что в ветви не может быть больше трех элементов, по одному каждого типа (см.рис. 2.8). При выборе элемента появляется возможность указать его характеристики. Была проведена проверка ввода различных символов и чисел во все заполняемые поля. Программой предусмотрен запрет ввода букв в поля, где вводятся только числа. В программном продукте предусмотрена возможность указывать для катушек и конденсаторов как индуктивность и емкость, так и сопротивление. Для того чтобы в их характеристики можно было вводить сопротивление, необходимо поставить галочку "Комплексное сопротивление для катушек и конденсаторов" (см.рис. 2.9). В программе задано по умолчанию, что ветви между собой в фазах соединены последовательно. Чтобы соединить рядом стоящие ветви параллельно, нужно установить соответствующие галочки в области "Соединить параллельно". Слева - соединить с предыдущей ветвью, справа - со следующей ветвью (см.рис. 2.10). Если пользователь добавил ненужную ветвь, то ее можно удалить. Для этого необходимо нажать кнопку "Удалить" в правой верхней части окна. Если в настройках включено подтверждение действий, то перед пользователем появится сообщение для подтверждения или отмены удаления (см.рис. 2.11).
Для того чтобы рассчитать параметры, нужно перейти на вкладку "Расчеты", расчет/перерасчет будет произведен автоматически при переходе на нее. В случае если не во всех фазах имеются ветви, расчет производиться не будет (см.рис. 2.14). В программе предусмотрены пункты Меню "Загрузка цепи", "Сохранить цепь", "Начать заново", "Настройки", "Справка", "О программе". Если пользователь захочет начать заново или загрузить цепь, то ему будет предоставлена возможность сохранить ранее введенную цепь (см.рис. 2.17). Результат расчета и диаграмму также можно сохранить. В Меню "Настройки" можно выбрать тему оформления на свой вкус и отключить/включить подтверждение некоторых действий (см.рис. 2.20).
ПРИЛОЖЕНИЕ 5
РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
СОДЕРЖАНИЕ
П5.1. ПРАВИЛА ЭКСПЛУАТАЦИИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ118П5.1.1. Условия эксплуатации программного обеспечения118П5.1.1.1. Требования к аппаратному обеспечению118П5.1.1.2. Требования к помещениям для эксплуатации аппаратных средств118П5.1.1.3. Требования к организации рабочих мест119П5.1.1.4. Требования к освещению помещения для эксплуатации аппаратных средств и рабочих мест120П5.1.1.5. Требования к организации режима труда и отдыха при работе с аппаратным обеспечением121П5.2. ЭКСПЛУАТАЦИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ122П5.2.1. Установка программного обеспечения на ЭВМ122П5.2.2. Вызов программного обеспечения124П5.2.3. Ввод исходных данных124П5.2.4. Действия пользователя по обработке информации125П5.2.5. Вывод результатов обработки информации125П5.2.6. Сообщения программного обеспечения125П5.2.7. Демонстрационный пример работы программного обеспечения126 П5.1. ПРАВИЛА ЭКСПЛУАТАЦИИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
П5.1.1. Условия эксплуатации программного обеспечения
П5.1.1.1. Требования к аппаратному обеспечению
Для эксплуатации программы к программному обеспечению предъявляются следующие требования:
- процессор с тактовой частотой от 300 МГц и выше;
- объем оперативной памяти от 10 Мб и выше;
- объем дискового пространства 10 Мб;
- монитор 640×480 VGA;
- манипулятор типа мышь;
- принтер.
П5.1.1.2. Требования к помещениям для эксплуатации аппаратных средств
Помещения с видео-дисплейными терминалами (ВДТ) и ПЭВМ должны оборудоваться системами отопления, кондиционирования воздуха или эффективной приточной вытяжной вентиляцией. Эти помещения также должны иметь естественное и искусственное освещение.
Естественное освещение должно осуществляться через светопроемы, ориентированные преимущественно на север и северо-восток, и обеспечивать коэффициент естественной освещенности (КЕО) не ниже 1,2% в зонах с устойчивым снежным покровом и не ниже 1,5% на остальной территории. Указанные значения КЕО нормируются для зданий, расположенных в III климатическом поясе. Расчет КЕО для других поясов светового климата проводится по общепринятой методике.
Искусственное освещение в помещениях эксплуатации ВДТ и ПЭВМ должно осуществляться системой общего равномерного освещения. В производственных и административно-общественных помещениях, в случаях преимущественной работы с документами, допускается применение системы комбинированного освещения (к общему освещению дополнительно устанавливаются светильники местного освещения, предназначенные для освещения зоны расположения документов).
Искусственное освещение должно обеспечивать на рабочих местах с ВДТ и ПЭВМ в производственных и административно-общественных, дошкольных и учебных помещениях освещенность не ниже нормируемых значений.
Следует ограничивать неравномерность распределения яркости в поле зрения пользователя ВДТ и ПЭВМ, при этом соотношение яркости между рабочими поверхностями не должно превышать 3:1 - 5:1, а между рабочими поверхностями и поверхностями стен и оборудования - 10:1.
В качестве источников света при искусственном освещении должны применяться преимущественно люминесцентные лампы типа ЛБ. При устройстве отраженного освещения в производственных и административно-общественных помещениях допускается применение металлогалогенных ламп мощностью до 250 Вт. Допускается применение ламп накаливания в светильниках местного освещения.
Общее освещение следует выполнять в виде сплошных или прерывистых линий светильников, расположенных сбоку от рабочих мест, преимущественно слева, параллельно линии зрения пользователей. При периметральном расположении рабочих мест с ВДТ и ПЭВМ в дошкольных и учебных помещениях, светильники общего освещения следует располагать локализовано относительно рабочих мест.
Яркость светильников общего освещения в зоне углов излучения от 50 град. До 90 град. с вертикалью в продольной и поперечной плоскостях должна составлять не более 200 кд/м, защитный угол светильников должен быть не менее 40 град.
Для обеспечения нормируемых значений освещенности в помещениях использования ВДТ и ПЭВМ следует проводить чистку остекления световых проемов и светильников не реже двух раз в год, а также современную замену перегоревших ламп.
Расположение рабочих мест с ВДТ и ПЭВМ в цокольных и подвальных помещениях не допускается.
В случае производственной необходимости, эксплуатация ВДТ и ПЭВМ в помещениях без естественного света может проводиться только по согласованию с органами Государственного санитарно-эпидемиологического надзора.
Площадь на одно рабочее место с ВДТ и ПЭВМ для взрослых пользователей должна составлять не менее 6,0 м2, а объем - не менее 20,0 м3. Площадь на одно рабочее место с ВДТ и ПЭВМ во всех учебных и дошкольных учреждениях должна быть не менее 6,0 м2, а объем - не менее 24 м3.
Звукоизоляция ограждающих конструкций помещения с ВДТ и ПЭВМ должна отвечать гигиеническим требованиям и обеспечивать нормируемые параметры шума согласно требованиям раздела 5 настоящих Санитарных правил и норм.
Поверхность пола в помещениях эксплуатации ВДТ и ПЭВМ должна быть ровной, без выбоин, нескользкой, удобной для очистки и влажной уборки, обладать антистатическими свойствами.
П5.1.1.3. Требования к организации рабочих мест
Расположение рабочих мест в ВДТ и ПЭВМ для пользователей в подвальных помещениях не допускается.
Площадь на одно рабочее место с ВДТ и ПЭВМ для пользователей должна составлять не менее 6 кв. м, а объем не менее 20 куб.м.
Неправильный выбор ВДТ приводит к ухудшению здоровья пользователя. Поэтому все ВДТ должны иметь гигиенический сертификат включающий, в том числе оценку визуальных параметров.
Конструкция ВДТ, его дизайн и совокупность эргономических параметров должны обеспечивать надежное и комфортное считывание отображаемой информации в условиях эксплуатации.
Конструкция ВДТ должна обеспечивать возможность фронтального наблюдения экрана путем поворота корпуса в горизонтальной плоскости вокруг вертикальной оси в пределах плюс - минус 30 градусов. Дизайн ВДТ должен предусматривать окраску корпуса в мягкие тона с диффузионным рассеиванием света. Корпус ВДТ и ПЭВМ, клавиатура и другие блоки и устройства ПЭВМ должны иметь матовую поверхность одного цвета с коэффициентом отражения 0.4 - 0.6 и не иметь блестящих деталей, способных создавать блики.
П5.1.1.4. Требования к освещению помещений для эксплуатации аппаратных средств и рабочих мест
Искусственное освещение в помещениях эксплуатации ВДТ и ПЭВМ должно осуществляться системой общего равномерного освещения. В производственных и административно-общественных помещениях, в случаях преимущественной работы с документами, допускается применение системы комбинированного освещения (к общему освещению дополнительно устанавливаются светильники местного освещения, предназначенные для освещения зоны расположения документов).
Искусственное освещение должно обеспечивать на рабочих местах с ВДТ и ПЭВМ в производственных и административно-общественных, дошкольных и учебных помещениях освещенность не ниже нормируемых значений.
Следует ограничивать неравномерность распределения яркости в поле зрения пользователя ВДТ и ПЭВМ, при этом соотношение яркости между рабочими поверхностями не должно превышать 3:1 - 5:1, а между рабочими поверхностями и поверхностями стен и оборудования - 10:1.
В качестве источников света при искусственном освещении должны применяться преимущественно люминесцентные лампы типа ЛБ. При устройстве отраженного освещения в производственных и административно-общественных помещениях допускается применение металлогалогенных ламп мощностью до 250 Вт. Общее освещение следует выполнять в виде сплошных или прерывистых линий светильников, расположенных сбоку от рабочих мест, преимущественно слева, параллельно линии зрения пользователей. При периметральном расположении рабочих мест с ВДТ и ПЭВМ в дошкольных и учебных помещениях, светильники общего освещения следует располагать локализовано относительно рабочих мест.
Яркость светильников общего освещения в зоне углов излучения от 50 град. До 90 град. с вертикалью в продольной и поперечной плоскостях должна составлять не более 200 кд/м, защитный угол светильников должен быть не менее 40 град.
Для обеспечения нормируемых значений освещенности в помещениях использования ВДТ и ПЭВМ следует проводить чистку остекленения световых проемов и светильников не реже двух раз в год, а также современную замену перегоревших ламп.
П5.1.1.5. Требования к организации режима труда и отдыха при работе с аппаратным обеспечением
Режимы труда и отдыха при профессиональной работе с ПЭВМ и ВТД должны организовываться в зависимости от вида и категории трудовой деятельности.
Виды трудовой деятельности разделяются на три группы:
- группа А - работа по считыванию информации с экрана ВТД и ПЭВМ с предварительным запросом;
- группа Б - работа по поводу информации;
- группа В - творческая работа в режиме диалога с ЭВМ. При выполнении в течении рабочей смены работ, относящихся к разным видам трудовой деятельности, за основную работу с ПЭВМ и ВТД следует принимать такую, которая занимает не менее 50% времени в течение рабочей смены или рабочего дня.
Для видов трудовой деятельности устанавливается три категории тяжести и напряженности работы с ВТД и ПЭВМ, которые определяются: для групп А и Б - по суммарному числу считываемых или вводимых знаков за рабочую смену; для группы В - по суммарному времени непосредственной работы с ВТД и ПЭВМ за рабочую смену. Нагрузка на рабочую смену любой продолжительности не должна превышать: для группы А - 60000 знаков, для групп Б - 45000 знаков, для группы В - суммарное время непосредственной работы с ВТД и ПЭВМ за смену не более 6 часов. Продолжительность работы педагогов при ведении занятий с ВТД и ПЭВМ во всех учебных заведениях не должна превышать 4 часов в день. Для обеспечения оптимальной работоспособности и сохранения здоровья профессиональных пользователей, на протяжении рабочей смены должны устанавливаться регламентированные перерывы. Время регламентированных перерывов в течение рабочей смены следует устанавливать в зависимости от ее продолжительности, вида и категории трудовой деятельности с ВТД и ПЭВМ. Во время регламентированных перерывов, с целью снижения нервно-эмоционального напряжения, устранения влияния гиподинамии гипокинезии, предотвращения развития познотонического утомления следует выполнять комплексы упражнений.
Продолжительность непрерывной работы с ВТД и ПЭВМ без регламентированного перерыва не должна превышать 2 часов.
Для профилактики зрительного утомления после каждых 25 минут работы следует выполнять комплекс упражнений для глаз. В случаях возникновения у работающих с ВТД и ПЭВМ зрительного дискомфорта или неблагоприятных субъективных ощущений, несмотря на соблюдение санитарно-гигиенических и эргономических требований и режимов труда и отдыха, следует применять индивидуальный подход в ограничении времени работы с ВТД и ПЭВМ и коррекцию длительности перерывов для отдыха или проводить смену деятельности, заменив ее на работу, не связанную с использованием ВТД и ПЭВМ.
П5.2. ЭКСПЛУАТАЦИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
П5.2.1. Установка программного обеспечения на ЭВМ
Для установки данного программного продукта предусмотрена инсталляция программы. Необходимо запустить файл setup.exe, на экране появится диалоговое окно, которое представлено на рис. П5.1). Для продолжения процесса инсталляции необходимо нажать "Далее".
Рисунок П5.1 - Окно приветствия
Далее, программа установки запрашивает директорию, в которую будет устанавливаться программа (см. рис. П5.2). По умолчанию это C:\Program Files\"3-AC calc"
Рисунок П5.2 - Окно выбора директории для установки
Для начала установки нажать на кнопку "Далее" (см. рис. П5.3).
Рисунок П5.3 - Окно начала установки
После указания необходимой директории и создания/не создания ярлыка на рабочем столе, программа установки программы на компьютер копирует файлы на диск. По завершению установки программы нажать на кнопку "Готово" (см. рис. П5.4)
Рисунок П5.4 - Окно выхода из программы установки
П5.2.2. Вызов программного обеспечения
Вызов приложения "Программа для автоматического расчета параметров трехфазных электрических цепей " осуществляется запуском ярлыка, который располагается на Рабочем столе после инсталляции, либо любым из известных способов загрузки исполняемых файлов в среде Windows. В данном случае исполняемым файлом является файл 3-AC calc.ехе, расположенный на рабочем столе.
П5.2.3. Ввод исходных данных
Ввод исходных данных при использовании программы осуществляется в соответствии со структурой записей. Данные вносятся с клавиатуры самим пользователем, а вид их характеристик выбираются из предложенных вариантов при помощи мыши. П5.2.4. Действия пользователя по обработке информации
При использовании программы пользователь принимает непосредственное участие при обработке информации. Попав на главную форму, пользователь может добавлять, сохранять, отменять действия и редактировать исходные данные, используя при этом функциональные клавиши. При переходе по вкладке "Расчет" пользователь может просматривать и сохранять расчет и диаграмму. Через меню программы пользователь может получить информацию о программе, помощь при работе с программой, настройки программы, а также возможность сохранять и загружать электрическую цепь.
П5.2.5. Вывод результатов обработки информации
При работе с программой выводить полученную информацию можно на экран монитора или в файлы различного формата. П5.2.6. Сообщения программного продукта
При работе программы выдаются различные сообщения, на которые должен правильно реагировать пользователь. Если пользователь хочет удалить добавленную ветвь в любую фазу, то появиться сообщение (рис.П5.2.1):
Рисунок П5.2.1 - Подтверждение удаления ветви
При использовании возможностей меню: "Загрузка цепи" и "Начать заново" пользователь может сохранить введенные ранее данные (рис.П5.2.2):
Рисунок П5.2.2 - Подтверждение сохранения цепи
П5.2.7. Демонстрационный пример работы программного продукта
Запустить программу можно нажав двойным щелчком мыши по файлу 3-AC calc.exe после чего на экране появится главное окно программы (см.рис.П5.2.3):
Рисунок П5.2.3- Форма входа в программу
Данная форма представляет собой своего рода вкладки, в которые мы поочередно заносим исходные данные. На вкладке "Общие параметры" пользователь указывает или изменяет номинальное линейное напряжение и номинальную частоту, из выпадающего списка выбирает единицы измерения сопротивления, которые будут использоваться в характеристиках элементов, а также при расчетах и выдаче результата. На данной вкладке пользователю необходимо указать тип трехфазной цепи, исходя из которого, будет производен расчет. После того, как пользователь ввел эти данные, можно переходить к заполнению фаз, что происходит на вкладках "Фаза AB", "Фаза ВC", "Фаза CA" (см.рис.П5.2.4-6):
Рисунок П5.2.4- Вкладка "Фаза АВ"
Рисунок П5.2.5- Вкладка "Фаза ВС"
Рисунок П5.2.6- Вкладка "Фаза СА"
Работа во вкладках с фазами происходит идентична. Пользователь поочередно заполняет их, пользуясь исходной схемой радиоэлектронного компонента.
На вкладках с фазами происходит добавление ветвей с присутствующими на них элементами. Для того чтобы стало доступно это действие необходимо нажать кнопку "Добавить ветвь" (см.рис.П5.2.7):
Рисунок П5.2.7- Добавление ветви в фазу
Всего 3 типа элементов: R - резистор, C - конденсатор, L - катушка индуктивности. При этом в каждой ветви может быть до 3-х элементов, по одному каждого типа. Если выбран только один элемент, то под остальными двумя будет отмечено "Отсутствует". При выборе элемента появляется возможность указать его характеристики (см.рис.П5.2.8): Рисунок П5.2.8 - Добавление элементов в ветвь
Поставив галочку "Комплексное сопротивление для катушек и конденсаторов", то катушка L и конденсатор C примут вид XL и XC соответственно, а вместо индуктивности и емкости в характеристики нужно будет вводить сопротивление (см.рис.П5.2.9): Рисунок П5.2.9 - Ввод значения комплексного сопротивления
Так добавляется нужное количество ветвей в выбранную фазу. В нижнем левом углу окна программы идет подсчет ветвей, вверху окна - обозначение ветви. С помощью функциональных клавиш осуществляется переход по добавленным ветвям для редактирования или просмотра. Ветви по умолчанию соединены последовательно. Чтобы соединить рядом стоящие ветви параллельно, нужно установить соответствующие галочки в области "Соединить параллельно". Слева - соединить с предыдущей ветвью, справа - со следующей. Параллельное и последовательное соединение отображается и визуально на форме (см.рис.П5.2.10): Рисунок П5.2.10 - Соединение ветвей в фазе
Выбранную ветвь можно удалить. Для этого нужно нажать кнопку "Удалить" в правой верхней части окна. Если в настройках включено подтверждение действий, то перед удалением появится сообщение для подтверждения или отмены удаления (см.рис.П5.2.11): Рисунок П5.2.11 - Подтверждение удаления ветви
Для того чтобы рассчитать параметры, нужно перейти на вкладку "Расчеты", расчет/перерасчет будет произведен автоматически при переходе на нее (см.рис.П5.2.12): Рисунок П5.2.12 - Вкладка "Расчет" (Результат)
Здесь выводится вся необходимая выходная информация с пояснениями по определенному методу расчета. На вкладке "Расчет" предусмотрен вывод не только числовых значений полученного результата, но и векторной диаграммы на основании полученных линейных токов. Диаграмма представляет собой координатную ось, в которой строятся 3 вектора (разных цветов), соответствующие фазам цепи. За X берется значение действительной части комплексного значения силы тока фазы, а за Y - значение мнимой части (см.рис.П5.2.13): Рисунок П5.2.13 - Вкладка "Расчет" (Векторная диаграмма линейных токов)
В случае если не во всех фазах имеются ветви, расчет производиться не будет (см.рис.П5.2.14): Рисунок П5.2.14 - Вкладка "Расчет" (Информационное сообщение)
Созданную цепь можно сохранить на диск, для последующего использования. Для этого в "Меню" необходимо выбрать пункт "Сохранить цепь", далее нужно выбрать путь для сохранения и ввести имя файла, после чего нажать кнопку "Сохранить" (см.рис.П5.2.15): Рисунок П5.2.15 - Сохранение цепи
Такое сохранения предусматривает использование сохраненного файла только в этой программе. При его загрузке в программу заносятся все исходные данные, расчет и диаграмма. Для этого необходимо в "Меню" выбрать пункт "Загрузить цепь". Если в настройках включено подтверждение действий, то перед загрузкой цепи будет предложено сохранить изменения (см.рис.П5.2.16): Рисунок П5.2.16 - Подтверждения общего сброса
По нажатию кнопки "Да" - сначала происходит сохранения цепи (описанное выше), а потом загрузка цепи. По нажатию кнопки "Отмена" - произойдет отмена выбранного действия. А по нажатию кнопки "Нет" - пользователь сразу загружает необходимую цепь. Для этого необходимо выбрать нужный файл, после чего нажать кнопку "Открыть" (см.рис.П5.2.17): Рисунок П5.2.17 - Загрузка цепи
Выходные данные также можно сохранить. Для этого нужно кликнуть правой кнопкой мыши на вкладке "Расчет" с результатом и выбрать в появившемся меню (появляется, если цепь полностью построена и расчет произведен) пункт "Сохранить". Далее ввести имя файла и нажать кнопку "Сохранить". Данные сохранять в текстовом формате (см.рис.П5.2.18): Рисунок П5.2.18- Сохранение расчета
Диаграмму также можно сохранить. Для этого нужно кликнуть правой кнопкой мыши на вкладке "Расчет" с диаграммой и выбрать в появившемся меню (появляется, если цепь полностью построена и расчет произведен) пункт "Сохранить". Далее ввести имя файла и нажать кнопку "Сохранить". Данные сохраняться в виде рисунка (см.рис.П5.2.19): Рисунок П5.2.19 - Сохранение диаграммы
Пользователь в любой момент может очистить все вкладки. Для этого необходимо выбрать в "Меню" пункт "Начать заново". Если в настройках включено подтверждение действий, то перед очисткой будет предложено сохранить изменения (см.рис.П5.2.16). В результате пользователь возвращается на вкладку "Общие параметры" и заново вводит все исходные данные. В "Меню" программы, выбрав пункт Настройки, можно выбрать тему оформления на свой вкус с выпадающего списка предложенных. Для отключения/включения подтверждения некоторых действий (удаление ветви, сохранение изменений) необходимо убрать/установить галочку в области "Подтверждение действий" (см.рис.П5.2.20): Рисунок П5.2.20- Пункт "Настройки"
Для вызова справки необходимо в "Меню" выбрать пункт "Помощь" (см.рис.П5.2.21): Рисунок П5.2.21 - Пункт "Помощь"
Узнать информацию о программе и авторе программы можно через пункт "О программе" в "Меню" (см.рис.П5.2.22):
Рисунок П5.2.22 - Пункт "О программе"
ПРИЛОЖЕНИЕ 6
ПРОТОКОЛ ИСПЫТАНИЙ ПРОГРАММНОГО ПРОДУКТА
Комиссия в составе
- председатель цикловой комиссии - С. Г. Тыбербай руководитель дипломного проекта - Г. Н. Баранова
преподаватель спецдисциплины - А.С. Шандриков
произвел проверку работоспособности программного продукта, разработанного в порядке выполнения дипломного проекта.
1. Информация о программном продукте 1.1. Название программного продукта: "Программа для автоматизированного расчета параметров трехфазных электрических цепей".
1.2. Номер версии программного продукта: 1.0
1.3. Дата разработки версии программного продукта 06.06.2011
1.4. Назначение программного продукта: Программный продукт предназначен для расчета трехфазных электрических цепей переменного тока.
1.5. Функции программного продукта: Программа для автоматизированного расчета параметров трехфазных электрических цепей.
1.6. Язык программирования: Embarcadero RAD Studio C++ Builder XE 2010
1.7. Наличие программы инсталляции: Есть
1.8. Тип компьютера(ов): Pentium II 1.9. Требования к компьютеру: Microsoft Office 2003
Оперативная память: 64 Мбайт и выше
Ёмкость жесткого диска(ов): 5 Мбайт
Монитор(ы): 640х480 VGA
Дополнительное периферийное оборудование: манипулятор типа "мышь", принтер
1.10. Тип операционной системы (систем): Windows 9x и выше 2.Информация об организации-заказчике:
2.1. Полное официальное наименование: УО "Витебский государственный политехнический колледж"
2.2. Место нахождения (почтовый адрес): г.Витебск, пр-т Черняховского,14
Номер контактного телефона(ов): (8-0212) 21-30-91
Номер факса: (8-0212) 21-30-91
Адрес электронной почты: www.vgpt@.tut.by
2.6 Фамилия, имя, отчество учащегося, разработавшего программный продукт: Шибеко Юлия Викторовна.
Работоспособность программного продукта проверена на контрольных примерах, предусматривающих все возможные варианты исходных и промежуточных данных.
Программный продукт признан работоспособным, соответствующим техническому заданию и позволяет решать поставленные перед ним производственные задачи.
Руководитель дипломного проекта ____________/Баранова Г.Н./
(подпись)
Председатель цикловой комиссии ____________/Тыбербай С.Г./
(подпись)
Преподаватель спецдисциплин ____________/Шандриков А.С./
(подпись)
29
3
ВГПК.400101.Д12.462-ПЗ
ВГПК.400101.Д10.008 -ПЗ
Документ
Категория
Рефераты
Просмотров
89
Размер файла
2 000 Кб
Теги
записка, диплом
1/--страниц
Пожаловаться на содержимое документа