from celery import Task, shared_task import os import sys import pickle import time import sqlite3 from peewee import * sys.path.append('../../../') sys.path.append('../') from protocol.ModBus.rtumaster_example import RTUMaster from protocol.Celery.MBRTUMaster import app from utils.DBModels.BaseModel import * from utils.DBModels.ProjectBaseModel import * from protocol.Celery.MBRTUSlave.MBRTUSTask import ModBusRTUSTask from utils.DBModels.ClientModels import ClientDB from utils.DBModels.ProtocolModel import ModBusVar from model.ProjectModel.VarManage import ModbusVarManage class ModBusRTUMTask(ModBusRTUSTask): _RTUMaster = None _cursor = None _dbPath = None _setting = None _offset = None def __init__(self): super(ModBusRTUMTask, self).__init__() @property def rtuSlave(self): return @property def rtuMaster(self): if self._RTUMaster is None: port = str(self.setting[0]) bytesize = int(self.setting[1]) baudrate = int(self.setting[2]) stopbits = int(self.setting[3]) parity = str(self.setting[4].split(' ')[0]) self._RTUMaster = RTUMaster(port = port, baudrate = baudrate, bytesize = bytesize, parity = parity, stopbits = stopbits, xonxoff=0) return self._RTUMaster @shared_task(base = ModBusRTUMTask, bind = True, priority = 5) def readValues(self): # 读取变量 rtuMaster = self.rtuMaster # print(globals().keys(), 111111111111) # [var.id, var.varName, var.description, var.varType, var.slaveID, var.address, var.min, var.max] # varName = CharField() # varType = IntegerField() # createTime = CharField() # description = CharField() # address = CharField() # slaveID = CharField() # min = CharField() # max = CharField() # allVar = self.allVar self.cursor.execute("select * from ModBusVar") allVar = self.cursor.fetchall() varDict = {} if not allVar: return else: # print(allVar) for varMes in allVar: name = str(varMes[1]) varType = str(varMes[2]) slaveId = int(varMes[6]) address = int(varMes[5]) - self.offset order = varMes[-1] # print(varType) if varType == '0': curValue = rtuMaster.readCoils(slaveId = slaveId, startAddress = address, varNums = 1) elif varType == '1': curValue = rtuMaster.readInputCoils(slaveId = slaveId, startAddress = address, varNums = 1) elif varType == '3': curValue = rtuMaster.readInputRegisters(slaveId = slaveId, startAddress = address, varNums = 1, order = order) elif varType == '4': curValue = rtuMaster.readHoldingRegisters(slaveId = slaveId, startAddress = address, varNums = 1, order = order) if curValue != 'error': self.influxDB.writeFun(str(name), curValue) varDict[name] = curValue try: value = app.backend.get(name).decode('utf-8') address2 = int(value.split(',')[0]) value = value.split(',')[1] if '.' not in value: value = int(value) else: value = float(value) if address == address2: if varType == '4': rtuMaster.writeSingleRegister(slaveId = slaveId, address = address, outputValue = value, order = order) app.backend.set(name, '') elif varType == '0': rtuMaster.writeSingleCoil(slaveId = slaveId, address = address, outputValue = value) app.backend.set(name, '') # if '.' in value: # value = float(value.split(',')[1]) # else: # value = int(value) except Exception as e: print(e) app.backend.set('ModBus', str(self.request.id)) # print(rtuMaster.readInputRegisters(slaveId = 2, startAddress = 0, varNums = 10)) # print(rtuMaster.readCoils(slaveId = 3, startAddress = 0, varNums = 10)) # print(rtuMaster.readInputCoils(slaveId = 4, startAddress = 0, varNums = 10)) # print(varDict) return varDict @shared_task(base = ModBusRTUMTask, bind = True, priority = 1) def setValue(self, name, varType, slaveID, address, value, order): # 写入变量 # RTUModbus = RTUMaster(port = 'COM4', baudrate = 9600, bytesize = 8, parity = 'N', stopbits = 1, xonxoff=0) slaveID = int(slaveID) address = int(address) - self.offset varType = str(varType) app.backend.set(name, str(address) + ',' + str(value)) return 'success2'