标签: modbus

Python modbus库

我必须用串行接口控制modbus设备.我没有使用modbus的经验.但我的简短研究揭示了几个modbus库

有哪些优点/缺点,还有更好的选择吗?

python modbus

45
推荐指数
3
解决办法
5万
查看次数

使用freemodbus托管多个客户端

我正在开发一个涉及微控制器通过TCP上的modbus与PC通信的项目.我的平台是STM32F4芯片,用C语言编程,没有RTOS.我环顾四周,发现了LwIP和Freemodbus并取得了相当不错的成功,让他们两人都去工作.不幸的是,我现在遇到了一些我不确定如何处理的问题.

我注意到,如果我建立连接,然后失去连接(通过拔掉以太网电缆)我将无法重新连接(当然,当我重新插入时).Freemodbus只允许一个客户端,并且仍然有第一个客户端注册.任何尝试连接的新客户端都将被忽略.在特定的超时期限之后,它不会丢弃第一个客户端,据我所知,这是一个TCP/IP标准.

我的想法是......

  1. 我需要一个可以处理多个客户端的modbus模块.通信丢失后的新客户端请求将被接受,并且第一个客户端最终将因超时而被丢弃.

    • 如何修改Freemodbus来处理这个问题?那里有例子吗?我已经考虑过自己做这件事,看起来这是一个规模很大的项目.
    • 是否有任何好的modbus包可以处理多个客户端,是不是太昂贵和易于使用?我已经看过几个关于各种选项的线索,但我不确定它们是否满足我的需要.我很难找到自己的东西.大多数不支持TCP和仅支持一个客户端的TCP.支持多个客户端通常是个坏主意吗?
  2. 我如何通过PC连接微控制器有问题?

    • 为什么每次尝试重新连接时PC都会更改端口?如果它保持之前使用的相同端口,这将不是问题
  3. 一旦我停止沟通,我应该从Freemodbus中删除客户端吗?

    • 这似乎违反标准,但可能有效.

我倾向于1.特别是因为我最终还是需要支持多个连接.任何帮助,将不胜感激.

谢谢.

c embedded tcp modbus

20
推荐指数
1
解决办法
1638
查看次数

是否有一个很好的库来处理.NET中的Modbus协议?

有没有人知道一个好的(最好是开源)库来处理Modbus协议?我见过一些图书馆,但我正在寻找一些人的个人经历,而不仅仅是谷歌的十大热门点击.我认为必须至少有一个人像我那样处理PLC和自动化硬件.

对任何其他可能对您有所帮助的材料开放......

.net open-source protocols plc modbus

17
推荐指数
3
解决办法
2万
查看次数

计算Modbus RTU CRC 16

我正在实现一个软件,我通过串口读取和写入Modbus RTU协议中的数据.为此,我需要在字节串的末尾计算两个CRC字节,但我无法做到这一点.

在整个网络中搜索,我找到了两个似乎正确计算CRC的函数:

