- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于ModBus通信协议的变频控制系统设计
基于ModBus通信协议的变频控制系统设计
ModBus RTU 变频控制系统 变频器 RS485
1??引言
??? 变频装置的特性保证了电机起动和加速时具有足够转矩,且消除了起动对电机的冲击,保证电网稳定,提高了电机和机械的使用寿命。以往继电器组成的控制变频器的回路不仅接线复杂,而且不美观,尤其是变频器周围存在干扰源时,容易引起控制回路误动作,造成工作不正常或停机,严重时甚至损坏变频器。由于ModBus总线可靠的数据传输,快速的数据响应,强大的抗干扰能力,确保总线通信快速、安全可靠地进行,所以本系统采用ModBus总线替代了复杂的继电器控制回路。
?
??? ModBus采用RS2232、RS2485等异步串行标准,ModBus把通信参与者规定为主站和从站,主从站之间关系如图1所示。
图1??Modbus通信协议主从站关系?
??? ModBus通讯协议有RTU和ASCII两种传输模式,这里主要介绍RTU传输模式。
??? RTU模式信息帧中的8位数据包括2个4位十六进制字符,消息发送至少要以3. 5个字符时间的停顿间隔开始,典型的消息域包括设备地址、功能代码、数据区、CRC (循环冗余校验) 。设备地址指明该消息由总线上哪个设备接收;功能代码指明主站要从站做出何种响应,在ModBus标准协议中,定义了很多功能码,在系统中为了简化。只用到了03 和06 两个功能码,即读取和写从站内部寄存器命令;数据区包括寄存器地址,要处理项的数目,域中实际数据字节数; CRC是对由从站地址开始的帧的所有的字节进行CRC16校验的校验码。
?
??? 本文主要是从应用的角度介绍ModBus协议在电机变频控制系统中的应用。主要硬件组成有艾默生EV2000变频器、 RS2232 /RS2485 转换器、AT89S52开发板作为控制器、速度传感器,电机、屏蔽通信电缆等采用图2所示的总体控制框图。
图2??总体控制框图
??? AT89S52芯片作为上位机, EV2000变频器作为下位机,控制电机低速、高速、PID调节等复杂控制,变频器自身的频率调节和经过速度变送AT89S52的PID调节组合成串级调节回路控制的电机速度输出如图3、4所示。由两图可以得出,串级调节对阶跃响应和干扰有较小的超调和非常平滑的输出。
图3??系统PID串级调节的输出及对干扰的响应
图4??系统普通PID的输出及对干扰的响应
?
??? 在通信协议的程序中,主站采用查询发送的方式,从站采用回馈响应的方式,上位机AT89S52采用在Keil开发平台下用C语言编程实现。下面主要介绍ModBus在数据发送接收中的C程序设计实现。主站查询从站状态程序框图如图5所示。
图5??主站查询从站状态程序框图
??? 工作时,主站查询从站的状态,ModBus功能代码03,读寄存器值。上位机将一帧命令经过CRC后放入发送寄存器中,初始化串口并通过RS2485总线发送数据,下位机接收到数据后经过CRC解析,读取此帧数据指定地址下的数据,并将数据通过RS2485总线反馈给上位机,上位机将接收到的数据放入接收寄存器中,由上位机对接收寄存器中的数据进行处理。限于篇幅,下面仅给出03功能号下的部分程序,以供参考。
#include config. h
#include
#include string. h
#include stdio. h
…
char uart0_send_count = 0;
char uart0_total_send_count;
char flag_modbusframefinish;
VoidModBussent ( void) / /串口初始化并发送数据
{U0 IER | = 0X02;
IO0SET = 0x40;
uart0_send_count = 1;
uart0_total_send_count - - ;
U0THR = uart0_output_buffer[0 ];
}
…
Void vaconcommunication ( void) / /通信接收处理
{
unsigned short crc_number;
char receive_count;
receive_count = uart0_input_buffer[ 2 ];
crc_number = ( uart0_input_buffer[ uart0_total_rcv_count - 1 ]
8) | uart0_input_b2uffer[ uart0_total_rcv_count - 2 ];
crc_buffer = uart0_input_buffer;
crc =CRC16 ( crc_buffer, uart0_total_rcv_count22
文档评论(0)