diff --git a/UI/RightAreaWidget.py b/UI/RightAreaWidget.py index 42fe829..1eeae45 100644 --- a/UI/RightAreaWidget.py +++ b/UI/RightAreaWidget.py @@ -28,6 +28,7 @@ class RightAreaWidgets(QWidget): self.areaLineEditValue = [] self.qualityEditValueList = [] self.areaLabel = {} + self.qualityLabel = {} self.areaWidget = areaWidget self.devicesManange = self.areaWidget.devicesManange self.order = order @@ -116,15 +117,15 @@ class RightAreaWidgets(QWidget): areaLineEdit.setObjectName('areaLineEdit') areaLineEdit.setFixedSize(80, 33) - qualityLineEdit = SoftKeyBoardEdit('0') + qualityLineEdit = SoftKeyBoardEdit('80') qualityLineEdit.setObjectName('areaLineEdit') qualityLineEdit.setFixedSize(80, 33) - forceBtn = ForceButton(number = number, valueLabel=areaValueLabel, valueEdit=areaLineEdit, qualityValueLabel=qualityLabel, \ + forceBtn = ForceButton(number = number, valueLabel=areaValueLabel, valueEdit=areaLineEdit, qualityValueLabel=qualityValueLabel, \ qualityLineEdit=qualityLineEdit, btnName = '强制') forceBtn.clicked.connect(self.AIAOForceValues) - qualityBtn = ForceButton(number = number, valueLabel=areaValueLabel, valueEdit=areaLineEdit, qualityValueLabel=qualityLabel, \ + qualityBtn = ForceButton(number = number, valueLabel=areaValueLabel, valueEdit=areaLineEdit, qualityValueLabel=qualityValueLabel, \ qualityLineEdit=qualityLineEdit, btnName = '故障') qualityBtn.clicked.connect(lambda: self.AIAOForceValues(qualityValue = '0')) @@ -135,8 +136,10 @@ class RightAreaWidgets(QWidget): forceLayout.addWidget(qualityBtn,1,3,1,1) else: self.areaLabel[number] = areaValueLabel + self.qualityLabel[number] = qualityValueLabel self.areaLineEditValue.append(0) + self.qualityEditValueList.append(0) # if self.deviceName[-2:] + self.dataType in ['从站DI','主站DO']: # areaMessLabel.setObjectName('wirteDIDOareaMessLabel') @@ -157,7 +160,8 @@ class RightAreaWidgets(QWidget): # forceLayout.setSpacing(10) return forceLayout - def wirteAreaLineEditValue(self,dataTypeAndModel, number, value, qualityValue, valueLabel, qualityValueLabel): + def wirteAreaLineEditValue(self,dataTypeAndModel, number, value, qualityValue = None, valueLabel = None, \ + qualityValueLabel = None): if self.areaWidget.okBtnValue: QMessageBox.warning(self, '提示', '请先保存通道信息') return @@ -165,15 +169,27 @@ class RightAreaWidgets(QWidget): if dataTypeAndModel in ['主站AO','从站AI']: pattern = re.compile(r'^[+-]?(\d+(\.\d*)?|\.\d+)$') match = pattern.match(value) - match2 = pattern.match(qualityValue) - if not match or not match2: + hexPattern = re.compile(r'^(0x)?[0-9A-Fa-f]{1,2}$') + match2 = hexPattern.match(qualityValue) + if not match : QMessageBox.warning(self, '提示', '请输入数字。') - return + return None, None + if not match2: + QMessageBox.warning(self, '提示', '请输入0-FF') + return None, None else: - valueLabel.setText(str(float(value))) - qualityValueLabel.setText(str(float(qualityValue))) - self.areaLineEditValue[number] = float(value) - self.qualityEditValueList[number] = float(qualityValue) + hexValue = int(match2.group(0), 16) + # 检查值是否小于等于 255 + if hexValue > 255: + QMessageBox.warning(self, '提示', '请输入0-FF') + return None, None + else: + valueLabel.setText(str(float(value))) + qualityValueLabel.setText(str(qualityValue)) + self.areaLineEditValue[number] = float(value) + # print(self.areaLineEditValue,number, qualityValue ) + self.qualityEditValueList[number] = qualityValue + return self.areaLineEditValue , self.qualityEditValueList #返回值和质量位值 #判断输入值是否为0和1 @@ -188,7 +204,8 @@ class RightAreaWidgets(QWidget): # print(curIndex) if not self.force: device = self.devicesManange.getDevice(self.deviceName) - values = device.getAreaValues(curIndex) + values, qualityValueList = device.getAreaValues(curIndex) + # print(qualityValueList) # print(self.deviceName, curIndex, values) if len(values) > len(self.areaLabel): return @@ -204,6 +221,8 @@ class RightAreaWidgets(QWidget): self.areaLabel[index].setText(value) continue self.areaLabel[index].setText(str(value)) + for index, value in enumerate(qualityValueList): + self.qualityLabel[index].setText(str(value)) # print(self.areaLabel[index],values) @@ -218,11 +237,12 @@ class RightAreaWidgets(QWidget): qualityValue = '0' else: qualityValue = sender.qualityLineEdit.text() + # print(qualityValue) dataTypeAndModel = self.deviceName[-2:] + self.dataType curIndex = self.areaWidget.areaTabWidget.currentIndex() valueList, qualityValueList = self.wirteAreaLineEditValue(dataTypeAndModel=dataTypeAndModel, number=number, value=value, qualityValue=qualityValue, \ valueLabel=valueLabel, qualityValueLabel=qualityValueLabel ) - # print(valueList, curIndex) + # print(valueList, qualityValueList,222) if valueList is None: return else: diff --git a/model/ProjectModel/BlockManage.py b/model/ProjectModel/BlockManage.py index ec6aa99..f5d603c 100644 --- a/model/ProjectModel/BlockManage.py +++ b/model/ProjectModel/BlockManage.py @@ -138,7 +138,7 @@ class BlockManage(): # print(blkIndex, blkoffect, numBlk) for i in range(numBlk): blkEntryListIndex = blkoffect - 1 + i - print(blkEntryListIndex, entryTuples) + # print(blkEntryListIndex, entryTuples) blkPointerByte = struct.pack('>h', entryTuples[blkEntryListIndex][0]) numBlkParms = entryTuples[blkEntryListIndex][1] blkSlot = int(blkPointerByte[0]) diff --git a/model/ProjectModel/DeviceManage.py b/model/ProjectModel/DeviceManage.py index b77ae85..3d27394 100644 --- a/model/ProjectModel/DeviceManage.py +++ b/model/ProjectModel/DeviceManage.py @@ -19,6 +19,7 @@ class Area(): nums = 0 forceValue = [0] currentValue = [0] * nums + qualityValueList = [] def __init__(self): pass @@ -142,7 +143,7 @@ class Device(): # # print(id(self), self.inputAreas) # return self.inputAreas[index].currentValue # print(self.areas[index].currentValue) - return self.areas[index].currentValue + return self.areas[index].currentValue, self.areas[index].qualityValueList def getLength(self, nums, bytes): length = int(nums) * int(bytes) @@ -257,7 +258,7 @@ class DevicesManange(): if deviceName in devicesDict: return devicesDict[deviceName] - def writeAreas(self, deviceName, areaIndex, values): + def writeAreas(self, deviceName, areaIndex, values, qualityValueList = None): # print(values) bytes = b"" device = self.getDevice(deviceName) @@ -282,6 +283,7 @@ class DevicesManange(): # for area, value in zip(areas, values): area = device.areas[areaIndex] area.forceValue = values + area.qualityValueList = qualityValueList if area.type in ['DO', 'DI'] and device.type == 'PA': area.forceValue = values[8:] + values[:8] elif area.type in ['DO', 'DI'] and device.type == 'DP' and device.masterOrSlave == "主站": @@ -293,7 +295,8 @@ class DevicesManange(): # print(area.forceValue) if area.type in ["AI", "AO"]: # print(area.forceValue) - byte = floatToBytes(area.forceValue, area.bytes, order = area.order) + byte = floatToBytes(area.forceValue, area.bytes, order = area.order, qualityValueList = area.qualityValueList) + # print(type(byte)) elif area.type in ["DI", "DO"]: # if device.type == "PA" and device.masterOrSlave == "从站" and len(area.forceValue) == 16: byte = coilsToBytes([int(x) for x in area.forceValue], area.bytes) @@ -354,8 +357,12 @@ class DevicesManange(): byte = bytes[i:i+4] if len(byte) != 4: continue + qualityByte = hex(bytes[i+4]) + # print(qualityByte) # print(round(struct.unpack('!f', reorderBytes(byte, area.order))[0], 4)) area.currentValue[i] = round(struct.unpack('!f', reorderBytes(byte, area.order))[0], 4) + area.qualityValueList = [qualityByte] + # print(area.qualityValueList) # print(round(struct.unpack('!f', reorderBytes(byte, area.order))[0], 4)) elif area.type in ['DI', 'DO']: if device.masterOrSlave == '主站' and device.type == 'DP': diff --git a/protocol/ModBus/ByteOrder.py b/protocol/ModBus/ByteOrder.py index 91aae97..9266b1c 100644 --- a/protocol/ModBus/ByteOrder.py +++ b/protocol/ModBus/ByteOrder.py @@ -63,7 +63,7 @@ def bytesTOFloat(value, order): return BADCToFloat(value) -def floatToBytes(values, length, order): +def floatToBytes(values, length, order, qualityValueList = None): # 判断order是否为ABCD或BADC # order = '>' if order in ['ABCD', 'BADC'] else '<' # hOrder = '<'if order.byte in ['ABCD', 'DCBA'] else '>' @@ -72,7 +72,18 @@ def floatToBytes(values, length, order): # print(values,valuesNums,6666) # 将values转换为字节流 valueByte = struct.pack(f"!{'f' * valuesNums}", *values) - valueByte = reorderBytes(valueByte, format = order) + struct.pack('B' * (length - valuesNums * 4), *[0] * (length - valuesNums * 4)) + if qualityValueList: + # print(qualityValueList[0]) + intValue = int(str(qualityValueList[0]), 16) + # print(intValue) + # 将整数转换为字节对象 + qualityByte = struct.pack('B', intValue) + # qualityByte = struct.pack('B' * (length - valuesNums * 4), *[0] * (length - valuesNums * 4)) + else: + qualityByte = b'\x80' + valueByte = reorderBytes(valueByte, format = order) + qualityByte + # print(valueByte, 12345) + # valueByte = reorderBytes(valueByte, format = order) + struct.pack('B' * (length - valuesNums * 4), *[0] * (length - valuesNums * 4)) # {'B' * (length - 4 * valuesNums) *[0] * (length - 4 * valuesNums) # print(valueByte) # 返回转换后的字节流