modbus tcp

demo.py

# demo:modbus_tcp应答机制
import modbus_tk.defines as md
import modbus_tk.modbus_tcp as mt
from xlwt.compat import xrange


class ConfigModbus(object):
    host = "127.0.0.1"
    port = 502


# 创建连接对象
master = mt.TcpMaster(ConfigModbus.host, ConfigModbus.port)
master.set_timeout(5.0)

print('连接成功')

try:
    # master.execute 远程连接到服务器端
    # 判断是否链接正常

    START_POS = 0  # 起始位置
    MAX_LENGTH = 10  # 取值的位数
    # md.READ_HOLDING_REGISTERS  # modbus读取保持寄存器 3
    Hold_value = master.execute(slave=1, function_code=md.READ_HOLDING_REGISTERS, starting_address=START_POS,
                                quantity_of_x=MAX_LENGTH, output_value=5)
    print(Hold_value)

    # 写寄存器起始地址为0的保持寄存器,操作寄存器个数为68
    START_POS = 0  # 起始位置
    MAX_LENGTH = 10  # 取值的位数
    # md.READ_HOLDING_REGISTERS  # modbus读取保持寄存器 3
    output_value_2 = [1,1,1,1,1,1,1,1,1,1,]
    data = master.execute(slave=1, function_code=md.WRITE_MULTIPLE_REGISTERS, starting_address=START_POS,
                          quantity_of_x=MAX_LENGTH, output_value=output_value_2)
    print(data)
    Hold_value = master.execute(slave=1, function_code=md.READ_HOLDING_REGISTERS, starting_address=START_POS,
                                quantity_of_x=MAX_LENGTH, output_value=5)
    print(Hold_value, '程序结束')


except Exception as e:
    print("error:", e)
    pass


配合mod_RSsim.exe软件使用
软件下载地址:mod_RSsim.exe

在这里插入图片描述

### Modbus TCP 协议概述 Modbus TCP 是一种基于以太网的工业通信协议,它继承了传统 Modbus 的简单性和可靠性,并扩展至现代网络环境。该协议利用 TCP/IP 协议栈中的传输控制协议 (TCP),使得设备间可以通过局域网或广域网实现高效的数据交换。 #### 物理层与数据链路层 Modbus TCP 使用标准以太网作为其底层支持技术,在物理层和数据链路层遵循 IEEE 802.3 标准[^1]。这意味着它可以无缝集成到现有的企业级 IT 基础设施中。 #### 网络层与传输层 在网络层方面,Modbus TCP 利用了 IPv4 或 IPv6 地址来唯一标识网络上的节点;而在传输层,则依赖于可靠的面向连接的服务——即 TCP 连接[^1]。默认情况下,服务器监听端口为 **502** 来接收来自客户端请求的消息包。 ### 报文结构分析 一条典型的 Modbus TCP 请求消息由以下几个部分组成: - **事务处理器ID(Transaction Identifier, TID)**: 用于匹配请求与响应之间的关联关系。 - **协议标识符(Protocol Identifier, PID)**: 当前固定设置为零表示这是一个纯 Modbus/TCP 数据帧。 - **长度字段(Length Field)**: 表明后续字节的数量不包括前面六个字头在内的实际有效载荷大小。 - **单元标识符(Unit ID/Slave Address)**: 指定目标从机地址或者本地主机自身当值设为255时表示广播模式操作。 - **功能码(Function Code)**: 定义执行何种类型的访问动作,例如读输入寄存器(0x04),写单个线圈状态(0x05)等等。 - **数据区(Data Area)**: 包含具体的操作参数以及附加信息依据所选的功能而变化。 下面给出一段 Python 示例代码展示如何构建并解析简单的 Modbus TCP 查询命令: ```python import struct def create_modbus_request(slave_id, function_code, start_address, quantity): tid = b'\x00\x01' # Transaction ID example value pid = b'\x00\x00' # Protocol identifier always zero for Modbus/TCP length = struct.pack('>H', 6) # Length of the following fields in bytes unit_id = bytes([slave_id]) request_pdu = bytes([function_code]) + \ struct.pack('>H', start_address) + \ struct.pack('>H', quantity) full_packet = tid + pid + length + unit_id + request_pdu return full_packet packet = create_modbus_request(1, 3, 0, 10) print(packet.hex()) ``` 此函数创建了一个针对特定 Slave 设备发起的标准 Modbus PDU 请求序列号 `0x01` ,尝试获取从第一个保持寄存器开始连续十个数值的内容。 ### 应用场景实例 假设存在一台 PLC 控制器充当 Modbus Server 并开放 IP 地址为 `192.168.1.10`, 用户希望远程监控其中存储的一些工艺变量如温度设定点等。此时可通过编写应用程序向上述地址发送适当构造好的 Modbus TCP 报文从而提取所需实时监测量。 另外值得注意的是尽管提供了官方文档解释各个细节但是实践过程中难免遇到兼容性问题因此建议观看相关教学视频进一步加深理解[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值