485通讯与MODBUS的区别与联系

最近做智能检测的项目,设备、串口之间的通讯比较多,一会儿485,一会儿modbus RTU,有点晕了,这里重新梳理一下RS485、485通讯协议、ModBus通讯协议、Modbus Rtu通讯这几个点的联系和区别。

先说RS485吧,RS485是一个工业常用的物理接口,是物理层的硬件设备(串口)。是在电脑设置上看得到的(windows系统-我的电脑-设备管理器)设备。

Modbus是一种国际标准的通讯协议,一般用于不同厂商设备之间进行数据交换,是应用层的软件协议,不能自己单独存在,必须要依赖于硬件设备作为实现平台。不同的硬件具有不同的电气特性和连接方式,比如RS232、RS485。可以把Modbus比作英语,RS232比作印度人,RS485比作美国人,印度人之间讲英语时,理解为基于RS232的modbus通信,美国人之间讲英语时,理解为基于RS485的modbus通信。

两台设备之间通过Modbus协议传输数据,需要硬件接口,于是就有了RS232\RS422\RS485等,其中RS485传输距离远,成为现在最主流的工业现场硬件接口。

Modbus按照一般维度分为Modbus Rtu、Modbus ASCII、Modbus TCP三种模式。

从接口类型维度来说,Modbus Rtu和ASCII基于串行链路,属于串行通讯口(serial port),Mobus tcp基于TCP/IP协议,属于网络(以太网)通讯口。

协议分为硬件协议和软件协议。而通讯协议属于软件协议,它包含报头包围的格式,MODBUS是应用层的通讯协议,主要用于传送和接收文件包的格式。而RS232,RS485是物理层的串行接口,它可以支持几十种通讯协议,MODBUS只是其中的一种。

Modbus的特征:(1) 主从协议方式(master/slave)

(2) 通讯规约:初始结构-地址码-功能码-数据区-校验码-结束结构

(3) modbus协议本质是对寄存器读写,通过指定寄存器地址,来交换数据

写了一大堆概念性的东西,现在在面对实际问题,以下是供应商给出来的一句话:

大概需求是我需要通过485串口,给供应商的设备发送一个速度信号,这个速度信号的格式要求,是485格式,波特率、奇偶校验、8个数据位这些就不用再说了,了解下串口基础就知道了,一般都是N81,即“无奇偶校验、8个数据位、1个停止位”,问题的关键在于这个“485格式”。RS485做为一个标准串口通讯,是有自己的标准通信格式的。

可以看到,跟modbus是有些相似的,除了自己的格式外,也可以选择遵循Modbus通讯规约,更多的是使用modbus RTU模式通讯格式。

上图是modbus rtu的通讯规约,接下里的任务,是搞懂485通讯规约和modbus rtu通讯规约的区别,两种格式到底区别在哪里。为什么供应商选择用485格式,而不是使用的更广泛的modbus rtu?这两者之间的优缺点又分别是什么?

补充1:

所谓rs485通讯协议,属于硬件层协议。硬件层管什么呢?决定数据如何传输,比如2进制的数只有0和1,那么如果1个字节现在是'0110 0011',现在这个字节里的0怎么传输和表达,1怎么传输和表达,比如rs232就规定了电压x伏就表示0,y伏表示1。再比如要选择多少条线来传输,选择什么材质的线来传输,这就是硬件层协议规定的事情。

同样RS485通讯协议也是个硬件层协议,实际上是关于电平、电压的约定。搞软件的不一定看得懂,特别是应用层软件。

比如这样

,再比如这样

,亦或是这样

反正我是看不懂的

但是我弄清楚了什么叫所谓的RS485通讯协议,是硬件的、关于电平、电压的,一个规约,跟应用软件没半毛钱关系。

补充2(2020.12.14):

起始我纠结了半天,就是被串口通讯和modbus rtu搞晕了,一周之后回过头来看,就显得有点笨,但是还是硬着头皮补充完整吧。

串口通讯和Modbus rtu的有哪些区别,又有哪些共同点呢?

从概念上来说,都是串口,rtu起始就是基于串口的,所以共同点就是,rtu和串口通讯,都要设置波特率、数据位、停止位、奇偶校验等

  1. // 波特率常量
  2. private final static int BAUD_RATE = 9600;
  3. // 广播地址
  4. // private final static int broadcast_SLAVE_ADDRESS = 0;
  5. // 数据位
  6. private final static int DATABITS_8 = 8;
  7. // 停止位
  8. private final static int STOPBITS_1 = 1;
  9. // 奇偶校验
  10. private final static int PARITY_NONE = 0;

不同点是,串口通讯需要串口对象,而modbus需要从机地址(设备地址),如果是广播模式就需要广播地址,一般是0。

  1. // MODBUS的设备(从机)地址。 默认为254, 但由于本设备不支持254的地址,所以需要修改设备的地址为1.
  2. private final static int SLAVE_ADDRESS = 1;
  3. // 广播地址
  4. private final static int broadcast_SLAVE_ADDRESS = 0;

