Exemple #1
0
 def __init__(self, tool_id):
     self.tool_id = tool_id
     self.db = DBHelper()
     self.tool = None
     self.tool_type = None
     self.dimension_id = []
     self.dimension_name = []
Exemple #2
0
 def __init__(self, cutter_info_dict, tool_type):
     threading.Thread.__init__(self)
     self.cutter_info_dict = cutter_info_dict
     self.tool_type = tool_type
     self.last_electric = -1
     self.N_act = 0
     self.W_act = 0
     self.db = DBHelper()
Exemple #3
0
class DetectionPattern(threading.Thread):
    def __init__(self, cutter_info_dict, tool_type):
        threading.Thread.__init__(self)
        self.cutter_info_dict = cutter_info_dict
        self.tool_type = tool_type
        self.last_electric = -1
        self.N_act = 0
        self.W_act = 0
        self.db = DBHelper()

    def run(self):
        load_data = self.db.get_one(["WUp", "WLow", "DUp", "NLimit"],
                                    cutter_load, {"ToolType": self.tool_type})
        w_up = load_data[0]
        w_low = load_data[1]
        D_up = load_data[2]
        n_limit = load_data[3]
        while True:
            if self.cutter_info_dict[self.tool_type]:
                cutter_info_list = self.get_one_data()
                print("get data :", cutter_info_list)
                # 主轴停止旋转
                if cutter_info_list[3] == 0:
                    # 刀具断刀
                    if self.W_act < w_low:
                        self.db.update(cutter_load, {"TippingAlarm": 1})
                        print("刀具断刀")
                        break
                    self.del_data_vessel()
                    print("运行正常")
                    break
                if self.last_electric == -1:
                    self.last_electric = cutter_info_list[2]
                    continue
                dP = math.fabs(cutter_info_list[2] - self.last_electric)
                self.W_act += cutter_info_list[2] * sampling_period
                if dP > D_up:
                    self.N_act += 1
                #刀具磨损
                if self.W_act > w_up:
                    self.db.update(cutter_load, {"WearWarning": 1})
                    print("刀具磨损")
                    self.del_data_vessel()
                    break
                #刀具崩刃
                if self.N_act > n_limit:
                    self.db.update(cutter_load, {"CuttingAlarm": 1})
                    print("刀具崩刃")
                    self.del_data_vessel()
                    break

    # queue队列中取数据
    def get_one_data(self):
        return self.cutter_info_dict[self.tool_type].get()

    # 检测结束时删除对应缓存抓取到的刀具数据的字典的键值对
    def del_data_vessel(self):
        del self.cutter_info_dict[self.tool_type]
Exemple #4
0
class Compensation:
    def __init__(self, tool_id):
        self.tool_id = tool_id
        self.db = DBHelper()
        self.tool = None
        self.tool_type = None
        self.dimension_id = []
        self.dimension_name = []

    def get_compensation(self, for_now):
        self.tool = self.db.get_some(['*'], config.cutter_compensation_table,
                                     {"tool_id": 1})
        self.tool_type = self.tool[0][1]
        self.dimension_id = config.tools[self.tool_type - 1]["Dimension_id"]
        self.dimension_name = config.tools[self.tool_type - 1]["name"]
        result = []
        for i in range(len(self.dimension_id)):
            for j in self.dimension_name[i]:
                sql="select * from {cutter}" \
                    " INNER JOIN {derection} " \
                    "ON {cutter}.component_id={derection}.component_id " \
                    "where {cutter}.tool_type={tool_type} " \
                    "AND {derection}.dimension_id='{dimension_id}' " \
                    "AND {derection}.name='{dimension_name}'".format(cutter=config.cutter_compensation_table,derection=config.derection_result,tool_type=self.tool_type,dimension_id=self.dimension_id[i],dimension_name=j)
                result = pd.read_sql(sql, self.db.con())
        sample_feature = ['machine_time']
        sample_output = ['compensation_value']
        LR = RidgeR(sample_feature, sample_output)
        LR.train(result)
        print("MSE:", LR.evaluation_model())
        LR.draw()
        LR.output_model_params()
        return LR.predict(for_now)

    def set_compensation(self, tool_id):
        r = redis.Redis(host='127.0.0.1', port=6379)
        r.lpush("set_compensation", tool_id)

    def __del__(self):
        self.db.close_db()
