ModbusTcp获取数据

ModbusTcp获取数据

记录一个用 pymodbus 库来获取数据的代码。

  • 注意:
    • 1.读取寄存器地址是16进制的。
    • 2.大小端转换通过代码知道原理。
    • 读取数据时,切记频率别太高,否则会出现连接被关闭问题。
cpp 复制代码
from pymodbus.client.sync import ModbusTcpClient
import struct
from datetime import datetime 
import time
def read_coordinate(host, port, register_address, unit_id,coordinate):
    """
    通过Modbus TCP读取机械臂的X坐标值。

    参数:
    host (str): Modbus TCP服务器的IP地址。
    port (int): Modbus TCP服务器的端口号。
    register_address (int): 存储X坐标值的第一个寄存器地址。
    unit_id (int): Modbus设备的单元ID,默认为1。

    返回:
    float: 机械臂的X坐标值,如果读取失败则返回 None。
    """
    start_time = datetime.now()
    client = ModbusTcpClient(host, port)
    try:
        if client.connect():
            # 读取两个连续的寄存器
            response = client.read_holding_registers(address=register_address, count=6, unit=unit_id)
            if response.isError():
                print(f"Modbus error: {response}")
                return None
            else:
                # 获取两个寄存器的值
                registers = response.registers
                coordinates = []
                for i in range(0,6,2):
                    #小端模式
                    combined_value = (registers[i + 1] << 16) | registers[i]
                    #大端模式
                    # combined_value = (registers[i] << 16) | registers[i + 1]
                    # 将两个寄存器的值组合成一个32位整数
                    coordinate_value = struct.unpack('!f', struct.pack('!I', combined_value))[0]
                    coordinates.append(coordinate_value)
                coordinate.extend(coordinates)
                return coordinates
        else:
            print("Failed to connect to Modbus server")
            return None
    finally:
        client.close()

if __name__ == "__main__":
# 示例使用
    host = '192.168.2.100'  # 替换为实际的Modbus服务器IP地址
    port = 502              # 替换为实际的Modbus服务器端口号
    register_address = 0x54 # 替换为实际的寄存器地址
    unit_id = 1
    coordinate = []

    while True:
        coordinate = read_coordinate(host, port, register_address,unit_id,coordinate)
        if coordinate is not None:
            x_coordinate = coordinate[0] * 1000
            y_coordinate = coordinate[1] * 1000
            z_coordinate = coordinate[2] * 1000
            print(f"机械臂的Xyz坐标值: {x_coordinate,y_coordinate,z_coordinate}")
            coordinate.clear()
        else:
            print("无法读取机械臂的X坐标值")
        time.sleep(0.2)
相关推荐
AIHE-TECH3 个月前
ModbusTCP/RTU转Ethernet/IP(CIP)-Modbus设备与罗克韦尔AB的PLC之间通讯
modbustcp·modbusrtu·ethernet/ip·eip·罗克韦尔ab·plc通讯·cip
ggtc7 个月前
基于WebSocket的modbus通信(二)- 客户端
modbustcp·websocket·netcore
weixin_426602141 年前
上海泗博HART转ModbusTCP网关HME-635应用案例之组态王和超声波液位计通信
网络·modbustcp·hart转modbustcp·hart协议
小天爱折腾1 年前
EtherCAT转Modbus网关做为 MODBUS 从站配置
modbustcp·modbus转profinet·ethercat转·modbus网关·485modbus转profinet网关·485转profinet网关·ethercat转modbus网关·modbusrtu转profinet·modbustcp转profinet主站·plc协议转换模块
朱尔斯Jules1 年前
【ModbusTCP协议】
网络·modbustcp·协议
weixin_426602141 年前
Modbus TCP/BACnet IP/MQTT物联网网关IOT-810介绍及其典型应用
物联网·bacnet·modbustcp·mqtt·网关