首页 > 编程问答 >Modbus TCP/ip Logosoft Comfort V8

Modbus TCP/ip Logosoft Comfort V8

时间:2024-07-30 04:03:19浏览次数:17  
标签:python tcp modbus

我正在做一个学校项目,其中包括徽标和我的计算机之间的 tcp/ip 通信,但我无法使其工作。我并不是想创建一个服务器,我只是想将一个值从我的计算机发送到徽标的网络数字输入。 标志ip:192.168.0.2 网络输入 ID:1 TCP/IP 端口:502 网络输入地址:1

Estoy haciendo un proyecto escolar,que incluye una comunicacion tcp/ip entre un logo y mi computadora,pero no puedo hacer que funcione.没有 estoy tratando de hacer un servidor,solo quiero enviar un valor desde mi computadora a una entrada digital de red en el logo.

Logo ip: 192.168.0.2 红色入口 id:1 TCP/IP 港口:502 红色入口,方向:1

导入插座 从 umodbus 导入conf from umodbus.client import tcp

conf.SIGNED_VALUES = True

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('192.168.0.2', 502))

消息 = tcp.write_single_coil(slave_id=1, 地址=1, 值=1)

响应 = tcp.send_message(消息, 袜子) 打印(响应) 袜子.close() print("传输完成")

尝试: 从 pymodbus.client.sync 导入 ModbusTcpClient 除了 ModuleNotFoundError: # 如果是法雅第一选项,美国第二进口选项 从 pymodbus.client 导入 ModbusTcpClient

ip_address = '192.168.0.2' port = 502 # Modbus TCP 端口缺陷

client = ModbusTcpClient(ip_address, port)

if not client.connect(): print("No se pudo conectar al cliente Modbus") 别的: print("Conexión exitosa")

# Escribir un valor digital en una bobina
def write_digital(client, address, value):
    result = client.write_coil(address, value)
    if result.isError():
        print(f"Error al escribir el valor en la puerta digital: {result}")
    else:
        print("Valor escrito correctamente en la puerta digital")

# Dirección de la bobina digital (depende de la configuración del Siemens LOGO!)
coil_address = 0x0001
# Valor a escribir en la bobina digital (True para encender, False para apagar)
digital_value_to_write = True

# Escribir el valor digital
write_digital(client, coil_address, digital_value_to_write)

# Cerrar la conexión
client.close()
print("Conexión cerrada")

Probe dos codigos, pero ninguno funcionó, el primero devolvio este 错误:我尝试了这两个代码,但没有一个起作用,第一个返回此错误: 回溯(最近一次调用最后一次): 文件“C:\Users\ruths\AppData\Local\Programs\Python\Python39\modbus.py”,第 16 行,位于 响应= tcp.send_message(消息,袜子) 文件“C:\Users\ruths\AppData\Local\Programs\Python\Python39\lib\site-packages\umodbus\client\tcp.py”,第 261 行,在 send_message 中 response_error_adu = recv_exactly(sock.recv,Exception_adu_size) 文件“C:\Users\ruths\AppData\Local\Programs\Python\Python39\lib\site-packages\umodbus\utils.py”,第 132 行,recv_exactly 块=recv_fn(大小-recv_bytes) ConnectionResetError: [WinError 10054] Se ha forzado la interrupción de una conexiente por el host remoto

我尝试了这两个代码,但没有一个起作用,第一个返回此错误: 回溯(最近一次调用最后一次): 文件“C:\Users\ruths\AppData\Local\Programs\Python\Python39\modbus.py”,第 16 行,位于 响应= tcp.send_message(消息,袜子) 文件“C:\Users\ruths\AppData\Local\Programs\Python\Python39\lib\site-packages\umodbus\client\tcp.py”,第 261 行,在 send_message 中 response_error_adu = recv_exactly(sock.recv,Exception_adu_size) 文件“C:\Users\ruths\AppData\Local\Programs\Python\Python39\lib\site-packages\umodbus\utils.py”,第 132 行,recv_exactly 块=recv_fn(大小-recv_bytes) ConnectionResetError: [WinError 10054] Se ha forzado la interrupción de una conexente por el host remoto

El segundo codigo devuelve este error:[WinError 10054] Se ha forzado la interrupción de una conexiente por el host remoto

the第二个返回:[WinError 10054] Se ha forzado la interrupción de una conexion exente por el host remoto

我不知道该怎么办。


好的,我明白了。想使用 Python 通过 Modbus TCP/IP 控制 Siemens LOGO!PLC。看来遇到的问题是连接被远程主机重置,这意味着 LOGO!PLC 未响应的请求。

让我们一步一步解决这个问题,并确保的代码能够正常工作。

1. 确认 LOGO!PLC 设置

  • 启用 Modbus TCP/IP: 确保在 LOGO!Comfort 软件中启用了 Modbus TCP/IP 通信。这通常在通信设置中完成。
  • IP 地址和端口: 确认 LOGO!PLC 的 IP 地址确实是 192.168.0.2,并且端口号是 502。
  • 网络数字输入地址: 在 LOGO!Comfort 软件中,确认网络数字输入的地址是否确实是 1。需要注意的是,Modbus 地址通常从 0 开始,因此地址 1 可能对应 LOGO!Comfort 中的地址 0。
  • 防火墙: 确保的计算机和 LOGO!PLC 之间没有防火墙阻止 Modbus TCP/IP 通信(端口 502)。

2. 检查 Python 代码