Exemple #5
0
    def __init__(self, sample_feature, sample_output, condition_dict=None):
        """
        :param sample_feature: 样本特征 list
        :param sample_output: 样本输出 list
        :param condition_dict: 数据库查询条件 dict
        """
        self.db = DBHelper()
        self.sample_feature = sample_feature
        self.sample_out = sample_output
        self.condition_dict = condition_dict
        self.field = ",".join(sample_feature + sample_output)

        from config import cutter_compensation_table
        #需要学习的表的name
        self.table = cutter_compensation_table

        # 构造不同的lambda值
        Lambdas = np.logspace(-5, 2, 200)
        self.ridge_cv = RidgeCV(alphas=Lambdas,
                                normalize=True,
                                scoring='neg_mean_squared_error',
                                cv=10)
Exemple #6
0
from config import cutter_compensation_table
from DBController.DBHelper import DBHelper
import time
from compensation.CompensationFunc import Compensation

db = DBHelper()

while True:
    wait_for_learn = db.get_some(["*"], cutter_compensation_table,
                                 {"IsRead": 0})

    if wait_for_learn:
        for i in wait_for_learn:
            db.update(cutter_compensation_table, {"IsRead": 1}, {"id": i[0]})
            compensation = Compensation(i[2])
            compensation_value = compensation.get_compensation(i[4])
            compensation.set_compensation(compensation_value)
    time.sleep(1)
Exemple #7
0
class RidgeR:
    def __init__(self, sample_feature, sample_output, condition_dict=None):
        """
        :param sample_feature: 样本特征 list
        :param sample_output: 样本输出 list
        :param condition_dict: 数据库查询条件 dict
        """
        self.db = DBHelper()
        self.sample_feature = sample_feature
        self.sample_out = sample_output
        self.condition_dict = condition_dict
        self.field = ",".join(sample_feature + sample_output)

        from config import cutter_compensation_table
        #需要学习的表的name
        self.table = cutter_compensation_table

        # 构造不同的lambda值
        Lambdas = np.logspace(-5, 2, 200)
        self.ridge_cv = RidgeCV(alphas=Lambdas,
                                normalize=True,
                                scoring='neg_mean_squared_error',
                                cv=10)

    def train(self, result):
        '''
        训练模型
        :param result:
        :return:
        '''
        self.result = result
        x = result[self.sample_feature]
        y = result[self.sample_out]
        #划分数据集
        self.x_train, self.x_test, self.y_train, self.y_test = train_test_split(
            x, y, test_size=0.2, random_state=0)
        # #标准化
        # self.transfer=StandardScaler()
        # self.x_train=self.transfer.fit_transform(self.x_train)
        # self.x_test=self.transfer.transform(self.x_test)

        # 对交叉验证模型传入输入数据和输出数据
        self.ridge_cv.fit(self.x_train, self.y_train)
        # 基于最佳lambda值建模
        self.estimator = Ridge(alpha=self.ridge_cv.alpha_)
        self.estimator.fit(self.x_train, self.y_train)

    def output_model_params(self):
        '''
        打印训练后模型的权重系数和偏置
        :return:
        '''
        print("岭回归-权重系数为:", self.estimator.coef_)
        print("岭回归-偏置为:", self.estimator.intercept_)

    def predict(self, input_list):
        """
        输入特征预测结果
        :param input_list: 特征值 list
        :return: 预测值
        """
        input_list = pd.DataFrame(input_list)
        # 标准化时使用这条
        # input_list=self.transfer.transform(input_list)
        result = self.estimator.predict((input_list))
        return result

    def draw(self):
        x = np.arange(0, 2000, 7)
        y = self.estimator.coef_[0][0] * x + self.estimator.intercept_[0]
        plt.plot(x, y)
        a = self.result[self.sample_feature]
        b = self.result[self.sample_out]
        plt.scatter(a, b)
        plt.show()

    def evaluation_model(self):
        '''
        模型评估
        :return: 均方误差
        '''
        y_pred = self.estimator.predict(self.x_test)
        #均方误差
        MSE = metrics.mean_squared_error(self.y_test, y_pred)
        return MSE

    def __del__(self):
        self.db.close_db()
