@@ -1467,14 +1467,16 @@ class GainLimiter(Block):
14671467 │ │ _____/
14681468 └─────┘ lower
14691469
1470+ TODO: Add an extra gain block "R" for y.
1471+
14701472 Parameters
14711473 ----------
14721474 u : str, BaseVar
14731475 Input variable, or an equation string for constructing an anonymous variable
14741476
14751477 """
14761478
1477- def __init__ (self , u , K , upper , lower , no_upper = False , no_lower = False ,
1479+ def __init__ (self , u , K , lower , upper , no_lower = False , no_upper = False ,
14781480 name = None , tex_name = None , info = None ):
14791481 Block .__init__ (self , name = name , tex_name = tex_name , info = info )
14801482 self .u = dummify (u )
@@ -1518,6 +1520,66 @@ def define(self):
15181520 self .y .e_str += f' - { self .name } _y'
15191521
15201522
1523+ class LimiterGain (Block ):
1524+ """
1525+ Limiter followed by a gain.
1526+
1527+ Exports the limited output `y`, unlimited output `x`, and HardLimiter `lim`. ::
1528+
1529+ upper ┌─────┐
1530+ /¯¯¯¯¯ │ │
1531+ u -> / -> │ K │ -> y
1532+ _____/ │ │
1533+ lower └─────┘
1534+
1535+ The intermediate variable before the gain is not saved.
1536+
1537+ Parameters
1538+ ----------
1539+ u : str, BaseVar
1540+ Input variable, or an equation string for constructing an anonymous variable
1541+
1542+ """
1543+
1544+ def __init__ (self , u , K , lower , upper , no_lower = False , no_upper = False ,
1545+ name = None , tex_name = None , info = None ):
1546+ Block .__init__ (self , name = name , tex_name = tex_name , info = info )
1547+ self .u = u
1548+ self .K = dummify (K )
1549+ self .upper = dummify (upper )
1550+ self .lower = dummify (lower )
1551+
1552+ if (no_upper and no_lower ) is True :
1553+ raise ValueError ("no_upper or no_lower cannot both be True" )
1554+
1555+ self .no_lower = no_lower
1556+ self .no_upper = no_upper
1557+
1558+ self .lim = HardLimiter (u = self .u , lower = self .lower , upper = self .upper ,
1559+ no_upper = no_upper , no_lower = no_lower ,
1560+ tex_name = 'lim' )
1561+
1562+ self .y = Algeb (info = 'Gain output after limiter' , tex_name = 'y' , discrete = self .lim )
1563+
1564+ self .vars = {'lim' : self .lim , 'y' : self .y }
1565+
1566+ def define (self ):
1567+ """
1568+ TODO: write docstring
1569+ """
1570+ self .y .e_str = f'{ self .K .name } * { self .u .name } * { self .name } _lim_zi'
1571+ self .y .v_str = f'{ self .K .name } * { self .u .name } * { self .name } _lim_zi'
1572+
1573+ if not self .no_upper :
1574+ self .y .e_str += f' + { self .K .name } * { self .name } _lim_zu*{ self .upper .name } '
1575+ self .y .v_str += f' + { self .K .name } * { self .name } _lim_zu*{ self .upper .name } '
1576+ if not self .no_lower :
1577+ self .y .e_str += f' + { self .K .name } * { self .name } _lim_zl*{ self .lower .name } '
1578+ self .y .v_str += f' + { self .K .name } * { self .name } _lim_zl*{ self .lower .name } '
1579+
1580+ self .y .e_str += f' - { self .name } _y'
1581+
1582+
15211583class Piecewise (Block ):
15221584 """
15231585 Piecewise block. Outputs an algebraic variable `y`.
0 commit comments