import unittest from ctypes import * from ctypes import cdll import matplotlib.pyplot as plt import threading case_count = 0 class LimitedArray: def __init__(self, capacity): self.capacity = capacity self.array = [] def append(self, element): if len(self.array) >= self.capacity: self.array.pop(0) self.array.append(element) class TestPIDCases(unittest.TestCase): # 给定一个X轴和Y轴的参数列表,用作后面承载数据 max_point = 50 obsX = LimitedArray(max_point) obsY = LimitedArray(max_point) @classmethod def setUpClass(cls) -> None: cls.dll = cdll.LoadLibrary('./epm.dll') print('[TestPIDCases] PID模块开始测试...') print('----------------------------------------------------') pass @classmethod def tearDownClass(cls) -> None: print('[TestPIDCases] 结束测试,测试用例%d个' % case_count) print('----------------------------------------------------') pass def setUp(self) -> None: global case_count case_count += 1 P= c_float(0.2) I= c_float(0.4) D= c_float(0.02) self.dll.pid_controller_init(P,I,D) pass def tearDown(self) -> None: # print("\r") pass # def testPID0(self): # print('PID 0') # dst = 500 # src = 200 # setpoint = c_float(dst) # process_variable = c_float(src) # self.dll.pid_position_control.restype = c_float # for i in range(100): # # 往列表插入展示的点的坐标 # self.obsX.append(i) # process_variable = self.dll.pid_position_control(setpoint, process_variable) # print(process_variable) # if process_variable<0: # process_variable = 0 # self.obsY.append(process_variable) # process_variable = c_float(process_variable) # plt.clf() # 清除之前画的图 # plt.plot(self.obsX.array,self.obsY.array,c="blue",lw=4) # 画出当前 ax 列表和 ay 列表中的值的图形 # plt.ylim(0, 1000) # 设置y轴的范围 # plt.axhline(dst, 0, 100,c="r",ls='--',lw=1)#横线 # plt.pause(1/1000) # plt.ion() # 开启一个画图的窗口 # plt.pause(3) # pass if __name__ == '__main__': unittest.main()