Exemple #8
0
class LearnPattern(threading.Thread):
    def __init__(self,cutter_info_dict,tool_type):
        threading.Thread.__init__(self)
        self.cutter_info_dict=cutter_info_dict
        self.tool_type=tool_type
        self.W_act=0
        self.max_dP=0
        self.last_electric=-1
        self.db=DBHelper()
        self.n_limit=0

    def run(self):
        while(True):
            if self.cutter_info_dict[self.tool_type]:
                self.data=self.db.get_one(["*"],cutter_load,{"ToolType":self.tool_type})
                self.cutter_info_list = self.get_one_data()
                print("get data :",self.cutter_info_list)
                #已学习过第一次
                if self.data:
                    if self.learn_nlimit()==1:
                        self.del_data_vessel()
                        break
                #第一次学习
                else:
                    if self.learn_wup_wlow_dup()==1:
                        self.del_data_vessel()
                        break

    #计算能耗积分和导数上限
    def compute_wact_maxdp(self):
        # self.cutter_info_list = self.get_one_data()
        if self.last_electric == -1:
            self.last_electric = self.cutter_info_list[2]
            return
        self.W_act += self.cutter_info_list[2] * sampling_period
        dP = math.fabs(self.cutter_info_list[2] - self.last_electric)
        self.last_electric = self.cutter_info_list[2]
        if dP > self.max_dP:
            self.max_dP = dP

    #第一次学习得到能耗上限、能耗下限、导数上限
    def learn_wup_wlow_dup(self):
        # 主轴停止旋转
        if self.cutter_info_list[3] == 0:
            W_up = self.W_act * up_ratio
            W_low = self.W_act * low_ratio
            D_up = self.max_dP * dp_ratio
            self.db.insert(cutter_load, {"ToolType": self.tool_type, "WUp": W_up, "WLow": W_low, "DUp": D_up})
            return 1
        self.compute_wact_maxdp()
        return 0

    #第二次学习通过上一次学习得出的导数上限和当前每次导数比较,得出导数超限次数
    def learn_nlimit(self):
        # 主轴停止旋转
        if self.cutter_info_list[3] == 0:
            self.db.update(cutter_load, {"Learned": 1, "Nlimit": self.n_limit})
            return 1
        # cutter_info_list = self.get_one_data()
        if self.last_electric == -1:
            self.last_electric = self.cutter_info_list[2]
            return 0
        dP = math.fabs(self.cutter_info_list[2] - self.last_electric)
        if dP > self.data[5]:
            print(dP,self.data[5])
            self.n_limit += 1
        return 0

    #queue队列中取数据
    def get_one_data(self):
        return self.cutter_info_dict[self.tool_type].get()

    #学习结束时删除对应缓存抓取到的刀具数据的字典的键值对
    def del_data_vessel(self):
        del self.cutter_info_dict[self.tool_type]
Exemple #9
0
import time
from DBController.DBHelper import DBHelper
from config import cutter_detection_table, cutter_load
from detection.CutterLearn import LearnPattern
from detection.BreakageDetection import DetectionPattern
import queue

cutter_info_dict = {}

while (True):
    db = DBHelper()
    field_list = [
        "ToolId", "ToolType", "SpindleElectric", "SpindleSpeed", "id"
    ]
    wait_for_learn = db.get_some(field_list, cutter_detection_table,
                                 {"IsRead": 0})
    if wait_for_learn:
        for i in wait_for_learn:
            #刀具没有开始使用的状态(不做记录)
            if i[3] == 0:
                if i[1] not in cutter_info_dict:
                    continue
            print("暂未放入queue的数据ToolType:", i[1])
            if i[1] in cutter_info_dict:
                print("放入queue数据:", i)
                #往对应的字典键对应的列表增加数据,供线程学习或监测
                cutter_info_dict[i[1]].put(list(i))
            else:
                #开始学习或检测
                cutter_info_dict[i[1]] = queue.Queue()
                is_learn_data = db.get_one(['Learned'], cutter_load,