|
|
|
@ -3,8 +3,11 @@ import json
|
|
|
|
|
from utils.DBModels.DeviceModels import DeviceDB
|
|
|
|
|
from model.ProjectModel.AreaManage import Area
|
|
|
|
|
import numpy as np
|
|
|
|
|
from protocol.ModBus.ByteOrder import *
|
|
|
|
|
import struct
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#从站 "AI" "DI"可强制
|
|
|
|
|
#主站 "AO" "DO"可强制
|
|
|
|
|
class Device():
|
|
|
|
|
inputAreas = []
|
|
|
|
|
outputAreas = []
|
|
|
|
@ -25,6 +28,7 @@ class Device():
|
|
|
|
|
area.order = order
|
|
|
|
|
area.bytes = bytes
|
|
|
|
|
area.length = self.getLength(nums, bytes)
|
|
|
|
|
area.nums = nums
|
|
|
|
|
if type in ["AI", "DI"]:
|
|
|
|
|
area.startAddress = 0 if not self.inputEndAddress else self.inputEndAddress + 1
|
|
|
|
|
area.endAddress = area.startAddress + area.length
|
|
|
|
@ -88,8 +92,8 @@ class Device():
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def writeAreas(self):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def delAreas(self, deviceName, id):
|
|
|
|
@ -131,7 +135,7 @@ class DevicesManange():
|
|
|
|
|
def addDevice(self, proType, masterSlaveModel, deviceName):
|
|
|
|
|
device = Device()
|
|
|
|
|
device.type = proType
|
|
|
|
|
device.masterSlaveModel = masterSlaveModel
|
|
|
|
|
device.masterOrSlave = masterSlaveModel
|
|
|
|
|
device.deviceName = deviceName
|
|
|
|
|
masterSlaveModel = masterSlaveModel
|
|
|
|
|
|
|
|
|
@ -174,6 +178,40 @@ class DevicesManange():
|
|
|
|
|
if deviceName in devicesDict:
|
|
|
|
|
return devicesDict[deviceName]
|
|
|
|
|
|
|
|
|
|
def writeAreas(self, deviceName, values):
|
|
|
|
|
bytes = b""
|
|
|
|
|
device = self.getDevice(deviceName)
|
|
|
|
|
if device.type == "DP" and device.masterOrSlave == "主站":
|
|
|
|
|
curProDict = self.dpMasterDevices
|
|
|
|
|
areas = device.outputAreas
|
|
|
|
|
elif device.type == "DP" and device.masterOrSlave == "从站":
|
|
|
|
|
curProDict = self.dpSlaveDevices
|
|
|
|
|
areas = device.inputAreas
|
|
|
|
|
elif device.type == "PA" and device.masterOrSlave == "主站":
|
|
|
|
|
areas = device.outputAreas
|
|
|
|
|
curProDict = self.paMasterDevices
|
|
|
|
|
elif device.type == "PA" and device.masterOrSlave == "从站":
|
|
|
|
|
areas = device.inputAreas
|
|
|
|
|
curProDict = self.paSlaveDevices
|
|
|
|
|
|
|
|
|
|
for area, value in zip(areas, values):
|
|
|
|
|
area.forceValue = value
|
|
|
|
|
|
|
|
|
|
for device in curProDict.values():
|
|
|
|
|
forceAreas = device.outputAreas if device.masterOrSlave == "主站" else device.inputAreas
|
|
|
|
|
for area in forceAreas:
|
|
|
|
|
if area.type in ["AI", "AO"]:
|
|
|
|
|
byte = floatToBytes([area.forceValue], area.bytes, order = area.order)
|
|
|
|
|
elif area.type in ["DI", "DO"]:
|
|
|
|
|
byte = coilsToBytes([int(x) for x in [area.forceValue]], area.bytes)
|
|
|
|
|
order = '<'if order.byte in ['ABCD', 'DCBA'] else '>'
|
|
|
|
|
else:
|
|
|
|
|
if len(bytes) % 2 != 0:
|
|
|
|
|
bytes += struct.pack('b', 0)
|
|
|
|
|
|
|
|
|
|
values = struct.pack('')
|
|
|
|
|
print(len(bytes))
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def addAreas(self, type, order, bytes, deviceName):
|
|
|
|
|
if DeviceDB.getByName(deviceName=deviceName).areaJson is None:
|
|
|
|
|