• 普通PC通过USB转485串口 ModBus-RTU通信协议控制伺服电机


    一、RS485通信

    RS485 是半双工通信(2 线制),可以一点对多点进行组网,而且 RS485 是用缆线两端的电压差值来表示传递信号,这与 RS232 电气特性大不一样。RS485 仅仅规定了接收端和发送端的电气特性,并没有规定或推荐任何数据协议

    RS485 采用两根通信线,通常用 A 和 B 或者 D+和 D-来表示。逻辑“1”以两线之间的电压差为+(0.2~6)V 表示,逻辑“0”以两线间的电压差为-(0.2~6)V 来表示,是一种典型的差分通信,
    电平与 TTL 电平兼容,可方便与 TTL 电路连接。

    优点:

    1. RS485的接口信号电平比RS231-C低,不易损坏接口电路的芯片,且该电平与TTL电平兼容,方便于TTL电路相连接。

    2. RS485的数据最高传输速率为10Mbps。其平衡双绞线的长度与传输速率呈反比,在100kbps速率下,才可能使用规定的最长电缆长度,只有在很短的距离下才能获得最高传输速率。

    3. RS485接口采用平衡驱动器和差分接收器的组合,抗共模干扰能力强,即抗噪声干扰性好,因而通信距离远,最大传输距离大约为1200m,实际可达3000m。

    4. RS485接口在总线上允许连接多达128个收发器,既具有多站能力。同时需要两个终端电阻,其阻值要求等于传输电缆的特性阻抗。在短距离300m内传输时可不连接终端电阻。

    RS485引脚定义

    RS-232与RS-422及RS-485三者之间的特性与区别

    二、ModBus-RTU通信协议

    modbus协议已经成为通用工业标准,通过协议,控制器与控制器、控制器通过网络(以太网)与其他设备之间可以实现串行通信。RTU即远程终端单元,消息中每8位包含两个十六进制字符。在相同的波特率下,这种方法比ASCII方式传送的数据量大。

    2.1.1 图解区

    2.2 ModBus-RTU详解
    • Modbus 一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、TCP。其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现。

    上面图中看到了报文格式:下面详细分析一条报文:01 06 00 01 00 17 98 04

        01                06                00 01              00 17               98 04
    从机地址        功能号        数据地址            数据            CRC校验

    这一串数据的意思是:把数据 0x0017(十进制23) 写入 1号从机地址 0x0001数据地址

    2.1.1 图解报文格式

    1、主机对从机写数据操作
    如果单片机接收到一个报文那么就对报文进行解析执行相应的处理,如上面报文:
        01             06            00 01           00 17        98 04 
      从机地址        功能号          数据地址          数据         CRC校验
    
    假如本机地址是 1 ,那么单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是:
                HoldDataReg[1]  =  0x0017;
    MODBUS主机就完成了一次对从机数据的写操作,实现了通讯。
    
    2、主机对从机读数据操作
    主机进行读HoldDataReg[1] 操作,则报文是:
        01             03           00 01         00 01          D5 CA 
     从机地址        功能号          数据地址      读取数据个数       CRC校验
    那么单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是:返回信息给主机,返回的信息也是有格式的:
    返回内容:  
        01       03           02          0017        F8 4A
      从机地址   功能号     数据字节个数    两个字节数据    CRC校验
    MODBUS主机就完成了一次对从机数据的读操作,实现了通讯。
    
    2.1.2 CRC校验

    意义:例如上面的 98 04 是它前面的数据(01 06 00 01 00 17)通过一算法(见附录2,很简单的)计算出来的结果,其实就像是计算累加和那样。(累加和:就是010600010017加起来的值,然后它的算法就是加法)。
    作用:在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确。比如主机发出01 06 00 01 00 17 98 04,那么从机接收到后要根据01 06 00 01 00 17 再计算CRC校验值,从机判断自己计算出来的CRC校验是否与接收的CRC校验(98 04主机计算的)相等,如果不相等那么说明数据传输有错误这些数据不能要。

    2.1.3 功能码
    • 常用功能码
      01 (0x01) 读线圈
      02 (0x02) 读离散量输入
      03 (0x03) 读保持寄存器
      04(0x04) 读输入寄存器
      05 (0x05) 写单个线圈
      06 (0x06) 写单个寄存器
      15 (0x0F) 写多个线圈
      16 (0x10) 写多个寄存器

  • 相关阅读:
    多校第四场
    codechef 两题
    Topcoder 多校T-shirt场
    状态压缩DP
    LUCAS 定理
    HDU 1104 Remainder
    HDU4542 小明系列故事——未知剩余系
    Codeforces Round #256 (Div. 2)
    Codeforces Round #FF (Div. 2)
    2016年川师大软件工程学生博客打分
  • 原文地址:https://www.cnblogs.com/shiqi17/p/10771741.html
Copyright © 2020-2023  润新知