Test.py实现GUI界面和大部分逻辑
# -*- coding: utf-8 -*-
from PyQt5.QtCore import QDateTime, Qt, QTimer, pyqtSignal, QThread
from PyQt5.QtWidgets import (QApplication, QCheckBox, QComboBox, QDateTimeEdit,
QDial, QDialog, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QLineEdit,
QProgressBar, QPushButton, QRadioButton, QScrollBar, QSizePolicy,
QSlider, QSpinBox, QStyleFactory, QTableWidget, QTabWidget, QTextEdit,
QVBoxLayout, QWidget, QMessageBox)
from PyQt5.QtGui import (QIntValidator)
import serial
import serial.tools.list_ports
import crcmod.predefined
import Func
import time
import threading
class WidgetGallery(QDialog):
# global dict1
# dict1 = {'SUM': '0000'}
sig = pyqtSignal(str, str, float, str, str, str)
def __init__(self, parent=None):
super(WidgetGallery, self).__init__(parent)
self.originalPalette = QApplication.palette()
self.comComboBox = QComboBox()
# print(self.getPort())
# self.comComboBox.currentIndexChanged.connect(self.selectionchange)
# print(self.comComboBox.currentText())
self.pasg = '1' # 默认通道为1,不然初始化bug
self.serFlag = False
comLabel = QLabel("串口:")
comLabel.setBuddy(self.comComboBox)
self.bpsComboBox = QComboBox()
self.bpsComboBox.addItems(self.getBps())
bpsLabel = QLabel("波特率:")
bpsLabel.setBuddy(self.bpsComboBox)
self.crcComboBox = QComboBox()
self.crcComboBox.addItems(self.getCrc())
crcLabel = QLabel("校验:")
crcLabel.setBuddy(self.crcComboBox)
self.openButton = QPushButton("打开串口")
self.openButton.setDefault(False)
self.openButton.clicked.connect(self.openSer)
self.openButton.setCheckable(True)
# self.openButton.setAutoExclusive(True)
# self.openButton.setEnabled(False)
# print(self.getPort())
self.comComboBox.addItems(self.getPort())
# self.open1Button = QPushButton("go03")
# self.open1Button.setDefault(False)
# self.staNum = '01'
# self.funCode = '03'
# self.keyName = 'SUM'
# self.open1Button.clicked.connect(self.sendFunction03(staNum, funCode, keyName))
# self.open1Button.clicked.connect(self.Print)
# self.open1Button.clicked.connect(self.sendFunction03)
self.setWindowFlags(Qt.Widget)
self.setWindowTitle("ST05D校准软件")
self.resize(600, 400)
self.setFixedSize(600, 400)
self.changeStyle('windowsvista')
topLayout = QHBoxLayout()
topLayout.addWidget(comLabel)
topLayout.addWidget(self.comComboBox)
topLayout.addWidget(bpsLabel)
topLayout.addWidget(self.bpsComboBox)
topLayout.addWidget(crcLabel)
topLayout.addWidget(self.crcComboBox)
topLayout.addSpacing(50)
topLayout.addWidget(self.openButton)
# topLayout.addWidget(self.open1Button)
topLayout.addStretch(1)
self.createTopLeftGroupBox()
self.createTopRightGroupBox()
self.createMiddleLeftGroupBox()
self.createMiddleRightGroupBox()
self.createBottomLeftGroupBox()
self.createBottomRightGroupBox()
mainLayout = QGridLayout()
mainLayout.addLayout(topLayout, 0, 0, 1, 2)
mainLayout.addWidget(self.topLeftGroupBox, 1, 0)
mainLayout.addWidget(self.topRightGroupBox, 1, 1)
mainLayout.addWidget(self.middleLeftGroupBox, 2, 0)
mainLayout.addWidget(self.middleRightGroupBox, 2, 1)
mainLayout.addWidget(self.bottomLeftGroupBox, 3, 0)
mainLayout.addWidget(self.bottomRightGroupBox, 3, 1)
mainLayout.setColumnStretch(0, 1)
mainLayout.setColumnStretch(1, 1)
self.setLayout(mainLayout)
# def Print(self):
# print('print')
def closeEvent(self, event):
# self.c.terminate()
print('thread=sta', self.readthread._running)
self.readthread.terminate()
print('close')
def openSer(self):
print('open')
print(self.openButton.isChecked())
if self.openButton.isChecked():
self.ser = serial.Serial(self.comComboBox.currentText(), self.bpsComboBox.currentText(), timeout=0)
self.comComboBox.setEnabled(False)
self.bpsComboBox.setEnabled(False)
self.crcComboBox.setEnabled(False)
self.openButton.setText('关闭串口')
else:
print('no')
self.ser.close()
self.openButton.setText('打开串口')
self.comComboBox.setEnabled(True)
self.bpsComboBox.setEnabled(True)
self.crcComboBox.setEnabled(True)
# if not self.serFlag:
# self.ser = serial.Serial(self.comComboBox.currentText(), self.bpsComboBox.currentText(), timeout=0)
# self.serFlag = True
# print(self.comComboBox.currentText(), self.bpsComboBox.currentText())
# else:
# self.ser.close()
# self.serFlag = False
# self.openSer()
# def sendFunction03(self, staNum, funCode, keyName):
def send03(self, keyName):
try:
staNum = self.staNum
# funCode = self.funCode
# keyName = self.keyName
except Exception:
staNum = '00'
# keyName = self.keyName
funCode = '03'
print('033')
if self.openButton.isChecked():
list1 = Func.sendFunction03(staNum, funCode, keyName)
# list1 = []
# dict1 = Func.addressDict03
# list1.append(int('0x' + staNum, 16))
# list1.append(int('0x' + funCode, 16))
# list1.append(int('0x' + dict1[keyName][0:2], 16))
# list1.append(int('0x' + dict1[keyName][2:4], 16))
# list1.append(int('0x00', 16))
# list1.append(int('0x02', 16))
# crc16_func = crcmod.predefined.mkCrcFun('modbus')
# # ba = bytearray([0o01, 0o03, 0o00, 0o00, 0o00, 0o02])
# a = bytes().fromhex(staNum + funCode + dict1[keyName] + '0002')
# # print(a)
# reslist = hex(crc16_func(a))[2:].zfill(4)
# # print(type(reslist[2:].upper()), reslist[:2].upper())
# list1.append(int('0x' + reslist[2:], 16))
# list1.append(int('0x' + reslist[:2], 16))
print(list1)
try:
self.ser.write(list1)
except Exception:
print('not ok')
reply = QMessageBox.warning(self,
"串口设置错误",
"请检查串口号及波特率设置",
QMessageBox.Yes | QMessageBox.No)
# self.echo(reply)
else:
print(type(self.ser.read()))
result16 = str(self.ser.read(), encoding="utf8")[6:14] # 去掉从站号功能码crc校验码等,只保留读取值
print(result16)
if len(result16) == 0:
reply = QMessageBox.warning(self,
"地址读取空",
"请检查串口设置",
QMessageBox.Yes | QMessageBox.No)
elif keyName == 'DN': # 获取从站地址
# result10 = int('0x' + result16[2:], 16) # 先实现只读后两位
result10 = Func.hex8ToInt(result16)
self.AdrlineEdit.setText(result10)
elif 'SENSE' in keyName: # 获取灵敏度
result10 = Func.hex8ToInt(result16)
self.SenlineEdit.setText(result10)
elif keyName == 'SUM': # 返回读取总和
return Func.hex8ToInt(result16)
else:
reply = QMessageBox.warning(self,
"串口设置错误",
"请打开串口",
QMessageBox.Yes | QMessageBox.No)
# return list1
# def hex8ToInt(s):
# s = '{:032b}'.format(int(s, 16))
# return int(s[1:], 2) - int(s[0]) * (1 << 31)
#
# def intToHex8(i):
# return '{:08x}'.format(int((bin(((1 << 32) - 1) & i)[2:]).zfill(32), 2))
def changeStyle(self, styleName):
QApplication.setStyle(QStyleFactory.create(styleName))
self.changePalette()
# def selectionchange(self):
# print('selectionchange', self.comComboBox.currentText())
def changePalette(self):
QApplication.setPalette(self.originalPalette)
def getPort(self):
port_list = list(serial.tools.list_ports.comports())
plist = []
print(len(port_list))
if len(port_list) == 0:
reply = QMessageBox.warning(self,
"没有串口设备",
"请检查串口设备连接",
QMessageBox.Yes | QMessageBox.No)
self.openButton.setEnabled(False)
return plist
else:
for p in port_list:
# print('device:', p.device, 'des:', p.description, 'hwid:', p.hwid)
plist.append(p.device)
return plist
def getBps(self):
listBps = ['9600', '19200', '38400', '57600', '115200']
return listBps
def getCrc(self):
listCrc = ['无校验', '奇校验', '偶校验']
return listCrc
def setAdr(self): # 设定从站地址
# print('okk')
if self.openButton.isChecked():
# print('okk1')
# print(type(self.AdrlineEdit.text()), self.AdrlineEdit.text())
self.staNum = self.AdrlineEdit.text()
# self.staNum = '1'
else:
# print('okk2')
reply = QMessageBox.warning(self,
"串口设置错误",
"请打开串口",
QMessageBox.Yes | QMessageBox.No)
def setPasg(self): # 设定通道
if self.openButton.isChecked():
# print(self.pasgBox.currentText())
self.pasg = self.pasgBox.currentText()
print(type(self.pasg))
else:
reply = QMessageBox.warning(self,
"串口设置错误",
"请打开串口",
QMessageBox.Yes | QMessageBox.No)
#
def test11(self, str):
if str == 'ok':
return 1
def displayRead(self, num):
self.NumlineEdit.setText(num)
def warnNoneRead(self):
print('warnNoneRead')
reply = QMessageBox.warning(self,
"地址读取空",
"请检查串口设置",
QMessageBox.Yes | QMessageBox.No)
def readNum(self): # 要做循环读数
if self.openButton.isChecked():
# print('okgo1', self.readNumButton.isChecked())
if self.readNumButton.isChecked():
print('okgo')
self.topLeftGroupBox.setEnabled(False)
self.topRightGroupBox.setEnabled(False)
# self.middleLeftGroupBox.setEnabled(False)
self.numComboBox.setEnabled(False)
self.unitComboBox.setEnabled(False)
self.clearButton.setEnabled(False)
self.middleRightGroupBox.setEnabled(False)
self.bottomLeftGroupBox.setEnabled(False)
self.bottomRightGroupBox.setEnabled(False)
self.openButton.setEnabled(False)
self.comComboBox.setEnabled(False)
self.bpsComboBox.setEnabled(False)
self.crcComboBox.setEnabled(False)
self.readNumButton.setText('停止读数')
# self.readNumButton.setEnabled(True)
#
numPasg = self.numComboBox.currentText()
unit = self.unitComboBox.currentText()
mult = 0.0000357628
i = 0
try:
staNum = self.staNum
# funCode = self.funCode
# keyName = self.keyName
print('ok')
except Exception:
staNum = '00'
print('no')
print(numPasg, unit, staNum)
# self.sigSetNum.connect(self.displayRead)
# print(1)
self.ser.close()
# print(2, type(numPasg), type(unit), type(mult), type(self.comComboBox.currentText()), type(self.bpsComboBox.currentText()), type(staNum))
self.sig.emit(numPasg, unit, mult, self.comComboBox.currentText(), self.bpsComboBox.currentText(), staNum)
# print(3)
# numPasg=numPasg, unit=unit, mult=mult, ser=self.ser, staNum=self.staNum
self.readthread.start()
# self.t = threading.Thread(target=self.c.run, args=(numPasg, unit, mult,))
# self.t.start()
# while self.readNumButton.isChecked():
#
# print(i, numPasg, unit)
# time.sleep(1)
else:
# print('terminate-out')
# self.c.terminate()
self.readthread.terminate()
self.ser = serial.Serial(self.comComboBox.currentText(), self.bpsComboBox.currentText(), timeout=0)
# print('terminate-out2')
self.readNumButton.setText('开始读数')
self.topLeftGroupBox.setEnabled(True)
self.topRightGroupBox.setEnabled(True)
# self.middleLeftGroupBox.setEnabled(False)
self.numComboBox.setEnabled(True)
self.unitComboBox.setEnabled(True)
self.clearButton.setEnabled(True)
self.middleRightGroupBox.setEnabled(True)
self.bottomLeftGroupBox.setEnabled(True)
self.bottomRightGroupBox.setEnabled(True)
self.openButton.setEnabled(True)
self.comComboBox.setEnabled(True)
self.bpsComboBox.setEnabled(True)
self.crcComboBox.setEnabled(True)
# self.readNumButton.setEnabled(False)
else:
reply = QMessageBox.warning(self,
"串口设置错误",
"请打开串口",
QMessageBox.Yes | QMessageBox.No)
def clearNum(self):
self.NumlineEdit.clear()
def createTopLeftGroupBox(self):
self.topLeftGroupBox = QGroupBox("")
self.readAdrButton = QPushButton("读取地址")
self.readAdrButton.clicked.connect(lambda: self.send03('DN'))
# print(self.ser.read())
self.readAdrButton.setDefault(False)
self.setAdrButton = QPushButton("设定地址")
self.setAdrButton.setDefault(False)
self.setAdrButton.clicked.connect(self.setAdr)
self.setPasgButton = QPushButton("设定通道")
self.setPasgButton.setDefault(False)
self.setPasgButton.clicked.connect(self.setPasg)
layout = QHBoxLayout()
list1 = ['1', '2', '3', '4', '5']
layout1 = QVBoxLayout()
self.AdrlineEdit = QLineEdit('0')
# self.AdrlineEdit.setPlaceholderText('0')
pIntValidator = QIntValidator()
pIntValidator.setRange(0, 255)
self.AdrlineEdit.setValidator(pIntValidator)
layout1.addWidget(self.AdrlineEdit)
self.pasgBox = QComboBox()
self.pasgBox.addItems(list1)
layout1.addWidget(self.pasgBox)
# layout1.addStretch(1)
layout2 = QVBoxLayout()
layout2.addWidget(self.readAdrButton)
layout2.addWidget(self.setAdrButton)
layout2.addWidget(self.setPasgButton)
# layout2.addStretch(1)
layout.addSpacing(10)
layout.addLayout(layout1)
layout.addSpacing(50)
# layout.addStretch(1)
layout.addLayout(layout2)
layout.setStretchFactor(layout1, 1)
layout.setStretchFactor(layout2, 1)
# layout.addStretch(1)
self.topLeftGroupBox.setLayout(layout)
def createTopRightGroupBox(self):
self.topRightGroupBox = QGroupBox("出厂校准")
self.readSenButton = QPushButton("读取灵敏度")
self.readSenButton.setDefault(False)
self.readSenButton.clicked.connect(lambda: self.send03('CH'+self.pasg+'SENSE'))
# print('11')
# staNum = '01'
# funCode = '03'
# keyName = 'SUM'
# self.read1Button.clicked.connect(self.sendFunction03)
layout = QVBoxLayout()
layout1 = QHBoxLayout()
styleLabel = QLabel("灵敏度:")
self.SenlineEdit = QLineEdit('2000')
self.SenlineEdit.setReadOnly(True)
# lineEdit.setEnabled(False)
styleLabel.setBuddy(self.SenlineEdit)
layout1.addWidget(styleLabel)
layout1.addWidget(self.SenlineEdit)
layout1.addSpacing(20)
layout1.addWidget(self.readSenButton)
layout2 = QHBoxLayout()
style1Label = QLabel("满量程请用模拟器2mv/v进行校准!")
layout2.addWidget(style1Label)
layout3 = QHBoxLayout()
set1Button = QPushButton("校准零点")
set1Button.setDefault(False)
set2Button = QPushButton("校准满度")
set2Button.setDefault(False)
layout3.addWidget(set1Button)
layout3.addWidget(set2Button)
layout.addLayout(layout1)
layout.addLayout(layout2)
layout.addLayout(layout3)
self.topRightGroupBox.setLayout(layout)
def createMiddleLeftGroupBox(self):
self.middleLeftGroupBox = QGroupBox("显示值读取")
comLabel = QLabel("小数点数:")
self.NumlineEdit = QLineEdit('0')
# lineEdit.setEnabled(False)
self.NumlineEdit.setReadOnly(True)
self.readNumButton = QPushButton("开始读数")
self.readNumButton.setDefault(False)
self.readthread = readThread()
self.sig.connect(self.readthread.on_source)
self.readthread.trigger.connect(self.displayRead)
self.readthread.trigger1.connect(self.warnNoneRead)
self.readNumButton.clicked.connect(self.readNum)
self.readNumButton.setCheckable(True)
# self.readNumButton.setAutoExclusive(True)
self.clearButton = QPushButton("清零")
self.clearButton.setDefault(False)
# self.clearButton.clicked.connect(self.clearNum)
# defaultPushButton.setDefault(False)
numList = ['0', '1', '2', '3', '4', '5']
self.numComboBox = QComboBox()
self.numComboBox.addItems(numList)
unitList = ['g', 'Kg', 'N', 'KN']
self.unitComboBox = QComboBox()
self.unitComboBox.addItems(unitList)
layout = QHBoxLayout()
layout1 = QVBoxLayout()
layout1.addWidget(comLabel)
layout1.addWidget(self.NumlineEdit)
layout1.addSpacing(10)
layout1.addWidget(self.readNumButton)
layout2 = QVBoxLayout()
layout2.addWidget(self.numComboBox)
layout2.addSpacing(10)
layout2.addWidget(self.unitComboBox)
layout2.addSpacing(10)
layout2.addWidget(self.clearButton)
layout.addLayout(layout1)
layout.addSpacing(50)
layout.addLayout(layout2)
layout.setStretchFactor(layout1, 1)
layout.setStretchFactor(layout2, 1)
self.middleLeftGroupBox.setLayout(layout)
def createMiddleRightGroupBox(self):
self.middleRightGroupBox = QGroupBox("多段标定")
styleLabel = QLabel("当前载荷值:")
lineEdit = QLineEdit('0')
styleLabel.setBuddy(lineEdit)
style1Label = QLabel("当前标定点数:")
line1Edit = QLineEdit('1')
line1Edit.setReadOnly(True)
line2Edit = QLineEdit('WAIT !')
line2Edit.setReadOnly(True)
styleLabel.setBuddy(line1Edit)
self.setCalButton = QPushButton("标定此点")
self.setCalButton.setDefault(False)
finishButton = QPushButton("完成标定")
finishButton.setDefault(False)
layout1 = QHBoxLayout()
layout1.addWidget(styleLabel)
layout1.addWidget(lineEdit)
layout1.addSpacing(20)
layout1.addWidget(style1Label)
layout1.addWidget(line1Edit)
layout2 = QHBoxLayout()
layout2.addWidget(line2Edit)
layout2.addSpacing(20)
layout2.addWidget(self.setCalButton)
layout2.addSpacing(20)
layout2.addWidget(finishButton)
layout = QVBoxLayout()
layout.addLayout(layout1)
layout.addSpacing(20)
layout.addLayout(layout2)
self.middleRightGroupBox.setLayout(layout)
def createBottomLeftGroupBox(self):
self.bottomLeftGroupBox = QGroupBox("参数修改")
styleLabel = QLabel("修改参数:")
style1Label = QLabel("修改值:")
self.setList = ['', 'AD采样速率', '滤波等级', '滤波带', '零点跟踪时间', '零点跟踪带', '判稳时间', '判稳条件', '设备地址',
'波特率', '校验位', '高低寄存器选择', '报警1模式', '报警1跟踪通道', '报警1报警值', '报警1区间值', '报警2模式',
'报警2跟踪通道', '报警2报警值', '报警2区间值']
setComboBox = QComboBox()
setComboBox.addItems(self.setList)
# method.fun1(self.setList)
lineEdit = QLineEdit('')
self.readParButton = QPushButton("读取参数值")
self.readParButton.setDefault(False)
self.chgButton = QPushButton("修改参数值")
self.chgButton.setDefault(False)
layout = QVBoxLayout()
layout1 = QHBoxLayout()
layout1.addWidget(styleLabel)
layout1.addSpacing(50)
layout1.addWidget(setComboBox)
layout2 = QHBoxLayout()
layout2.addWidget(style1Label)
layout2.addSpacing(108)
layout2.addWidget(lineEdit)
layout3 = QHBoxLayout()
layout3.addWidget(self.readParButton)
layout3.addWidget(self.chgButton)
layout.addLayout(layout1)
layout.addLayout(layout2)
layout.addLayout(layout3)
self.bottomLeftGroupBox.setLayout(layout)
def createBottomRightGroupBox(self):
self.bottomRightGroupBox = QGroupBox("Key方式校准")
self.enaCalButton = QPushButton("校准使能")
self.enaCalButton.setDefault(False)
conButton = QPushButton("确定校准")
conButton.setDefault(False)
styleLabel = QLabel("灵敏度:")
lineEdit = QLineEdit('0')
lineEdit.setBaseSize(13, 13)
layout = QVBoxLayout()
layout1 = QHBoxLayout()
layout1.addWidget(styleLabel)
layout1.addSpacing(50)
layout1.addWidget(lineEdit)
layout2 = QHBoxLayout()
layout2.addWidget(self.enaCalButton)
layout2.addSpacing(50)
layout2.addWidget(conButton)
layout.addLayout(layout1)
layout.addLayout(layout2)
self.bottomRightGroupBox.setLayout(layout)
class readThread(QThread):
trigger = pyqtSignal(str)
trigger1 = pyqtSignal()
# print('thread init')
# def __init__(self):
# self._running = True
# # self.obj = obj
def __init__(self): # do_create_data放在最后
super().__init__()
self._running = True
self.numPasg = None
self.unit = None
self.mult = None
# self.ser = None
self.com = None
self.bps = None
self.staNum = None
self.init_flag = False
print('thread init1')
def on_source(self, numPasg, unit, mult, com, bps, staNum):
self.init_flag = True
self.numPasg = numPasg
self.unit = unit
self.mult = mult
# self.ser = ser
self.ser = serial.Serial(com, bps, timeout=0)
self.staNum = staNum
self._running = True
print('on_source')
def threadsend03(self, keyName):
try:
staNum = self.staNum
except Exception:
staNum = '00'
# keyName = self.keyName
funCode = '03'
print('threadsend03')
list1 = Func.sendFunction03(staNum, funCode, keyName)
print(list1)
try:
self.ser.write(list1)
except Exception:
print('not ok')
# reply = QMessageBox.warning(self,
# "串口设置错误",
# "请检查串口号及波特率设置",
# QMessageBox.Yes | QMessageBox.No)
# self.echo(reply)
else:
print(type(self.ser.read()))
result16 = str(self.ser.read(), encoding="utf8")[6:14] # 去掉从站号功能码crc校验码等,只保留读取值
print(result16)
if len(result16) == 0:
print('thread null')
# reply = QMessageBox.warning(self,
# "地址读取空",
# "请检查串口设置",
# QMessageBox.Yes | QMessageBox.No)
self.trigger1.emit()
# pass # emit
return None
elif keyName == 'SUM': # 返回读取总和
return Func.hex8ToInt(result16)
elif 'PV' in keyName: # 返回单通道读取
return Func.hex8ToInt(result16)
def terminate(self):
print('gg')
# print('terminate-in', self.ser.is_open)
self._running = False
if self.init_flag:
self.ser.close()
print('what')
def run(self):
print('run')
while self._running:
# print('T-minus', numPasg, unit, mult)
if self.numPasg == '0':
returnNum = self.threadsend03('SUM')
# returnNum = WidgetGallery.test11(QDialog, 'ok')
if returnNum == None:
break
else:
displayNum = returnNum * self.mult
else:
returnNum = self.threadsend03('PV'+self.numPasg) # 6是什么意思?
# returnNum = WidgetGallery.test11(QDialog, 'ok')
if returnNum == None:
break
else:
displayNum = returnNum * self.mult # kg
if self.unit == 'g':
finalNum = displayNum * 1000
elif self.unit == 'Kg':
finalNum = displayNum
elif self.unit == 'N':
finalNum = displayNum * 9.8
elif self.unit == 'KN':
finalNum = (displayNum * 9.8)/1000
# finalNum = i
# self.NumlineEdit.setText(str(finalNum))
# i += 1
self.trigger.emit(str(finalNum))
# setNumSignal.emit(str(finalNum))
# numPasg += '1'
time.sleep(1)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
gallery = WidgetGallery()
gallery.show()
sys.exit(app.exec_())
Func.py实现具体交互指令
import serial
import serial.tools.list_ports
import crcmod.predefined
addressDict01={
'PC1': '000B',
'PC2': '000C',
'PC3': '000D',
'PC4': '000E',
'PC5': '000F',
'SC1': '0011',
'SC2': '0012',
'SC3': '0013',
'SC4': '0014',
'SC5': '0015'
}
addressDict05= {
'TC': '000A',
'PC1': '000B',
'PC2': '000C',
'PC3': '000D',
'PC4': '000E',
'PC5': '000F',
'cal': '0010',
'Tbu': '0011',
'Tfc': '0013'
}
addressDict03= {
'SUM': '0000',
'PV1': '0002',
'PV2': '0004',
'PV3': '0006',
'PV4': '0008',
'PV5': '000A',
'CH1SENSE': '000C',
'CH1INP1': '000E',
'CH1INP2': '0010',
'CH1OFFSET': '0012',
'CH1POINT': '0014',
'CH1AVP1': '0016',
'CH1AVP2': '0018',
'CH1AVP3': '001A',
'CH1AVP4': '001C',
'CH1AVP5': '001E',
'CH1AVP6': '0020',
'CH1AVP7': '0022',
'CH1AVP8': '0024',
'CH1AVP9': '0026',
'CH1PVP1': '0028',
'CH1PVP2': '002A',
'CH1PVP3': '002C',
'CH1PVP4': '002E',
'CH1PVP5': '0030',
'CH1PVP6': '0032',
'CH1PVP7': '0034',
'CH1PVP8': '0036',
'CH1PVP9': '0038',
'CH1ADSSPEED': '003A',
'CH1FILTER': '003C',
'CH1FBAND': '003E',
'CH1ATZT': '0040',
'CH1ATZB': '0042',
'CH1STBT': '0044',
'CH1STBB': '0046',
'CH2SENSE': '004A',
'CH2INP1': '004C',
'CH2INP2': '004E',
'CH2OFFSET': '0050',
'CH2POINT': '0052',
'CH2AVP1': '0054',
'CH2AVP2': '0056',
'CH2AVP3': '0058',
'CH2AVP4': '005A',
'CH2AVP5': '005C',
'CH2AVP6': '005E',
'CH2AVP7': '0060',
'CH2AVP8': '0062',
'CH2AVP9': '0064',
'CH2PVP1': '0066',
'CH2PVP2': '0068',
'CH2PVP3': '006A',
'CH2PVP4': '006C',
'CH2PVP5': '006E',
'CH2PVP6': '0070',
'CH2PVP7': '0072',
'CH2PVP8': '0074',
'CH2PVP9': '0076',
'CH2ADSSPEED': '0078',
'CH2FILTER': '007A',
'CH2FBAND': '007C',
'CH2ATZT': '007E',
'CH2ATZB': '0080',
'CH2STBT': '0082',
'CH2STBB': '0084',
'CH3SENSE': '0088',
'CH3INP1': '008A',
'CH3INP2': '008C',
'CH3OFFSET': '008E',
'CH3POINT': '0090',
'CH3AVP1': '0092',
'CH3AVP2': '0094',
'CH3AVP3': '0096',
'CH3AVP4': '0098',
'CH3AVP5': '009A',
'CH3AVP6': '009C',
'CH3AVP7': '009E',
'CH3AVP8': '00A0',
'CH3AVP9': '00A2',
'CH3PVP1': '00A4',
'CH3PVP2': '00A6',
'CH3PVP3': '00A8',
'CH3PVP4': '00AA',
'CH3PVP5': '00AC',
'CH3PVP6': '00AE',
'CH3PVP7': '00B0',
'CH3PVP8': '00B2',
'CH3PVP9': '00B4',
'CH3ADSSPEED': '00B6',
'CH3FILTER': '00B8',
'CH3FBAND': '00BA',
'CH3ATZT': '00BC',
'CH3ATZB': '00BE',
'CH3STBT': '00C0',
'CH3STBB': '00C2',
'CH4SENSE': '00C6',
'CH4INP1': '00C8',
'CH4INP2': '00CA',
'CH4OFFSET': '00CC',
'CH4POINT': '00CE',
'CH4AVP1': '00D0',
'CH4AVP2': '00D2',
'CH4AVP3': '00D4',
'CH4AVP4': '00D6',
'CH4AVP5': '00D8',
'CH4AVP6': '00DA',
'CH4AVP7': '00DC',
'CH4AVP8': '00DE',
'CH4AVP9': '00E0',
'CH4PVP1': '00E2',
'CH4PVP2': '00E4',
'CH4PVP3': '00E6',
'CH4PVP4': '00E8',
'CH4PVP5': '00EA',
'CH4PVP6': '00EC',
'CH4PVP7': '00EE',
'CH4PVP8': '00F0',
'CH4PVP9': '00F2',
'CH4ADSSPEED': '00F4',
'CH4FILTER': '00F6',
'CH4FBAND': '00F8',
'CH4ATZT': '00FA',
'CH4ATZB': '00FC',
'CH4STBT': '00FE',
'CH4STBB': '0100',
'CH5SENSE': '0104',
'CH5INP1': '0106',
'CH5INP2': '0108',
'CH5OFFSET': '010A',
'CH5POINT': '010C',
'CH5AVP1': '010E',
'CH5AVP2': '0110',
'CH5AVP3': '0112',
'CH5AVP4': '0114',
'CH5AVP5': '0116',
'CH5AVP6': '0118',
'CH5AVP7': '011A',
'CH5AVP8': '011C',
'CH5AVP9': '011E',
'CH5PVP1': '0120',
'CH5PVP2': '0122',
'CH5PVP3': '0124',
'CH5PVP4': '0126',
'CH5PVP5': '0128',
'CH5PVP6': '012A',
'CH5PVP7': '012C',
'CH5PVP8': '012E',
'CH5PVP9': '0130',
'CH5ADSSPEED': '0132',
'CH5FILTER': '0134',
'CH5FBAND': '0136',
'CH5ATZT': '0138',
'CH5ATZB': '013A',
'CH5STBT': '013C',
'CH5STBB': '013E',
'DN': '0142',
'BAUD': '0144',
'PRTY': '0146',
'FIRH': '0148',
'SP1M': '014A',
'SP1A': '014C',
'SP1V': '014E',
'SP1B': '0150',
'SP2M': '0152',
'SP2A': '0154',
'SP2V': '0156',
'SP2B': '0158',
}
def sendFunction03(staNum, funCode, keyName):
list1 = []
list1.append(int('0x'+staNum, 16))
list1.append(int('0x'+funCode, 16))
list1.append(int('0x' + addressDict03[keyName][0:2], 16))
list1.append(int('0x' + addressDict03[keyName][2:4], 16))
list1.append(int('0x00', 16))
list1.append(int('0x02', 16))
crc16_func = crcmod.predefined.mkCrcFun('modbus')
a = bytes().fromhex(staNum + funCode + addressDict03[keyName] + '0002')
reslist = hex(crc16_func(a))[2:].zfill(4)
print(type(reslist[2:].upper()), reslist[:2].upper())
list1.append(int('0x' + reslist[2:], 16))
list1.append(int('0x' + reslist[:2], 16))
return list1
def sendFunction01(devAddress,funCode,keyName,cNum):
list2=[]
list2.append(int('0x'+devAddress, 16))
list2.append(int('0x' + funCode, 16))
list2.append(int('0x' + addressDict01[keyName][0:2], 16))
list2.append(int('0x' + addressDict01[keyName][2:4], 16))
list2.append(int('0x' + cNum[0:2], 16))
list2.append(int('0x' + cNum[2:4], 16))
crc16_func = crcmod.predefined.mkCrcFun('modbus')
a = bytes().fromhex(devAddress + funCode + addressDict01[keyName] + cNum)
reslist = hex(crc16_func(a))[2:].zfill(4)
print(type(reslist[2:].upper()), reslist[:2].upper())
list2.append(int('0x' + reslist[2:], 16))
list2.append(int('0x' + reslist[:2], 16))
return list2
def sendFunction05(staNum,funCode,keyName,zeroNum):
list3 = []
list3.append(int('0x' + staNum, 16))
list3.append(int('0x' + funCode, 16))
list3.append(int('0x' + addressDict05[keyName][0:2], 16))
list3.append(int('0x' + addressDict05[keyName][2:4], 16))
list3.append(int('0x' + zeroNum[0:2], 16))
list3.append(int('0x' + zeroNum[2:4], 16))
crc16_func = crcmod.predefined.mkCrcFun('modbus')
a = bytes().fromhex(staNum + funCode + addressDict05[keyName] + zeroNum)
reslist = hex(crc16_func(a))[2:].zfill(4)
print(type(reslist[2:].upper()), reslist[:2].upper())
list3.append(int('0x' + reslist[2:], 16))
list3.append(int('0x' + reslist[:2], 16))
return list3
def sendFunction10(staNum, funCode, keyName):
list4 = []
list4.append(int('0x'+staNum, 16))
list4.append(int('0x'+funCode, 16))
list4.append(int('0x' + addressDict03[keyName][0:2], 16))
list4.append(int('0x' + addressDict03[keyName][2:4], 16))
list4.append(int('0x00', 16))
list4.append(int('0x02', 16))
list4.append(int('0x04', 16))
list4.append(int('0x00', 16))
list4.append(int('0x00', 16))
list4.append(int('0x00', 16))
list4.append(int('0x00', 16))
crc16_func = crcmod.predefined.mkCrcFun('modbus')
a = bytes().fromhex(staNum + funCode + addressDict03[keyName] + '0002')
reslist = hex(crc16_func(a))[2:].zfill(4)
print(type(reslist[2:].upper()), reslist[:2].upper())
list4.append(int('0x' + reslist[2:], 16))
list4.append(int('0x' + reslist[:2], 16))
return list4
def hex8ToInt(s):
s = '{:032b}'.format(int(s,16))
return int(s[1:], 2) - int(s[0]) * (1 << 31)
def intToHex8(i):
return '{:08x}'.format(int((bin(((1 << 32) - 1) & i)[2:]).zfill(32), 2))
print(intToHex8(-1))
print(hex8ToInt('ffffffff'))