计算机可以使用Hostlink协议连接到欧姆龙的PLC,通过Hostlink协议,计算机可以向PLC发送Hostlink命令,PLC处理来自计算机的命令,并把结果回传给计算机。
由于Hostlink协议的开放性,它被广泛使用在上位监控系统中,用户可以通过计算机自主编程,实现对PLC的操作,通过收发Hostlink协议报文,实现在多种平台上对欧姆龙PLC的监控。下面我们就来学习Hostlink协议的相关内容。
计算机与PLC通信是通过计算机与PLC之间交换命令和应答实现的,交换的命令和应答遵循欧姆龙的Hostlink协议。一次信息交换中,传输的命令或应答的长度称为“帧”,Hostlink协议的1帧最多可包含131个字符,是面向字符的协议。计算机通过发送Hostlink命令,可以对PLC进行I/O读写、改变操作模式、强制置位/复位等操作。
Hostlink协议根据发送方和接收方,分为发送协议(命令)和接收协议(响应),格式有所不同。下面以独立的1帧命令为例,介绍Hostlink协议的格式。
(1)命令格式
命令格式如图2-4所示。
图2-4 命令格式
①起始符:规定为“@”。
②节点号:PLC的单元号,范围为0~31。
③命令符:表示发送命令的指示目的(可参考表2-2)。
④操作内容:表示命令符操作的参数,命令不同,内容也不一样。
⑤校验符:FCS校验,对校验的内容进行异或运算,结果为2字符(8bit)。
⑥结束符:规定为“*CR”。
Hostlink常用的命令会受PLC型号的制约,不同型号PLC的Hostlink命令可能有所不同,本书以最常用的CJ/CS系列PLC CPU单元的命令为例讲解Hostlink协议,CJ/CS系列PLC CPU单元可以接收如图2-5所示的通信命令。
图2-5 通信命令
C-Mode命令:C-Mode命令是专用的Hostlink通信命令。它由主机发出,并发送到目标PLC的CPU单元。
FINS命令:FINS命令是消息服务通信命令。它不依赖特定的传输路径,可用于各种网络通信(控制器连接、以太网等)和串行通信(主机连接)。关于FINS的详细信息可参考第6章的相关内容。
注意 当主机是PLC CPU单元时,主机将通过CMND(490)/SEND(090)/RECV(098)发送FINS命令,由于本书描述计算机与PLC通信,用不到PLC的命令,是把计算机当成主机,因此以上命令将不做详细介绍。
下面我们就开始讲解Hostlink命令,先讲解C-Mode命令。C-Mode命令是欧姆龙最常用的Hostlink命令,基本全系欧姆龙PLC都支持,常用C-Mode命令见表2-2。
表2-2 常用C-Mode命令
(2)响应格式
响应格式如图2-6所示。
图2-6 响应格式
①起始符:规定为“@”。
②节点号:PLC的单元号,表明返回的响应数据PLC的单元号。
③命令符:表明本帧返回的是何种命令的响应数据。
④状态符:显示响应的结果是正确还是异常(可参考表2-3)。
⑤操作内容:根据命令符返回的响应数据。
表2-3 常见响应状态符
⑥校验符:FCS校验,对校验的内容进行异或运算,结果为2字符(8bit)。
⑦结束符:规定为“*CR”。
通过Hostlink命令,上位计算机可以进行编程、组态、监控等操作。使用Hostlink命令,用户只需要在计算机侧编写并发送命令帧,PLC接收侧就会自动返回响应帧。用户读取响应帧数据,就能得知返回数据正常与否,以及需要获取的数据。
当传送一帧数据时,结束符的前面要安排一个校验符,以检查传送时是否存在数据错误,通常称为FCS校验。校验的范围是从一帧的起始符到校验符之前的所有字符,算法就是将校验范围中的ASCII字符转换成HEX码后执行异或操作,得到的结果就是2个ASCII字符(8bit)的校验码。通信的双方每次接收到一帧,均计算FCS,与帧中所包含的FCS进行比较,从而查检帧中间的数据错误。
例如,以读00号PLC DM0数据区命令为例进行说明,其命令格式如图2-7所示。
图2-7 读00号PLC DM0数据区的命令格式
本例的FCS校验计算过程如图2-8所示。
图2-8 FCS校验计算过程
再将图2-8的FCS校验结果转换成ASCII码,放到消息帧里。
下面开始介绍Hostlink的常用命令。这些命令可用于计算机与PLC间的通信,以下关于命令的描述以计算机为“第一人称”,例如读IR/SR区命令就是使用计算机读取PLC的IR/SR区的数据所用到的命令,命令格式指的是计算机发送给PLC的命令帧格式,响应格式指的是PLC反馈给计算机的数据帧格式。
(1)读IR/SR区数据
读IR/SR区数据命令格式和响应格式如图2-9和图2-10所示。
图2-9 读IR/SR区数据命令格式
图2-10 读IR/SR区数据响应格式
(2)读LR区数据
读LR区数据命令格式和响应格式如图2-11和图2-12所示。
图2-11 读LR区数据命令格式
图2-12 读LR区数据响应格式
(3)读HR区数据
读HR区数据命令格式和响应格式如图2-13和图2-14所示。
图2-13 读HR区数据命令格式
图2-14 读HR区数据响应格式
(4)读定时器和计数器的PV值
读定时器和计数器的PV值命令格式和响应格式如图2-15和图2-16所示。
图2-15 读定时器和计数器的PV值命令格式
图2-16 读定时器和计数器的PV值命令响应格式
(5)读定时器和计数器的状态
读定时器和计数器的状态命令格式和响应格式如图2-17和图2-18所示。
图2-17 读定时器和计数器的状态命令格式
图2-18 读定时器和计数器的状态响应格式
(6)读DM区数据
读DM区数据命令格式和响应格式如图2-19和图2-20所示。
图2-19 读DM区数据命令格式
图2-20 读DM区数据响应格式
(7)读AR区数据
读AR区数据命令格式和响应格式如图2-21和图2-22所示。
图2-21 读AR区数据命令格式
图2-22 读AR区数据响应格式
(8)写IR/SR区数据
写IR/SR区数据命令格式和响应格式如图2-23和图2-24所示。
图2-23 写IR/SR区数据命令格式
图2-24 写IR/SR区数据响应格式
(9)写LR区数据
写LR区数据命令格式和响应格式如图2-25和图2-26所示。
图2-25 写LR区数据命令格式
图2-26 写LR区数据响应格式
(10)写HR区数据
写HR区数据命令格式和响应格式如图2-27和图2-28所示。
图2-27 写HR区数据命令格式
图2-28 写HR区数据响应格式
(11)写定时器和计数器的PV值
写定时器和计数器的PV值命令格式和响应格式如图2-29和图2-30所示。
图2-29 写定时器和计数器的PV值命令格式
图2-30 写定时器和计数器的PV值响应格式
(12)写定时器和计数器的状态
写定时器和计数器的状态命令格式和响应格式如图2-31和图2-32所示。
图2-31 写定时器和计数器的状态命令格式
图2-32 写定时器和计数器的状态响应格式
(13)写DM区数据
写DM区数据命令格式和响应格式如图2-33和图2-34所示。
图2-33 写DM区数据命令格式
图2-34 写DM区数据响应格式
(14)写AR区数据
写AR区数据命令格式和响应格式如图2-35和图2-36所示。
图2-35 写AR区数据命令格式
图2-36 写AR区数据响应格式
(15)写状态区数据
写状态区数据命令格式和响应格式如图2-37和图2-38所示。
图2-37 写状态区数据命令格式
方式数据:00——编程方式
02——监控方式
03——运行方式
图2-38 写状态区数据响应格式
(16)强制置位
强制置位命令格式和响应格式如图2-39和图2-40所示。
图2-39 强制置位命令格式
图2-40 强制置位响应格式
图2-39中操作数的名称地址见表2-4。
表2-4 操作数的名称地址
(17)强制复位
强制复位命令格式和响应格式如图2-41和图2-42所示。
图2-41 强制复位命令格式
图2-42 强制复位响应格式
图2-41中操作数的名称地址见表2-4。
(18)取消强制置位/复位
取消强制置位/复位命令格式和响应格式如图2-43和图2-44所示。
图2-43 取消强制置位/复位命令格式
图2-44 取消强制置位/复位响应格式
计算机侧使用Visual Studio 2015作为开发工具编写程序,PLC侧选用的型号是CP1E-N40DR-D。另外,需要参考2.1.3节提前设置PLC的通信参数,注意有些C-Mode命令需要PLC工作在监控模式下才能起作用,具体参考表2-2。因此,本例首先需要改变PLC的运行模式到监控模式,然后计算机再通过编写的程序与PLC进行通信。这个程序无须事先计算校验码,只需要写入校验位前的Hostlink命令就行,然后程序代码会完成FCS校验并加到Hostlink命令后面,再将命令帧发送给PLC。计算机侧通信程序对话框如图2-45所示。
图2-45 计算机侧通信程序对话框
串口设定区域设定串口号、数据位、波特率、停止位、校验位等参数,单击“打开串口”按钮,程序就会把串口打开,如果有问题,就会显示error提示。串口的参数设置要与PLC串口的参数设置一致。
命令设置区域包括以下4个部分:
1)命令:可以选择动作是读还是写,参考表2-2所列的命令和2.2.1节中关于命令的描述。
2)起始地址:要读或者写的地址,例如若想读CIO10通道的数据,那么这个参数要写成“0010”;若想读CIO15通道的数据,那么这个参数要写成“0015”。这个参数必须是4位字符串,不够的前面用“0”补齐。
3)内容:如果前面的命令是读,那么这个参数表示要读的长度,例如若要读一个通道的数据,那么就是“0001”,该参数也是字符串型数字常量,必须写够4位,不够的用“0”补齐。如果前面的命令是写,那么这个参数就是要写的内容,例如若要把1写到这个通道里,那么就是“0001”,如果想写2AAA,那么就是“2AAA”。写的内容必须是十六进制的数,用字符串表示也是4个为一组,不够的用“0”补齐。
4)单元号:该参数表示PC要与PLC通信的节点号,如果只有一个PLC,那么单元号就是00。命令设置完毕后单击“发送/接收”按钮,完整命令就会被发送出去,发送的命令就会在发送数据区域显示出来,而PLC端反馈的数据则会在接收数据区域显示出来。
1)计算机程序读PLC D区起始地址为0001且数据长度为1的数据,单击“发送/接收”按钮,发送数据区域就会显示发送的内容,即@00RD0001000156*,接收数据区域就会收到PLC的反馈,即@00RD0063C121*,表示D0001的内容是十六进制的63C1,RD后面的“00”代表发送成功。
D区内存数据如图2-46所示,可以看出D0001内的数据就是63C1。
图2-46 D区内存数据
通信对话框设置如图2-47所示。
图2-47 通信对话框设置
2)计算机程序写数据0000到PLC的D0001,如图2-48所示。
图2-48 写数据0000到PLC的D0001
单击“发送/接收”按钮后,发送数据区域就会显示发送的内容,即@00WD0001000052*,接收数据区域就会收到PLC的反馈,即@00WD0053*,WD后面的“00”表示写入成功。
写数据后D区内存数据如图2-49所示。
图2-49 写数据后D区内存数据
消息帧格式请参考2.2.1节相关命令格式的描述。
见本书配套资源包
。
欧姆龙的PLC也支持FINS命令,FINS命令是消息服务通信命令,不依赖于特定的传输路径。它们可用于各种网络上的通信(控制器连接、以太网连接等)和串行通信(Hostlink)。它们可以从CPU单元、特殊I/O单元或主机发出,也可以发送到其中任何一个,可以发送的命令取决于目标PLC的规定。本书以CP1E系列PLC为例,讲解如何通过串行通信Hostlink发送FINS命令,通过FINS命令可以形成用于跨不同欧姆龙网络的消息服务命令系统,它们可以用于各种控制操作,例如发送和接收数据、更改操作模式、强制设置和强制重置、执行文件操作等。另外,FINS命令和C-Mode不用PLC运行在监视模式,RUN模式也可以,而且FINS命令支持对PLC的位操作,例如读取I/O的逻辑状态。
1)FINS命令在应用层进行传输,它不依赖于低层次网络层(物理层和数据链接层)进行传输,这使得它们可以在各种网络和CPU总线之间传输。具体来说,它们可以通过以太网、Controller Link和Hostlink在两个PLC或PLC与计算机之间传输。
2)除了CPU单元外,FINS命令还可以访问各种设备,例如CPU总线单元、个人计算机等。
3)FINS命令支持网络中继操作,因此它们可以通过网络层次结构访问最多3个网络级别(包括本地网络)的设备。
4)FINS命令可以使用Hostlink协议在计算机与PLC之间传输通信。
当使用Hostlink发送或接收FINS命令和响应时,帧的前面必须是Hostlink头,后面是Hostlink的FCS校验码和结束符。
Hostlink协议发送FINS的命令帧格式如图2-50所示。
图2-50 Hostlink协议发送FINS的命令帧格式
FINS命令帧还包括响应等待时间、目标节点地址、源节点地址和其他FINS命令格式数据。
Hostlink协议发送FINS的响应帧格式如图2-51所示。
图2-51 Hostlink协议发送FINS的响应帧格式
FINS响应帧还包括传输时设置的内容和FINS命令帧的响应格式数据。
5)计算机发送FINS命令到PLC,计算机用以下的FINS命令帧格式发送命令到PLC,命令长度不能超过1114个字符,而且不能将FINS命令分割成单独帧发送。
①计算机直接连接到PLC(包括CPU单元和串口扩展单元)的FINS命令帧格式如图2-52所示,此格式也能用于计算机与串口板或串口通信组件的通信。
图2-52 计算机直接连接到PLC的FINS命令帧格式
②计算机连接到网络,可以跨网络连接到PLC,跨网络的FINS命令帧格式如图2-53所示。
图2-53 跨网络的FINS命令帧格式
③Hostlink命令解释如下:
● @符号必须在发送命令的开头。
● 单元号:指连接到计算机的PLC CPU单元的单元号,在计算机的设置中设置单元号。当计算机连接到串行通信单元时,单元号在CX-Programmer通信单元的设置中设定。
● 报文头:用于区分不同的命令,FINS命令设置为“FA”。
● 响应等待时间:从PLC接收命令到返回消息帧之间的间隔,它可以设置为0~F Hex,单位是10ms。
● ICF
:80(ASCII 38 30)——网络中的PLC;
00(ASCII 30 30)——直接连接到计算机的PLC。
● DA2:目标单元地址。
● SA2:源单元地址。
● SID:重复发射时,作为计数器使用,通常设置为00(ASCII 30 30)。
● FCS:FCS校验码,校验范围从帧开始@到FCS之前所有的位。
● 结束符:设置为“*CR”。
④PLC返回信息到计算机。返回数据的长度必须小于1115个字符。
PLC直接连接到计算机的返回数据格式如图2-54所示。
图2-54 PLC直接连接到计算机的返回数据格式
PLC通过网络连接到计算机的返回数据格式如图2-55所示。
图2-55 PLC通过网络连接到计算机的返回数据格式
● ICF:C0(ASCII 43 30)——网络中的PLC;
40(ASCII 34 30)——直接连接到计算机的PLC。
● FINS响应码:分为Main code和Sub code,各2字节。0000(ASCII 30 30 30 30)代表正确,其他值代表通信有错误。
更多关于FINS命令的信息请参考第6章的描述。
计算机侧选用的编程软件是Visual Studio 2015,PLC选择的是CJ1G,下面是计算机使用FINS协议通过Hostlink串口与PLC通信的设置对话框,按照计算机直接连接PLC CPU串口的FINS协议格式设计,上半部分是串口设定部分,需要与PLC的串口设定一致,下半部分是命令设置,输入命令的相关参数,单击“发送/接收”按钮,程序就自动把FCS校验等部分加到命令帧里并发送给PLC。
1)根据图2-56设置部分参数,把串口设定好,然后打开串口。
图2-56 设置对话框
2)发送/接收数据对话框如图2-57所示,命令设置包括Hostlink协议的各个字符段和FINS命令的字符段,下面的设置是读取CIO020.4~CIO020.7位的二进制数,发送数据部分是程序整理完毕后实际发送给PLC的字符串,接收数据部分是PLC给计算机的反馈。注意,这些字符发送给PLC和从PLC接收的实际对应的是ASCII码而不是字符串。
图2-57 发送/接收数据对话框
①发送消息帧字符段解释如下:
②接收消息帧字符段解释如下:
从图2-58可以看出,CIO020.4~CIO020.7的数据为1111,与测试程序接收的数据一致。
图2-58 CIO020.4~CIO020.7的数据
3)利用程序把1011写入CIO020.4~CIO020.7的设置对话框如图2-59所示。
①发送消息帧字符段解释如下:
②接收消息帧字符段解释如下:
图2-59 写数据设置对话框
从图2-60可以看出,CIO020.4~CIO020.7的数据为1011,与测试程序发送的数据一致。
图2-60 写入数据后的CIO020.4~CIO020.7
4)图2-61是读取D1~D4的字的设置对话框。
图2-61 读取D1~D4的字的设置对话框
①发送消息帧字符段解释如下:
②接收消息帧字符段解释如下:
实际读取的数据与PLC内存里的数据一致,D1~D4数据如图2-62所示。
5)把6666777788889999写入D1~D4,设置对话框如图2-63所示。
①发送消息帧字符段解释如下:
图2-62 D1~D4数据
图2-63 写数据到D1~D4的设置对话框
②接收消息帧字符段解释如下:
从图2-64可以看出,D1~D4的数据与测试程序发送的数据一致。
图2-64 写入数据后的D1~D4
6)FINS协议通信程序源代码:
见本书配套资源包。