打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
大神是这样理解 串口通讯与MODBUS协议的
工控PLC技术
公众号
去学工控技术
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
数据…
数据n
CRC16
7. 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.通讯成功界面
精彩回顾
1、图解工业机器人控制与PLC通信
2、免费领取:halcon编程源码(带注释)
3、【干货分享】教你如何进行halcon标定
4、【限时领取】ABB机器人培训视频+PPT课件+学习资料
5、【限时领取】20种工业机器人,100多种应用案例视频
6、【干货分享】KUKA机器人视频+PPT+资料
7、【免费领取】安川机+那智机器人教学视频、学习资料
8、【干货免费送】FANUC机器人学习视频+资料
9、西门子S7-3/400:编程软件、教程、案例、文档
10、【福利】三菱FX5U学习资料免费领取
11、工业机器人调试,难吗?
12、人工智能技术学习常用的十类算法
13、S7-1200与其他PLC/组态软件无线串口通讯(自由口)
14、从来没有一种工作叫:钱多事少离家近,位高权重责任轻!
15、FANUC 机器人码垛编程详细讲解
文章来源:综合网络,如有侵权,联系删除。
机器人配视觉 工业机器人、机器视觉、Visual Studio 应用(联合视觉)、PLC(联合机器人)、人工智能最新信息、工业自动化资讯......
21篇原创内容
公众号
一起学机器人PLC
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
干货丨从Modbus开始说现场总线!
pic单片机与触摸屏串行通信的modbus协议实现
Can转RTU网关can总线转profinet
第18章 RS485通信和Modbus协议
MODBUS详解精简版
松下PLC通过MODBUS总线控制LEXIUM的05伺服-机电之家网PLC技术网
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服