问题标签 [modbus]

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 投票
2 回答
1540 浏览

java - 使用基于 Web 的 Java 应用程序远程处理 PLC

我们正在开发一个模拟器应用程序,用户可以在其中创建模拟并运行逻辑。现在在我们项目的第二阶段,我们需要使用基于 Web 的应用程序进行硬件触发。我需要一些关于我将如何使用我的 java 代码与 PLC 机器交互的信息,我们正在使用 modbus 串行通信,但如果你有其他更好的解决方案可以更改。根据我的研究,我们已经看到了 OPC 服务器,但我没有从中得到任何东西。我想要有人可以帮助我了解什么是流动的。如何进行此操作。我是否必须编写驱动程序才能与我的应用程序和 PLC 进行通信。

完成这项任务需要完成的工作。如果您有任何链接,请分享

谢谢你

0 投票
1 回答
1961 浏览

python - 由于我的服务器实现的意外回答,Modbus TCP 客户端关闭了连接

我已经在 Python 中实现了一个基于 TCP 的 Modbus 作为服务器软件。应用程序是多线程的,并且严重依赖标准库。我在管理服务器端的连接时遇到问题。同时,我作为客户端的 Modbus over TCP 实现工作得很好。

实现说明

  • 服务器是多线程的,一个线程管理 SOCK_STREAM 套接字用于接收帧
  • 出于效率原因使用 select
  • 信号量用于防止在发送或接收时对套接字资源的并发访问
  • Modbus上层的封装是通过发送和接收方法透明地完成的,无论如何只是构建一个带有正确的头和有效载荷的帧......
  • 另一个线程运行,在其中调用 Modbus 发送和接收方法。

TCP 上下文

TCP 启动并运行,绑定到一个端口,最大客户端设置和侦听。

wireshark 下的痕迹显示:

  • 客户:SYN
  • 我的应用服务器:SYN、ACK
  • 客户:ACK

在服务器端,一个全新的套接字已按预期创建并绑定到客户端套接字。

到目前为止,一切都很好。

Modbus 上下文

  • 客户端:发送 Modbus 帧,TCP 标志 = 0x18,即 ACK + PUSH
  • 我的应用服务器:不等待并发送一个空 TCP 确认帧
  • 客户端:等待带有 tcp ack 标志的 modbus 帧。因此,将其视为错误并要求关闭连接。

因此,我的服务器软件之后无法发送任何实际响应,因为客户端的套接字正在关闭或已经关闭。

我的问题

  • 我收到一个主线程需要处理的 modbus 帧(服务器端)
  • 处理需要几毫秒,同时通过我的服务器套接字发送一个 TCP ACK 帧,而我希望它不发送任何东西!

您对如何管理 ACK 行为有任何想法吗?我已经阅读了有关 naggle 算法的内容,但它似乎不在问题的范围内……我不确定 setsockopt 方法的任何选项也能解决我的问题,但我可能弄错了。

如果您有任何建议,我很感兴趣......我希望我足够清楚。

0 投票
1 回答
696 浏览

.net - 从投票到事件的最佳方式是什么?

如果您将 300 字节的原始数据每秒 20 次解析成一堆 WPF 控件属性,您的解决方案是什么?

更具体地说,我有一个支持 Modbus 的 PLC,我需要制作一个 WPF HMI 来控制它。Modbus 是一种需要轮询数据更改的通信协议。相比之下,WPF 和 .NET 框架一般都提倡事件驱动模型,因此每秒 20 次将数据直接推送到控件中对我来说似乎很不自然。Modbus 不仅缺乏报告数据变化的手段,而且它不提供字节的高级表示,并且由开发人员正确地将一组无符号短裤分解成有意义的东西。

虽然解析这些数据对我来说没什么大不了的,但要正确转换为一堆启用事件的 DependencyProperties(假设为数据绑定)具有挑战性。我不希望有很多初始化代码或临时存储来监视更改。

0 投票
3 回答
6824 浏览

c - 复制不同数据类型的缓冲区内容

我正在编写一个运行在 MSP430 控制器上的 modbus 协议代码。响应缓冲区(全局)是一个 8 位数据数组,通过它对已处理请求的响应将在串行 UART 上发送。现在,我的问题是生成的响应包含不同数据类型的组合。即 uint8、uint32、浮点数。如何使用全局响应缓冲区发送此数据?

对于浮动,我尝试使用 memcpy,这似乎工作正常。有没有更好更有效的方法?因为帧大小很大(比如 20-30 字节)。这是我尝试做的演示

0 投票
3 回答
1993 浏览

c# - 多线程和串行端口

好的..这会很长,但我需要先解释一些背景。

我软件的这一部分用于对沿着传送带运行的物品进行分类。我正在为传送带使用 Modbus。Modbus 将在特定时间打开大门,让物品通过大门。物品将根据重量通过某些门。

我正在监控传感器以确定物品何时在秤上。当传感器被阻塞时,物品会被称重并发送到适当的门。定时器设置为打开/关闭大门。

我的代码将适用于此..问题是,它不适用于多个项目。我的意思是,当门打开时,传感器不会被监控,直到门关闭。因此,当物品 A 正在前往登机口的途中,物品 B 在挡住传感器时不会在秤上称重。我一次最多可以有 8 个项目。这是我现在正在运行的代码:

这段代码工作正常,我只需要能够考虑到多个项目就行了。有什么建议么????

