python tk protocol_Python Modbus_tk在树莓派上实现rtu master

利用 python modbus工具实现modbus从站的数据采集,很方便简单。Python Modbus 协议工具目前有下面三种:

modbus_tk:完整modbus协议栈的实现,支持modbus tcp/rtu{1.提供slave模拟器,即模拟modbus server:502),  web-based hmi master支持}

pymodbus:使用twisted实现的modbus完整协议(支持异步通讯)

MinimalModbus:只支持modbusrtu

Modbsu_tk库使用

execute(slave,功能代码,开始地址,quantity_of_x=0,output_value=0,data_format="",指定长度=-1)

实现数据读与写,用功能码很容易实现。

READ_COILS = 1读线圈READ_DISCRETE_INPUTS = 2读离散输入READ_HOLDING_REGISTERS = 3【读保持寄存器】READ_INPUT_REGISTERS = 4读输入寄存器WRITE_SINGLE_COIL = 5写单一线圈WRITE_SINGLE_REGISTER = 6写单一寄存器WRITE_MULTIPLE_COILS = 15写多个线圈 【强制多点线圈】WRITE_MULTIPLE_REGISTERS = 16写多寄存器 【写乘法寄存器】

master.execute(1,cst.READ_HOLDING_REGISTERS, 0, 3)

1—从设备地址

cst.READ_HOLDING_REGISTERS—读保持寄存器

0—开始地址

3—读三个字节

下面来一个简单的例子。

#!/usr/bin/env python

# -*- coding: utf_8 -*-

"""

Modbus TestKit: Implementation of Modbus protocol in python

(C)2009 - Luc Jean - luc.jean@gmail.com

(C)2009 - Apidev - http://www.apidev.fr

This is distributed under GNU LGPL license, see license.txt

"""

import serial

import modbus_tk

import modbus_tk.defines as cst

from modbus_tk import modbus_rtu

#PORT = 1

PORT = "/dev/ttyUSB0"

def main():

"""main"""

logger = modbus_tk.utils.create_logger("console")

try:

#Connect to the slave

master = modbus_rtu.RtuMaster(

serial.Serial(port=PORT, baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0)

)

master.set_timeout(5.0)

master.set_verbose(True)

logger.info("connected")

logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 1, 1))

#send some queries

#logger.info(master.execute(1, cst.READ_COILS, 0, 10))

#logger.info(master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 8))

#logger.info(master.execute(1, cst.READ_INPUT_REGISTERS, 100, 3))

#logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 100, 12))

#logger.info(master.execute(1, cst.WRITE_SINGLE_COIL, 7, output_value=1))

#logger.info(master.execute(1, cst.WRITE_SINGLE_REGISTER, 100, output_value=54))

#logger.info(master.execute(1, cst.WRITE_MULTIPLE_COILS, 0, output_value=[1, 1, 0, 1, 1, 0, 1, 1]))

#logger.info(master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 100, output_value=xrange(12)))

except modbus_tk.modbus.ModbusError as exc:

logger.error("%s- Code=%d", exc, exc.get_exception_code())

if __name__ == "__main__":

main()

用modsim在window下充当slave设置如下:

在树莓派下运行结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值