问题标签 [modbus-tcp]
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.
protocols - Modbus TCP/IP 转 BACnet
首先,我对此并不陌生,我曾尝试在谷歌上搜索答案,但认为最好问问专家。
有一个使用 BACnet 协议的楼宇管理系统 (BMS),但我的设备记录器只有 Modbus TCP/IP。我知道市场上有一个转换器,但我想知道这个概念。
Modbus TCP/IP 具有专门用于读取特定参数的注册表值(例如 40135)。转换器如何在 BACnet BMS 中读取此注册表值?您是否必须在转换器软件中为 BACnet 的输出指定此注册表值?
一般情况下,BACnet端读取接收功率等设备参数应该输入什么?
在这种情况下,BACnet BMS 是否将 MASTER 和设备视为 SLAVE?
我希望有人可以花一些时间来消除我对此的怀疑。会很感激的。
谢谢你。
c# - C# TCP/IP 消息正在更改
我正在使用 Microsoft Visual Studio 2013 专业 C# 编写程序。我使用了调试器,查看了名为 Message3 的数组,它有正确的信息,但是当它到达连接的计算机 modbus 程序时,消息是不同的。所以我使用了 Wireshark,wireshark 同意 Modbus 程序。这很奇怪,因为它只对某些值(例如 modbus 中的值 7600)执行此操作,它在两个寄存器中发送,分别为 29 和 176,我的程序在数组中有它,但wireshark 看到的是 29 194 176。它以某种方式添加了一个 194不在我的数组中。
这就是我的调试器所拥有的,这就是线鲨所看到的:0 4 0 0 0 6 1 3 0 5 0 1 03 02 1d c2 b0
我都试过了: writer.Flush 和 writer.FlushAsync 但没有任何帮助。同样,它也只是一些值。这是我的代码:
有任何想法吗 ?
在 FlushAsync 之后我再次在 } 处有一个断点,我复制了有什么消息但它没有 194(请参见上文)
wifi - IOT 通过 wifi 和 modbus 不断连接到 PHP
我现在正在研究 PHP 部分。我对物联网知之甚少,所以这个问题可能很奇怪,但如果有人能给我一个例子、概念甚至是一种学习方式,我将不胜感激。
思路是让PLC设备可以通过wifi和modbus tcp与服务器保持连接发送和读取数据。PLC 是 modbus 客户端(主机),PHP 是 modbus 从机(服务器)。PLC 和 PHP 被放置在不同的 IP 地址中,这意味着连接必须不仅在 LAN 中可用,而且在 WAN 中可用。谢谢你的任何建议。
c++ - Qt/C++ 通过 Modbus TCP 与 CMMO-ST-C5-1-LKP Festo 控制器通信
我正在尝试通过带有 Qt/C++ 的 modbus 与电机控制器通信。
我使用主要从 Qt SerialBus adueditor 示例中获取的代码连接到它:
建立连接后,我使用此 tcp pdu = "00000004084301000000000000" 调试驱动器,调试设备并出现代码“E047”的错误,因为通信中断。问题是当我尝试进行复位(这是复位位的上升沿)时,我发送了这两个连续的帧,但它不起作用,错误仍然存在。
当我点击 “开始”按钮,帧被永久发送,然后我可以点击复位位,错误消除。通讯中断,只有当我点击“停止”时才会出现错误。当通信运行时,我可以执行其他操作,例如单击停止按钮或更改功能代码,是否使用多线程?在这种情况下,我怎样才能像这个模拟器界面一样提供与控制器的持续通信?
python - MODBUS:创建一个虚假的写请求响应
我试图用某种 MITM 攻击来欺骗我的 HMI(客户端)。但看起来我不明白一些基本的东西。这是 HMI 端的代码和 Wireshark 屏幕截图。问题是:
- 我正在从 HMI 丢弃原始 WRITE 请求数据包
- 我正在制作虚假的 RESPONSE 数据包并将其发送到 HMI
- 之后 HMI 尝试发送新的 REQUEST 但 PLC(服务器)突然没有响应 :(
感谢您的各种帮助!
javascript - 如何使用 Javascript DataView 和 ArrayBuffer 为多字节数据类型正确设置字节大小的 MODBUS 数据
我正在使用 jsmodbus npm 库使用readHoldingRegisters()
函数检索 16 位寄存器。
我正在使用 ArrayBuffer 和 DataView 来设置和获取所需格式的数据:
我知道从寄存器返回的数据始终是 16 位整数,拆分为两个 8 位字节值,所以我应该将视图中的两个字节设置为两个连续的整数,即使它稍后可能会从视图中检索为 Int16 或浮动32。这个对吗?
其次,如果我希望将数据检索为带符号的 Int16 或 Float32,是否有必要将高字节设置为有符号,将低字节设置为无符号,如下所示:
第三:尽管需要设置正确的字节顺序,但在针对视图设置数据时使用哪种方法是否重要,因为视图中字节和位的顺序不受您设置的方法的影响,只有当你检索那些数据回来了?
当然,它似乎不会:
理智检查赞赏!
tcp - 如何减少 TCP/IP 握手超时时间
详细信息: 我正在处理通过 TCP/IP 设备连接到 Modbus 的问题。我们需要每秒轮询一部分设备 modbus 寄存器 4-6 次。我们记录了以下时间。在控制测试中,我们能够以以下速度进行通信:
控制装置:每0.0015s一次,标准偏差为0.0001s。
发行设备:每0.5200s一次,标准差为0.01s。
经过数周的故障排除和数据包捕获,我们将问题缩小到与我们通信的设备没有发出或响应 TCP 握手数据包的事实。然而,通信仍然是可能的,因为在发出 TCP 请求并随后被忽略后,查询仍会进行 0.3200 秒。此外,问题设备不支持 UDP。
抓包分解图[1]:https ://i.stack.imgur.com/lCEos.png
第一个(顶部)数据包是控制,第二个(底部)数据包是问题
问题: 忽略 TCP 的基本作用是握手这一事实,有没有办法减少或完全缓解 Windows 7 机器上英特尔 NIC 上的 TCP 握手。
python - Modbus TCP 传输速度
我正在使用 Modbus TCP 进行一些测试,我正在努力理解此处计算的关于每秒扫描的最大寄存器数的理论速度限制。
我的测试是使用 beaglebone 来托管我从笔记本电脑轮询的 modbus 服务器(从属服务器)。两台设备都位于私有子网上,并且它们是该子网上仅有的两台设备。服务器和客户端在 python 中使用 pymodbus 实现。作为测试,我使用块读取来轮询 6000 个保持寄存器(48 个块读取中的每一个 125 个寄存器),并且花费了 0.17163 秒。这转化为大约 35,000 个寄存器/秒的扫描速率。这速度很快,但与上面链接页面中计算的 Base100T 接口的理论极限相去甚远。
根据该页面,Base100T 连接的理论限制应该在 3,600,000 个寄存器/秒左右。我意识到由于 python 程序的吞吐量等原因会有一些损失,但是它比理论值低得多,以至于我很难理解这些主要损失在哪里。吞吐量会限制在哪里?
以下是我用于此测试的代码清单:
服务器(Beaglebone)
客户端(笔记本电脑)
arduino - PLC和Arduino之间的MODBUS TCP
我正在尝试在 PLC(WAGO 750-8101)和 Arduino(UNO)之间交换数据,PLC 作为主机,Arduino 作为从机,但似乎无法连接。
对于 Arduino,我有一个 MINI ENC28J60 作为网络模块,并像这样连接到 arduino:
SCK - 引脚 13,SO - 引脚 12,SI - 引脚 11,CS - 引脚 10
VCC:3.3V
对于 arduino,我正在使用这些库:
主设置
和主要代码:
从站设置(arduino):
输出(调试)从站:
我能够在 PLC 和 Modbus Slave 模拟器之间建立连接(并交换数据),但是当我尝试连接 arduino 时,我似乎无法建立连接。
这是我在 PLC 中遇到的错误:
有什么建议么?问题是否可能是我正在使用交叉电缆(即使 WAGO 在以太网设置中设置为切换模式?)
modbus - 读取保持寄存器时 Modpoll 的奇怪行为
我使用 Modpoll Modbus 客户端实用程序进行测试。
命令(一)
.\modpoll -1 -t 4:hex -r 40072 -c 2 IP地址
给出以下结果(2 个连续保持寄存器的十六进制值):
[40072]: 0x404F
[40073]:0x5C28
根据文档,这两个寄存器包含一个 IEEE 754 大端编码的单精度浮点数。相应的值约为 3.24(使用 IEEE 754 实用程序解码)。
我想使用 Modpoll 直接读取 IEEE 754 编码的 32 位浮点数。当且仅当我输入以下命令(II)时,我才会得到类似的结果:
.\modpoll -1 -t 4:float -r 40071 -c 1
3.203139
该值不完全相同,因为我读取了随时间变化的电流。
如果我输入:
.\modpoll -1 -t 4:float -r 40072 -c 1
我得到一个完全不同的价值。
知道寄存器 40072 和 40073 (I) 以及寄存器 40071 和 40072 中的相同值是如何出现的吗?