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设置如下:

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

`modbus_tk` 库是一个用于 PythonModBus 协议库,它支持 TCP、RTU 和 ASCII 方式的数据传输。在这个库中,`modbus_tcp` 主要用于通过 TCP 连接发送和接收 ModBus 数据包。下面将详细介绍如何使用 `modbus_tk.modbus_tcp` 模块向远程设备发送信息。 ### 发送信息的基本步骤 1. **初始化 ModBus TCP 客户端**: 首先,你需要创建一个 `ModbusTcpClient` 对象并提供目标主机 IP 地址和端口号。默认端口是 502。 ```python import modbus_tk as mt from modbus_tk import modbus_tcp client = modbus_tcp.ModbusTcpClient_(host='your_host_ip', port=your_port) ``` 2. **连接到服务器**: 确保客户端已经与目标服务器建立了连接。 ```python if not client.connect(): print("无法连接到服务器") else: print("已成功连接") ``` 3. **读取或写入数据**: 使用 `read_holding_registers` 或 `write_single_register` 函数发送指令: - **读取寄存器值**: ``` holding_registers = client.read_holding_registers(address=starting_address, count=number_of_registers) print(holding_registers.registers) ``` - **写入寄存器值**: ``` result = client.write_single_register(address=register_address, value=new_value) ``` 4. **关闭连接**: 执行完操作后记得关闭连接。 ```python client.close() ``` ### 示例代码片段 ```python import modbus_tk as mt from modbus_tk import modbus_tcp # 初始化 ModBus TCP 客户端 client = modbus_tcp.ModbusTcpClient_(host='192.168.1.100', port=502) try: # 连接到服务器 if not client.connect(): print("无法连接到服务器") else: print("已成功连接") # 写入寄存器值示例 result = client.write_single_register(address=10, value=50) # 写入地址 10 的单个寄存器值为 50 print(f"写入结果: {result}") except Exception as e: print(e) finally: # 关闭连接 client.close() ``` ### 相关问题: 1. `modbus_tk` 库还支持哪些协议类型以及它们的区别是什么? 2. 如何配置 ModBus TCP 客户端以支持 SSL/TLS 加密通信? 3. 当使用 `modbus_tk` 进行 ModBus 通信时,遇到常见的错误和异常应该怎样解决?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值