); IF _fbUnit1.xWarning THEN xWarning := TRUE; END_IF IF _fbUnit1.xError THEN xError := TRUE; END_IF // =============================== // Unit 2 // =============================== _fbUnit2( xEnable := xEnable, stUnitConfig:= GVL_CONFIG.stUnitConfig, stHMIInterface:= stHMIInterface.stHMIInterfaceUnit2, xEmergencyStopOk:= xEmergencyStopOk, rSetpointPosolytPumpInlet:= GVL_CONFIG.rPumpPosolytOnPower, rSetpointNegolytPumpInlet:= GVL_CONFIG.rPumpNegolytOnPower, xReleaseErrors:= xReleaseErrors, xReleaseLimitErrors:= xReleaseLimitErrors, xConfirmAlarms:= xConfirmAlarms, _xWarningConfirmPending=> ); IF _fbUnit2.xWarning THEN xWarning := TRUE; END_IF IF _fbUnit2.xError THEN xError := TRUE; END_IF // =============================== // Unit 3 // =============================== _fbUnit3( xEnable := xEnable, stUnitConfig:= GVL_CONFIG.stUnitConfig, stHMIInterface:= stHMIInterface.stHMIInterfaceUnit3, xEmergencyStopOk:= xEmergencyStopOk, rSetpointPosolytPumpInlet:= GVL_CONFIG.rPumpPosolytOnPower, rSetpointNegolytPumpInlet:= GVL_CONFIG.rPumpNegolytOnPower, xReleaseErrors:= xReleaseErrors, xReleaseLimitErrors:= xReleaseLimitErrors, xConfirmAlarms:= xConfirmAlarms, _xWarningConfirmPending=> ); IF _fbUnit3.xWarning THEN xWarning := TRUE; END_IF IF _fbUnit3.xError THEN xError := TRUE; END_IF // =============================== // Unit 4 // =============================== _fbUnit4( xEnable := xEnable, stUnitConfig:= GVL_CONFIG.stUnitConfig, stHMIInterface:= stHMIInterface.stHMIInterfaceUnit4, xEmergencyStopOk:= xEmergencyStopOk, rSetpointPosolytPumpInlet:= GVL_CONFIG.rPumpPosolytOnPower, rSetpointNegolytPumpInlet:= GVL_CONFIG.rPumpNegolytOnPower, xReleaseErrors:= xReleaseErrors, xReleaseLimitErrors:= xReleaseLimitErrors, xConfirmAlarms:= xConfirmAlarms, _xWarningConfirmPending=> ); IF _fbUnit4.xWarning THEN xWarning := TRUE; END_IF IF _fbUnit4.xError THEN xError := TRUE; END_IF // =============================== // Units ready check // =============================== _xAllUnitsReady := _fbUnit1.xReady AND _fbUnit2.xReady AND _fbUnit3.xReady AND _fbUnit4.xReady; // =============================== // Units in shutdown discharge mode // =============================== xInShutdownDischargeMode := _fbUnit1.xInShutdownDischargeMode AND _fbUnit2.xInShutdownDischargeMode AND _fbUnit3.xInShutdownDischargeMode AND _fbUnit4.xInShutdownDischargeMode; // =============================== // Units shutdown discharge allowed // =============================== xShutdownDischargeAllowed := _fbUnit1.xShutdownDischargeAllowed AND _fbUnit2.xShutdownDischargeAllowed AND _fbUnit3.xShutdownDischargeAllowed AND _fbUnit4.xShutdownDischargeAllowed; // =============================== // All units off // =============================== xOff := _fbUnit1.xOff AND _fbUnit2.xOff AND _fbUnit3.xOff AND _fbUnit4.xOff; // =============================== // Calculate module voltage // =============================== rCurrentVoltage := _fbUnit1.rCurrentVoltage + _fbUnit2.rCurrentVoltage + _fbUnit3.rCurrentVoltage + _fbUnit4.rCurrentVoltage; // =============================== // Module balance check // =============================== // Reset balance ok flag _xBalanceOk := TRUE; // Test unit 1 with unit 2 IF ABS(_fbUnit1.rCurrentVoltage - _fbUnit2.rCurrentVoltage) > GVL_CONFIG.rMaxAbsDiffVoltageUnitsOnModule THEN _xBalanceOk := FALSE; END_IF // Test unit 1 with unit 3 IF ABS(_fbUnit1.rCurrentVoltage - _fbUnit3.rCurrentVoltage) > GVL_CONFIG.rMaxAbsDiffVoltageUnitsOnModule THEN _xBalanceOk := FALSE; END_IF // Test unit 1 with unit 4 IF ABS(_fbUnit1.rCurrentVoltage - _fbUnit4.rCurrentVoltage) > GVL_CONFIG.rMaxAbsDiffVoltageUnitsOnModule THEN _xBalanceOk := FALSE; END_IF // Test unit 2 with unit 3 IF ABS(_fbUnit2.rCurrentVoltage - _fbUnit3.rCurrentVoltage) > GVL_CONFIG.rMaxAbsDiffVoltageUnitsOnModule THEN _xBalanceOk := FALSE; END_IF // Test unit 2 with unit 4 IF ABS(_fbUnit2.rCurrentVoltage - _fbUnit4.rCurrentVoltage) > GVL_CONFIG.rMaxAbsDiffVoltageUnitsOnModule THEN _xBalanceOk := FALSE; END_IF // Test unit 3 with unit 4 IF ABS(_fbUnit3.rCurrentVoltage - _fbUnit4.rCurrentVoltage) > GVL_CONFIG.rMaxAbsDiffVoltageUnitsOnModule THEN _xBalanceOk := FALSE; END_IF // Signal an error if all units are ready and module is out of balance IF _xAllUnitsReady AND (NOT _xBalanceOk) THEN xError := TRUE; END_IF // =============================== // Module ready validation check // =============================== IF _xAllUnitsReady AND _xBalanceOk THEN xReady := TRUE; ELSE xReady := FALSE; END_IF]]>