593{
594
597 auto& data = bus->GetElectricalDataRef();
598 data.stabVoltageVector.clear();
599 data.stabVoltageVector.shrink_to_fit();
600 data.stabFreqVector.clear();
601 data.stabFreqVector.shrink_to_fit();
602 data.stabFreq = m_systemFreq;
603 data.oldAngle = std::arg(data.voltage);
604 data.filteredAngle = 0.0;
605 data.dxt = 0.0;
606 data.filteredVelocity = 0.0;
607 data.ddw = 0.0;
608
609 }
610
612 auto dataPU = load->GetPUElectricalData(m_powerSystemBase);
613 auto& data = load->GetElectricalDataRef();
614
615 double activePower = dataPU.activePower;
616 double reactivePower = dataPU.reactivePower;
617
620 {
621 data.voltage = bus->GetElectricalDataRef().voltage;
622 }
623 else {
624 load->SetOnline(false);
625 }
626
627 data.v0 = std::abs(data.voltage);
628 data.y0 = std::complex<double>(activePower, -reactivePower) / (data.v0 * data.v0);
629
630 if (data.loadType == CONST_IMPEDANCE) {
631 std::complex<double> s0 = std::complex<double>(activePower, -reactivePower) * (data.v0 * data.v0);
632 activePower = s0.real();
633 reactivePower = -s0.imag();
634 }
635
636 data.pz0 = (data.constImpedanceActive / 100.0) * activePower;
637 data.pi0 = (data.constCurrentActive / 100.0) * activePower;
638 data.pp0 = (data.constPowerActive / 100.0) * activePower;
639
640 data.qz0 = (data.constImpedanceReactive / 100.0) * reactivePower;
641 data.qi0 = (data.constCurrentReactive / 100.0) * reactivePower;
642 data.qp0 = (data.constPowerReactive / 100.0) * reactivePower;
643
644 data.voltageVector.clear();
645 data.voltageVector.shrink_to_fit();
646 data.electricalPowerVector.clear();
647 data.electricalPowerVector.shrink_to_fit();
648
649 if (load->IsOnline())
650 data.electricalPower = std::complex<double>(activePower, reactivePower);
651 else {
652 data.electricalPower = std::complex<double>(0.0, 0.0);
653 data.voltage = std::complex<double>(0.0, 0.0);
654 }
655
656
657 }
658
661 auto dataPU = syncGenerator->GetPUElectricalData(m_powerSystemBase);
662 auto& data = syncGenerator->GetElectricalDataRef();
663 double k = 1.0;
664 if (data.useMachineBase) {
665 double oldBase = syncGenerator->GetValueFromUnit(data.nominalPower, data.nominalPowerUnit);
666 k = m_powerSystemBase / oldBase;
667 }
670 data.terminalVoltage = bus->GetElectricalDataRef().voltage;
671 else
672 data.terminalVoltage = std::complex<double>(1.0, 0.0);
673
674 std::complex<double> conjS(dataPU.activePower, -dataPU.reactivePower);
675 std::complex<double> vt = data.terminalVoltage;
676 std::complex<double> ia = conjS / std::conj(vt);
677
678 double xd = data.syncXd * k;
679 double xq = data.syncXq * k;
680 double ra = data.armResistance * k;
681
682 if (data.model == Machines::SM_MODEL_1) {
683 xq = data.transXd * k;
684 xd = xq;
685 }
686 else if (data.syncXq == 0.0)
687 xq = data.syncXd * k;
688
689 double sd = 1.0;
690 double sq = 1.0;
691 double satF = 1.0;
692 double xp = data.potierReactance * k;
693 bool hasSaturation = false;
694 if (data.satFactor != 0.0) {
695 satF = (data.satFactor - 1.2) / std::pow(1.2, 7);
696 if (xp == 0.0) xp = 0.8 * (data.transXd * k);
697 hasSaturation = true;
698 }
699
700
701 std::complex<double> eq0 = vt + std::complex<double>(ra, xq) * ia;
702 double delta = std::arg(eq0);
703
704 double id0, iq0, vd0, vq0;
707
708
709 double xqs = xq;
710 double xds = xd;
711 if (hasSaturation) {
712 double oldDelta = 0;
713 bool exit = false;
714 int numIt = 0;
715 while (!exit) {
716 oldDelta = delta;
719
720
721 double epd = vd0 + ra * id0 + xp * iq0;
722
723 sq = 1.0 + satF * (xq / xd) * std::pow(epd, 6);
724 xqs = (xq - xp) / sq + xp;
725 eq0 = data.terminalVoltage + std::complex<double>(ra, xqs) * ia;
726 delta = std::arg(eq0);
727 if (std::abs(delta - oldDelta) < m_saturationTolerance) {
728 exit = true;
729 }
730 else if (numIt >= m_maxIterations) {
731 m_errorMsg = _("Error on initializate the saturation values of \"") + data.name + _("\".");
732 return false;
733 }
734 numIt++;
735 }
736
737 double epq = vq0 + ra * iq0 - xp * id0;
738 sd = 1.0 + satF * std::pow(epq, 6);
739 xds = (xd - xp) / sd + xp;
740 }
741
742 double ef0 = vq0 + ra * iq0 - xds * id0;
743
744 data.initialFieldVoltage = ef0 * sd;
745 data.fieldVoltage = data.initialFieldVoltage;
746 data.pm = std::real((data.terminalVoltage * std::conj(ia)) + (std::abs(ia) * std::abs(ia) * ra));
747 syncGenerator->
IsOnline() ? data.speed = 2.0 * M_PI * m_systemFreq : data.speed = 2.0 * M_PI * data.ocFrequency;
748 data.delta = delta;
749 data.pe = data.pm;
750 data.electricalPower = std::complex<double>(dataPU.activePower, dataPU.reactivePower);
751 if (!syncGenerator->
IsOnline()) data.electricalPower = std::complex<double>(0.0, 0.0);
752 data.sd = sd;
753 data.sq = sq;
754 data.id = id0;
755 data.iq = iq0;
756
757
758 data.oldIq = iq0;
759 data.oldId = id0;
760 data.oldPe = data.pe;
761 data.oldSd = sd;
762 data.oldSq = sq;
763
764 switch (data.model) {
765 case Machines::SM_MODEL_1: {
766 data.tranEq = std::abs(eq0);
767
768 data.tranEd = 0.0;
769 data.subEq = 0.0;
770 data.subEd = 0.0;
771 } break;
772 case Machines::SM_MODEL_2: {
773 double tranXd = data.transXd * k;
774
775 data.tranEq = ef0 + (xd - tranXd) * (id0 / sd);
776 data.tranEd = 0.0;
777 data.subEd = 0.0;
778 data.subEq = 0.0;
779 } break;
780 case Machines::SM_MODEL_3: {
781 double tranXd = data.transXd * k;
782 double tranXq = data.transXq * k;
783 if (tranXq == 0.0) tranXq = tranXd;
784
785 data.tranEq = ef0 + (xd - tranXd) * (id0 / sd);
786 data.tranEd = -(xq - tranXq) * (iq0 / sq);
787
788 data.subEd = 0.0;
789 data.subEq = 0.0;
790 } break;
791 case Machines::SM_MODEL_4: {
792 double tranXd = data.transXd * k;
793 double subXd = data.subXd * k;
794 double subXq = data.subXq * k;
795 if (subXd == 0.0) subXd = subXq;
796 if (subXq == 0.0) subXq = subXd;
797
798 data.tranEq = ef0 + (xd - tranXd) * (id0 / sd);
799 data.tranEd = 0.0;
800 data.subEq = data.tranEq + (tranXd - subXd) * (id0 / sd);
801 data.subEd = -(xq - subXq) * (iq0 / sq);
802 } break;
803 case Machines::SM_MODEL_5: {
804 double tranXd = data.transXd * k;
805 double tranXq = data.transXq * k;
806 double subXd = data.subXd * k;
807 double subXq = data.subXq * k;
808 if (subXd == 0.0) subXd = subXq;
809 if (subXq == 0.0) subXq = subXd;
810
811 data.tranEq = ef0 + (xd - tranXd) * (id0 / sd);
812 data.tranEd = -(xq - tranXq) * (iq0 / sq);
813 data.subEq = data.tranEq + (tranXd - subXd) * (id0 / sd);
814 data.subEd = data.tranEd - (tranXq - subXq) * (iq0 / sq);
815 } break;
816 default:
817 break;
818 }
819
820
821 if (data.useAVR) {
822
823
824
825 data.avrSolver = std::make_shared<ControlElementSolver>(data.avr, m_timeStep * m_ctrlTimeStepMultiplier, m_tolerance, m_parent);
826
827 data.avrSolver->SetSwitchStatus(syncGenerator->
IsOnline());
828 data.avrSolver->SetCurrentTime(m_currentTime);
829 data.avrSolver->SetTerminalVoltage(std::abs(data.terminalVoltage));
830 data.avrSolver->SetInitialTerminalVoltage(std::abs(data.terminalVoltage));
831 data.avrSolver->SetActivePower(dataPU.activePower);
832 data.avrSolver->SetReactivePower(dataPU.reactivePower);
833 data.avrSolver->SetVelocity(data.speed);
834 data.avrSolver->SetInitialVelocity(data.speed);
835 data.avrSolver->InitializeValues(false);
836 if (!data.avrSolver->IsOK()) {
837 m_errorMsg = _("Error on initializate the AVR of \"") + data.name + wxT("\".\n") +
838 data.avrSolver->GetErrorMessage();
839
840 return false;
841 }
842 }
843 if (data.useSpeedGovernor) {
844
845
846
847
848 data.speedGovSolver = std::make_shared<ControlElementSolver>(data.speedGov, m_timeStep * m_ctrlTimeStepMultiplier, m_tolerance, m_parent);
849 data.speedGovSolver->SetSwitchStatus(syncGenerator->
IsOnline());
850 data.speedGovSolver->SetCurrentTime(m_currentTime);
851 data.speedGovSolver->SetActivePower(dataPU.activePower);
852 data.speedGovSolver->SetReactivePower(dataPU.reactivePower);
853 data.speedGovSolver->SetVelocity(data.speed);
854 data.speedGovSolver->SetInitialVelocity(data.speed);
855 data.speedGovSolver->SetInitialMecPower(data.pm);
856 data.speedGovSolver->InitializeValues(false);
857 if (!data.speedGovSolver->IsOK()) {
858 m_errorMsg = _("Error on initializate the speed governor of \"") + data.name + wxT("\".\n") +
859 data.speedGovSolver->GetErrorMessage();
860
861 return false;
862 }
863 }
864
865
866
867
868
869 data.terminalVoltageVector.clear();
870 data.terminalVoltageVector.shrink_to_fit();
871 data.electricalPowerVector.clear();
872 data.electricalPowerVector.shrink_to_fit();
873 data.mechanicalPowerVector.clear();
874 data.mechanicalPowerVector.shrink_to_fit();
875 data.freqVector.clear();
876 data.freqVector.shrink_to_fit();
877 data.fieldVoltageVector.clear();
878 data.fieldVoltageVector.shrink_to_fit();
879 data.deltaVector.clear();
880 data.deltaVector.shrink_to_fit();
881
882
883 }
884
887 auto dataPU = indMotor->GetPUElectricalData(m_powerSystemBase);
888 auto& data = indMotor->GetElectricalDataRef();
889
891 if (connBus->GetElectricalDataRef().number < 0) indMotor->
SetOnline(
false);
892
893 double w0 = 2.0 * M_PI * m_systemFreq;
894 std::complex<double> i1 = std::complex<double>(dataPU.activePower, -data.q0) / std::conj(data.terminalVoltage);
895 double ir = std::real(i1);
896 double im = std::imag(i1);
897 std::complex<double> e = data.terminalVoltage - std::complex<double>(data.r1t, data.x1t) * i1;
898 double te = std::real(e * std::conj(i1)) / w0;
899
900 double wi = w0 * (1 - data.s0);
901 data.as = te * (data.aw + (data.bw * w0) / wi + (data.cw * w0 * w0) / (wi * wi));
902 data.bs = te * ((data.bw * w0) / wi + (2.0 * data.cw * w0 * w0) / (wi * wi));
903 data.cs = (te * data.cw * w0 * w0) / (wi * wi);
904
905 data.aCalc = data.as;
906 data.bCalc = data.bs;
907 data.cCalc = data.cs;
908
910 std::complex<double> tranE =
911 (std::complex<double>(0, data.x0 - data.xt) * i1) / std::complex<double>(1.0, w0 * data.s0 * data.t0);
912
913 data.tranEr = std::real(tranE);
914 data.tranEm = std::imag(tranE);
915
916 data.slip = data.s0;
917 data.ir = ir;
918 data.im = im;
919 data.te = te;
920 }
921 else {
922 data.tranEr = 0.0;
923 data.tranEm = 0.0;
924 data.slip = 1.0 - 1e-7;
925 data.ir = 0.0;
926 data.im = 0.0;
927 data.te = 0.0;
928 }
929
930
931 data.oldTe = data.te;
932 data.oldIr = data.ir;
933 data.oldIm = data.im;
934
935
936 data.slipVector.clear();
937 data.slipVector.shrink_to_fit();
938 data.electricalTorqueVector.clear();
939 data.electricalTorqueVector.shrink_to_fit();
940 data.mechanicalTorqueVector.clear();
941 data.mechanicalTorqueVector.shrink_to_fit();
942 data.velocityVector.clear();
943 data.velocityVector.shrink_to_fit();
944 data.currentVector.clear();
945 data.currentVector.shrink_to_fit();
946 data.terminalVoltageVector.clear();
947 data.terminalVoltageVector.shrink_to_fit();
948 data.activePowerVector.clear();
949 data.activePowerVector.shrink_to_fit();
950 data.reactivePowerVector.clear();
951 data.reactivePowerVector.shrink_to_fit();
952
953
954 }
955 CalculateReferenceSpeed();
956 return true;
957}