|  | @@ -0,0 +1,84 @@
 | 
	
		
			
				|  |  | +import random
 | 
	
		
			
				|  |  | +from enum import Enum
 | 
	
		
			
				|  |  | +from math import fabs
 | 
	
		
			
				|  |  | +import matplotlib.pyplot as plt
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class Hyst(Enum):
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    HYST_IDLE   = 0
 | 
	
		
			
				|  |  | +    HYST_UP     = 1
 | 
	
		
			
				|  |  | +    HYST_DOWN   = 2
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +hyst_high_state = Hyst.HYST_IDLE.name
 | 
	
		
			
				|  |  | +hyst_low_state = Hyst.HYST_IDLE.name
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def grapth():
 | 
	
		
			
				|  |  | +    hyst_high_limit = 6.0
 | 
	
		
			
				|  |  | +    hyst_low_limit = 1.0
 | 
	
		
			
				|  |  | +    x = []
 | 
	
		
			
				|  |  | +    in_data = []
 | 
	
		
			
				|  |  | +    hyst_high = []    
 | 
	
		
			
				|  |  | +    hyst_low = []    
 | 
	
		
			
				|  |  | +    hyst_value_low = []
 | 
	
		
			
				|  |  | +    hyst_value_high = []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    for i in range(200):
 | 
	
		
			
				|  |  | +        x.append(i)
 | 
	
		
			
				|  |  | +        in_data.append(random.uniform(0.0, 7.0))
 | 
	
		
			
				|  |  | +        hyst_high.append(hyst_high_limit)
 | 
	
		
			
				|  |  | +        hyst_low.append(hyst_low_limit)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        hyst_value_low.append(trig_low_value(in_data[i], hyst_low_limit, 1.5))
 | 
	
		
			
				|  |  | +        hyst_value_high.append(trig_high_value(in_data[i], hyst_high_limit, 1.5))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    plt.plot(x, in_data, x, hyst_high, x, hyst_low, x, hyst_value_low, x, hyst_value_high)
 | 
	
		
			
				|  |  | +    plt.title('Тестовые данные для гистерезиса')
 | 
	
		
			
				|  |  | +    plt.xlabel('X')
 | 
	
		
			
				|  |  | +    plt.ylabel('Y')
 | 
	
		
			
				|  |  | +    plt.show()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def trig_low_value(value: float, lowlevel: float, hyst: float):
 | 
	
		
			
				|  |  | +    global hyst_low_state
 | 
	
		
			
				|  |  | +    if hyst_low_state == Hyst.HYST_IDLE.name:
 | 
	
		
			
				|  |  | +        if value <= lowlevel:
 | 
	
		
			
				|  |  | +            hyst_low_state = Hyst.HYST_DOWN.name
 | 
	
		
			
				|  |  | +            return True
 | 
	
		
			
				|  |  | +        else:
 | 
	
		
			
				|  |  | +            return False
 | 
	
		
			
				|  |  | +    elif hyst_low_state == Hyst.HYST_DOWN.name:
 | 
	
		
			
				|  |  | +        if value > (lowlevel + fabs(hyst)):
 | 
	
		
			
				|  |  | +            hyst_low_state = Hyst.HYST_IDLE.name
 | 
	
		
			
				|  |  | +            return False
 | 
	
		
			
				|  |  | +        else:
 | 
	
		
			
				|  |  | +            return True
 | 
	
		
			
				|  |  | +    return False
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def trig_high_value(value: float, highlevel: float, hyst: float):
 | 
	
		
			
				|  |  | +    global hyst_high_state
 | 
	
		
			
				|  |  | +    if hyst_high_state == Hyst.HYST_IDLE.name:
 | 
	
		
			
				|  |  | +        if value >= highlevel:
 | 
	
		
			
				|  |  | +            hyst_high_state = Hyst.HYST_UP.name
 | 
	
		
			
				|  |  | +            return True
 | 
	
		
			
				|  |  | +        else:
 | 
	
		
			
				|  |  | +            return False
 | 
	
		
			
				|  |  | +    elif hyst_high_state == Hyst.HYST_UP.name:
 | 
	
		
			
				|  |  | +        if value < (highlevel - fabs(hyst)):
 | 
	
		
			
				|  |  | +            hyst_high_state = Hyst.HYST_IDLE.name
 | 
	
		
			
				|  |  | +            return False
 | 
	
		
			
				|  |  | +        else:
 | 
	
		
			
				|  |  | +            return True
 | 
	
		
			
				|  |  | +    return False
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def main():
 | 
	
		
			
				|  |  | +    grapth()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +if __name__ == '__main__':
 | 
	
		
			
				|  |  | +    main()
 |