问题标签 [easy-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 投票
0 回答
104 浏览

c# - C#处理EASYMODBUS时Socket是否连接

我正在使用“EasyModBus”与 BUS 系统进行通信。如果连接丢失或出现故障,我需要用户立即知道。另一个问题是,如果我断开网络连接,软件将由于下面提到的行上的未连接套接字而挂起:

我测试了下面列出的几种方法:

  1. 如果(tcpClient.Connected)
  2. if(tcpClient.Available!=0) 以及 socket.Poll
  3. Ping 和检查状态

结果: Ping 没问题,但我必须将阅读时间间隔从 1000 毫秒更改为至少 2500 毫秒。然后,如果我断开套接字,我会得到异常。但我需要每 1000 毫秒读取一次脉冲。

这里有同样的问题:EasyModbus: disconnecting from network doesn't change the connection state

正如我所提到的,我尝试了 tcpclient.Available 但它不起作用。

我的代码:

任何帮助表示赞赏。

0 投票
2 回答
2135 浏览

c# - 一起编写 ModbusClient 和 ModbusServer 时出现问题

关于守则

EasyModbus Nuget在 C# 窗口窗体应用程序中使用。我正在尝试使用 RTU(实时更新)获取更改后的保持寄存器的地址值ModbusServer

下面的代码连接到服务器。

下面的代码获取保持寄存器下面给出的地址值。

到目前为止,一切正常。

我正在阅读有关 EasyModbus 中实时更新的信息。我发现这个链接可以自动将更改后的保持寄存器值发送到偶数处理程序。

现在,我有以下代码:

当我运行它时,我得到以下错误。

每个套接字地址(协议/网络地址/端口)通常只允许使用一次

发生此错误是因为我添加了 ModbusServer 代码。

你能建议为什么会这样吗?

0 投票
1 回答
1891 浏览

c# - EasyModbus TCP 通信减慢 Windows 应用程序

当 EasyModbus TCP 计时器内的方法数量增加时,WinForms 应用程序会变慢。应该怎么做才能提高应用程序的速度?

我正在使用 Modbus TCP/IP 从 WinForms 应用程序连接从设备。EasyModbus TCP/IP 库用于建立 WinForms 应用程序和从设备之间的通信,数据(浮点数)应该不断地从客户端读取和写入,因此方法被写入一个用于 Modbus 通信的计时器中。当方法的数量增加时,整个应用程序就会变慢。

上面的代码返回预期的结果,它从 WinForms 写入浮点数据到寄存器号 40001,它从客户端 ModBus 寄存器 40395 读取数据并显示在文本框中。

当读取和写入数据的方法数量增加时,整个应用程序会变慢,因为需要同时访问来自多个寄存器的数据。

谁能帮我解决这个问题,如何一次访问多个寄存器而不减慢整个应用程序的速度?

0 投票
1 回答
109 浏览

python-3.x - Python comunication modbus tcp with plc saia sbc

I am trying to read the registers and flags of the saia sbc PCD2 M4_x ​​plc via Modbus TCP communication. I know the IP address and the communication port of the plc, however every time I read a flag or a register I always get different values ​​from those set. I'm sure it's not a register offset problem that usually occurs in modbus communication. The code I wrote is the one listed and also the results.

however the flags 0 through 10 do not have that state and even if I change it when I start the written code the result remains the same. Even if I change addresses.

0 投票
0 回答
879 浏览

pyserial - 使用 Pyserial 读取 Modbus 保持寄存器 - 收到的字节少于预期

我正在使用 PySerial 库从 modbus rtu 从站读取保持寄存器值。我有一个带有 Unix 操作系统的嵌入式网关设备(所以 /dev/tty 端口)。和一个 modbus 从站,它可以给我一些指标,例如频率、温度等。我尝试使用 pymodbus 库建立连接并读取寄存器内容,在其设备上使用制造商的 modbus 连接规范,但它不起作用。我收到了这个错误,需要进一步的低级分析:

AttributeError:“ExceptionResponse”对象没有属性“registers”

第一步 - 连接

我得到了easymodbus库,因为它更容易确定如何建立连接以及将哪些片段传递给从站。说到这一点,我注意到在 RS485 上需要在 pyserial 上配置进一步的设置。我用下面的代码做到了

它读取以下值:

第二步 - 读取保持寄存器

制造商参数报告如下:

整体执行流程报告如下。如您所见,发送者 modbus 消息已正确构建。右侧有 CRC 字节,但端口上的响应引发了超时错误。当按预期接收到较少的字节数据时会引发它。

下面的代码显示了有关此行为的更多详细信息。

如果您需要任何进一步的详细信息,请不要犹豫对这个问题发表评论。谢谢

0 投票
1 回答
56 浏览

java - 将 ASCII 值写入 RS485 等串行通信设备的寄存器

我正在创建一个 java 桌面应用程序。我想将数据写入设备的寄存器。根据我的项目文档,寄存器的大小是 16 位长。我正在使用 EasyModbusJava jar 将数据写入寄存器。到目前为止,我已经在设备的寄存器上写入了一些整数数据。现在我想在 16 个连续寄存器(每个寄存器 2 个字符)中写入 32 个字符的 ascii。但问题是在寄存器上写入的可用方法将 int 作为参数。如果传递的是 ascii 值的 short(int) 数组,那么它需要进行类型转换,这意味着它将不再获取 short 数据类型的大小。

两种方法可以写入寄存器地址。

用于写入单个寄存器

用于写入多个寄存器

建议一些方法来解决我的问题。

下面是我在项目中使用的 jar 文件文档的链接。 Jar 文件的文档。

0 投票
0 回答
192 浏览

c# - 从 Windows 表单 C# 中的 Modbus EasyModbus.dll 库读取 FT300 传感器数据时出现问题

我现在正在尝试通过 USB-RS485 转换器读取传感器数据并使用 C# 中的EasyModbus.dll

但是,我一直收到CRC 检查失败ReadHoldingRegister部分。连接和读取部分如下图所示。

我已经做了很多研究,但仍然无法解决问题。谁能帮我这个?

CRC校验失败将发生在

FT300 Modbus 设置也如下所示:

在此处输入图像描述

图片来自本手册,第 34 页

0 投票
1 回答
268 浏览

c# - 在easymodbus RTU c#中更改从站ID后恢复连接

我正在尝试通过将新值写入正确的寄存器来更改能量计的从属 ID。一旦更改了值,连接显然会丢失,但我找不到更新它的方法。我无法在不关闭整个应用程序的情况下关闭端口,没有响应 modbusClient.Disconnect(); 我怎样才能恢复连接并从那里继续?

0 投票
0 回答
1353 浏览

java - EasyModBus modbusClient.ReadHoldingRegisters() 返回意外 0

背景:

一段时间以来,我们一直在使用带有 TM3AI8、TM3DQ8R 和 TM3DI8 模块的 Schneider M251 PLC,我注意到我们收到了通过 Modbus tcp 发送的意外值。

大多数时候,我们通过 Modbus 协议接收的信号在 4mA 范围内,处于我们预期信号的较低部分。但是,我们看到一个间歇性的 0 很少通过 modbus tcp 使用 easy modbus tcp 库发送到我们的 java 软件

图书馆:http ://easymodbustcp.net/en/

具体来说,当我们调用:

val = modbusClient.ReadHoldingRegisters(3005, 1)[0];

我们看到一个间歇性的不频繁 val = 0 出现,但只是偶尔出现。当我检查名为 soMachine 的 PLC 软件时,它似乎从未显示过零值。有没有人遇到过这种问题?我使用结构文本设置了一个 POU 来计算 IO 读数为 0 的次数,显然它从来都不是。所以我认为它与modbus库有关。

我在下面提供了一个 system.out.println(val) 来显示问题:

plc 上的 I/O 配置为 0-20mA 扩展,传感器为 4-20mA 传感器。我们的单位刻度上的零读数代表 -2500 个单位,这对我们的系统造成了问题,因为它代表了我们测量中的巨大差异。我们正在使用 Schneider 卡上提供的诊断位以及检测传感器故障。但是,传感器似乎没有故障并且工作正常。

如您所见,来自 IO 卡的信号也有点嘈杂。读取此传感器的电压时,万用表不会波动,并且在我们的万用表上非常稳定,在 3.989mV 范围内。

当我们看到间歇性的 0 打印到控制台时,我们在 soMachine 中看不到 0。此外,每 250 毫秒调用一次轮询值的方法。

我们采用了以下“过滤器”,但这并不是解决问题的理想方法。

如果您需要有关此问题的更多信息,请告诉我。

ReadHoldingRegisters 方法如下:

问候,

0 投票
0 回答
17 浏览

c# - EasyModeBus 包无法连接服务器

我正在开发一个 C# 项目并使用该EasyModBus包。我在尝试连接到服务器时遇到错误,我找不到解决方案。

如果需要,我可以分享截图。