问题标签 [libmodbus]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
500 浏览

c - libmodbus - 监控和重启连接

我正在 Linux 上开发一个 Modbus TCP 客户端,以使用libmodbus与不同的 Modbus 设备进行通信。

为了初始化 TCP 连接,int modbus_connect(modbus_t *ctx);调用该函数并在连接成功时返回 0。

我需要一个单独的线程来持续监视与设备的 TCP 连接,以查看它是否仍然连接,如果没有,请尝试再次连接。

不断调用modbus_connect以检查连接是否成功将创建多个连接,这不是我想要的。

我可以尝试不断尝试从设备读取数据,如果出现错误,请检查错误代码并尝试再次连接。但是,对 Modbus 设备的写入和读取发生在不同的类和线程中,这些类和线程应该从通信控制中提取。

libmodbus 中似乎没有任何功能支持这一点。

任何建议表示赞赏。

0 投票
0 回答
497 浏览

c++ - 是否可以实现基于 libmodbuspp 的 Modbus 主设备,它使用 RTU over TCP 与 TCP/RTU 网关后面的 RTU 从设备通信?

我正在开发一个 C++ Modbus应用程序,它已经使用libmodbuspp库来实现一个 Modbus 主设备,以在 TCP 或 RTU 模式下查询Modbus 从设备(分别用于通过以太网或 RS-232/485 串行链路连接的设备)。它已经工作正常,但最近设置了一个新要求,即此应用程序还应该通过 TCP 实现 RTU,因此它能够通过 TCP 与网关通信,该网关有许多 RTU Modbus 从设备连接到它的许多串行端口(网关只是将 RTU 数据包转发到其中设置的相应从属 ID)。基本上这意味着我们的应用程序应该通过 TCP/IP 连接而不是串行端口发送 Modbus RTU PDU。

对于一个快速而肮脏的解决方案(可能对其他人有帮助),我使用socat创建一个虚拟串行端口,该端口具有到目标 TCP 网关的出站 TCP 连接,使我的应用程序仅在其常规 RTU 模式下工作(虚拟串行端口是/dev/ttyS4和TCP 网关端点192.168.0.10:8000):

socat -d -d pty,link=/dev/ttyS4,raw,echo=0 tcp-connect:192.168.0.10:8000

但对于最终应用程序,我想要更干净的东西,而不依赖于外部应用程序。

我想知道是否可以使用libmodbuspp 的 virtual-rtu层来实现这一点。虽然libmodbuspp 文档非常好,但似乎这是一个新功能,所以对我来说还不是很清楚。文档和示例仅显示它可以通过服务器路由器(专用服务器)通过 TCP 接收 RTU,而后者又可以到达与这些对象关联的 RTU 从站,但我需要的恰恰相反:能够连接到作为客户端的 TCP 端点,但向其发送 Modbus RTU 而不是 Modbus TCP 数据报。

由于libmodbuspp库实际上是众所周知的 Modbus C 库libmodbus的 C++ 包装器,因此也有可能使用libmodbus 的这个分支,它增加了对 RTU over TCP 的支持,但我宁愿不必在 C++ 中重新实现支持包装库libmodbuspp如果它已经以某种方式支持它(但可能以不完整的方式 - 不在客户端连接中)。也许更熟悉libmodbuspp代码库的人可以在这里给我一些指示?谢谢!

0 投票
1 回答
260 浏览

c++ - C++ 减少 modbus_connect 超时

我想尝试 10 个即时 modbus 连接。但是,每次我无法连接时,我必须等待 2 分钟才能进行下一次连接,因为之前的 modbus_connect 调用仍在主动监听。所以,如果我连接失败 10 次,我必须等待 20 分钟。

有人可以帮我减少超时时间吗?我正在使用 Libmodbus v3.1.6

0 投票
2 回答
915 浏览

c - libmodbus:如何编译包含 libmodbus 库的应用程序?

我的应用程序编译有问题,它基于libmodbus库: https ://github.com/stephane/libmodbus

我尝试使用以下命令对其进行编译: cc pkg-config --cflags --libs libmodbus modbus.c -o modbus

但我收到以下错误:

我将不胜感激任何帮助!

此致!

0 投票
1 回答
65 浏览

c++ - 使用 std::mutex 时遇到问题

我在使用std::mutex( cpp ) 序列化对共享资源的访问时遇到问题(我需要使用非线程安全的 libmodbus。我目前正在尝试通过在 modbus_write_registers 函数mutex.lock()之前放置一条语句来序列化对它的访问。我释放我函数末尾附近的互斥锁。)

我的问题的本质是,看起来多个线程能够同时获取互斥锁上的锁。

我尝试了几种不同的编译器版本,我尝试使用std::lock_guard的结果都是一样的。

