Python获取modbus升级版,这是代码部分,硬件设置后期加入

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)
    read = read.strip() + crc_data[4:] + crc_data[2:4]
    return read


PORT = 'COM12'  # windows
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))
        # logger = modbus_tk.utils.create_logger(name="console", record_format="%(message)s")
        master.set_timeout(5)
        master.set_verbose(True)
        holding_date = master.execute(slave_id, cst.READ_HOLDING_REGISTERS, start_addr, date_len)
        holding_data125 = list()
        for i in range(len(holding_date)):
            holding_data125.append('%04x' % (holding_date)[i])  # append()在Tmp1列表末尾添加新的对象
        all_holding_data = '0103' + '%02x' % (date_len * 2) + ''.join(holding_data125)
        ddd = {'s': 0}
        ddd.update({'s': crc16Add(all_holding_data)})
        return str(ddd['s'])
    except modbus_tk.modbus_rtu.ModbusInvalidResponseError as err:
        print(err)
id = 16
datas = dict()
for i in range(1, id+1):
    datas.update({i: modbus_getdate(slave_id=i, start_addr=0, date_len=64)})
    time.sleep(0.3)
    print(i)
    print(datas[i])

数据结果展示
Python获取modbus升级版,这是代码部分,硬件设置后期加入_第1张图片

你可能感兴趣的:(modbus)