from celery import Task import os import sys import sqlite3 from peewee import * sys.path.append('../../../') sys.path.append('../') from protocol.ModBus.tcpmaster_example import TcpMaster from protocol.Celery.MBTCPMaster import app from protocol.Celery.MBTCPSlave.MBTCPSTask import ModBusTCPSTask from utils.DBModels.BaseModel import * from utils.DBModels.ProjectBaseModel import * from utils.DBModels.ClientModels import ClientDB from utils.DBModels.ProtocolModel import ModBusVar, TCPSetting from model.ProjectModel.VarManage import ModbusVarManage class ModBusTCPMTask(ModBusTCPSTask): _TCPMaster = None def __init__(self): super(ModBusTCPMTask, self).__init__() @property def tcpSlave(self): return @property def TcpModbus(self): if self._TCPMaster is None: address = self.setting[0] port = self.setting[1] self._TCPMaster = TcpMaster(host = address, port = port) return self._TCPMaster @app.task(base = ModBusTCPMTask, bind = True, priority = 5) def readValues(self): # 读取变量 # [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 = self.TcpModbus.readCoils(slaveId = slaveId, startAddress = address, varNums = 1) elif varType == '1': curValue = self.TcpModbus.readInputCoils(slaveId = slaveId, startAddress = address, varNums = 1) elif varType == '3': curValue = self.TcpModbus.readInputRegisters(slaveId = slaveId, startAddress = address, varNums = 1, order = order) elif varType == '4': curValue = self.TcpModbus.readHoldingRegisters(slaveId = slaveId, startAddress = address, varNums = 1, order = order) if curValue != 'error': self.influxDB.writeFun(str(name), curValue) varDict[name] = curValue app.backend.set('ModBus', str(self.request.id)) # print(self.TcpModbus.readInputRegisters(slaveId = 2, startAddress = 0, varNums = 10)) # print(self.TcpModbus.readCoils(slaveId = 3, startAddress = 0, varNums = 10)) # print(self.TcpModbus.readInputCoils(slaveId = 4, startAddress = 0, varNums = 10)) return varDict @app.task(base = ModBusTCPMTask, bind = True, priority = 1) def setValue(self, name, varType, slaveID, address, value, order): # 写入变量 slaveID = int(slaveID) address = int(address) - self.offset varType = str(varType) # print(address, 555555555555555555) if varType == '4': self.TcpModbus.writeSingleRegister(slaveId = slaveID, address = address, outputValue = value, order = order) elif varType == '0': self.TcpModbus.writeSingleCoil(slaveId = slaveID, address = address, outputValue = value) else: return '错误的变量类型' return 'success2'