这里有一些技术:

一些代码:

我的写功能

我的主要:

  • ModbusClientObject 是一个具有std::mutexComLock 作为私有成员的类的对象,以及一个“libmodbus”上下文数据成员 pToModbusServer...

  • 据我所知,我正在将 1 个对象的地址传递给所有线程,我确保所有线程在运行时都为其地址显示相同的值。而且我没有在任何地方显式地创建另一个 Modbus 包装类的实例。

我的终端显示连续的“锁定后”消息,它们之间没有“modbus_write 之后和睡眠之前”消息,并且匹配的 modbus_write_registers 调用失败并出现各种内存损坏错误(正如非线程安全的库所预期的那样)。

任何帮助,将不胜感激。
:-) 奥马尔

0 投票
0 回答
43 浏览

c - 在 C 中使用 libmodbus 实现 modbus 网关功能

我参与了使用 libmodbus 库在 C 中实现网关功能的项目。在服务器端,我正在尝试使用 modbus_read_input_registers() 函数读取设备。现在我想通过 tcp 将接收到的消息从实际设备发送到主/客户端。我已经可以从主/客户端发送请求并在网关设备上接收它。我检查功能代码和地址并分别读取设备。一旦我成功地从设备获得响应,我想将响应发送回客户端。我有以下查询:

  1. 我可以使用 modbus_mapping_new() 或映射数据变量将响应发送到主/客户端吗?
  2. 有没有其他方法可以将响应发送给客户端?
0 投票
1 回答
34 浏览

python - 关闭在 dll 中创建的套接字

我正在 Windows 操作系统上使用 python 中的 libmodbus.dll 创建一个 modbus 从站。我使用 ctypes 来加载 dll 并利用它的功能。我在这里模仿了一个示例代码。dll 中的一个调用最终打开了一个套接字

在示例的末尾,它有一行关闭套接字,如下所示

close()不是 libmodbus.dll 的一部分。它来自图书馆#include <unistd.h>。有没有办法关闭套接字而不必获取具有该close()功能的 dll?close()如果没有,我将如何在 Windows 平台上访问该命令?据我所知unistd.h是针对posix的。

0 投票
0 回答
91 浏览

c - 如何使用libmodbus,使用makefile?

我在一个新项目中工作,我需要使用 modbus tcp/ip ...当前项目已经有一个 makefile,主要问题是我不知道如何编辑 makefile 以链接库。

任何人都可以帮助我吗?请!

你好!我在一个新项目中工作,我需要使用 modbus tcp/ip ...当前项目已经有一个 makefile,主要问题是我不知道如何编辑 makefile 以链接库。

任何人都可以帮助我吗?请!你好!我在一个新项目中工作,我需要使用 modbus tcp/ip ...当前项目已经有一个 makefile,主要问题是我不知道如何编辑 makefile 以链接库。

任何人都可以帮助我吗?请!

这是制作文件

这是代码

0 投票
0 回答
254 浏览

c++ - libmodbus 库的 modbus_read_registers() 无法在 Raspbian GNU/Linux 10 (buster) 上读取 RS485 数据,但能够在 Yocto Dizzy Release 上读取

我正在使用下面的 c\c++ 示例代码来使用 libmodbus 读取 Modbus RTU 数据。我有两个不同的基于 linux 的网关,一个有 Raspbian GNU/Linux 10 (buster),另一个有 Yocto Dizzy Release。使用 libmodbus lib,我能够读取两个网关上的 modbus tcp 数据。但是对于 modbus rtu (RS485) 的 Raspbian GNU/Linux 10 (buster),我在读取缓冲区时遇到连接超时。两种网关还有一个区别,即 Raspbian GNU/Linux 10 (buster) 使用 ttyUSB0 端口,而 Yocto Dizzy Release 使用 linux 的 ttymxc2 端口。

但是当我在 Raspbian GNU/Linux 10 (buster) 上使用 pymodbus 在 python 中尝试示例代码时,我能够读取数据。

有人可以帮助确定在 c++ 中使用 libmodbus for Raspbian GNU/Linux 10 (buster) 的 modbus rtu (RS485) 出了什么问题。

0 投票
1 回答
219 浏览

c - 尝试编译 mbrtu 时找不到 Libmodbus 库

我试过:

下载、编译和安装libmodbus库。现在我在 /usr/local/lib/ 中有一个 libmodbus.a 文件。

现在我要安装 mbrtu:

奇怪的是,在 make 之后我得到了错误:

我尝试将库路径 /usr/local/lib/ 添加到 $LD_LIBRARY_PATH,但这根本没有帮助。

有人可以解释一下如何正确编译和安装 libmodbus 库吗?