import time
import serial
import serial.tools.list_ports
import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
from binascii import *
from crcmod import *
def crc16Add(read):
crc16 = crcmod.mkCrcFun(0x18005, rev=True, initCrc=0xFFFF, xorOut=0x0000)
readcrcout = hex(crc16(unhexlify(read))).upper()
str_list = list(readcrcout)
if len(str_list) == 5:
str_list.insert(2, '0') # 位数不足补0
crc_data = "".join(str_list)
# print(crc_data)
read = read.strip() + crc_data[4:] + crc_data[2:4]
# print('CRC16校验:', crc_data[4:] + ' ' + crc_data[2:4])
# print('增加Modbus CRC16校验:>>>', read)
return read
PORT = 'COM11' # windows 端口是不一样的 看你插的usb口是那个
def HexToByte(hexStr):
return bytes.fromhex(hexStr)
def str_to_hex(s):
return ''.join([hex(ord(c)).replace('0x', '') for c in s])
def hex_to_str(s):
return ''.join([chr(i) for i in [int(b, 16) for b in s.split(' ')]])
def str_to_bin(s):
return ' '.join([bin(ord(c)).replace('0b', '') for c in s])
def bin_to_str(s):
return ''.join([chr(i) for i in [int(b, 2) for b in s.split(' ')]])
def modbus_getdate(slave_id, start_addr, date_len):
try:
master = modbus_rtu.RtuMaster(serial.Serial(port=PORT,
baudrate=38400,
bytesize=8,
parity='N',
stopbits=1,
xonxoff=0))
#master 设置的不同参数也不同,要注意这里
# logger = modbus_tk.utils.create_logger(name="console", record_format="%(message)s")
master.set_timeout(5)
master.set_verbose(True)
# print('connected')
# logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 125))
# read 方法
holding_date = master.execute(slave_id, cst.READ_HOLDING_REGISTERS, start_addr, date_len)
holding_data125 = []
for i in range(len(holding_date)):
holding_data125.append('%04x' % (holding_date)[i]) # append()在Tmp1列表末尾添加新的对象
# all_holding_data = '%02x'%slave_id + '035a' + ''.join(holding_data125)
all_holding_data = '0103' + '%02x' % (date_len * 2) + ''.join(holding_data125)
# print(all_holding_data)
all_holding_data_crc16Add = crc16Add(all_holding_data) # 增加Modbus CRC16校验值后的值
# print(all_holding_data_crc16Add)
return str(all_holding_data_crc16Add)
# write方法
# print(master.execute(35, cst.WRITE_MULTIPLE_REGISTERS, 9, output_value=[1]))
except modbus_tk.modbus_rtu.ModbusInvalidResponseError as err:
print(err)
# t1 = time.time()
datas=dict()
id = 15
for j in range(1, id + 1):
datas.update({j: modbus_getdate(slave_id=j, start_addr=0, date_len=45)})
time.sleep(0.3)
print(j)
print(datas[j])
# 若连接没成功输出的是None说明你的端口找对了,之后就是master的设置了
#有啥疑问可以留言
#使用for循环输出的数据 输出端口1-15的结果如下,结果是这样的说明 你的硬件已将数据上传成功
python获取modbus数据演示,modbus_tk上传数据,这一切的前提是我用的485通信
最新推荐文章于 2024-05-15 09:04:30 发布