下面贴一段经典的,串口程序,第一段是打开串口,第二段是往串口发送数据的

  1. public static final SerialPort openPort(String portName, int baudrate) throws PortInUseException {
  2. try {
  3. // 通过端口名识别端口
  4. CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
  5. // 打开端口,并给端口名字和一个timeout(打开操作的超时时间)
  6. CommPort commPort = portIdentifier.open(portName, 2000);
  7. // 判断是不是串口
  8. if (commPort instanceof SerialPort) {
  9. SerialPort serialPort = (SerialPort) commPort;
  10. try {
  11. // 设置一下串口的波特率等参数
  12. // 数据位:8
  13. // 停止位:1
  14. // 校验位:None
  15. serialPort.setSerialPortParams(baudrate, SerialPortManager.DATABITS_8, SerialPortManager.STOPBITS_1,
  16. SerialPortManager.PARITY_NONE);
  17. } catch (UnsupportedCommOperationException e) {
  18. e.printStackTrace();
  19. }
  20. return serialPort;
  21. }
  22. } catch (NoSuchPortException e1) {
  23. e1.printStackTrace();
  24. }
  25. return null;
  26. }

入参是串口名称和波特率。返回值是实体对象。

  1. public static void sendToPort(SerialPort serialPort, byte[] order) {
  2. OutputStream out = null;
  3. try {
  4. out = serialPort.getOutputStream();
  5. out.write(order);
  6. out.flush();
  7. } catch (IOException e) {
  8. e.printStackTrace();
  9. } finally {
  10. try {
  11. if (out != null) {
  12. out.close();
  13. out = null;
  14. }
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. }

入参是串口对象实体,即第一段打开串口代码的返回值。用的是outPutStream,输出流。

而modbus rtu是怎么实现串口打开和发送呢,起始modbus只是基于串口,本质上还是主从机之间的通讯。

  1. // 实例化ModBus工厂
  2. ModbusFactory modbusFactory = new ModbusFactory();
  3. ModbusMaster master = modbusFactory.createRtuMaster(serialParameters);

跟SerialPort实体类似,ModbusMaster是个主机对象,当你将其init()的时候,在modbus角度你开启了主机,其实就是打开了串口。

modbus的发送不用赘述,基本就是遵循modbus的格式,功能码、寄存器地址、寄存器数量、数据位等等。例如16功能码,代表写入多个连续保持寄存器,支持广播模式。

这是16码的格式:

(0)

相关推荐

  • 基于RS485的PLC与变频器通讯实现

           摘要:在数控机床中,以三相异步电动机为控制对象,通过PLC与变频器的通讯连接和编程测试,实现了PLC与变频器之间的基于RS485专用通讯协议方式的通讯,测试程序稳定,可实时监控变频器参数 ...

  • MODBUS 485通讯常见物理接口——DB9接口详解

    做工业自动化的朋友经常接触到的通讯协议如RS232,RS485,它的通讯线物理接口大部分DB9接口,如果需要对总线上的数据进行监听的时候,只需要做一条三通线,通过USB转485转换插头连接到电脑就可以 ...

  • 大神是这样理解 串口通讯与MODBUS协议的

    工控PLC技术公众号 去学工控技术1. 基本的通讯方式基本的通讯方式有并行通讯和串行通讯两种.并行通信:是指数据的各位同时进行传送的通信方式.串行通信:是指数据一位一位顺序传送的通信方式.2. 串行通 ...

  • SA516MGr.485与国内Q345R的区别

    一.什么是SA516MGr.485:属于中低温压力容器用碳钢板,执行标准是ASME,是美标压力容器用钢板的一种.SA516MGr.485为镇静钢,符合细奥氏体精粒度的要求.被广泛应用于石油.化工.电站 ...

  • 两个FX5U系列PLC如何用RS485通讯进行modbus通讯

    两个FX5U系列PLC如何用RS485通讯进行modbus通讯

  • 三菱plc怎样通过485通讯控制多台变频器

    有多种方法实现,首先要看变频器的牌子如果也是三菱的如FR-A系列.F系列.D系列以及S系列等,可以使用三菱plc中的专用指令IVDR写入指令和IVCK读出指令对变频器进行控制和数据监视,plc作为主站 ...

  • 基于VB6.0与485仪表的Modbus RTU通信(含代码)

    JZGKCHINA 尊重原创 勿抄袭 勿私放其他平台 前言 在写这边文章时,很纠结,到底要不要写呢?原因主要有3个:第一.VB6.0这么古老的语言现在还有人用吗?现在不是很流行C#.Python.Ja ...

  • 西门子博途 TIA 的 Modbus 主站通讯技术讲解

    西门子PLC因其市场占有率较高,且被广大用户使用,应用比较广泛,而其博图TIA平台得到了推广应用,本文将介绍使用CP341进行Modbus 主站通讯 硬件:CP341,Dongle,CPU,PS307 ...

  • PLC通讯MODBUS协议的应用及编程,大神总结就是不一样

    爱上PLC 公众号 去学PLC 叙述:现为大家讲解一下MODBUS的应用,现在工业控制上位机和下位机通信大部分采用通信协议为MODBUS,可想而知机器与机器通信的重要性. 一:MODBUS系统框架图 ...

  • 电气人必知:Modbus和TCP究竟有什么区别?

    今天我们来聊一下Modbus和TCP的区别. 这两个协议即有区别又有密切的联系.它们的相结合,不但实现了基于modbus/tcp/IP协议远程网络通讯,促进了modbus在其对应领域中的使用. mod ...