您的位置 首页 分销

如何用C51完成单片机和PLC之间通讯的实例

HMI(人机界面)以其体积小,高性能,强实时等特点,越来越多的应用于工业自动化系统和设备中。它有字母、汉字、图形和图片等不同的显示,界面简单友好。

1、 HMI(人机界面)以其体积小,高性能,强实时等特色,越来越多的应用于工业主动化体系和设备中。

它有字母、汉字、图形和图片等不同的显现,界面简略友爱。配有长寿命的薄膜按钮键盘,操作简略。它一般选用具有集成度高、速度快、高牢靠且价格低一级长处的单片机[1]作为其间心操控器,以完成实时快速处理。PLC单片机结合不只能够提PLC的数据处理才能,还能够给用户带来友爱简练的界面。本文以Modbus通讯协议为例,具体评论了一个人机体系中,如何用C51完成单片机PLC之间通讯的实例。


2、Modbus通讯协议

Modbus协议是应用于电子操控器上的一种通用言语。经过此协议,操控器相互之间、操控器经由网络和其它设备之间能够通讯。 Modbus协议供给了主—从准则,即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)依据主设备查询供给的数据作出相应反响。主设备查询的格局:设备地址(或播送,此刻不需求回应)、功用代码、一切要发送的数据、和一过错检测域。从设备回应音讯包括承认地址、功用码、任何要回来的数据、和一过错检测域。假如在音讯接纳进程中产生一过错,或从设备不能履行其指令,从设备将树立一过错音讯并把它作为回应发送出去。

操控器能设置为两种传输形式:ASCII和RTU,在相同的波特率下,RTU可比ASCII办法传送更多的数据,所以选用KTU形式。

(1)典型的RTU音讯帧

典型的RTU音讯帧如表1所示。


RTU音讯帧的地址域包括8bit。或许的从设备地址是0…127(十进制)。其间地址0是用作播送地址,以使一切的从设备都能知道。主设备经过即将联络的从设备的地址放入音讯中的地址域来选通从设备。当从设备发送回应音讯时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。

RTU音讯帧中的功用代码域包括了8bits,当音讯从主设备发往从设备时,功用代码域将告之从设备需求履行哪些行为;当从设备回应时,它运用功用代码域来指示是正常回应(无误)仍是有某种过错产生(称作贰言回应,一般是将功用码的最高位由0改为1)。

从主设备发给从设备音讯的数据域包括附加的信息:从设备有必要用于进行履行由功用代码所界说的行为。这包括了像不接连的寄存器地址,要处理项的数目,域中实践数据字节数。假如没有过错产生,从从设备回来的数据域包括恳求的数据。假如有过错产生,此域包括一贰言代码,主设备应用程序能够用来判别采纳下一步举动。

当选用RTU形式作字符帧时,过错检测域包括一16Bits值(用两个8位的字符来完成)。过错检测域的内容是经过对音讯内容进行循环冗长检测(CRC)办法得出的。CRC域附加在音讯的终究,增加时先是低字节然后是高字节。

(2)一切的Modbus功用码

Modbus的功用码界说如表2所示。


3、常用功用通讯程序的规划

本文介绍了几个Modbus常用功用程序的规划。笔者选用单片机作为主机,在单片机上编写程序完成单片机与PLC之间的通讯。由单片机向PLC宣布指令信息,PLC主动作出回应。PLC经过单片机的串行通讯口通讯,程序用C51完成。程序的子函数及其功用:

(1)串口初始化

voidProtocolInit(void)

函数功用:串口设置为异步通讯办法1(开始位1位,数据位8位,中止位1位);守时/计数器1设置为波特率产生器,通讯速率9600bps;开串行中止,并把串行中止设置为高优先级。

(2)CRC简略函数

unsignedcharCrc16(unsignedchar*puchMsg,unsignedcharusDataLen)

函数功用:先调入一值是全“1”的16位寄存器,然后调用一进程将音讯中接连的8位字节各当时寄存器中的值进行处理。每个8位字符都独自和寄存器内容相或(OR),成果向最低有用位方向移动,最高有用位以0填充。LSB被提取出来检测,假如LSB为1,寄存器独自和预置的值或一下,假如LSB为0,则不进行。整个进程要重复8次。在终究一位(第8位)完成后,下一个8位字节又独自和寄存器的当时值相或。终究寄存器中的值,是音讯中一切的字节都履行之后的CRC值。

(3)初始化变量

voidInitvar(void)

函数功用:初始化一切进程变量。

(4)串行中止服务程序

voidProtocolSerialProcess(void)interrupt4using2

函数功用:发送中止发送主机构成的指令数组,发送完后置标志位;接纳中止接纳PLC回来的呼应数组,存入接纳数组,并置标志位,且假定呼应正确,留下主机处理。

(5)读N个位变量(线圈)

voidProtocolRead_bit(unsignedcharDeviceAddr/*PLC局号*/,unsignedcharRegType/*寄存器类型*/,unsignedintBitAddr/*开始地址*/,unsignedcharSubAddr/*子地址*/,unsignedintBitNum/*位数*/)

函数功用:依据函数参数,构成读N个位变量的指令数组,发动发送。等候发送完并接纳完(如超时未接纳完则从头发送)。剖析接纳数组:正确,保存读取的数据;过错,从头发送。

(6)写一个位变量

voidProtocolSetBit(unsignedcharDeviceAddr/*PLC局号*/,unsignedcharRegType/*寄存器类型*/,unsignedintBitAddr/*地址*/,unsignedcharSubAddr/*子地址*/,unsignedi

ntClrSet/*写值“1”或“0”*/)

函数功用:依据函数参数,构成置某位变量为“1”或“0”的指令数组,发动发送。等候发送完并接纳完(如超时未接纳完则从头发送)。剖析接纳数组:正确,回来;过错,从头发送。

(7)读N个字节变量

voidProtocolReadByte(unsignedcharDeviceAddr/*PLC局号*/,unsignedcharRegType/*寄存器类型*/,unsignedintRegAddr/*开始地址*/,unsignedcharSubAddr/*子地址*/,unsignedintRegNum/*个数*/)

函数功用:依据函数参数,构成读N个字节变量的指令数组,发动发送。等候发送完并接纳完(如超时未接纳完则从头发送)。剖析接纳数组:正确,保存读取的数据;过错,从头发送。

(8)写N个字节变量

voidProtocolSetByte(unsignedcharDeviceAddr/*PLC局号*/,unsignedcharRegType/*寄存器类型*/,unsignedintRegAddr/*开始地址*/,unsignedcharSubAddr/*子地址*/,unsignedintRegNum/*个数*/)

函数功用:依据函数参数,构成写N个字变量的指令数组(要写的数从某参数数组中读取),发动发送。等候发送完并接纳完(如超时未接纳完则从头发送)。剖析接纳数组:正确,回来;过错,从头发送。

4、结束语

以上的程序现已经过试验,并应用于实践的人机体系中。按照相似的办法,能够编写其他不同功用的程序,完成对PLC的不同操控和操作。使用单片机和PLC进行优势互补,能够组成网络化、智能化的工业操控体系。别的整个单片机体系程序用C51言语编程,程序简练,便于阅览与调试。单片机和人机界面结合能够实时的显现PLC的工作状况,实时的操控、设置、调整PLC工作情况,进步工业操控的主动化程度和实时性。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/147751.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部