我还尝试了以下方法:

当我这样做时,我在按下开始按钮时启动了两个线程。我得到各种异常,程序最终抛出 SEHException 并崩溃。我得到的其他错误说“串行端口已打开”或“I/O 错误”。

0 投票
1 回答
2193 浏览

c# - C# BackgroundWorker 和 Com 端口问题

好的。我有一个监控 2 个 COM 端口的程序。一个挂在秤上,另一个挂在 modbus 板上。

我的问题出在连接到 modbus 板的 COM 端口上。我的程序每 100 毫秒读取一个传感器(在 modbus 板上)。它返回 0 或 1(通过 COM 端口)以确定传感器是否被阻塞。如果它被阻塞,则会通过端口向电路板发送信号。

我的问题是我无法退出对传感器的监控,但在发送我的其他信号之前,我必须确保没有使用 com 端口。

监控传感器的例程在后台工作线程上。一旦传感器被触发,就会产生另一个线程,向 modbus 板发送信号。所以我需要在向电路板发送信号时暂停“传感器线程”。我该怎么做呢?

请记住,它是一个 BackgroundWorker,因此 Thread.Join 不是一个选项。

这是我的代码:

该线程的 RunWorkerCompleted 只是重新启动线程。以下线程不断监视“sensorstatus”以查看传感器何时被阻塞:

RunWorkerCompleted 为此重新启动此线程,使其成为循环

0 投票
1 回答
1582 浏览

silverlight - Windowsphone 上不存在 System.Net.Sockets.TcpClient,如何解决?

我正在开发一个连接到不同品牌 plc 的程序,因此使用不同的协议与它们通信。我找到了一个不错的小库(单击库项目页面)来实现 Modbus 协议。当我测试它(在控制台中)时,它就像一个魅力。但是现在我想在我的 windowsphone 应用程序上实现它,它会出现一些找不到命名空间的错误。

在google上一段时间后,我发现silverlight框架没有实现:System.Net.Sockets.TcpClient Namespace

因此我不能使用这个库。他们是否有任何“简单”的解决方法来克服这个问题?

0 投票
1 回答
543 浏览

silverlight - Modbus Tcp 用于 Silverlight

原始问题:

我正在寻找一个 silverlight 库或示例,它向我展示了如何使用 silverlight 框架通过 tcp 连接到 modbus 设备。

我找到了多个使用 tcpClient 的库,from system.net.sockets.tcpclient但这个命名空间在 silverlight 中不可用。所以 .net 库无法解决问题

另外,仅作为背景信息,我正在构建一个 windows phone 应用程序,并且我已经在 msdn 站点(链接)上查看了示例“在 windowsphone 中使用套接字”


编辑1:

经过一段时间的编程,我能够System.net.sockets仅使用库编写 modbus 设备的保持寄存器。问题是,我从我的 modbus 设备得到一个返回字节。另外,我有一个接收函数来读取 modbus 设备上的寄存器,它也返回字节。

我曾经捕获这样的字节(使用System.Net.Sockets.TcpClient

我要的是这些东西: 1. 中是否有System.net.Sockets与 Networkstream.Readbyte 具有相同功能的函数?2. 如果没有功能可以做同样的事情。还有其他方法吗,如果有,是否有示例,或者有人可以让我开始吗?

谢谢 :)


0 投票
2 回答
905 浏览

modbus - 在 SCADA 系统中,有没有办法让一个 modbus 主站与另一个主站对话?

我正在制作两个交换数据的 SCADA 系统。我的目标是在 tcp 上使用 modbus,因为两个系统都支持这个协议。当然,问题是这两个系统都只能充当 modbus 主站。

在所有现场总线开源的情况下,我很惊讶没有“桥接”实用程序可以让两个主站互相交谈。我对这些技术并不是特别精通,但从外部看来,实现一个打开两个端口并充当两个独立主机的从属的进程似乎是微不足道的。

两个主设备都将中介视为从设备,但来自 Master1 的 POV 的输入寄存器是来自 Master2 的 POV 的输出寄存器,反之亦然。

是否有任何东西,从概念上或协议方面,表明这是有问题的?

0 投票
1 回答
1007 浏览

c# - 通过 IP 与串行通信拒绝命令 MODBUS?

这很奇怪,我们有一个打印机设置,它有一个 IP 和它监听的端口,然后我们需要将打印作业发送到打印机。

我已经设法连接到打印机,但是每当我传输任何东西时,我都会在打印机上超时,或者它只是坐在那里什么都不做。

我知道我可以与打印机交谈,因为它显示在它的日志中。

到目前为止,我有以下内容:

根据手册,我需要执行以下操作:

正如您可能看到的,我不知道如何实现这一点,所以欢迎任何和所有帮助

一些附加信息,打印机没有附带驱动程序,所以据我所知,我需要将原始数据传输到打印机,打印机有一个串行连接,但它距离串行电缆太远,因此以太网连接在那里(我相信它是以太网串行)。

Dialog 的一般原理 计算机发送 ENQ(1 字节) 打印机发送 ACK(1 字节) 计算机发送数据(Ident 1 字节 | 长度 2 字节 | 数据 0 到 n 字节 | 校验和 1 字节) 打印机发送 Ack(1 字节)

当我过去使用串行时,我使用端口上的写入功能来发送数据,将数据放入缓冲区,一旦完成接收检查缓冲区,但我对如何在 IP 上执行此操作一无所知?