提供的两个代码示例都有一些问题需要修正:

  • 第一个代码示例 (umodbus):

    • slave_id 应该是 LOGO!PLC 的 Modbus 从站 ID,而不是 1。请在 LOGO!Comfort 软件中查看正确的从站 ID。
    • 需要将 write_single_coil 函数的返回值赋给 message 变量。
  • 第二个代码示例 (pymodbus):

    • coil_address 需要使用正确的 Modbus 地址格式。例如,如果网络数字输入地址在 LOGO!Comfort 中是 1,那么 coil_address 应该是 0x0000

3. 修改后的代码示例 (pymodbus)

建议使用 pymodbus 库,因为它更加稳定和易用。以下是一个修正后的代码示例,需要将 slave_id coil_address 替换为实际值:

from pymodbus.client import ModbusTcpClient

ip_address = '192.168.0.2'
port = 502
slave_id =  # 替换为 LOGO!PLC 的 Modbus 从站 ID
coil_address = 0x0000  # 替换为网络数字输入的 Modbus 地址

client = ModbusTcpClient(ip_address, port)

try:
    client.connect()
    print("连接成功")

    result = client.write_coil(coil_address, True, unit=slave_id)
    if result.isError():
        print(f"写入数字输出失败: {result}")
    else:
        print("已成功写入数字输出")

finally:
    client.close()
    print("连接已关闭")

4. 测试和调试

  • 运行修改后的代码并观察输出。
  • 如果仍然遇到 ConnectionResetError ,请使用 Wireshark 等网络分析工具捕获 Modbus TCP/IP 通信数据包,以查看是否存在错误或通信问题。

希望这些步骤可以帮助解决问题!如果还有其他问题,请随时告诉我。

标签:python,tcp,modbus
From: 78808844

相关文章

  • 即使安装了软件包,也找不到 python 模块句子转换器
    对于我的python脚本(如下所示),我使用句子转换器包,其中包含SBERT模型。即使在执行“piplist”时明确列出该软件包,并且还安装了torch,所有内容都更新到最新版本,但仍然找不到该模块。脚本:importnumpyasnpimportpandasaspdfromsentence_transformersimportSenten......
  • 有没有办法在 python 中返回类实例的布尔属性?
    我想组织我玩的游戏中的汽车数据。为此,我创建了一个“Car”类。我希望将此类实例的一些属性作为布尔值,这样我就可以将此类的所有实例放入列表中并过滤它们。我当前的解决方案不起作用,因为,我收到以下错误消息:TypeError:__repr__returnednon-string(typeCar)我使用......
  • python 正则表达式匹配一行中的多个单词而不转到下一行
    我正在编写一个解析器来解析以下输出:admin@str-s6000-on-5:~$showinterfacestatusEthernet4InterfaceLanesSpeedMTUAliasVlanOperAdminTypeAsymPFC------------------------------------------......
  • 使用 Python 平滑和对称不规则形状和曲线
    我需要完成三项任务:正则化曲线曲线的对称性完成不完整的曲线例如,这里是输入和预期的输出图像:输入输出|||在一般设置中,形状可以由任何SVG曲线基元(贝塞尔曲线、直线、弧线)表示。为了统一表示,示例包含曲线的折线近似。这些折线保存为......
  • 在Python中通过绝对路径引用数据文件夹
    我有一个大型python项目,其中数据太大,无法每次都以相同的方式共享。不同的人可能会使用网络位置或将某些内容复制到本地驱动器。该路径由不同子文件夹中的脚本和笔记本使用。例如,我将创建一个config.py来定义数据文件夹的路径。importsyssys.path.append('../'......
  • python三天速成记(看完你就会)day3 满满干货~
    续上文啦~EXCEL表的操作上一篇文章讲了怎么读取和操作txt和csv文档,但其实我们生活中还有一个常用的文本格式那就是excel文件,特别是在对大量数据进行处理的时候。excel文件的用处和广泛。其实在python中有很多库可以处理excel文件,但是本文主要介绍使用最实用最广泛的库pan......
  • Python输入验证改进的其他方式
    题目[题目来源:Python编程快速上手——让繁琐工作自动化(第二版)第三章实践项目,下面的解答程序为我自己完成的,仅供参考。]编写一个名为collatz()的函数,他有一个名为number的参数。如果参数是偶数,那么collatz()就输出number//2,并返回该值。如果参数是奇数,那么collatz()就......
  • Python的PyInputPlus模块
    PyInputPlus模块简介PyInputPlus模块的功能:PyInputPlus模块是一个Python第三方模块,需要自己对它进行安装。包含与input()函数类似的、用于多种数据(如日期、数字、电子邮箱地址等)的函数。如果,用户输入了无效的内容,例如格式错误的日期或超过预期范围的数字,那么PyInputPlus模......
  • 用Python实现二进制搜索(二分查找)
    二进制搜索(binarysearch,又称二分搜索)是一种快速有效的搜索方法,用于搜索有序列表中的元素。importmathdefbinary_search(sorted_list,target):"""在有序列表sorted_list中查找目标值target的位置使用二分查找算法"""lower_bound=0#初始......
  • 超详细Python教程——使用Hexo搭建自己的博客
    使用Hexo搭建自己的博客对于一个程序员来说,搭建一个属于自己的博客平台是非常有意义的事情。首先,博客可以记录自己的成长历程,也是对自己一段时间学习和工作的总结和沉淀;其他,通过博客可以营销自己,增强自己在互联网或行业内的影响力,为将来更好的职业生涯打一个坚实的基础。前......