我必须用串行接口控制modbus设备.我没有使用modbus的经验.但我的简短研究揭示了几个modbus库
有哪些优点/缺点,还有更好的选择吗?
我正在开发一个涉及微控制器通过TCP上的modbus与PC通信的项目.我的平台是STM32F4芯片,用C语言编程,没有RTOS.我环顾四周,发现了LwIP和Freemodbus并取得了相当不错的成功,让他们两人都去工作.不幸的是,我现在遇到了一些我不确定如何处理的问题.
我注意到,如果我建立连接,然后失去连接(通过拔掉以太网电缆)我将无法重新连接(当然,当我重新插入时).Freemodbus只允许一个客户端,并且仍然有第一个客户端注册.任何尝试连接的新客户端都将被忽略.在特定的超时期限之后,它不会丢弃第一个客户端,据我所知,这是一个TCP/IP标准.
我的想法是......
我需要一个可以处理多个客户端的modbus模块.通信丢失后的新客户端请求将被接受,并且第一个客户端最终将因超时而被丢弃.
我如何通过PC连接微控制器有问题?
一旦我停止沟通,我应该从Freemodbus中删除客户端吗?
我倾向于1.特别是因为我最终还是需要支持多个连接.任何帮助,将不胜感激.
谢谢.
有没有人知道一个好的(最好是开源)库来处理Modbus协议?我见过一些图书馆,但我正在寻找一些人的个人经历,而不仅仅是谷歌的十大热门点击.我认为必须至少有一个人像我那样处理PLC和自动化硬件.
对任何其他可能对您有所帮助的材料开放......
我正在实现一个软件,我通过串口读取和写入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) 我试图在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) 我需要带有源代码的简单modbus Java库.我在google上找到了但是有.jar文件并且没有强大的使用手册.任何人都可以使用手册或源代码向我推荐modbus库吗?
我有这个字节数组:
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) 我目前正在开发一个允许不同自动化进行通信的项目.为此,我想创建一个客户端和服务器,使用modbus协议进行通信.我不确定我现在是否想要使用ModBus/TCP,ModBus/RTU或ModBus/ASCII.
我在C中搜索了客户端/服务器示例,我可以找到库,但没有简单的通信示例.我想从头开始,所以库不是我想要的.
我要的是,如果有人能给我一个用C语言编写的简单代码用于客户端和/或使用Modbus进行通信的服务器,因为我不确定我将使用任何类型的Modbus将是一个很大的帮助(RTU/TCP/ASCII).
越简单越好,我希望代码演示的是,例如:对服务器的初始化,请求,答案,关闭连接.
非常感谢您的宝贵时间.
c network-programming modbus serial-communication modbus-tcp
我正在使用 ModBus RTU,并且我正在尝试弄清楚如何计算 CRC16。我不需要代码示例。我只是对这个机制感到好奇。我了解到基本的 CRC 是数据字的多项式除法,根据多项式的长度用零填充。下面的测试示例应该检查我的基本理解是否正确:
计算。
01001011000
1001
0000011000
1001
01010
1001
0011
Run Code Online (Sandbox Code Playgroud)
Edit1:到目前为止已由 Mark Adler 在之前的评论/答案中验证。
在寻找答案时,我看到了很多不同的方法,包括反转、依赖小端或大端等,这些方法改变了给定的结果011
。
Modbus RTU CRC16
当然,我很想了解不同版本的 CRC 是如何工作的,但我的主要兴趣是简单地了解这里应用的机制。到目前为止我知道:
我确实像上面的示例一样手动计算了这个值,但我不想在这个问题中以二进制形式写下来。我认为我的二进制转换是正确的。我不知道的是如何合并初始值——它是用来填充数据字而不是零吗?或者我需要颠倒答案吗?还有别的事吗?
第一次尝试:用 0 填充 16 位。计算出的二进制余数为1111 1111 1001 1011
十六FF9B
进制,对于 CrC16/Modbus 不正确,但对于 …
有人可以建议用于Microchip PIC18处理器的Modbus RTU从器件的开源实现吗?我正在寻找用于RS-232/RS-485的Modbus RTU的实现,但也欢迎Modbus TCP/IP实现.