1026更新

ModbusPack
zhangxuxutm 2 years ago
parent eb68ed846f
commit 4f32597f3d

5
.gitignore vendored

@ -14,6 +14,11 @@ o
*.code-workspace
*.json
*.spec
*.cmd
*.exe
*.api
Static/license.lic
.idea/.gitignore
/Static/influxDB/
/bin.build/
Static/InfluxDB.api

@ -611,13 +611,13 @@ QCheckBox#userBox::indicator{
QCheckBox#userBox::indicator:checked{
image: url(Static/checkoff.png);
image: url(:/static/checkoff.png);
}
QCheckBox#userBox::indicator:enabled:unchecked{
image: url(Static/checkon.png);
image: url(:/static/checkon.png);
}
@ -714,7 +714,7 @@ QComboBox#timeBox::drop-down{
QComboBox#setBox::drop-down, QComboBox#ProTypeBox::drop-down,QComboBox#TcRtdTypeBox::drop-down, QComboBox#ModbusTypeBox::drop-down, QComboBox#timeBox::drop-down{
image: url(Static/down.png);
image: url(:/static/down.png);
}
@ -806,3 +806,52 @@ QListView#trendListView::item{
margin-bottom: 10px;
}
QMessageBox {
background-color: #f0f0f0;
color: black;
font-size: 14px;
border: 1px solid #cccccc;
border-radius: 5px;
padding: 5px;
}
QMessageBox QLabel {
color: black;
font-size: 14px;
}
QMessageBox QPushButton {
background-color: #e0e0e0;
color: black;
font-size: 14px;
border: 1px solid #cccccc;
border-radius: 5px;
padding: 5px;
min-width: 5em;
}
QMessageBox QPushButton:hover {
background-color: #f5f5f5;
}
QMessageBox QPushButton:pressed {
background-color: #e5e5e5;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

@ -1,4 +1,5 @@
import sys
import time
# sys.setrecursionlimit(10000)
@ -20,7 +21,7 @@ from PyQt5.QtWinExtras import QtWin
from win32 import win32api, win32gui
from win32.lib import win32con
# from UI.VarManages.FFWidget import FFWidget
from UI.VarManages.FFWidget import FFWidget
from windoweffect import WindowEffect, MINMAXINFO, NCCALCSIZE_PARAMS
@ -29,9 +30,8 @@ from UI.Main.MainTop import MainTop
from ..ProjectManages.ProjectWidget import ProjectWidgets
from ..VarManages.VarWidget import VarWidgets
# HartWidgets, TcRtdWidgets, AnalogWidgets, FFSimulateWidgets, \
# HartSimulateWidgets
from ..VarManages.VarWidget import VarWidgets, HartWidgets, TcRtdWidgets, AnalogWidgets, FFSimulateWidgets, \
HartSimulateWidgets
from ..UserManage.UserWidget import UserWidgets
from ..TrendManage.TrendWidget import TrendWidgets
from ..Setting.RTUSetting import RTUSettingWidget
@ -116,22 +116,22 @@ class MainWindow(QMainWindow):
self.trendWidget = TrendWidgets()
self.TcpSettingWidget = TCPSettingWidget()
self.RtuSettingWidget = RTUSettingWidget()
# self.hartWidget = HartWidgets()
# self.tcrtdWidget = TcRtdWidgets()
# self.analogWidget = AnalogWidgets()
# self.ffWidget = FFWidget()
# self.ffsimulateWidget = FFSimulateWidgets()
# self.hartsimulateWidget = HartSimulateWidgets()
self.hartWidget = HartWidgets()
self.tcrtdWidget = TcRtdWidgets()
self.analogWidget = AnalogWidgets()
self.ffWidget = FFWidget()
self.ffsimulateWidget = FFSimulateWidgets()
self.hartsimulateWidget = HartSimulateWidgets()
self.userWidget.setObjectName('userWidget')
self.projectWidget.setObjectName('projectWidget')
self.trendWidget.setObjectName('trendWidget')
self.varWidget.setObjectName('varWidget')
# self.analogWidget.setObjectName('analogWidget')
# self.ffWidget.setObjectName('ffWidget')
# self.ffsimulateWidget.setObjectName('ffsimulateWidget')
# self.hartsimulateWidget.setObjectName('hartsimulateWidget')
self.analogWidget.setObjectName('analogWidget')
self.ffWidget.setObjectName('ffWidget')
self.ffsimulateWidget.setObjectName('ffsimulateWidget')
self.hartsimulateWidget.setObjectName('hartsimulateWidget')
self.rightWidget = QStackedWidget()
# self.rightWidget.setAttribute(Qt.WA_StyledBackground, True)
@ -142,19 +142,19 @@ class MainWindow(QMainWindow):
self.rightWidget.addWidget(self.userWidget)
self.rightWidget.addWidget(self.TcpSettingWidget)
self.rightWidget.addWidget(self.RtuSettingWidget)
# self.rightWidget.addWidget(self.hartWidget)
# self.rightWidget.addWidget(self.tcrtdWidget)
# self.rightWidget.addWidget(self.analogWidget)
# self.rightWidget.addWidget(self.ffWidget)
# self.rightWidget.addWidget(self.ffsimulateWidget)
# self.rightWidget.addWidget(self.hartsimulateWidget)
self.rightWidget.addWidget(self.hartWidget)
self.rightWidget.addWidget(self.tcrtdWidget)
self.rightWidget.addWidget(self.analogWidget)
self.rightWidget.addWidget(self.ffWidget)
self.rightWidget.addWidget(self.ffsimulateWidget)
self.rightWidget.addWidget(self.hartsimulateWidget)
self.rightWidget.widget(1)
self.leftWidget.createProject.clicked.connect(lambda: self.exButtonClicked(0))
self.leftWidget.varMag.clicked.connect(self.varShow)
self.leftWidget.trendMag.clicked.connect(lambda: self.exButtonClicked(2))
self.leftWidget.trendMag.clicked.connect(self.reFreshTrendWidget)
self.leftWidget.userMag.clicked.connect(lambda: self.exButtonClicked(3))
self.leftWidget.protocolMag.clicked.connect(self.showSetting)
@ -186,7 +186,7 @@ class MainWindow(QMainWindow):
self.setWindowFlag(Qt.FramelessWindowHint)
def exButtonClicked(self, index):
self.rightWidget.setCurrentIndex(index)
print(index)
# print(index)
Globals.setValue('SearchWidget', index)
@ -204,7 +204,7 @@ class MainWindow(QMainWindow):
def varShow(self):
proType = Globals.getValue('currentProType')
print(type(proType))
# print(type(proType))
if proType == -1:
return
elif proType in ['0', '1', '2', '3']:
@ -229,7 +229,12 @@ class MainWindow(QMainWindow):
elif proType in ['9']:
self.rightWidget.setCurrentIndex(11)
Globals.setValue('SearchWidget', 11)
#枚举参数
#枚举参数
def reFreshTrendWidget(self):
self.trendWidget.getMems()
self.exButtonClicked(2)
def enum(self,**enums):
return type('Enum', (), enums)

@ -5,8 +5,9 @@ from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QSize, Qt
from PyQt5.QtGui import QPixmap, QIcon
from UI.TrendManage.TrendWidget import TrendWidgets
from Static import static
from utils import Globals
from Static import static
class MainTop(QtWidgets.QWidget):
def __init__(self, MainWindow):
super().__init__()
@ -49,7 +50,6 @@ class MainTop(QtWidgets.QWidget):
self.iconLabol.setPixmap(QPixmap(':/static/zhjt.png').scaled(50,50))
self.titleLabel.setText("信号发生装置")
self.closeBtn.clicked.connect(self.MainWindow.close)
self.minBtn.clicked.connect(self.MainWindow.showMinimized)
self.maxBtn.clicked.connect(self.showMax)

@ -249,12 +249,14 @@ class ProjectButtonDelegate(QItemDelegate):
return
self.loginWidget = LoginWidget()
self.loginWidget.show()
lastproType = Globals.getValue('currentProType')
ProjectManage.switchProject(str(self.parent().model.datas[sender.index[0]][1]), str(self.parent().model.datas[sender.index[0]][4]))
proType = Globals.getValue('currentProType')
if proType in ['0', '1', '2', '3']:
Globals.getValue('varTable').model.initTable()
# if lastproType in ['0', '1', '2', '3']:
# Globals.getValue('varTable').model.refreshComboBox()
elif proType in ['4']:
Globals.getValue('HartTable').model.initTable()
elif proType in ['5']:
@ -338,8 +340,7 @@ class ProTypeBoxDelegate(ProjectButtonDelegate):
setattr(self, comboBox, QComboBox(self.parent()))
cmBox = getattr(self, comboBox)
# item = ['MODBUSTCP 主站模式', 'MODBUSTCP 从站模式', 'MODBUSRTU 主站模式', 'MODBUSRTU 从站模式','HART', 'TCRTD', 'AO/DO/PI', 'FF', 'FF模拟', 'HART模拟']
item = ['MODBUSTCP 主站模式', 'MODBUSTCP 从站模式', 'MODBUSRTU 主站模式', 'MODBUSRTU 从站模式']
item = ['MODBUSTCP 主站模式', 'MODBUSTCP 从站模式', 'MODBUSRTU 主站模式', 'MODBUSRTU 从站模式','HART', 'TCRTD', 'AO/DO/PI', 'FF', 'FF模拟', 'HART模拟']
cmBox.addItems(item)
cmBox.index = [index.row(), index.column()]
if self.parent().model.datas[index.row()][index.column()] in range(10):

@ -111,7 +111,7 @@ class RegisterWidget(QWidget):
self.setWindowTitle("Form")
# self.label.setText("TextLabel")
pix = QtGui.QPixmap(':/static/logo.png')
pix = QtGui.QPixmap(':/:/static/logo.png')
self.label.setPixmap(pix)
self.label.setScaledContents(True)
self.label.setMaximumSize(QSize(110,40))

@ -114,6 +114,8 @@ class TrendWidgets(QWidget):
Globals.setValue('HistoryWidget', self)
def deleteMem(self):
if not self.memLsit:
return
self.historyDB.mem = self.memLsit[self.timeBox.currentIndex()]
self.historyDB.deleteMem()
InfluxMem.deleteMem(self.historyDB.mem)
@ -173,16 +175,15 @@ class TrendWidgets(QWidget):
def exchangeProject(self):
self.timeBox.clear()
self.memLsit = []
self.getMems()
self.refreshList(0)
self.trendWebView.setHtml('')
def getMems(self):
# 获取所有的趋势表
mems = InfluxMem.get_all()
self.proName = Globals.getValue('currentPro')
# self.timeBox.clear()
self.timeBox.clear()
if mems is 'Error':
return
for x in mems:
@ -195,14 +196,16 @@ class TrendWidgets(QWidget):
def refreshList(self, index):
# 更新变量列表
self.getMems()
self.model.clear()
if self.memLsit == []:
return
self.historyDB.mem = self.memLsit[index]
# self.historyDB.startTime = int(float(self.memLsit[index]))
# print(self.memLsit[index])
tagSet = self.historyDB.queryVarName()
self.model.clear()
# if not tagSet:
# QMessageBox.information(self, '提示', '当前工程历史趋势已损坏')
# return
for tag in tagSet:
item = QStandardItem(str(tag))
item.setCheckable(True)

@ -11,7 +11,6 @@ from PyQt5.QtWidgets import (QApplication, QGridLayout, QHBoxLayout, QLabel,
from protocol.Celery.MBTCPMaster import app
from Static import static
class MessageWidget(QWidget):
def __init__(self, parent=None):
super(MessageWidget, self).__init__(parent)
@ -65,7 +64,7 @@ class MessageWidget(QWidget):
self.recvLabel.setText(QCoreApplication.translate("Form", u"\u63a5\u6536\u5230\u62a5\u6587", None))
self.sendLabel.setText(QCoreApplication.translate("Form", u"\u53d1\u9001\u7684\u62a5\u6587", None))
self.clearButton.setText("清空报文")
self.reButton.setText(QCoreApplication.translate("Form", u"\u505c\u6b62\u5237\u65b0", None))
self.reButton.setText('停止刷新')
self.decimaButton.setText('切换进制')
self.timer = QTimer(self)
@ -90,8 +89,10 @@ class MessageWidget(QWidget):
def stopRe(self):
if self.timer.isActive():
self.timer.stop()
self.reButton.setText('开始刷新')
else:
self.timer.start()
self.reButton.setText('停止刷新')
def addText(self):
self.recvEdit.clear()

@ -5,7 +5,7 @@ import qtawesome
from PyQt5 import QtGui,QtCore,QtWidgets
from PyQt5.QtCore import QAbstractTableModel, QModelIndex, Qt, QVariant, QSize
from PyQt5.QtWidgets import QItemDelegate, QHBoxLayout, QWidget, QTableView, QMessageBox, QComboBox
from PyQt5.QtWidgets import QItemDelegate, QHBoxLayout, QWidget, QTableView, QMessageBox, QComboBox, QStyleOptionViewItem
from protocol.Celery.MBTCPMaster import app as MBTCPMApp
@ -76,6 +76,7 @@ class VarTableModel(QAbstractTableModel):
self.checkList = ['Unchecked'] * len(self.datas)
# self.layoutChanged.emit()
self.table.proxy.invalidate()
self.refreshComboBox()
def append_data(self, x):
@ -194,6 +195,24 @@ class VarTableModel(QAbstractTableModel):
self.datas[sourceRow], self.datas[destinationChild] = self.datas[destinationChild], self.datas[sourceRow]
self.table.proxy.invalidate()
def refreshComboBox(self):
# print(self.table.rowCount())
for i in range(len(self.datas)):
cbRow = str('cb' + str(i) + '5')
index = self.index(i, 5)
delegate = self.table.itemDelegate(index)
delegate.paint(self.table, QStyleOptionViewItem(), index)
try:
comboBox = getattr(delegate, cbRow)
except Exception as e:
continue
if self.datas[i][5] in [0, 1]:
comboBox.setCurrentIndex(self.datas[i][5])
elif self.datas[i][5] in [3, 4]:
comboBox.setCurrentIndex(self.datas[i][5] - 1)
else:
comboBox.setCurrentIndex(-1)
class ModBusTCPSlaveModel(VarTableModel):
def __init__(self, header, data: list, table = None):
'''
@ -253,6 +272,7 @@ class VarButtonDelegate(QItemDelegate):
comboBox.addItem('BADC', 3)
comboBox.addItem('DCBA', 4)
comboBox.setCurrentText(self.parent().model.datas[index.row()][index.column()])
comboBox.setMinimumWidth(30)
comboBox.currentIndexChanged.connect(self.indexChange)
@ -376,23 +396,26 @@ class VarButtonDelegate(QItemDelegate):
else:
varMes = model.datas[sender.index[0]]
name, des, varType, slaveID, address, min, max, order = str(varMes[3]), str(varMes[4]), str(varMes[5]), str(varMes[6]), str(varMes[7]), str(varMes[8]), str(varMes[9]), str(varMes[-1])
print(name, des, varType, slaveID, address, min, max, order)
# print(name, des, varType, slaveID, address, min, max, order)
if not name or not varType:
reply = QMessageBox.question(self.parent(),
'警告',
"有字段为空",
QMessageBox.Yes)
return
sender.isEdit = True
checkbox.setEnabled(False)
model.editableList.remove(sender.index[0])
if sender.oldName:
ModbusVarManage.editVar(name = sender.oldName, Nname = name, des = des, varType = varType, slaveID = slaveID, address = address, min = min, max = max, order = order)
if sender.oldName and ModBusVar.getByName(sender.oldName):
if sender.oldName == name or [varMes[3] for varMes in model.datas].count(name) < 2:
ModbusVarManage.editVar(name = sender.oldName, Nname = name, des = des, varType = varType, slaveID = slaveID, address = address, min = min, max = max, order = order)
else:
QMessageBox.information(self.parent(), '提示', '已有同名变量')
return
else:
ModbusVarManage.createVar(varName = name, varType = varType, des = des, address = address, slaveID = slaveID, min = min, max = max, order = order)
res = ModbusVarManage.createVar(varName = name, varType = varType, des = des, address = address, slaveID = slaveID, min = min, max = max, order = order)
if res:
QMessageBox.information(self.parent(), '提示', '已有同名变量')
return
sender.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2'))
rowIndex = sender.index[0]
varMes = ModbusVarManage.getByName(name)
@ -401,6 +424,10 @@ class VarButtonDelegate(QItemDelegate):
varMes.insert(2, '')
model.insert_data(varMes, rowIndex)
model.remove_row(rowIndex + 1)
sender.isEdit = True
checkbox.setEnabled(False)
model.editableList.remove(sender.index[0])
def delete_action(self):
@ -418,18 +445,15 @@ class VarButtonDelegate(QItemDelegate):
trend = ActualTrend(varName = name)
trend.show()
class ModbusTypeBox(VarButtonDelegate):
class ModbusTypeBox(QItemDelegate):
def __init__(self, parent=None):
super(ModbusTypeBox, self).__init__(parent)
def paint(self, painter, option, index):
if not self.parent().indexWidget(index):
if index.column() == 5:
data = self.parent().model.datas[index.row()]
comBox = str('cb' + str(index.row()) + str(index.column()))
setattr(self, comBox, QComboBox(self.parent()))
setattr(self, comBox, QComboBox())
comboBox = getattr(self, comBox)
item = ['Coil Status', 'Input Status', 'Input Register', 'Holding Register']
@ -451,6 +475,7 @@ class ModbusTypeBox(VarButtonDelegate):
comboBox.setObjectName('ModbusTypeBox')
comboBox.setEditable(True)
comboBox.lineEdit().setAlignment(Qt.AlignCenter)
comboBox.setMinimumWidth(200)
# comboBox.setEnabled(False)
h_box_layout = QHBoxLayout()
h_box_layout.addWidget(comboBox)
@ -474,6 +499,7 @@ class ModbusTypeBox(VarButtonDelegate):
index,
widget
)
self.parent().openPersistentEditor(index)
def indexChange(self):
sender = self.sender()

@ -190,9 +190,13 @@ class TcRtdButtonDelegate(VarButtonDelegate):
QMessageBox.Yes)
return
mv = temToMv(varType, float(value))
mv += float(compensation)
if not mv and mv != 0:
reply = QMessageBox.question(self.parent(),
'警告',
"输入值有误",
QMessageBox.Yes)
return
mv += float(compensation)
model.table.mvList[sender.index[0]] = mv
model.table.valueList[sender.index[0]] = float(value)
forceVars = Globals.getValue('forceVars')

@ -1,6 +1,7 @@
import time
from PyQt5.QtCore import QThread, pyqtSignal
from UI.TrendManage.ActualTrendWidget import ActualTrend
from protocol.TCP.RTDTC import RTDTCClient
from protocol.TCP.Analog import AnalogClient
from protocol.FF.FFSimulate import FFSimulate
@ -111,3 +112,6 @@ class HartSimulateThread(FFThread):
self.window.valueList = self.HartSimulate.readValue()
except Exception as e:
print(e)

@ -100,6 +100,7 @@ class VarTableView(QTableView):
self.header.setSectionResizeMode(0, QHeaderView.Fixed)
self.header.resizeSection(0, 70)
class HartTableView(VarTableView):

@ -20,7 +20,6 @@ from protocol.TCP.TemToMv import temToMv
from protocol.TCP.Analog import getRealAO
import re
from Static import static
class VarWidgets(QtWidgets.QWidget):
_isPopenOpen = False
def __init__(self, parent=None):

@ -8,6 +8,7 @@ import time
import sys
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyle(QStyleFactory.create('Fusion'))

@ -107,7 +107,7 @@ class register:
# str = str
k = des(self.Des_Key, CBC, self.Des_IV, pad=None, padmode=PAD_PKCS5)
EncryptStr = k.encrypt(str)
print(type(EncryptStr))
# print(type(EncryptStr))
return base64.b64encode(EncryptStr) # 转base64编码返回
# 获取注册码,验证
@ -123,7 +123,7 @@ class register:
key_decrypted = str(self.DesDecrypt())
if content != 0 and key_decrypted != 0:
if content != key_decrypted:
print("wrong register code, please check and input your register code again:")
# print("wrong register code, please check and input your register code again:")
self.regist()
elif content == key_decrypted:
return True

@ -20,7 +20,7 @@ def parseDate(date_string: str):
class HistoryDBManage():
org = "DCS"
# bucket = "history"
url = "http://127.0.0.1:8086"
url = "http://localhost:8086"
def __init__(self, bucket, mem = None, isCelery = True):
self.getToken(isCelery)
@ -95,7 +95,11 @@ class HistoryDBManage():
|> range(start: {})\
|> filter(fn:(r) => r._measurement == "{}")\
|> filter(fn:(r) => r._field == "value")'.format(self.bucket, self.startTime, self.mem)
results = self.queryApi.query(query, org = self.org)
try:
results = self.queryApi.query(query, org = self.org)
except Exception as e:
BucketsApi(self.client).create_bucket(bucket_name = self.bucket, org = self.org)
return tagSet
for result in results:
for record in result.records:
tagSet.add(record['varName'])

@ -109,7 +109,7 @@ class ProjectManage(object):
# 删除工程
name = str(name)
# print(name)
print(Globals.getValue('currentPro'))
# print(Globals.getValue('currentPro'))
Client.initDB()
if name == Globals.getValue('currentPro'):
Globals.getValue('currentProDB').close()
@ -144,11 +144,11 @@ class ProjectManage(object):
Globals.setValue('currentProDB', projectDB)
Globals.setValue('currentProType', proType)
# if Globals.getValue('FFThread').isRunning():
# Globals.getValue('FFThread').reStart()
# return
# if proType == '7':
# Globals.getValue('FFThread').start()
if Globals.getValue('FFThread').isRunning():
Globals.getValue('FFThread').reStart()
return
if proType == '7':
Globals.getValue('FFThread').start()
# initDB
@classmethod

@ -44,7 +44,7 @@ class ModbusVarManage(object):
maxIndex = index
# print(IDIndex, slaveIndex, nameIndex, desIndex, typeIndex, addrIndex, minIndex, maxIndex)
if IDIndex == None or slaveIndex == None or nameIndex == None or desIndex == None or typeIndex == None or addrIndex == None or minIndex == None or maxIndex == None:
print('表头错误')
# print('表头错误')
return '表头错误'
for index, row in enumerate(list(ws.iter_rows())[1:]):
@ -96,7 +96,7 @@ class ModbusVarManage(object):
max = str(max)
order = order
if ModBusVar.getByName(name):
print('已有同名变量')
return 1
else:
varModel = ModBusVar()
varModel.createVar(varName = varName, varType = varType, des = des, address = address, slaveID = slaveID, min = min, max = max, order = order)

@ -94,7 +94,7 @@ def setValue(self, name, varType, slaveID, address, value, order): # 写入变
slaveID = int(slaveID)
address = int(address) - self.offset
varType = str(varType)
print(address, 555555555555555555)
# print(address, 555555555555555555)
if varType == '4':
self.TcpModbus.writeSingleRegister(slaveId = slaveID, address = address, outputValue = value, order = order)
elif varType == '0':

@ -1,5 +1,5 @@
from pythonnet import load
load('coreclr')
# load('coreclr')
import clr # 与其他模块不同此处不直接导入pythonnet 而是导入clrpython与c#交互核心)
dll_path = 'protocol\\FF\\NationalInstruments.Fieldbus' # 为了方便理解这里给到dll所在的绝对路径且包含dll文件本身
clr.AddReference(dll_path) #加载c#库

@ -15,12 +15,12 @@ class HartProtocol(object):
for index, address in enumerate(self.addressList):
value = self.rtuMaster.readHoldingRegisters(slaveId = 1, startAddress = address, varNums = 2, order = 'ABCD')
valueList.append(value)
print(self.addressList, valueList)
# print(self.addressList, valueList)
return valueList
def writeValue(self, devIndex, elemIndex, value):
address = self.addressList[devIndex * 5 + elemIndex]
print(address)
# print(address)
self.rtuMaster.writeSingleRegister(slaveId = 1, address = address, outputValue = value, order = 'DCBA')
if __name__ == '__main__':

Loading…
Cancel
Save