0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文了解串口通讯与MODBUS协议

jf_78858299 来源:机器人配视觉 作者:机器人配视觉 2023-03-23 09:59 次阅读

1. 基本的通讯方式

基本的通讯方式有并行通讯和串行通讯两种。

并行通信:是指数据的各位同时进行传送的通信方式。

串行通信:是指数据一位一位顺序传送的通信方式。

2. 串行通讯的两种方式

串行通信的两种基本形式:同步通信和异步通信。

异步通信所传输的数据帧格式是由1个起始位、1~9个数据位、1~2个停止位组成,依靠起始位和停止位保持同步;

同步通信所传输数据帧格式是由多个字节组成的一个帧,每个帧都有两个(或一个)同步字符作为起始位以触发同步时钟开始发送或接收数据。

3. 根据传送方向分类

根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。 如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输。如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。

图片

4. 串行通讯接口

串行通讯物理接口按电气标准及协议来分包括RS-232、RS-422、RS485等,这里主要讲一些最常用的RS485接口。

5. RS485接口电路

图片

作为一个经常被应用到的SP485R芯片的示范电路,可以被直接嵌入实际的RS-485应用电路中。微处理器的标准串行口通过RXD 直接连接SP485R 芯片的RO 引脚,通过TXD直接连接SP485R 芯片的DI 引脚。

由微处理器输出的R/D 信号直接控制SP485R 芯片的发送器/接收器使能:R/D 信号为“1”,则SP485R 芯片的发送器有效,接收器禁止,此时微处理器可以向RS-485 总线发送数据字节;R/D 信号为“0”,则SP485R 芯片的发送器禁止,接收器有效,此时微处理器可以接收来自RS-485 总线的数据字节。此电路中,任一时刻SP485R 芯片中的“接收器”和“发送器”只能够有1 个处于工作状态。

连接至A 引脚的上拉电阻R7、连接至B 引脚的下拉电阻R8 用于保证无连接的SP485R芯片处于空闲状态,提供网络失效保护,以提高RS-485 节点与网络的可靠性。

如果将SP485R 连接至微处理器80C51 芯片的UART 串口,则SP485R 芯片的RO 引脚不需要上拉;否则,需要根据实际情况考虑是否在RO 引脚增加1 个大约10K 的上拉电阻。

6. 串口MODBUS通讯

Modbus作为工业通信回路中数据交换的规则已经被广泛地应用在各个领域,使得具有Modbus 通信协议的设备方便通信,例如PLC变频器、流量计、温湿度、上位机组态软件、各种传感器仪表等。

Modbus通信协议分为两种串行通信模式,ASCII 和RTU 通信模式。在使用时,需要先设定通信模式以及串行口RS232、RS485的通信参数(波特率,奇偶校验,从机地址,数据位,停止位,字节顺序),在Modbus 总线上的所有设备应具有相同的通信模式和串行通信参数

modbus信息帧结构组成

  1. MODBUS命令报文

读数据

主站发送

地址 功能码 数据起始地址高位 数据起始地址低位 数据个数高位 数据个数低位 CRC16高位 CRC16低位

返回:

地址 功能码 字节长度 数据1高位 数据1低位 数据2高位 数据2低位 CRC16高位 CRC16低位

8. MODBUS关键概念

(1)上位机读取数据每次间隔时间一般不小于100ms

(2)设备地址:MODBUS从机通讯地址,在一个网络中不能有两个相同的地址。(3)功能码:MODBUS 协议规定的功能码

(4)寄存器地址和寄存器数

主站命令中的参数是从寄存器地址开始的寄存,读寄存器长度的N个寄存器。(5)从站响应数据

从站响应数据是:字节数和N个数字节数据。

9. MODBUS主站常用操作

1)读优化:对于不连续地址的数据读取,是否采取打包读,则系统使用打包读命令,一次性完成多个地址的读取。

2)读优化间隔:读优化时,若地址之间小于此间隔,则会打包到一起,使用多读命令一次读取。

3)最大包长:一次通讯允许的最大数据长度。

4)字节顺序:调整32位双字的解码顺序。

以32位整数为例,说明字节顺序的含义:

1234:表示双字元件不做处理直接解码,。

例如:从串口读到的数据为0000 00 01 表示 1。

2143:表示双字元件高低字不颠倒,但字内高低字节颠倒。

例如:从串口读到的数据为0000 00 01 表示 0x00000100 (即256)。

