0911更新

main
“zcw” 2 years ago
parent 6f0a3d75a0
commit f68909be12

@ -96,7 +96,7 @@ class AreaTabWidget(QMainWindow):
areas = json.loads(areas) areas = json.loads(areas)
area = areas[index] area = areas[index]
type = area["type"] type = area["type"]
print(area, type,'ssss') # print(area, type,'ssss')
if index != -1: if index != -1:
@ -110,7 +110,7 @@ class AreaTabWidget(QMainWindow):
def addAreaWidget(self, widgetList, loacl = True, init = False): def addAreaWidget(self, widgetList, loacl = True, init = False):
dataType = widgetList[0].currentText() dataType = widgetList[0].currentText()
print(widgetList) # print(widgetList)
order = self.dataTypeTranslate(widgetList[1].currentText()) order = self.dataTypeTranslate(widgetList[1].currentText())
byteLineEdit = widgetList[2].text() byteLineEdit = widgetList[2].text()
areaLayout = widgetList[3] areaLayout = widgetList[3]
@ -226,7 +226,7 @@ class AreaTabWidget(QMainWindow):
return self.dataTypeDict[order] return self.dataTypeDict[order]
def wirteValue(self, editBtn): def wirteValue(self, editBtn):
# deviceName = self.areaTabWidget.parent().parent().parent().parent().parent().windowTitle() deviceName = self.areaTabWidget.parent().parent().parent().parent().parent().windowTitle()
# index = self.areaTabWidget.currentIndex() # index = self.areaTabWidget.currentIndex()
valueList = [] valueList = []
@ -237,7 +237,8 @@ class AreaTabWidget(QMainWindow):
widgetList[0].setText(widgetList[1].text()) widgetList[0].setText(widgetList[1].text())
if isinstance(widgetList[1], QLineEdit): if isinstance(widgetList[1], QLineEdit):
valueList.append(int(widgetList[1].text())) valueList.append(float(widgetList[1].text()))
self.mainwindow.devicesManange.writeAreas(deviceName = deviceName, values = valueList)

@ -19,6 +19,8 @@ class Area():
type = None type = None
addressList = [] addressList = []
order = 'ABCD' order = 'ABCD'
nums = None
forceValue = 0
def __init__(self): def __init__(self):
pass pass

@ -3,8 +3,11 @@ import json
from utils.DBModels.DeviceModels import DeviceDB from utils.DBModels.DeviceModels import DeviceDB
from model.ProjectModel.AreaManage import Area from model.ProjectModel.AreaManage import Area
import numpy as np import numpy as np
from protocol.ModBus.ByteOrder import *
import struct
#从站 "AI" "DI"可强制
#主站 "AO" "DO"可强制
class Device(): class Device():
inputAreas = [] inputAreas = []
outputAreas = [] outputAreas = []
@ -25,6 +28,7 @@ class Device():
area.order = order area.order = order
area.bytes = bytes area.bytes = bytes
area.length = self.getLength(nums, bytes) area.length = self.getLength(nums, bytes)
area.nums = nums
if type in ["AI", "DI"]: if type in ["AI", "DI"]:
area.startAddress = 0 if not self.inputEndAddress else self.inputEndAddress + 1 area.startAddress = 0 if not self.inputEndAddress else self.inputEndAddress + 1
area.endAddress = area.startAddress + area.length area.endAddress = area.startAddress + area.length
@ -88,8 +92,8 @@ class Device():
def writeAreas(self):
pass
@classmethod @classmethod
def delAreas(self, deviceName, id): def delAreas(self, deviceName, id):
@ -131,7 +135,7 @@ class DevicesManange():
def addDevice(self, proType, masterSlaveModel, deviceName): def addDevice(self, proType, masterSlaveModel, deviceName):
device = Device() device = Device()
device.type = proType device.type = proType
device.masterSlaveModel = masterSlaveModel device.masterOrSlave = masterSlaveModel
device.deviceName = deviceName device.deviceName = deviceName
masterSlaveModel = masterSlaveModel masterSlaveModel = masterSlaveModel
@ -174,6 +178,40 @@ class DevicesManange():
if deviceName in devicesDict: if deviceName in devicesDict:
return devicesDict[deviceName] 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 @classmethod
def addAreas(self, type, order, bytes, deviceName): def addAreas(self, type, order, bytes, deviceName):
if DeviceDB.getByName(deviceName=deviceName).areaJson is None: if DeviceDB.getByName(deviceName=deviceName).areaJson is None:

@ -1,5 +1,17 @@
import struct import struct
def reorderBytes(byteStream, format):
if format == 'ABCD':
return byteStream
elif format == 'DCBA':
return byteStream[::-1]
elif format == 'BADC':
return bytes([byteStream[1], byteStream[0], byteStream[3], byteStream[2]])
elif format == 'CDAB':
return bytes([byteStream[2], byteStream[3], byteStream[0], byteStream[1]])
else:
raise ValueError("Invalid format")
# 大端模式 # 大端模式
def floatToABCD(value): def floatToABCD(value):
valueByte = struct.unpack('>HH',struct.pack('>f', value)) valueByte = struct.unpack('>HH',struct.pack('>f', value))
@ -38,3 +50,33 @@ def BADCToFloat(value):
def CDABToFloat(value): def CDABToFloat(value):
valueByte = struct.unpack('<f', struct.pack('<HH', value[0], value[1])) valueByte = struct.unpack('<f', struct.pack('<HH', value[0], value[1]))
return valueByte[0] return valueByte[0]
def floatToBytes(values, length, order):
# 判断order是否为ABCD或BADC
# order = '>' if order in ['ABCD', 'BADC'] else '<'
# hOrder = '<'if order.byte in ['ABCD', 'DCBA'] else '>'
# 获取values的长度
valuesNums = len(values)
# 将values转换为字节流
valueByte = struct.pack(f"!{'f' * valuesNums}", *values)
valueByte = reorderBytes(valueByte, format = order)
print(ABCDToFloat(struct.unpack('!HH', valueByte)))
# {'B' * (length - 4 * valuesNums) *[0] * (length - 4 * valuesNums)
# 返回转换后的字节流
# return valueByte
def coilsToBytes(values, length):
decimalNumbers = []
binaryNumber = ''.join([str(x) for x in list(reversed(values))])
zeroNeeded = 0 if len(binaryNumber) % 8 == 0 else 8 - (len(binaryNumber) % 8)
binaryNumber = '0' * zeroNeeded + binaryNumber
for i in range(0, len(binaryNumber), 8):
eightValues = binaryNumber[i:i+8]
decimalNumbers.append(int(eightValues, 2))
valueByte = struct.pack("B" * length, *decimalNumbers, *[0] * (length - len(decimalNumbers)))
return valueByte
# print(coilsToBytes([1] * 2, 3))
floatToBytes([3.14], 5, 'ABCD')

Loading…
Cancel
Save