欢迎来到天天文库
浏览记录
ID:46612918
大小:67.00 KB
页数:3页
时间:2019-11-26
《Modbus协议下实现单片机与PLC之间的通讯》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Modbus协议下实现单片机与PLCZ间的通讯1引言hmi(人机界面)以其体积小,高性能,强实时等特点,越来越多的应用于工业自动化系统和设备屮。它有字母、汉字、图形和图片等不同的显示,界面简单友好。配有长寿命的薄膜按钮键盘,操作简单。它一般采用具有集成度高、速度快、高可靠「L价格低等优点的单片机[1]作为其核心控制器,以实现实时快速处理。pic和单片机结合不仅町以提PLC的数据处理能力,还可以给用户带來友好简洁的界面。本文以Modbus通讯协议为例,详细讨论了一•个人机系统中,如何用C51实现单片机和PLC之间通讯的实例。2Modbus通讯协议Modbus协议是应用于电子控制器上的
2、一种通用语言。通过此协议,控制器相互Z间、控制器经由网络和其它设备之间口J以通信。Modbus协议捉供了主一从原则,即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询捉供的数据作岀相应反应。主设备查询的格式:设备地址(或广播,此吋不需要回应)、功能代码、所冇要发送的数据、和一错误检测域。从设备回应消息包括确认地址、功能码、任何要返回的数据、和一错谋检测域。如果在消息接收过程屮发生一错谋,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。控制器能设置为两种传输模式:ASCII和RTU,在同样的波特率下,RTU可比ASCII方式传送更多的数据
3、,所以采用KTU模式。(1)典型的RTU消息帧典型的RTU消息帧如表1所示。RTU消息帧的地址域包含8bito可能的从设备地址是0,..127(十进制)。其中地址0是用作广播地址,以使所有的从设备都能认识。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。RTU消息帧中的功能代码域包含了8bits,当消息从主设备发往从设备时,功能代码域将告之从设备需要执行哪些行为;当从设备回应吋,它使用功能代码域来指示是正常回应(无误)还是冇某种错误发生(称作异议回应,一般是将功能码的最高位
4、由0改为1)O从主设备发给从设备消息的数据域包含附加的信息:从设备必须用于进行执行由功能代码所定义的行为。这包括了像不连续的寄存器地址,要处理项的数冃,域中实际数据字节数。如果没有错谋发牛,从从设备返回的数据域包含请求的数据。如果有错课发牛,此域包含一异议代码,主设备应用程序可以用来判断采取下-•步行动。当选用RTU模式作字符帧时,错误检测域包含一16Bits值(用两个8位的字符来实现)。错谋检测域的内容是通过对消息内容进行循环兀长检测(CRC)方法得出的。CRC域附加在消息的最后,添加时先是低字节然后是高字节。(2)所有的Modbus功能码Modbus的功能码定义如表2所示。3常
5、用功能通讯程序的设计[5]本文介绍了几个Modbus常用功能程序的设计。笔者釆用单片机作为主机,在单片机上编写程序实现单片机与PLCZ间的通讯。由单片机向PLC发出命令信息,PLC自动作出回应。PLC通过单片机的串行通讯口通讯,程序用C51实现。程序的子函数及具功能:⑴串口初始化voidProtocolInit(void)函数功能:串口设置为界步通讯方式1(起始位1位,数据位8位,停止位1位)淀时/计数器1设置为波特率发生器,通讯速率9600bps;开串行中断,并把串行中断设置为高优先级。(2)CRC简单函数unsignedcharCrcl6(unsignedchar*puchMs
6、g,unsignedcharusDataLen)函数功能:先调入一值是全“1"的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。每个8位字符都单独和寄存器内容相或(OR),结果向授低冇效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节乂单独和寄存器的当前值相或。最终寄存器中的值,是消息中所冇的字节都执行之后的CRC值。(3)初始化变量voidlnitvar(void)函数功能:初始化所有过程变量。(4)串行中断服务程
7、序voidProtocolScrialProccss(void)intcnupt4using2函数功能:发送中断发送主机形成的命令数组,发送完后置标志位;接收中断接收PLC返回的响应数组,存入接收数组,并置标志位,且假设响应正确,昭待主机处理。(5)读N个位变量(线圈)voidProtocolRcad_bit(unsigncdcharDcviccAddr/*PLC局号*/,unsignedcharRegType/*寄存器类型*/,unsignedintBitAddr/
此文档下载收益归作者所有