3412:表示双字元件高低字颠倒,但字内高低字节不颠倒。

例如:从串口读到的数据为0000 00 01 表示 0x00010000 (即65536)。

4321:表示双字元件内4个字节全部颠倒。

例如:从串口读到的数据为00 00 00 01 表示 0x0100 0000 (即1677 721

10. C语言MODBUS程序

(1).CRC16算法

INT16U CRC16(INT8U *puchMsg, INT16U usDataLen)

{

INT8U uchCRCHi = 0xFF; /* 高CRC字节初始化 */

INT8U uchCRCLo = 0xFF; /* 低CRC 字节初始化 */

INT8U uIndex; /* CRC循环中的索引 */

while (usDataLen--) /* 传输消息缓冲区 */

{

uIndex = uchCRCHi ^*puchMsg++;   /* 计算CRC */

  uchCRCHi = uchCRCLo ^auchCRCHi[uIndex];

  uchCRCLo = auchCRCLo[uIndex];

}

return (uchCRCHi << 8 |uchCRCLo);

}

(2)发送命令程序

本例程以Mag64为核心CPU

void Read_InPut(INT8U Addr,INT16UStart,INT16U Len)

{

INT16U CRC;

SendBuffer_485[0]=Addr; //设备地址

SendBuffer_485[1]=0x04; //modbus功能码

SendBuffer_485[2]=Start/256; //Start为寄存器地址

SendBuffer_485[3]=Start%256;

SendBuffer_485[4]=Len/256; //Len为读取寄存器长度

SendBuffer_485[5]=Len%256;

CRC=CRC16(SendBuffer_485,6);

SendBuffer_485[6]=CRC/256; //CRC校验高位

SendBuffer_485[7]=CRC%256; //CRC校验低位

R485_OUT; //使能RS485发送

SendLen_485=8;

SendNum_485=0;

CloseINT0(); //关闭串口接受中断

UCSR0B |= BIT(UDRIE0); //打开串口发送中断

}

(3)返回数据解析

数据接收使用串口中断,ReceivedBuffer_485为接收数据组,ReceivedNum_485为接收到数据长度,ReceivedFlag_485接收到数据标志。函数float Datasum(INT8UBYTE1, INT8U BYTE2, INT8U BYTE3, INT8U BYTE4)把浮点数的4个字节转换为1个浮点数。

float Datasum(INT8U FloatByte1, INT8U FloatByte2,INT8U FloatByte3, INT8U FloatByte4)

{

float aa;

union IntTOFP

{

FP32       F32;

  INT8U      T8[4];

};

union IntTOFPaa;

aa.T8[0] = FloatByte1;

aa.T8[1] = FloatByte2;

aa.T8[2] = FloatByte3;

aa.T8[3] = FloatByte4;

return aa;

}

void Read_Lmag(INT8U Ad)

{

INT8U i,j;

INT8U Num1[10],BIT;

INT16UCRC1,CRC2;

FP32 Flow; //aaa为瞬时流量数值

ReceivedFlag_485=1;

Open_Time1_Ms5(20);

Read_InPut(Ad,0x1010,2); //发送设备地址、寄存器地址、寄存器长度

while(ReceivedFlag_485); //等待接收结束

if((ReceivedNum_485==9)&&(ReceivedBuffer_485[0]==Ad)) // 判断数据是否正确

{

CRC1=CRC16(ReceivedBuffer_485,7);                

 CRC2=ReceivedBuffer_485[7]*256+ReceivedBuffer_485[8];

  if(CRC1==CRC2)

  {// 转换数据为浮点数

Flow= Datasum(ReceivedBuffer_485[6], ReceivedBuffer_485[5], ReceivedBuffer_485[4] ,ReceivedBuffer_485[3]);

}

}

}

11. MODBUS调试软件MODBUS PULL

以从站地址为1,波特率9600,读取所有实时数据为例设置方法如下:

按照表2所示:起始寄存器地址4113 寄存器个数为22

  1. 设置采集命令包括设备地址(1)、MODBUS功能码(04)、寄存器地址(4113)、寄存器长度(2)、采集间隔(1000)。

图片

2.设置串口数据

根据从机串口格式(1位起始位 8位数据位 1位停止位,无校验)设置如下图:

图片

3.设置数据显示格式

图片

4.通讯成功界面

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6753

    浏览量

    88606
  • MODBUS
    +关注

    关注

    28

    文章

    1740

    浏览量

    76658
  • 异步通信
    +关注

    关注

    1

    文章

    56

    浏览量

    10104
  • 同步时钟
    +关注

    关注

    0

    文章

    42

    浏览量

    3210
收藏 人收藏

    评论

    相关推荐

    Modbus协议转Profibus协议网关接温控表与PLC通讯

    Modbus协议转Profibus协议网关(XD-MDPB100)则是实现这一通讯的重要工具。Modbus转Profibus网关的主要功能是实现Mo
    的头像 发表于 06-21 11:31 1803次阅读
    <b class='flag-5'>Modbus协议</b>转Profibus<b class='flag-5'>协议</b>网关接温控表与PLC<b class='flag-5'>通讯</b>

    基于modbus协议串口通信

    RT:小弟求教各位大神,用labvIEW怎么做基于modbus协议串口通信啊??怎么编程啊??
    发表于 12-04 19:57

    如何使用modbus协议实现labview的串口通讯

    如何使用modbus协议实现labview的串口通讯,校验码又是什么?它们都是子vi吗?
    发表于 09-23 14:17

    哪位大神能给个labview利用modbus协议进行串口通讯的例程啊?

    从论文里找,发现关于modbus协议串口通讯,大家给的例程都是关于CRC或者LRC校验的程序。本人菜鸟,最近刚在NI官网下了modbus库,发现这里也有类似于VISA的控件,不知道怎
    发表于 06-13 15:10

    modbus协议笔记

    1 Modbus协议概要​ Modbus通信协议由Modicon公司(现在的施耐德电气Schneider Electric)于1979年为可编程逻辑控制(即PLC)通信而发表。目前,Modbu
    发表于 07-02 07:17

    Modbus协议是什么?Modbus协议主要有哪些应用?

    请问Modbus协议是什么?Modbus协议主要有哪些应用?
    发表于 07-15 12:04

    Modbus协议是什么

    Modbus协议是什么?MODBUS功能码有哪些?MODBUS协议有哪几种传输模式?
    发表于 09-29 07:06

    Modbus协议的相关资料推荐

    认识Modbus协议
    发表于 02-11 06:02

    读懂Modbus协议

    Modicon被施耐德(Schneider)收购,Modbus协议广泛应用在工业控制器、HMI和传感器上,逐渐被其他厂商所接受,成为了种主流的通讯协议,用于和外围设备进行
    发表于 10-28 14:23

    Modbus协议的理解

      当上位机和下位机进行通讯或多个微控制器进行通讯时需要进行通讯,很常用的种就是通过串口收发命令,在简单的系统中可以自己定义
    发表于 05-05 16:47

    基于Modbus协议串口通讯程序_RS485总线系统应用

    本文在遵循Modbus协议的基础上,阐述了Modbus的两种传输模式和串口通讯程序的设计实例,并给出了VB语言的程序清单。
    发表于 01-03 18:51 1.7w次阅读
    基于<b class='flag-5'>Modbus协议</b>的<b class='flag-5'>串口</b><b class='flag-5'>通讯</b>程序_RS485总线系统应用

    Modbus协议最基础概念详细介绍

    认识Modbus协议
    发表于 12-07 17:06 18次下载
    <b class='flag-5'>Modbus协议</b>最基础概念详细介绍

    基于Modbus协议通讯的DEMO称重程序

    EMERSONEV1000/EV2000变频器与MITSUBISHFX2PLC基于Modbus协议通讯的DEMO程序、硬件连接二、通讯方式Modb
    的头像 发表于 02-14 10:05 1150次阅读
    基于<b class='flag-5'>Modbus协议</b><b class='flag-5'>通讯</b>的DEMO称重程序

    工业通讯应用中主流的常用协议Modbus协议

    智联物联技术分享,本期为大家介绍工业通讯常用的主流协议Modbus协议Modbus协议的前身叫做Mod协议,常被用于Modicon公司的P
    的头像 发表于 04-19 15:25 1239次阅读
    工业<b class='flag-5'>通讯</b>应用中主流的常用<b class='flag-5'>协议</b><b class='flag-5'>Modbus协议</b>

    浅谈Modbus协议

    Modbus协议种广泛应用的工业控制器网络协议,它定义了个控制器能够识别的消息结构,用于实现不同设备之间的通信和数据交换。自1979年由Modicon公司(现为施耐德电气Schn
    的头像 发表于 10-09 13:56 124次阅读