WORD CRC16 (const BYTE *nData, WORD wLength)
{
    static const WORD wCRCTable[] = {
       0X0000, 0XC0C1, 0XC181, 0X0140, 0XC301, 0X03C0, 0X0280, 0XC241,
       0XC601, 0X06C0, 0X0780, 0XC741, 0X0500, 0XC5C1, 0XC481, 0X0440,
       0XCC01, 0X0CC0, 0X0D80, 0XCD41, 0X0F00, 0XCFC1, 0XCE81, 0X0E40,
       0X0A00, 0XCAC1, 0XCB81, 0X0B40, 0XC901, 0X09C0, 0X0880, 0XC841,
       0XD801, 0X18C0, 0X1980, 0XD941, 0X1B00, 0XDBC1, 0XDA81, 0X1A40,
       0X1E00, 0XDEC1, 0XDF81, 0X1F40, 0XDD01, 0X1DC0, 0X1C80, 0XDC41,
       0X1400, 0XD4C1, 0XD581, 0X1540, 0XD701, 0X17C0, 0X1680, 0XD641,
       0XD201, 0X12C0, 0X1380, 0XD341, 0X1100, 0XD1C1, 0XD081, …
Run Code Online (Sandbox Code Playgroud)

c++ qt hex modbus crc16

11
推荐指数
2
解决办法
4万
查看次数

ARM:通过UART读取modbus数据失败

我试图在ARM板上使用UART连接从RS485适配器读取寄存器但没有成功

连接器

从设备连接到ARM板

能量功率计< - rx/tx电缆 - > SENA RS485适配器< - 串行公/公适配器+串口到迷你串行电缆 - > ARM板迷你串口

看到设置的图像:

使用的设备树: am335x-sbc-t335.dts

设备树资源: http ://get-album.com/dts/

从设备连接到PC

能量功率计< - 2线rx/tx - > SENA RS485适配器< - > PC

注意:主板上的迷你串口与用于串口控制台通信的端口相同(在波特115200上) - 这没有问题

下面是使用libmodbus库从连接的从设备读取第一个寄存器的ac代码

libmodbus_test.c - 从设备读取和打印第一个reigster:

#include <sys/types.h>
#include <string.h>
#include <modbus.h> …
Run Code Online (Sandbox Code Playgroud)

c arm modbus rs485 uart

10
推荐指数
1
解决办法
1068
查看次数

需要modbus Java库

我需要带有源代码的简单modbus Java库.我在google上找到了但是有.jar文件并且没有强大的使用手册.任何人都可以使用手册或源代码向我推荐modbus库吗?

java modbus

9
推荐指数
3
解决办法
2万
查看次数

获取字节数组的CRC校验和并将其添加到该字节数组

我有这个字节数组:

static byte[] buf = new byte[] { (byte) 0x01, (byte) 0x04, (byte)0x00, (byte)0x01,(byte)0x00, (byte) 0x01};
Run Code Online (Sandbox Code Playgroud)

现在,该字节数组的CRC校验和应该是0x60,0x0A.我希望Java代码重新创建此校验和,但我似乎无法重新创建它.我试过crc16:

static int crc16(final byte[] buffer) {
    int crc = 0xFFFF;

    for (int j = 0; j < buffer.length ; j++) {
        crc = ((crc  >>> 8) | (crc  << 8) )& 0xffff;
        crc ^= (buffer[j] & 0xff);//byte to int, trunc sign
        crc ^= ((crc & 0xff) >> 4);
        crc ^= (crc << 12) & 0xffff;
        crc ^= ((crc & 0xFF) << 5) & …
Run Code Online (Sandbox Code Playgroud)

java checksum modbus crc

9
推荐指数
1
解决办法
2万
查看次数

使用C中的Modbus创建一个简单的客户端/服务器

我目前正在开发一个允许不同自动化进行通信的项目.为此,我想创建一个客户端和服务器,使用modbus协议进行通信.我不确定我现在是否想要使用ModBus/TCP,ModBus/RTU或ModBus/ASCII.

我在C中搜索了客户端/服务器示例,我可以找到库,但没有简单的通信示例.我想从头开始,所以库不是我想要的.

我要的是,如果有人能给我一个用C语言编写的简单代码用于客户端和/或使用Modbus进行通信的服务器,因为我不确定我将使用任何类型的Modbus将是一个很大的帮助(RTU/TCP/ASCII).

越简单越好,我希望代码演示的是,例如:对服务器的初始化,请求,答案,关闭连接.

非常感谢您的宝贵时间.

c network-programming modbus serial-communication modbus-tcp

9
推荐指数
1
解决办法
3万
查看次数

CRC16 (ModBus) - 计算算法

我正在使用 ModBus RTU,并且我正在尝试弄清楚如何计算 CRC16。我不需要代码示例。我只是对这个机制感到好奇。我了解到基本的 CRC 是数据字的多项式除法,根据多项式的长度用零填充。下面的测试示例应该检查我的基本理解是否正确:

  • 数据字:0100 1011
  • 多项式:1001 (x 3 +1)
  • 由于最高指数 x 3 ,所以用 3 位填充
  • 计算:0100 1011 000 / 1001 -> 余数:011

计算。

01001011000
 1001
 0000011000
      1001
      01010
       1001
       0011 
Run Code Online (Sandbox Code Playgroud)

Edit1:到目前为止已由 Mark Adler 在之前的评论/答案中验证。

在寻找答案时,我看到了很多不同的方法,包括反转、依赖小端或大端等,这些方法改变了给定的结果011

Modbus RTU CRC16

当然,我很想了解不同版本的 CRC 是如何工作的,但我的主要兴趣是简单地了解这里应用的机制。到目前为止我知道:

  • x 16 +x 15 +x 2 +1 是多项式:0x18005 或 0b11000000000000101
  • 初始值为0xFFFF
  • 十六进制消息示例:01 10 C0 03 00 01
  • 上述消息的 CRC16(十六进制):C9CD

我确实像上面的示例一样手动计算了这个值,但我不想在这个问题中以二进制形式写下来。我认为我的二进制转换是正确的。我不知道的是如何合并初始值——它是用来填充数据字而不是零吗?或者我需要颠倒答案吗?还有别的事吗?

  • 第一次尝试:用 0 填充 16 位。计算出的二进制余数为1111 1111 1001 1011十六FF9B进制,对于 CrC16/Modbus 不正确,但对于 …

modbus crc16 boolean-polynomials

8
推荐指数
1
解决办法
2万
查看次数

Microchip PIC的Modbus堆栈

有人可以建议用于Microchip PIC18处理器的Modbus RTU从器件的开源实现吗?我正在寻找用于RS-232/RS-485的Modbus RTU的实现,但也欢迎Modbus TCP/IP实现.

embedded serial-port modbus microchip rs485

7
推荐指数
1
解决办法
2万
查看次数