通讯协议

  • 1 调试助手
  • 1.1 crc计算助手
  • 1.2 串口调试助手
  • 2 使用serial节点读取数据
  • 3 modbus协议
  • 3.1 报文
  • 3.2 功能号
  • 3.2.1主机对从机写数据操作
  • 3.2.2主机对从机读数据操作
  • 3.3 MODBUS报文模型
  • 4 Modbus tcp和Modbus rtu的区别和联系
  • 5 协议
  • 5.1 TCP协议
  • 5.2 Modbus rtu


1 调试助手

1.1 crc计算助手

调参数注意红框!

java实现modbus rtu读取数据 modbus读取的数据怎么处理_数据

1.2 串口调试助手

java实现modbus rtu读取数据 modbus读取的数据怎么处理_数据_02

  图中红框是上一个计算软件返回来的结果,所有的参数设置如图所示:串口号,波特率,hex发送,hex显示。发送以后得到图中篮框
  如果想自动发送,点击拓展,然后把返回值写到黄框内,然后点自动发送,其实上边的两行的结果也会显示,但由于不是hex,并不会有效。
  填写完参数以后记得打开串口,串口打开后,在使用node-red时,要把串口关闭,不然显示串口被占用。同样node-red使用串口时,也要把串口关掉,打开cmd,调出红框即可。

java实现modbus rtu读取数据 modbus读取的数据怎么处理_串口_03

2 使用serial节点读取数据

在 node-red中serial 流

java实现modbus rtu读取数据 modbus读取的数据怎么处理_嵌入式硬件_04


打开serial节点:

  红框中的9 代表的是接收到的字节长度是9位。把别的参数配置成图中的样子。

java实现modbus rtu读取数据 modbus读取的数据怎么处理_嵌入式硬件_05


新建buffer:

  新建buffer就是填写的是使用传输助手返回来的值。

java实现modbus rtu读取数据 modbus读取的数据怎么处理_数据_06


构造函数:

  构造函数是实现转换功能。

  用黄线圈起来的就代表出来的一个buffer,它出来的数据就是和窗口助手蓝色框出来的一样,是16进制的数组。

  接下来要做的就是把得到的数组变成有用的信息,就用到了函数节点。填写函数实现转换。

java实现modbus rtu读取数据 modbus读取的数据怎么处理_串口_07


  绿色代表从需要的数组里,选择出需要的数,黄色的代表这两个数进行拼接。红色的语句代表将取到的数变为10进制。b代表数,16代表当前的数b的进制。

  最后的黄色框注意的是只能有一个返回值。可以把要显示的做一个对象,然后在输出。上边的小黄框代表拼接也可以用另一种语句写。和modbus的结合

java实现modbus rtu读取数据 modbus读取的数据怎么处理_串口_08


  在modbus节点中,我这个值选取的是2,则代表我需要用的温度湿度的值选取的是两个。所以导致左后的值是9位,其中包括2个校验位。

3 modbus协议

3.1 报文

  Modbus一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、TCP。其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现。
分析一条MODBUS-RTU报文:01 06 00 01 00 17 98 04
01      06     00 01   00 17   98 04
从机地址  功能号   数据地址  数据   CRC校验
这一串数据的意思是:把数据 0x0017(十进制23) 写入 1号从机地址 0x0001数据地址。
   一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,就像上面的一串数据。
意义:例如上面的 98 04 是它前面的数据(01 06 00 01 00 17)通过一算法计算出来的结果,其实就像是计算累加和那样。(累加和:就是010600010017加起来的值,然后它的算法就是加法)。
作用:在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确。比如主机发出01 06 00 01 00 17 98 04,那么从机接收到后要根据01 06 00 01 00 17 再计算CRC校验值,从机判断自己计算出来的CRC校验是否与接收的CRC校验(98 04主机计算的)相等,如果不相等那么说明数据传输有错误这些数据不能要。

3.2 功能号

作用:指示具体的操作。

3.2.1主机对从机写数据操作

  如果单片机接收到一个报文那么就对报文进行解析执行相应的处理,如上面报文:
01      06     00 01   00 17   98 04
从机地址  功能号   数据地址  数据   CRC校验
  假如本机地址是 1 ,那么单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是: HoldDataReg[1] = 0x0017;
MODBUS主机就完成了一次对从机数据的写操作,实现了通讯。

3.2.2主机对从机读数据操作

01      03     00 01   00 01      D5 CA
从机地址  功能号   数据地址  读取数据个数   CRC校验
  那么单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是:返回信息给主机,返回的信息也是有格式的:
返回内容:
01      03     02     00 17     F8 4A
从机地址,功能号,数据字节个数, 两个字节数据 ,CRC校验
  MODBUS主机就完成了一次对从机数据的读操作,实现了通讯。

3.3 MODBUS报文模型

java实现modbus rtu读取数据 modbus读取的数据怎么处理_嵌入式硬件_09


ADU: 应用数据单元

PDU: 协议数据单元

*

4 Modbus tcp和Modbus rtu的区别和联系

Modbus RTU一般采用串口RS232C或RS485/422,而Modbus TCP一般采用以太网口。现在市场上有很多协议转换器,可以轻松的将这些不同的协议相互转换 ∶Intesisbox可以把modbus rtu转换成 Modbus tcp,实际 上ModbusQ协议包括ASCII、RTU、TCP。
  Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式。
  Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCll模式采用LRC校验,RTU模式采用16位CRC校验.。ModbusTCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。
  TCP和RTU协议非常类似,只要把RTU协议的两个字节的校验码去掉,然后在RTU协议的开始加上5个0和一个6并通过TCP/IP网络协议发送出去即可。
TCP通过网线,RTU通过USB接口, 485协议.连接
  而Modbus TCP协议则是在RTU协议上加一个MBAP报文头,由于TCP是基于可靠连接的服务,RTU协议中的CRC校验码就不再需要,所以在Modbus TCP协议中是没有CRC校验码,用一句比较通俗的话说就是:Modbus TCP协议就是Modbus RTU协议在前面加上五个0以及一个6,然后去掉两个CRC校验码字节就OK.虽然这句话说得不是特别准确,但是也基本上把RTU与TCP之间的区别说得比较清楚了。

java实现modbus rtu读取数据 modbus读取的数据怎么处理_数据_10

5 协议

5.1 TCP协议

图中画横线的,就根据第二张图片的ID,fc,地址,长度…依次填写就可以。

java实现modbus rtu读取数据 modbus读取的数据怎么处理_嵌入式硬件_11


java实现modbus rtu读取数据 modbus读取的数据怎么处理_TCP_12


点击第一张图片的红色框,进入另一个设置界面:

java实现modbus rtu读取数据 modbus读取的数据怎么处理_TCP_13


黄色代表tcp协议,选择tcp。蓝色是串口:串口服务器里设置的多少就填多少。绿色指串口服务器的ip地址。

5.2 Modbus rtu

java实现modbus rtu读取数据 modbus读取的数据怎么处理_数据_14


红色的框就是指每个传感器的ID,为了方便识别,比如TCP里边的就是3,。黑框调rtu的配置节点信息,配置信息如下:

java实现modbus rtu读取数据 modbus读取的数据怎么处理_数据_15