朱卫国 樊留锁
摘 要 PLC作为工业自动化控制系统的核心,早已得到了广泛的应用,由于PLC的优良性能和重要性,PLC的价格也一直是居高不下,在进行数据的显示时,如果是通过机工业计算机或者触摸屏这样的上位机,自不必说,这是轻而易举的事,如果没有工业计算机或者触摸屏只通过PLC的输出口进行大量数据的显示,是很不合算的,因为PLC的价格对I/O点数很敏感,然而通过单片机与PLC的通信并进行大量数据的显示,则不失为一种高效灵活个性化的设计方法。
关键词 PLC 单片机 数据 灵活
中图分类号:TP278 文献标识码:A
0引言
单片机作为一种嵌入式智能单元已得到了非常广泛的应用,这主要表现在它体积小、价格低、功能多样、灵活多变等特点,即使在PLC这样的控制系统中也常常会见到他的身影,在本例中我们通过单片机与PLC的编程口通信实现PLC内部数据的采集与显示,它的好处在于不占用PLC的任何输出端口、采集数据量可多可少、制造成本可高可低、显示屏可大可小、显示距离可远可近,充分体现了用单片机采集显示PLC内部数据的灵活性。
1编程口的应用
所有的PLC都有一个编程口可以和上位计算机进行通信,以便可以进行程序的读写、运行监视和实时控制。在通信协议方面都有一套不需要用户编程的固有通信服务程序,上位机只需要按格式通信即可,但这种协议对每一个品牌的PLC来说,并不都是公开的,如果我们不知道这个协议,那么除非是应用组态王或者是某一品牌的触摸屏软件可以通过简单的设置就可以通信过外,自己用单片机、VB和VC等软件是难以实现通信的,如果用PLC的通信指令,有的品牌PLC的通信指令不支持编程口,必须用其自己的通信模块,而一个通信模块也价格不菲,这也显然是不合算的,所以不用PLC输出口而可以进行大量数据显示的前提是能通过编程口进行有协议的串行通信或无协议但是支持串行通信指令的通信,在此我们仅仅讨论的是通过三菱FX系统PLC编程口进行有协议的串行通信。
2三菱FX系列PLC的编程口通信协议
在这种通信方式中,与PLC通信的计算机为主机,PLC仅作用从机存在,通信功能有四种,软元件读写各一种,对应命令分别为0(ASCII码30H)和1(ASCII码31H),位强制置位与复位各一种对应命令分别为7(ASCII码37H)和8(ASCII码38H),三菱FX系列PLC的编程口通信协议是以帧为单位进行传输的,每帧的每个字节都是以ASCII码的形式存在的,每一帧的数据因上传与下传的不同、命令、以及信息的多少而在结构与长短上有所不同。
2.1上位机读取PLC软元件的数据
上位机发送帧:帧开始标志(ASCII码02H)、命令(ASCII码30H)、首地址(4个ASCII码)、数据数目(2个ASCII码)、帧结束标志(ASCII码03H)、和校验(2个ASCII码),一共11个ASCII码。
PLC返回帧:帧开始标志(ASCII码02H)、数据1(4个ASCII码)、数据2(4个ASCII码)、……、最后一个数据(4个ASCII码)、帧结束标志(ASCII码03H)、和校验(2个ASCII码),长度不确定。
2.2上位机向PLC软元件写数据
上位机发送帧:帧开始标志(ASCII码02H)、命令(ASCII码30H)、首地址(4个ASCII码)、数据数目(2个ASCII码)、数据1(4个ASCII码)、数据2(4个ASCII码)、……、最后一个数据(4个ASCII码)、帧结束标志(ASCII码03H)、和校验(2个ASCII码),长度不确定。
PLC返回帧:
接受正确返回ASCII码06H
接受错误ASCII码15H
2.3上位机置位与复位PLC上的位元件
上位机发送帧:帧开始标志(ASCII码02H)、命令(ASCII码置位07H复位08H)、地址(4个ASCII码)、帧结束标志(ASCII码03H)、和校验(2个ASCII码),一共9个ASCII码。
PLC返回帧:
接受正确返回ASCII码06H
接受错误ASCII码15H
从以上帧格式可以看出,数据读写是可以批处理的,置位与复位操作则不能进行批量处理。
三菱PLC的串行口协议为: RS232C、波特率: 9600bps、数据位:7、奇偶: even
3以不变应万变
通过前文所述可知,上位机与PLC通信的帧格式较为繁杂,这表现在两方面,其一,在上位机要通过复杂的运算过程才能生成通信码,这中间涉及命令的选择、地址ASCII码的求取、每一个数据要发送ASCII码的求取、要发送数据量ASCII码的求取、奇偶校验、和校验、生成发送序列,接收数据时还要进行和校验、奇偶校验的还原、ASCII码到十六进制数的转换与四位十六进制数的合成;其二,每一个发送或接收帧都包含有地址,这对于每一种软件元件是不一样的,这个不一样还表现在同一种软元件操作类别不一样时其地址也会有所不同。
这些繁杂给我们编程带来了困难,总的结果会导致或者程序占用空间很大,或者程序结构复杂,含混晦涩难读难懂难修改,怎么可以简化这个繁杂的过程呢?
通过以下方法的处理可以得到很大的简化,基本达到以不变应万变目的,对于发送帧数据和接收帧数据处理这一块,无论多复杂还是要做的,但是不再需要对每一个软元件都做,只需要针对数个(根据自己需要,例如D0-D9)数据寄存器做一个上位机读取PLC的数据寄存器的发送帧,针对数个(根据自己需要,例如D10-D19)数据寄存器做一个上位机向PLC的数据寄存器的发送帧即可,如此即实现了在单片机上的以不变应万变。在PLC一侧,这种协议的通信是不需要用户撰写程序的,但这里应单片机程序的需要只需要做简单编程即可,例如实际要读取的数据是D100-D109,則只需要在程序开头写上LD M8000 BMOV D100 D0 K10,再例如实际读取的是Y0-Y17的状态,只需要在程序开头写上LD M8000 MOV K4Y0 D0就好。
这种以数据传送来简单化编程的方法,虽然实时性不强,但用于数据显示相比人自身的反应速度来说已经足够地快了。
读取D0-D9的数据的发送帧如下所示:02 30 31 30 30 30 30 41 03 35 46
4 PLC与单片机通信的实现
4.1硬件上的实现
要实现PLC与单片机的通信,首要的就是使PLC与单片机进行有效的联接,三菱PLC的圆形编程口是RS422协议,而单片机的编程端口是TTL协议,所以无法使二者直接相联接,需要进行协议的协调一致,我们知道PLC与计算机是通过一条转接线连于计算机的9针串口(RS232)上的,单片机从计算机下载程序进也是如此,这样我们就可以把二者联接计算机的一端联接到一起,但是二者同为9针的孔口,根本不可联接,这样我们就需要做一个中间的转接线——用两个9针的针口联接起来作为中间的桥梁,但是两个9针的针口必须如下联接才可通信:2-3、3-2、5-5。
4.2软件上的实现
我们知道单片机有四种串行通信方式,这里必须用方式2,即8位数据位可变波特率的异步串行通信,这是第一个关键所在。
从PLC的通信协议可知,它的数据位是7位,猛看起来似乎与单片机的通信协议不相符,而实际上是一样的,PLC侧的数据是7位,还有一位最高位是作为奇偶校检位用的,合起来也是8位一个字节地进行传送,这里不同之处在于PLC的7位数据方式,一次只能传送一位十六进制数,而单片机的8位数据方式即可以作为两位十六进制数处理也可以如PLC的7位数据方式处理。
偶校验的实现:
void SendOneByte(unsigned char c) //偶校验与发送一个字节
{
ACC=c; //待校验数送入ACC累加器
if(P==1)c=c+0x80; //P=1则C为奇数个1,最高位加1变成偶数个1
SBUF = c;
while(!TI);
TI = 0;
}
偶校验位的剔除:
if(byte[4]>127)byte[4]=byte[4]-128;
if(byte[5]>127)byte[5]=byte[5]-128;
if(byte[2]>127)byte[2]=byte[2]-128;
if(byte[3]>127)byte[3]=byte[3]-128;
ASCII码到Hex的转换:单片机头文件处写上#include
四位十六进制数的合成:需要用左移位与按位或运算进行。
D0=toint(byte[4]);//合成D0
D0=(D0<<4)|toint(byte[5]);
D0=(D0<<4)|toint(byte[2]);
D0=(D0<<4)|toint(byte[3]);
单片机通信方式的设计:
void InitUART(void)
{
TMOD = 0x20; //串口方式2
SCON = 0x50; //9600波特率
TH1 = 0xD9;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
显示屏的设计:可根据实际需要用单片机的其它I/O口进行静态或动态的显示,这属于普通单片机的技术设计,不在本文讨论之列。
从前文的设计分析可知,虽然PLC工作可靠功能强大,但实际应用中还是会表现出不足之处,此时配合单片机的应用正好可以取长补短相得益彰,二者有机结合后才能充分体现设计的灵活性,使系统设计呈现最佳状态。
参考文献
[1] 王静霞.单片机基础与应用[M].北京:高等教育出版社,2016.
[2] 朱成庆.电气控制与PLC技术.[M].北京:电子科技大学出版社,2012.
[3] 李言武.可编程控制器技术[M].北京:北京邮电大学出版社,2016.
[4] 梁小布,梁吟曦.可编程控制器应用技术[M].北京:北京理工大學出版社,2009.
[5] 刘东汉.PLC技术及应用[M].北京:人民邮电出版社,北京理工大学出版社,2009.