时间:2024-07-28
薛青娜
(西安铁路职业技术学院,西安710014)
目前,出于成本的考虑,大部分的小型PLC并没有集成CAN通信接口,部分大型 PLC集成有CAN通讯接口,但价格较贵。随着应用技术的发展,经常会出现一些应用场合,在面积较大的范围内,需要多台PLC协同完成一个系统的综合控制[1]。许多制造业用户特别是大型企业,为了避免过分依赖一家系统提供商,通常会采用几家不同厂商的控制系统。PLC之间的通信格式不兼容,给企业内部的系统集成、集中管理和升级带来了极大的困难。因此,研究一种统一的通信协议,以使不同品牌的PLC可以统一监控和互相自由通信具有重要的现实意义。
CAN总线具有多主工作方式、各站依据优先权进行总线访问的机制、无破坏性的总线仲裁技术、短帧结构不易受干扰、自动检错、发送期间若丢失仲裁或由于出错而遭到破坏的帧可实现自动重发等性能。直接通信距离最远可达10km(传输速率为5kbit/s),最高通信速率可达1Mbit/s(传输距离为40m),非常适合用于组建PLC通信网络[2]。
提出了一种基于CAN总线的PLC网络方案,能够对多台联网的PLC实现远程配置、数据通信,并能够在投入较低硬件成本的基础上,实现良好的系统运行性能。这个方案也充分发挥了现场总线CAN-bus的实时、可靠、高速、远距离、易维护等特点[3]。通过单片机将PLC的通讯协议转化为CAN协议,并组成CAN总线网络,以实现各PLC之间的相互访问,同时可使用上位机检测各PLC的工作和通信状况。这种方式组建的PLC网络,与选择集成CAN通讯功能的PLC设备相比,具有更加灵活的系统扩展能力,也能够获得更好的性价比[4]。
图1 基于CAN总线的PLC网络方案
在该方案中与上位机联系的欧姆龙PLC通过转换网关连接,而下位机的 PLC1,PLC2,…,PLCn则是不同公司的PLC产品,有欧姆龙的PLC,有三菱的SC-09,还有满足MODBUS通信协议的控制产品。这里转换网关的作用就是搭建不同PLC协议与CAN协议之间的桥梁,并满足不同PLC协议之间的无缝衔接。为了开发方便起见,转换网关使用周立功的DP51+开发板来进行实现,其中的CAN功能通过CAN控制芯片SJA1000来完成。
在CAN与多PLC协议转换方案中,主要是通过软件来实现协议之间的转换,这里有欧姆龙通信协议、三菱SC-09、Modbus RTU。这里在DP51+的软件中使用f_serial_1.c和f_can_1.c:实现欧姆龙通信协议和CAN协议的互相转换;f_serial_2.c和f_can_2.c:实现三菱SC-09通信协议和CAN协议的互相转换;f_serial_3.c和f_can_3.c:实现Modbus RTU通信协议和CAN协议的互相转换。在软件检测到不同协议的时候,通过中断方式来调用上述函数完成协议转换。
在上位机中严格按照OMRON专用协议编写通信程序。这样PLC才能理解上位机发来的命令帧,而上位机才能理解PLC发回的响应帧[5]。响应帧在PLC的上位链接单元中自动生成,在PLC中无需用户再编写通信程序,因此可以没有PLC的主动参与而进行通信。PLC也有能力在必须主动参与时发起数据传输。当多节点参与通信时,必须为上位机链接通信设置节点号,用以区分不同的节点,本文中每个DP51+上只有一个PLC,节点号设置为00。从上位计算机发送一个命令时,必须遵循上位机连接通信协议。
程序f_can_1.C用来将CAN接口接收到的命令转化为欧姆龙的通信协议。主函数void f_can_1()首先发送各命令共同的起始字符'@'和节点号"00",unsigned char m_canchar[]中保存了主程序中接收到的CAN命令,其中第一个字节为该命令的控制字符,根据该字节的值区别不同的命令并分别处理。
f_serial_1.C程序用来将串口接收到的欧姆龙响应命令转化为CAN命令。CAN命令帧的地址为读取命令中包含的发送节点地址,命令码为将相应命令码的第7位置1,unsigned char m_serialchar[]中保存了主程序中接收到的欧姆龙PLC通过串口发送的字符,其中第四和第五字节保存了命令的标题码,程序以此判断并分别处理不同的命令。若为测试命令,则将数据区的第三个字节设置为本节点PLC的类型号,其它读写命令由开始地址区分后转换为相应的CAN命令。在处理读数据的响应命令时,对于大于8个字节的命令,要分成多帧分别传送。
三菱SC-09通信电缆采用统一的编址处理各种软设备,因此需要明确每一个软设备的具体设备地址,读写时各软设备的地址范围如下表所示,每一地址为一个字节,长8位,相当于8个软设备,如读写时0080H实际是X0~X7的值。
表1 三菱字软设备地址
程序f_can_2.C用来将CAN接口接收到的命令转化为三菱SC-09的通信协议。因为三菱SC-09通信协议中每个字节的最高位为偶校验位,其余位为数据位,而DP51+串口协议每字节8位数据位,无校验位。
f_serial_2.C程序用来将串口接收到的SC-09的通信命令转化为CAN命令。因接收到的每个字节都包含了偶校验位,所以在使用每个字节的值之前,首要要去取偶校验位,然后再根据标题码判断不同的处理命令。
程序f_can_3.C用来将CAN接口接收到的命令转化为Modbus的通信协议。在DP51+接收到读取工作区的命令0x22后,首先发送节点地址01,其后为读取保持寄存器命令的标题码03,标题码之后为读取变量的开始地址和读取数目,把转换完成的Modbus命令中从地址到读取数据低位的各字节存储在数组char ch[]中,然后计算该命令的CRC校验。
f_serial_3.C程序用来将串口接收到控制器的应答命令转化为CAN命令。DP51+接收到应答命令后计算CRC校验,确认校验无误则转化为CAN命令并发送回相应的节点,如果命令大于8个字节,则分成多帧分别发送。
必要时欧姆龙能主动发起传送数据,以减少上位机监控的频率。实现这一功能需要在欧姆龙PLC中编写TXD命令,首先初始化DM区,DM0高字节为写操作命令代码,与CAN协议的命令码相同,低字节为写操作目标节点的地址。DM1中保存写命令的开始地址,从DM2开始保存要写的数值。
TXD命令的格式如图2所示,首源字S为传送数据第一个字的地址,本文中固定为DM0,控制字(C)的值决定了数据的输出端口,在上位机链接模式中,最低两位未使用,均设置为0。最高位设置为1,则输出到外围端口,设置为0,则输出到外围端口以外的端口。当最高位设置为0时,第二位设置为0,使用CPU单元内置的RS-232C端口,设置为1或2则分别使用串行通信板端口1或2。本文使用CPU单元内置的RS-232C端口,因此控制字C设置为#0。字节数N必须是#0000到#0061之间的BCD值(即最多有122个字节的ASCII字符)。当执行条件为ON时,TXD从首源字S开始读出N个字节数据,将其转化为ASCII码,然后输出数据到指定端口,在读取DM区时,将先读取高字节,后读取低字节。
图2 欧姆龙TXD命令
从欧姆龙PLC发送出的字符格式如下表所示,欧姆龙PLC将自动添加前缀(起始字符、节点号和标题码EX)和后缀(校验码和结束符)。程序f_serial_1.C通过标题码EX来判断是否是欧姆龙PLC发出的TXD命令,根据正文的最高字节,将其转化为相应的CAN通信命令(按字节写输出命令0x03、按字节写工作区命令0x13),接收写入命令节点的处理流程与上位机监控时相同,在收到写入节点发回的正确响应命令后,欧姆龙主动发起的对其它节点写入数据的操作结束。
表2 欧姆龙EX命令
当需要欧姆龙主动发起读数据操作时,需要使用查询命令0x04。两PLC互相通信的示意图如图3所示。
以欧姆龙主动发起读取三菱PLC数据的操作为例,具体通信步骤如下:
(1)在欧姆龙PLC中编写TXD命令,首先初始化DM区,DM0高字节为命令代码,与CAN协议的命令码相同(04),低字节为读取数据目标PLC的节点地址。DM1高字节设置读取目标PLC哪个区域的数据,若读取输入区则置为01,读取输出区则设置为02,读取工作区则设置为03。低字节设置读取来的数据放到本机工作区的开始地址,如设置为00。DM2设置为读取目标节点数据的开始地址,DM3设置为读取的字节数。然后通过TXD命令将DM0到DM3的数据发送到DP51+(1)。
图3 PLC主动读数据通信流程
(2)DP51+(1)确认欧姆龙发送来的EX命令正文的第一个字节为0x04后,将其转化为CAN查询命令(0x04),并发送到目标节点。
(3)DP51+(2)接收到查询消息帧以后,通过判断第3个字节的值,采用相应的命令读取三菱PLC输入区、输出区或者工作区的数据。
(4)三菱PLC自动响应对它的读数据命令。
(5)DP51+(2)接收到三菱PLC对读数据命令的响应后,以接收到CAN命令的第4个字节的值为开始地址,发出按字节写工作区命令0x13到DP51+(1)。
(6)DP51+(1)接收到写工作区命令0x13后,处理开始地址后转化为欧姆龙写IR区命令,在接收到欧姆龙PLC的正确响应后通信结束,读取的数据保存在欧姆龙的工作区中。
三菱PLC主动发起读写其它节点的数据需要使用RS指令。RS指令的格式如图4所示,虽然在一个程序中可以按需使用大量RS指令,但必须保证同一时刻只有一个RS指令被驱动。该指令使用RS-232接口来发送和接收串行数据,在RS指令接通的情况下,将M8122置位(设置发送请求),将从发送地址开始,依次将数据发送到串口,发送数据的个数由发送数据点数决定。本文不需要三菱PLC主动接收数据,因此接收数据点数设置为0。
由M8161决定发送数据的方式,当M8161设置为OFF时,16位数据被分成高8位和低8位,然后再发送;设置为ON时,高8位被忽略,只发送低8位。本文中CAN应用层协议采用按字节方式读写,因此使用RS指令前,将M8161设置为ON。
图4 三菱RS指令
由三菱PLC主动发起写其它节点的操作时,首先初始化数据寄存器,D0设置为写操作命令代码,与CAN协议的命令码相同,D1设置为写操作目标节点的地址。D2中保存写命令的开始地址,从D3开始保存要写的数值。然后驱动RS指令,并设置发送请求。三菱PLC将自动在数据块的前后分别添加数据块起始标志STX和数据块结束标志ETX。
由三菱PLC主动发起读取其它节点数据的操作时,首先初始化数据寄存器,D0设置为查询命令代码04,D1设置为读取数据目标节点的地址。D2设置为读取目标PLC哪个区域的数据,D3设置为读取来的数据放到本机工作区的开始地址。D4设置为读取目标节点数据的开始地址,D5设置为读取的字节数。然后驱动RS指令,并设置发送请求。其余通信流程与欧姆龙主动发起读取其它节点数据的流程相同。
用Keil软件编写协议转换程序(与欧姆龙PLC连接的DP51+的CAN通信地址设置为2,另外一个与三菱PLC连接的DP51+的CAN地址设置为3,实际应用时可外接DIP开关用来选择地址),并生成汇编文件,然后将DP51+的串口与上位机串口相连接,将模式选择开关拨到编程模式,打开DPFlash下载软件,型号选择DP51(+),选择连接的上位机串口,并选择波特率为 9600bps[6-7]。
在欧姆龙PLC中首先将DM0-DM2分别设置为#0302、#0000、#0001,然后执行如图5所示的命令,每1秒钟通过TXD命令将DM0-DM2的数据发送到串口,经过DP51+转换为对三菱PLC写输出区的命令,然后将DM2中的数值循环左移一位。三菱PLC的输出指示灯依次循环点亮,由欧姆龙PLC主动发起的写数据命令正确执行。
图5 欧姆龙TXD通信程序
在欧姆龙PLC中首先将DM0-DM3分别设置为#0402、#0100、#0000、#0002,然后每 1 秒钟通过TXD命令将DM0-DM3的数据发送到串口,将三菱PLC的输入区从地址0开始的两个字节读到工作区IR016,然后将输出区IR100设置为与工作区起始地址IR016的值相同。将三菱PLC的输入点设置为ON以后,欧姆龙PLC相应的输出点点亮,由欧姆龙主动发起的读数据命令正确执行。
许多制造业用户特别是大型企业,为了避免过分依赖一家系统提供商,通常会采用几家不同厂商的控制系统[8]。PLC之间的通信格式不兼容,给企业内部的系统集成、集中管理和升级带来了极大的困难。本文提出了一种基于CAN总线的PLC网络通信方案,该方案通过将各厂家不同的通信协议转化为统一的CAN网络通信,从而实现了较好的互相连通以及统一的上位机监控能力。
[1] 甘永梅,李庆丰,刘小娟.现场总线技术及其应用[M].北京:机械工业出版社,2004.
[2] 温克强.Modbus通讯协议在DCS与PLC通讯中的应用[J].石油化工自动化,2005(5):65-68.
[3] 李喜东,刘波涛,刘刚.Modbus RTU串行通讯协议在工业现场的应用[J].自动化技术与应用,2005,24(7):37-40.
[4] 袁飞,程恩.基于Modbus规约的智能仪表与PC机通信技术实现[J].微计算机信息,2004,20(9):56-57.
[5] 赵伟,张小牛.网络化一测量技术与仪器发展的新趋势[J].电测与仪表.2000,37(7):5-9.
[6] 郑平,李英.基于Ethernet的全开放工业控制网络[J].工业仪表与自动化装置,2001(3):6-9.
[7] 吴钦伟.工业仪表与装置智能化网络化的进展[J].自动化博览,2003(18):1-6.
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!