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.
157 lines
5.6 KiB
Python
157 lines
5.6 KiB
Python
2 years 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.rtuslave_example import RTUSlave
|
||
|
from protocol.Celery.MBRTUSlave 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, RTUSetting
|
||
|
from model.ProjectModel.VarManage import ModbusVarManage
|
||
|
|
||
|
|
||
|
class ModBusRTUSTask(ModBusTCPSTask):
|
||
|
_RtuSlave = None
|
||
|
_setting = None
|
||
|
_offset = None
|
||
|
def __init__(self):
|
||
|
super(ModBusRTUSTask, self).__init__()
|
||
|
|
||
|
@property
|
||
|
def rtuSlave(self):
|
||
|
if self._RtuSlave 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._RtuSlave = RTUSlave(port = port, baudrate = baudrate, bytesize = bytesize, parity = parity, stopbits = stopbits, xonxoff=0)
|
||
|
self._RtuSlave.start()
|
||
|
return self._RtuSlave
|
||
|
|
||
|
@property
|
||
|
def tcpSlave(self):
|
||
|
return
|
||
|
|
||
|
|
||
|
@property
|
||
|
def setting(self):
|
||
|
if self._setting is None:
|
||
|
self.cursor.execute("select * from RTUSetting")
|
||
|
allCon = self.cursor.fetchall()
|
||
|
|
||
|
port = str(allCon[0][1])
|
||
|
bytesize = int(allCon[0][2])
|
||
|
baudrate = int(allCon[0][3])
|
||
|
stopbits = int(allCon[0][4])
|
||
|
parity = str(allCon[0][5].split(' ')[0])
|
||
|
offset = int(allCon[0][-1])
|
||
|
self._setting = [port, bytesize, baudrate, stopbits, parity, offset]
|
||
|
return self._setting
|
||
|
|
||
|
@property
|
||
|
def offset(self):
|
||
|
if self._offset is None:
|
||
|
offset = self.setting[-1]
|
||
|
self._offset = offset
|
||
|
return self._offset
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
@app.task(base = ModBusRTUSTask, 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]
|
||
|
try:
|
||
|
self.rtuSlave.server.get_slave(slaveId)
|
||
|
except:
|
||
|
self.rtuSlave.addSlave(slaveId)
|
||
|
# print(varType)
|
||
|
if varType == '4':
|
||
|
# varDict[name] = RTUModbus.readHoldingRegisters(slaveId = slaveId, startAddress = address, varNums = 1)
|
||
|
curValue = self.rtuSlave.readValue(slaveId, '4', address, order = order)
|
||
|
elif varType == '3':
|
||
|
curValue = self.rtuSlave.readValue(slaveId, '3', address, order = order)
|
||
|
# curValue = RTUModbus.readInputRegisters(slaveId = slaveId, startAddress = address, varNums = 1)
|
||
|
elif varType == '0':
|
||
|
curValue = self.rtuSlave.readValue(slaveId, '0', address, order = order)
|
||
|
# curValue = RTUModbus.readCoils(slaveId = slaveId, startAddress = address, varNums = 1)
|
||
|
elif varType == '1':
|
||
|
curValue = self.rtuSlave.readValue(slaveId, '1', address, 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])
|
||
|
if '.' in value:
|
||
|
value = float(value.split(',')[1])
|
||
|
else:
|
||
|
value = int(value.split(',')[1])
|
||
|
if address == address2:
|
||
|
self.rtuSlave.setValue(slaveId, varType, address, value, order = order)
|
||
|
app.backend.set(name, '')
|
||
|
except Exception as e:
|
||
|
print(e)
|
||
|
# varDict[name] = RTUModbus.readInputCoils(slaveId = slaveId, startAddress = address, varNums = 1)
|
||
|
|
||
|
app.backend.set('ModBus', str(self.request.id))
|
||
|
# print(RTUModbus.readInputRegisters(slaveId = 2, startAddress = 0, varNums = 10))
|
||
|
|
||
|
# print(RTUModbus.readCoils(slaveId = 3, startAddress = 0, varNums = 10))
|
||
|
|
||
|
# print(RTUModbus.readInputCoils(slaveId = 4, startAddress = 0, varNums = 10))
|
||
|
# print(varDict)
|
||
|
return varDict
|
||
|
|
||
|
|
||
|
@shared_task(base = ModBusRTUSTask, bind = True, priority = 1)
|
||
|
def setValue(self, name, varType, slaveID, address, value): # 写入变量
|
||
|
# print(id(self.rtuSlave))
|
||
|
slaveID = int(slaveID)
|
||
|
address = int(address) - self.offset
|
||
|
# self.rtuSlave.setValue(slaveId, varType, address, value)
|
||
|
app.backend.set(name, str(address) + ',' + str(value))
|
||
|
# if varType == '1':
|
||
|
# RTUModbus.writeSingleRegister(slaveId = slaveID, address = address, outputValue = value)
|
||
|
# elif varType == '3':
|
||
|
# RTUModbus.writeSingleCoil(slaveId = slaveID, address = address, outputValue = value)
|
||
|
# else:
|
||
|
# return '错误的变量类型'
|
||
|
return 'success'
|