张立众
(陕西理工大学 电气工程学院, 陕西 汉中 723000)
基于Linux平台串行通信协议DF1的C语言程序设计
张立众
(陕西理工大学 电气工程学院, 陕西 汉中 723000)
为了实现对AB可编程控制器的监控组态提供更加经济和简便的途径,在Linux平台下完成了串行通信协议DF1的开发。采用C语言编程和模块化程序设计,给出了协议开发的一般方法和基本流程。运行结果表明能够实现Linux下PC机与AB公司多数可编程控制器的通信。
Linux平台; 串行通信; DF1协议; C语言程序
DF1协议是AB公司可编程控制器系统广泛支持的数据链路层通信协议,各系列可编程控制器及装有RSLinx通信软件的计算机均支持DF1协议[1]。它的物理层建立在RS232和RS485等电气标准之上,针对不同的设备建立不同的应用层命令。综合物理层、数据链路层和应用层后能够完成基于DF1协议的通信。目前使用的监控组态较为复杂,DF1协议的相关研究在国内尚属空白。为了实现对AB可编程控制器的监控组态提供经济和简便的途径,本文在Linux平台下完成了DF1协议的开发,可与AB公司多数可编程控制器通信。本次设计给出了模块化编程的协议开发步骤和Linux下DF1协议开发的完整源代码,由于Linux操作系统具有优越的可移植性,可以方便地把本程序移植到嵌入式系统中,使开发具有DF1协议接口的节点变得更快捷。可应用于实际设备的DF1协议接口的开发,对其他协议的开发也有一定的参考价值。
1.1DF1协议简介
DF1协议最大的特点是联合了ANSI x3.28规范中的D1(数据透明性)和F1(双向同时传输兼内部响应)。数据透明性是指报文格式简单和数据的可读性,双向同时传输兼内部响应是指在物理层的RXD和TXD上数据是同时传输的而不同于其他协议里RXD和TXD是交替进行的,当然这主要是对全双工而言。
DF1链路层协议完成如下任务:
(1)从一个链路向另一个链路传送报文,它不涉及到报文的内容、功能和最终目的,如DF1全双工协议所实现的就是在命令或应答的结尾加上BCC或CRC校验码,设备接收到命令或应答后就进行校验,如果校验通过就返回ACK,否则返回NAK(注:在应用层将涉及到报文的内容、功能和最终目的);
(2)通过错误标识代码来标识错误。
DF1协议主要分为两类:DF1半双工协议(主从通信)和DF1全双工协议(点对点通信)。DF1半双工主/从协议提供一种多支路单主/多从网络,主机通过定时轮询从机启动通信[2]。半双工协议是一种支持一主多从通信方式的协议,允许2到255个节点通过Modems同时连接到单一链路上。如果只有一个从站,从站可以直接与主站相连。当然还有其他实现DF1半双工协议的途径,例如通过1761-NET-AIC模块组成RS485网络实现DF1半双工通信。
RS485是美国电气工业联合会(EIA)制定的利用平衡双绞线做传输线的多点通信标准[3],采用半双工通信方式,信号在同一时刻只能从一方流向另一方,不能双向交流[4],接口是常见的串行通信接口之一。这里采用RS485出于以下考虑:RS232采用点对点连接,通信距离短,且采用电平传输模式,通信极易受到干扰;与之相比,RS485总线传输距离远,采用差分信号传输,具有抗干扰能力强和多站点通信能力等优点[5]。RS485收发器采用平衡发送和差分接收,共模输出电压在-7~+12 V之间,具有抑制共模干扰的能力[6]。RS485总线型结构是一种用于设备联网的经济而又传统的工业总线方式,采用点对点、点对多点和广播式通信方式。最突出之处就是结构简单,现场施工方便,省时省力,也节省线材,而且运行状态稳定,故障率较低[7-9]。RS485串行接口克服了RS232传输距离近、传输速率慢等缺点,最高传输速率可达到10 Mbps[10],传输距离可以达到120 m[11]。
本文的DF1半双工协议就是通过RS485网络实现的,整个RS485总线上只能有1个主设备,其余为从设备,总线可连接多达32个设备[12]。
1.2DF1协议的控制字符
DF1全双工协议是点对点的通信协议,主要特点有:(1)在点对点链路中允许同时收发数据;(2)在多支路链路中的交互模块具有数据仲裁功能;(3)高性能的协议实现程序应该尽可能的从传输媒介上获得大的数据流量。当通过AB通信模块连接交互模块时,通信模块自动完成仲裁功能。如果系统对实时性要求不高则采用半双工通信模式,反之则选用全双工通信方式。
DF1协议采用的是异步通信方式,数据是一帧一帧地发送。DF1协议的控制字符是ASCII码控制字符,通常由7位组成,需要在前面添加一位构成8位数据。DF1协议就是通过组合一些控制字符,构成特殊的控制信号和数据信号的。组成控制信号和数据信号的控制字符必须连续发送,中间不要有其他字符。控制信号是固定不变的组合,而数据信号的内容是可变的。全双工传送信号与半双工传送信号相比DLE NAK在这里没有reset作用,DLE ENQ也不是轮询报文开始标识,而是要求对方重新发送的标识。其他标识含义同上。
半双工传送信号比全双工传送信号多出了DLE SOH(10 01)、DLE EOT(10 04)、STN等标识。DF1全双工主要是通过两个主程序:发送主程序(TRANSMITTER)和接收(RECEIVER)主程序来实现发和收同时进行,这就体现了DF1的双向同时传输的特点。关于DF1全双工的实现流程比较简单,基本是一收一发,发完报文后通过收到的反馈情况,来判断是否正确执行,若没有则重发,或显示错误等操作。
1.3DF1协议的报文帧格式
1.3.1报文帧格式及其具体含义
半双工协议使用了下面的3种报文帧格式:
(1)轮询帧
(2)主报文帧
(3)从报文帧
全双工协议一般只使用半双工协议的第3种报文帧格式:从报文帧。对具体的应用层展开如下:
上面既有命令的格式又有应答的格式,数据是按从左向右的顺序在链路上传播的。
DF1协议分为物理层、数据链路层、应用层。数据发送时,来自用户应用程序的数据传送给应用层,经过应用层数据封装之后传送给数据链路层,再经过数据链路层封装之后交给物理层传输。数据接收的过程与此相反[13]。
1.3.2CRC校验
重要说明:DF1的CRC校验虽然采用了CRC-16标准,但它与常用的CRC-16略有不同,就是在开始时,CRC寄存器的初值为0x0000H,而不是0xFFFFH。
CRC半双工校验:如下报文
10 01 20 10 0208 09 06 00 10 10 04 0310 03 853ASTN DLE STXAPPDATA(DLEDLE)DLE ETX CRC
校验内容=STN+STX+APP DATA+ETX=20020809060010040303,
对上面的校验内容进行上述CRC-16的校验过程将得到校验码:853A。
CRC全双工校验:
10 0208 09 06 00 10 10 04 0310 03 9D30DLE STXAPP DATA(DLE DLE)DLE EXT CRC
校验内容=APP DATA+ETX=0809060010040303,
对上面的校验内容进行上述CRC-16的校验过程将得到校验码:9D30。
图1 系统硬件实验平台
DF1协议的开发借助罗克韦尔三层网络实验平台,在Linux下的PC机中进行,和嵌入式系统相比PC机有着更多的开发和调试工具。半双工硬件实验平台的搭建如图1所示。
首先完成Linux下串口编程的初始化:在Linux下所有设备是作为文件处理的,串口文件位于/dev目录下。串口一为/dev/ttyS0,串口二为/dev/ttyS1。打开、关闭、读写串口都是通过使用标准的文件函数来操作。在使用串口之前必须先通过设置termios结构体的各成员变量实现串口的设置,这里需要设置波特率、数据位、停止位、校验位。软件开发工具使用GNU,它是Linux下的文本编辑软件Vi和C语言编译软件Gcc。全部程序在Red Hat Linux 8.0中调试通过。PC机有完善的操作系统并提供应用程序接口(API),开发好的应用程序可以直接在操作系统上运行。本次软件开发采用模块化程序设计,系统的软件设计结构如图2所示。
图2 系统的软件设计结构图
(1)首先连接好计算机和Micrologix1000的DF1网络。串口发送10 02 01 00 0F 00 08 52 A2 0A 07 89 00 00 10 03 8D 4D,PLC返回10 06 10 02 00 01 4F 00 08 52D0 07 E8 03 00 00 00 00 00 0010 03 5F E2。数据中“D0 07”表示N7:0为2000,“E8 03”表示N7:1为1000。
(2)显示write B3:0。串口发送10 02 01 00 0F 00 08 54 AA 04 03 85 00 00 03 00 01 00 10 03 DB B2,PLC返回10 06 10 02 00 01 4F 00 08 54 10 03 AB 1C 10 05 10 05 10 05 10 05。
程序运行结果如图3和图4所示。
图3 读取流程图
图4 写入流程图
本文通过对AB公司串行通信协议DF1的深入研究,解读其数据链路层协议和应用层通信命令,最终实现了DF1协议,从而可与AB公司大部分可编程控制器通信。DF1协议与其他类似串口协议相比功能较完备,通用性较强,DF1协议支持全双工高速通信模式,这是其他类似串口协议如Modbus协议所不支持的功能。除此之外DF1协议还提供了很强的错误诊断和处理功能,从而充分保证了数据传输的准确性和完备性,完全能满足工业复杂环境的需求。
[1]陈惠珊.DF1协议在无线通信控制系统的实现[J].工业控制计算机,2007,20(7):27-29.
[2]刘鹏,孙伟,曹文.基于DF1协议的通讯在铝厂烟气净化监控系统中的应用实践[J].中国有色冶金,2006(5):39-42.
[3]郭政慧,张治斌.煤矿RS485监控线路复用技术[J].煤矿安全,2010(2):58-60.
[4]冯梅,孙良勤,郑民.基于RS485通讯的TD特型固化炉温度数据系统[J].化工自动化及仪表,2011,38(5):608-620.
[5]王晓丽.基于RS485现场总线的乳化液浓度在线检测[J].煤矿机械,2011,32(11):218-220.
[6]闫成华,周余,都思丹.基于嵌入式Linux的RS485通信协议[J].计算机工程,2008,34(11):278-280.
[7]耿立中,王鹏,马聘,等.RS485高速数据传输协议的设计与实现[J].清华大学学报:自然科学版,2008,48(8):1311-1314.
[8]周有利.RS485总线的使用和解决方案探讨[J].电脑知识与技术,2009,5(5):1242-1243.
[9]弋沛琦,鞠建波,范敬泽,等.RS-485总线通信可靠性的分析与研究[J].海军航空工程学院学报,2009,24(6):692-694.
[10]郭伟伟,马捷中,翟正军,等.DSP与PC机之间的数据通信研究[J].微处理机,2008(29):155-157.
[11]张有清,杨文焕,王世杰,等.基于LabVIEW串行通信的变频调速监控系统[J].电机与控制应用,2010,37(7):50-53.
[12]陈品富,刘以军,宋春晖,等.采用自适应召唤策略提高RS485总线上的数据传输效率[J].电力系统保护与控制,2011,39(14):133-137.
[13]何风行,顾德英.Linux下PC机和罗克韦尔PLC的通讯[J].仪器仪表学报,2005,26(增刊8):445-449.
[责任编辑:谢 平]
Linux-based serial communication protocol DF1 of C language programming
ZHANG Li-zhong
(School of Electrical Engineering, Shaanxi Sci-Tech University, Hanzhong 723000, China)
In order to provide a more economical and convenient way to monitor and control the AB programmable controller, the development of serial communication protocol DF1 in Linux platform is completed. Using C language programming and modular programming, the general method and basic procedure of protocol development are given. The running results show that the communication between PC and AB can be realized by Linux.
Linux platform;serial communication;DF1 protocol;C language programming
1673-2944(2016)04-0017-06
2015-03-30
2015-10-15
张立众(1969—),男,辽宁省鞍山市人,陕西理工大学讲师,硕士,主要研究方向为智能控制系统、现场总线和工业以太网。
TP273
A