python获取modbus数据演示,modbus_tk上传数据,这一切的前提是我用的485通信

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通信_第1张图片

python获取modbus数据演示,modbus_tk上传数据,这一切的前提是我用的485通信_第2张图片

你可能感兴趣的:(modbus)