You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
4.7 KiB
Python

7 months ago
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'