DF1协议涉及OSI网络模型的物理层、数据链路层和应用层。网络层介绍见表3-1。
表3-1 网络层介绍
DF1协议最大的特点是联合了ANSI x3.28规范中的D1(数据透明性)和F1(双向同时传输兼内部响应)。数据透明性是指报文格式简单和数据的可读性,双向同时传输兼内部响应是指在物理层的RXD和TXD上数据是同时传输的。DF1支持全双工或半双工通信,对应不同的物理层网络拓扑,全双工通信需要基于RS-232、RS-422等进行网络部署,半双工通信需要基于RS-485进行网络部署。
物理层是一组电缆和接口模块,用来提供节点间通信的通道。一个节点作为网络上的连接点,通常具有唯一的地址。
当计算机连接到DH、DH+、DH485或ControlNet link上时,接口模块是DF1 link(RS-232)与Network link(DH、DH+、DH485或ControlNet link)之间的接口。DF1物理层连接如图3-1所示。
图3-1 DF1物理层连接
(1)DF1 link
一个DF1 link提供:
1)半双工协议的主从通信;
2)全双工协议的点对点通信。
(2)Network link
点对点通信能使用的网络连接类型见表3-2。
表3-2 网络连接类型
(续)
DF1和Network(DH、DH+和DH485)用软件的两层完成连接:
● 数据链路层;
● 应用层。
图3-2显示的是软件层的工作原理。
图3-2 软件层的工作原理
(1)数据链路层
该层控制着物理层上的通信流并具有以下功能:
1)确定物理介质上的编码。
2)控制谁传输数据,谁使用仲裁协议。
3)将数据包从源节点传输到物理链接上的目标节点。
根据连接类型的不同,数据链路层需要做的动作也不同。数据链路层的需求见表3-3。
表3-3 数据链路层的需求
(续)
(2)应用层
该层控制和执行两个节点规定的实际命令并具有以下功能:
1)数据库和应用处理接口。
2)解释命令。
3)将用户的数据格式化为数据包。
应用层的节点通常分为两种:
1)发送者,接收到一个用户信号,然后发送信息并等待回复,再发送结果给用户。
2)接收者,等待网络连接上的消息,当接收到消息时,执行操作并回复消息给发送者。
无论消息的功能或目的地是什么,网络上所有的消息都具有相同的基本结构。消息的基本结构见表3-4。
表3-4 消息的基本结构
下文将就协议和数据两部分展开详细的描述。
如果计算机连接一个接口模块,那么必须在计算机上编程以生成适合协议的字符序列,再发送给接口模块,通过DF1协议可以实现点对点通信。DF1协议是数据链路层协议,是一种用编程规则解释通过物理连接传输的信号,有如下特点:
● 从连接的一端到另一端传递一条没有错误的消息。它不关心消息的内容、功能信息或信息的最终目的。例如,全双工DF1协议完成无差错检查BCC或CRC,并且把检查结果附到每一个发送或者接收的信息的节尾。如果BCC或者CRC可接收,则返回一个ACK;如果BCC或者CRC不可接收,则返回一个NAK。
● 用错误代码指示失败。在通信字符内部,协议能够划分消息并检测信号错误,错误后可重试,以控制消息流。
DF1协议主要分两类:DF1半双工协议(主从通信)和DF1全双工协议(点对点通信)。
DF1半双工主从协议提供一种多支路单主多从网络通信,主站通过定时轮询从站启动通信。半双工协议是一种支持一主多从通信方式的协议,允许2到255个节点通过modem同时连接到单一链路上。如果只有一个从站,从站可以直接与主站相连。
DF1全双工协议是点对点的通信协议,主要特点有:在点对点链路中允许同时收发数据,在多支路链路中的交互模块具有数据仲裁功能,高性能的协议实现程序尽可能从传输媒介中获得更大的数据流量。当通过AB通信模块连接交互模块时,通信模块自动完成仲裁功能。如果系统对实时性要求不高,则采用半双工通信模式;反之采用全双工通信模式。
全双工与半双工通信的控制字符、数据帧格式、数据处理流程等均不同,需要区别处理。
由于计算机本身没有RS-485接口,再加上全双工通信效率更高,因此本书将着重介绍全双工协议。
全双工协议支持点对点的连接,允许双向同步传输。在端点连接上,接口模块可以仲裁连接上传输的顺序等信息。
(1)字符传输
AB PLC通过RS-232接口发送串行数据,一次10bit到11bit(带奇偶校验)。如果数据长度是8bit,那么奇偶校验被保留,但要确认计算机是否符合这种模式。字符传输格式见表3-5。
表3-5 字符传输格式
(2)传输的字符
全双工协议都是面向字符的,它们使用表3-6中的ASCII控制字符进行控制,第7位加一个0,扩展到8位。
表3-6 控制字符
(续)
字符组是对连接协议具有特定含义的一个或者多个位的序列。字符组包含的字符必须一个接着一个,中间不能有其他字母。DF1协议将表3-6中列出的字符组合成控制和数据字符,控制字符是DF1协议读取特定消息时所需的固定符号,数据字符是包含特定消息应用数据的可变符号。全双工控制字符见表3-7。
表3-7 全双工控制字符
在全双工协议中,设备共享相同的数据电路,并且两个设备可以同时“通话”。全双工协议可以比作双车道桥:汽车可以同时在两个方向上行驶。
全双工协议连接两个物理电路,使双向消息同时传输(命令或者回复消息包)。这两个物理电路提供四条逻辑传输路径。全双工消息传输机制如图3-3所示。
图3-3 全双工消息传输机制
1)在电路1中,发送者A向接收者B发送消息(路径1),接收者A发送响应控制字符(DLE ACK、DLE NAK)到发送者B(路径3)。
2)在电路2中,发送者B向接收者A发送消息(路径4),接收者B发送响应控制字符(DLE ACK、DLE NAK)到发送者A(路径2)。
3)电路1中的所有消息和字符都是沿着相同的方向(A到B)移动,电路2中的消息和字符以相反的方向(B到A)移动。
AB PLC使用发送器和接收器实现DF1的接收和发送。下面就以发送器和接收器来定义协议环境。
1)发送器需要知道哪里接收它发送的信息。
● 根据发送器的要求一次发一条信息。
● 在传输下一条信息之前,需要通知传输是否成功。
2)接收器必须具有处理消息的机制,见表3-8。
表3-8 接收器消息处理机制
从发送器A到接收器B(路径1)的消息符号以及从接收器B到发送器A(路径2)的响应代码的发送和接收协议环境如图3-4所示。
图3-4 发送和接收协议环境
理想状态下,数据链路层协议与在该层上传输的内容或者消息包的格式(链路层数据)没关系,然而全双工协议对数据内容做了规定。
1)链路层数据最小为6字节。
2)链路层数据最大大小取决于应用层命令。
3)一些协议的执行要求链路层数据的第1个字节匹配节点地址,例如1771-kg模块的点对点通信。
4)作为重复消息检测算法的一部分,接收器将链路层数据的第2、3、5和6字节与前一消息中的相同字节进行比较,如果字节之间没有差异,则消息归类为前一消息的重传。读者可以设置AB PLC接口模块的参数,使其不执行重复消息检测。
在全双工协议中,消息源(提供消息包的软件)通过发送器(发送数据的设备)发送数据,然后接收器(接收数据的设备)接收到接收器(接收数据的软件)。
1)发送消息逻辑图如图3-5所示。
图3-5 发送消息逻辑图
2)接收器必须能够对有问题的情况做出反应,以下就是接收数据的过程中可能出现的一些问题:
①接收器已满,无法接收下一条消息。
②消息可能包含奇偶校验错误。
③BCC或CRC校验码不可用。
④DLE STX或DLE ETX BCC/CRC丢失。
⑤消息太长或太短。
⑥消息外发生错误的控制字符或数据字符。
⑦消息内发生错误的控制字符。
⑧DLE ACK反馈丢失导致发送器重复发送了同一条消息给接收器。
接收消息逻辑图如图3-6所示。
图3-6 接收消息逻辑图
3)一个完整的发送和接收过程如图3-7所示。
图3-7 发送和接收过程
数据链路层帧的特点如下:
● 全双工协议在不同的网络层实现其消息字段;
● 末个轮询和消息帧的末尾有1字节的BCC字段或2字节的CRC字段。
下面就开始介绍消息帧结构。
全双工协议实现不同的消息帧,这取决于网络层。图3-8显示了全双工消息帧的结构。
图3-8 全双工消息帧的结构
BCC/CRC字段包含DLE STX和DLE ETX之间的所有应用层数据的8位和的二进制补码。它不包括任何响应字符,可以使用块校验符(BCC)或者16位循环冗余校验(CRC16)对BCC/CRC字段进行错误检查。
在每一个轮询帧和每个消息帧的末尾,有1字节的BCC(块检查字符)域,或者2字节的CRC(循环冗余检查)域。通过开关设置或者软件配置选择BCC或CRC。任一域都能验证每个消息帧传输的准确性。下面对这两种校验方法分别进行介绍。
(1)BCC校验方法
BCC算法提供了中等级别的数据安全性,但是使用时注意以下两点:
● 在传输的过程中,不能检测到字节的移位。
● 不能检测帧内零的插入或删除。
以全双工协议BCC计算为例,如果一个消息帧包含十进制数据08、09、06、00、02、04和03,那么BCC消息帧如图3-9所示。
图3-9 BCC消息帧
APP DATA部分的和是32,那么转换为十六进制就是20 Hex。BCC校验是这个和的二补数(即二进制补码)运算,本例的二补数运算结果就是E0 Hex。二补数是一种用二进制位表示有号数的方法,也是一种将数字的正负号进行编号的方式。一个数字的二补数就是将该数字做原位的反运算(即二进制反码),再将结果加1,即为该数字的二补数。二补数算法如图3-10所示。
图3-10 二补数算法
要点:若要传输10 Hex,则必须使用数据字符DLE DLE表示。但是,这些DLE数据中只有一个包含在BCC总和中,例如传输十六进制数据08、09、06、00、04和03,消息帧如图3-11所示。
图3-11 含有10 Hex的消息帧
在上面的例子里,应用层数据的字节总和是2E Hex,因为只有一个DLE包含在BCC中,所以BCC是D2 Hex。
注意 如果BCC的校验和是10 Hex,则将其发送为“10”而不是“10 10”,即BCC不会被视为数据。
(2)CRC校验方法
AB PLC采用CRC-16/ARC算法。下面说明这种CRC算法的计算方法。
1)在消息帧开始时,发送器清除16位用于存储CRC值的寄存器。
2)把第1个8位二进制数据(即通信信息帧的第1个字节)与16位CRC寄存器的低8位相异或,把结果放于CRC寄存器中,高8位数据不变。
3)把CRC寄存器的内容右移一位(朝低位),用0填补最高位,并检查右移后的移出位。
4)如果移出位为0,则重复第3步(再次右移一位);如果移出位为1,则CRC寄存器与A001(1010000000000001)进行异或。
5)重复步骤3和步骤4,直到右移8次,这样整个8位数据全部进行了处理。
6)重复步骤2到步骤5,进行通信信息帧下一个字节的处理。
7)该通信信息帧所有字节按上述步骤计算完成后,将得到的16位CRC寄存器的高、低字节进行交换。
8)最后得到的CRC寄存器内容即为CRC码。
9)ETX值传送完后,传送CRC寄存器中的值。接收器也计算CRC值,并将其与接收到的CRC值进行比较,以验证收到的数据的准确性。
下面是个实际的帧,你可以用下面的字符串验证CRC计算程序。按照上面的步骤,需要计算的CRC字符段为DLE STX到DLE ETX之间的字符,那么需要校验的就是07 11 41 00 53 B9 00 00 00 00 00 00 00 00 00 00 00 00+03(ETX),如图3-12所示。
图3-12 CRC校验例子
本节主要讲解应用层软件程序设计和应用层使用的消息包结构。应用层主要使用应用程序发送和接收消息。应用程序分为两种,即命令发起者和命令执行者,这两种应用程序的功能见表3-9。
表3-9 命令发起者和命令执行者的功能
在AB PLC内部,Allen Bradley异步接口模块使用路由子程序和消息序列,当模块接收到异步连接上的消息时,它将消息放入排队序列。然后,路由子程序从序列里选出消息,并通过DH、DH+或DH485网络传输消息。模块还对从网络接收的消息进行排序,路由子程序接收到这些消息,并通过异步连接重新传输它们。
大部分设备发送和接收消息包的结构如图3-13所示。
图3-13 发送和接收消息包的结构
这些字段在链路上从左向右传输,具体解释见表3-10。
表3-10 消息包字段具体解释
注意 SRC、CMD和TNS的组合是每个消息包里的唯一标识,必须与上一个消息包中的相应字符段不同。如果相同,则忽略该消息,并将其视为一个副本;如果接收模块启用了“忽略重复消息”选项,则此消息将被忽略。
下面对每个字段进行更详细的讲解。
(1)DST和SRC
通过交换相应命令消息的DST和SRC,形成应答消息的DST和SRC,如图3-14所示。
图3-14 DST和SRC交换
(2)CMD和FNC
这两个字段一起工作,定义命令消息在目的节点要执行的内容。这些字段的内容由应用程序产生。消息格式取决于CMD和FNC的值,CMD为命令类型,FNC为命令类型下的特定功能,CMD格式如图3-15所示。
图3-15 CMD格式
举例:PLC-2指令enter download mode
发送=00000111(07 Hex)
应答=01000111(47 Hex)
高优先级发送(DH only)=00100111(27 Hex)
高优先级应答(DH only)=01100111(67 Hex)
(3)STS和EXT STS
这些字段表示消息传输的状态,传输正确返回0,传输错误返回非零字符,解释见表3-11。
表3-11 STS和EXT STS解释
注:只有当STS=F0时,消息才包括EXT STS部分。
STS用不同的位来表示应用层和链路层的传输错误信息,其位解析如图3-16所示。
有关STS和EXT STS错误代码的更多信息,参见3.2.2节。
图3-16 STS位解析
图3-17 TNS字段
(4)TNS
TNS包含唯一的16位标识符,通过维护一个16位计数器来生成这个数字。每次应用程序创建新消息时递增计数器,并将计数器值存储在新消息的两个TNS字节中。多任务环境必须使用TNS计数器,并且读取和增加TNS必须是不可分割的。TNS包含两字节,发送时低字节在前,高字节在后。TNS字段如图3-17所示,TNS值的分配见表3-12。
表3-12 TNS值的分配
注意 不要在应答消息中更改TNS值,应答消息直接把命令TNS复制过去就行。如果更改此值,则命令启动器不能匹配其命令与相应的应答消息。
(5)ADDR
ADDR(地址)包含命令执行器中要执行命令的存储器位置的开始字节地址,但SLC500处理器除外,它的ADDR被解释为字地址。
SLC 5/02、SLC 5/03和SLC 5/04处理器可以将CIF寻址模式位S:2/8设置为1,以将ADDR的解释更改为字节地址,使其与其他PLC处理器兼容。例如,如果命令要从命令执行器读取数据,那么ADDR指定要读取数据第1字节的地址。ADDR字段如图3-18所示。
在某些情况下,当从基本命令集向PLC-3、PLC-5、PLC-5/250或SLC500处理器发送命令时,必须创建特殊文件以接收数据。
图3-18 ADDR字段
注意 ADDR字段指定的是在PLC数据表中字节的地址,而不是字的地址。在后文中有如何解释PLC字到字节地址转换的相关内容。
(6)SIZE
消息要传输的数据字节数。此字段出现在read命令中,其中指定响应节点在其应答消息中必须返回的数据字节数。其大小随命令的类型而变化。PLC-5和PLC-5/250键入读写命令,该字段指元素的数量,而不是字节。在PLC-5中键入read和写命令,该字段为两字节长:先传输低字节,后传输高字节。
此部分叙述了发送通信指令给Allen Bradley PLC时应该使用的格式,并列出了通信指令的约定。下面开始描述指令如何使用。这些命令的消息包包括STS,可能还有包含状态和错误代码信息的EXT STS字段。有关这些字符的更多信息,请参阅3.2.2节。如果有些PLC数据涉及安全,不想被这些指令影响,那么需要使用以下的设置提前做数据保护:使用PLC-5/11、-5/20、5/30、-5/40、-5/60或-5/80处理器,可以指定权限,保护数据文件不被写入访问DH+链接;使用SLC 5/02、5/03或5/04处理器,可以指定静态文件保护,保护数据文件不被写入并防止从任何通信通道访问。
在一些情况下,接口模块能够通过设置PLC/SLC点来拒绝命令输入,具体要看PLC的手册描述。
表3-13(见本书配套资源包)为DF1通信指令,是PLC型号和对应指令的列表,第1列为命令,第2列为CMD(十六进制),第3列为FNC(十六进制),第1行其他部分为PLC型号,对应的列有√的意思是这种PLC支持这个命令。如果向PLC发送不支持的指令,则会发生不可预知的错误。
由于指令和PLC型号太多,我们着重讲一下具有代表性的MicroLogix1000相关指令。如果要了解其他指令,请自行查阅相关PLC手册。下面开始介绍指令,C为发送指令,R为指令的回复。
(1)change mode
1)改变MicroLogix PLC模式的指令,指令消息如图3-19所示。
图3-19 MicroLogix PLC change mode指令消息
2)改变SLC 5系列(包括500、5/03、5/04)的模式,只有钥匙在REM位置才起作用,指令消息如图3-20所示。
图3-20 SLC PLC change mode指令消息
(2)close file
关闭PLC的文件,当程序文件被打开并写完后将其关闭,指令消息如图3-21所示。
图3-21 close file指令消息
(3)diagnostic status
从接口模块读取状态模块的信息,返回的状态内容在下面的数据部分,状态信息随接口模块的类型而变化,指令消息如图3-22所示。
图3-22 diagnostic status指令消息
(4)disable force
取消I/O的强制功能,所有的强制将被取消,指令消息如图3-23所示。
图3-23 disable force指令消息
(5)download completed
下载完整系统后使用,使处理器回到之前的模式,指令消息如图3-24所示。
图3-24 download completed指令消息
(6)echo
检查通信连接上传输的完整性。命令消息将最多243字节的数据传输到节点接口模块。接收模块应对此进行回复,并通过将相同的数据传回原始节点来执行命令,指令消息如图3-25所示。
图3-25 echo指令消息
(7)initialize memory
重置处理器的内存目录,不重置通信设置,指令消息如图3-26所示。
图3-26 initialize memory指令消息
(8)open file
打开PLC处理器的文件,如果文件成功打开,则返回一个标签(低字节,高字节),指令消息如图3-27所示。
图3-27 open file指令消息
指令消息里的Tag用于命令protected type file read或者protected type file write,Tag也可用于关闭文件。如果回复有错误,那么Tag也可能被EXT STS代替。
(9)protected typed file read
从PLC打开的文件读取数据,指令消息如图3-28所示。
图3-28 protected typed file read指令消息
其中,Offset是文件中读取数据起始地址的偏移量;Size是读取数据的大小,MicroLogix 1000为0~248字节,SLC 500、5/01、5/02为0~96字节。
(10)protected typed file write
将数据写入PLC,对于MicroLogix 1000,这个命令可用于更新终端ID。(为此,Size=02h,Tag=4176,Offset=0000,File tpye=90,两个字节的数据就是终端ID,低字节优先。)指令消息如图3-29所示。
图3-29 protected type file write指令消息
其中,Offset是文件中读取数据起始地址的偏移量,Size是读取数据的大小,MicroLogix 1000为0~241字节,SLC 500、5/01、5/02为0~89字节。
(11)protected typed logical read with three address fields
从PLC的逻辑模块读取数据,指令消息如图3-30所示,特定命令消息部分字节解释见表3-14。
图3-30 protected typed logical read with three address fields指令消息
表3-14 特定命令消息部分字节解释
(12)protected typed logical write with three address fields
将数据写入PLC的逻辑模块,指令消息如图3-31所示,特定命令消息部分字节解释见表3-15。
图3-31 protected typed logical write with three address fields指令消息
表3-15 特定命令消息部分字节解释
对PLC文件的读写需要了解每个类型PLC文件的存储规则,我们以MicroLogix 1000的内存文件为例,其所包含的数据类型组织如下。
1)O0,输出文件Output (file 0),存储输出模块的状态。
2)I1,输入文件Input (file 1),存储输入模块的状态。
3)S2,状态文件Status (file 2),存储控制器操作信息,用于控制器故障诊断和程序操作。系统状态文件向用户提供用户程序所使用指令的相关信息,指示错误的诊断信息、处理器方式、扫描时间、波特率、系统节点地址等数据。熟悉状态文件中每个字的含义可以为编程诊断和调试带来方便。
4)B3,位文件Bit (file 3),用于存储内部继电器逻辑。
5)T4,计时器Timer (file 4),存储计时器累加值、预设值以及状态位。
6)C5,计数器Counter (file 5),存储计数器累加值、预设值以及状态位。
7)R6,控制Control (file 6),存储数据的长度、位指针位置以及位状态,用于需要文件操作的一些指令,如移位寄存器指令和顺序器指令。
8)N7,整数Integer (file 7),存储数字值和位信息,用于放置一个16位的字。
每个数据文件类型被标示为一个字母和一个数字文件号,见表3-16。
表3-16 文件类型对应文件号
数据文件的类型要结合表3-14、表3-15和表3-16一起来定义,数据文件的地址由文件名称、文件号、元素名、字号及位构成,相互之间用一定的分隔符分开,不同数据类型的每个元素具有的字数不同,有单字元素(输入/输出文件)和三字元素(计时器和计数器文件)。
(13)read diagnostic counter
从接口模块的PROM或者RAM里读取最多244字节的数据,可以使用此命令读取模块的诊断计时器和计数器,指令消息如图3-32所示。
图3-32 read diagnostic counter指令消息
(14)reset diagnostic counter
重置节点接口中的所有诊断计时器和计数器模块为零,指令消息如图3-33所示。
图3-33 reset diagnostic counter指令消息
(15)read link parameter
读取DH485参数,指令消息如图3-34所示。
图3-34 read link parameter指令消息
(16)set link parameter
设置DH485参数,指令消息如图3-35所示。
图3-35 set link parameter指令消息
(17)unprotected read
从公共接口文件(CIF)读取数据。SLC 500 CIF是数据文件9,MicroLogix 1000 CIF是整数文件7。这个命令用于读取PLC中的保护文件,指令消息如图3-36所示。
图3-36 unprotected read指令消息
其中,Address为CIF文件里的逻辑偏移,Size为从偏移地址开始的字节数。
(18)unprotected write
写数据到CIF。SLC 500 CIF是数据文件9,MicroLogix 1000 CIF是整数文件7,指令消息如图3-37所示。
图3-37 unprotected write指令消息
其中,Address为CIF文件里的逻辑偏移,Data为要写入的数据。
注意 以上大部分指令的应答消息都含有ETX STS,但是只有在出现错误时,才可以将EXT STS字段附加到应答包中。