UM4001


UM4001 GUTTA通讯协议
   PDF格式完整版本下载

概述

GUTTA通讯协议分为3大部分内容:PLC控制协议、PLC传输协议、PLC状态协议。控制协议用于PLC的基本控制;例如登陆、登出、复位、清除等等。传输协议用于程序的上传和下载;状态协议用于PLC程序的在线监控和调试。

由于PLC的实现方式不同(编译和解释)、CPU性能和FLASH容量的不同、通讯方式的不同(RS243、RS485、USB、CAN等)、功能的不同(是否支持调试),特定的PLC系统可以部分实现上述协议。对于特定的PLC类型,GUTTA Ladder Editor软件需要知道目标PLC支持那些通讯协议,从而判断当前的通讯任务是否能够完成。GUTTA软件在启动的时候,在载入ManagerFun.xml和ManagerVar.xml之前,先要载入PlcType.xml文件。这个文件是对当前PLC类型的一个总体描述。这个文件位于PLC类型文件夹下(可参考《UM4002 变量描述文件规范》《UM4003 指令描述文件规范》)。一个典型的PlcType.xml文件看起来是这个样子的:

<PlcType
 Name="CPU-EC20"
 Information="CPU-EC20"
 SystemBlockDll="SystemBlockDll.dll"
 SystemBlockBinarySize="50"
 DataBlockPageSize="16"
 DataBlockPageItemSize="16"
 ProgramBlockPageIntSize="8"
 ProgramBlockPageSbrSize="8"
 ProgramBlockPageArgIntSize="32"
 ProgramBlockPageArgSbrSize="32"
 ProgramBlockConstBinarySize="128"
 ProgramBlockInstructionBinarySize="10752"
 CommunicationDll="CommunicationDll.dll"
 ExchPackSize="64"
 ExchSupport="0000|0000"
 >
</PlcType>
<PlcType>:Name属性

数据类型为STRING,长度必须大于0且小于或等于16。

节点PlcType的Name属性描述当前PLC类型的名称。这个名称是GUTTA软件识别当前PLC类型的唯一依据。(不论是打开文件还是上传程序,GUTTA软件都要先确定这个属性的值,然后根据此值载入对应的PLC配置)

<PlcType>: Information属性

数据类型为STRING,长度必须大于0且小于或等于64。

节点PlcType的Information属性是对当前PLC类型名称的一个更详细描述。这个描述信息仅仅只是对名称的一个补充说明,不参与PLC类型的识别。

<PlcType>: SystemBlockDll属性

数据类型为STRING,不能为空。

节点PlcType的SystemBlockDll属性告诉GUTTA软件如果需要编辑PLC系统块,应该载入动态连接库的文件名。

<PlcType>: SystemBlockBinarySize属性

数据类型为INT。

节点PlcType的SystemBlockBinarySize属性描述PLC目标硬件允许的最大系统块大小(字节为单位)。

<PlcType>: DataBlockPageSize属性

数据类型为INT。

节点PlcType的DataBlockPageSize属性描述PLC目标硬件允许的最大数据块页数量。

<PlcType>: DataBlockPageItemSize属性

数据类型为INT。

节点PlcType的DataBlockPageItemSize属性描述PLC目标硬件允许的最大数据块单页数据项数量。
由于一个数据项是8个字节,故数据块的总大小为(字节为单位):
DataBlockBinarySize=DataBlockPageSize*DataBlockPageItemSize*8

<PlcType>: ProgramBlockPageIntSize属性

数据类型为INT。

节点PlcType的ProgramBlockPageIntSize属性描述PLC目标硬件允许的最大中断调用数量。

<PlcType>: ProgramBlockPageSbrSize属性

数据类型为INT。

节点PlcType的ProgramBlockPageSbrSize属性描述PLC目标硬件允许的最大函数调用数量。

<PlcType>: ProgramBlockPageArgIntSize属性

数据类型为INT。

节点PlcType的ProgramBlockPageArgIntSize属性描述PLC目标硬件允许的最大中断调用参数个数。

<PlcType>: ProgramBlockPageArgSbrSize属性

数据类型为INT。

节点PlcType的ProgramBlockPageArgSbrSize属性描述PLC目标硬件允许的最大函数调用参数个数。

<PlcType>: ProgramBlockConstBinarySize属性

数据类型为INT。

节点PlcType的ProgramBlockConstBinarySize属性描述PLC目标硬件允许的最大常数块大小(字节为单位)。

<PlcType>: ProgramBlockInstructionBinarySize属性

数据类型为INT。

节点PlcType的ProgramBlockInstructionBinarySize属性描述PLC目标硬件允许的最大指令块大小(字节为单位)。

<PlcType>: CommunicationDll属性

数据类型为STRING,不能为空。

节点PlcType的CommunicationDll属性告诉GUTTA软件如果需要进行上传或下载,应该载入动态连接库的文件名。

<PlcType>: ExchPackSize属性

数据类型为INT,必须大于或等于64且小于1024。

节点PlcType的ExchPackSize属性描述一个数据包的最大有效数据长度。由于这个长度并不包含GUTTA封包附加数据和MODBUS封包附加数据,实际的硬件缓冲应该比这个长度略大。在传送比这个值要长的

<PlcType>: ExchSupport属性

数据类型为STRING。格式为“M1|V1|M2|V2|…|Mn|Vn”

节点PlcType的ExchSupport属性描述当前PLC类型支持的通讯指令。Mn和Vn都用16进制的数表达。某条通讯指令是否被当前PLC支持,可以用下面的公式表示:
ExchSupport=((ExchID&M1)==V1)||((ExchID&M2)==V2)||...||((ExchID&Mn)==Vn)
由于任何数与上16#0000都等于16#0000,故上面给出的例子表示CPU-EC20支持全部的通讯指令。

封包结构

GUTTA通讯协议由MODBUS协议封包。在解析本协议前,必须先解析MODBUS协议。在进行MODBUS通讯时,PLC编程软件GUTTA Ladder Editor控制的主机端口为MODBUS主站;PLC硬件端口是MODBUS从站。通讯由主站发起,子站在接受到主站数据后,必须在指定的时间内向主站发送响应数据。至此,一个通讯来回完成。

GUTTA通讯数据由MODBUS的13号功能封装:

发送数据:

站号 功能码 GUTTA通讯数据 CRC校验
N 13            

返回数据:

站号 功能码 GUTTA通讯数据 CRC校验
N 13            

GUTTA通讯数据长度是可变的,其格式如下:

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号 通讯数据
                   

返回数据:

GUTTA通讯数据
数据长度 功能码 内部包号 通讯数据
                   

数据长度、功能码、内部包号都是两字节变量,范围是0H ~ FFFFH。在通讯的时候,这三个变量都是先传送高位字节,然后传送低位字节。数据长度是功能码、内部包号、通讯数据三者长度之和,以字节计。功能码在后面有详细说明。当通讯数据比较大时,需要分包传送。为了统一,不论是单包数据还是多包数据,都有内部包号,包号从0开始,若是最后一包数据,需要将内部包号的最高置为1。

若PLC执行成功,返回功能码为发送数据的功能码,否则,返回数据功能码为发送数据的功能码最高位置1后的值。

功能码索引

PLC控制协议

功能码缩写说明
0100HPLC_CLEAR清除PLC
0110HPLC_ATTACH连接PLC
0111HPLC_DETACH断开PLC
0120HGET_PLC_NAME获得PLC名称
0121HGET_PLC_INFOR获得PLC信息

PLC传输协议

功能码缩写说明
0210HDATA_ASK查询PLC有效数据页
022XHDATA_PAGE_ASK查询PLC数据页长度
023XHDATA_PAGE_READ读PLC指定数据页
024XHDATA_PAGE_WRITE写PLC指定数据页
0260HSYSTEM_ASK查询PLC有效系统页
027XHSYSTEM_PAGE_ASK查询PLC系统页长度
028XHSYSTEM_PAGE_READ读PLC指定系统页
029XHSYSTEM_PAGE_WRITE写PLC指定系统页
0300HPROGRAM_ASK查询PLC有效程序页
0310HPROGRAM_CONST_ASK查询PLC常数页长度
0311HPROGRAM_CONST_READ读PLC指定常数页
0312HPROGRAM_CONST_WRITE写PLC指定常数页
04XXHPROGRAM_ARGUMENT_ASK查询PLC参数页长度
05XXHPROGRAM_ARGUMENT_READ读PLC指定参数页
06XXHPROGRAM_ARGUMENT_WRITE写PLC指定参数页
07XXHPROGRAM_INSTRUCTION_ASK查询PLC程序页长度
08XXHPROGRAM_INSTRUCTION_READ读PLC指定程序页
09XXHPROGRAM_INSTRUCTION_WRITE写PLC指定程序页

PLC状态协议

功能码缩写说明
0A00HSTATUS_READ读PLC状态
0A01HSTATUS_WRITE写PLC状态
0A02HSTATUS_SCAN强制扫描
0A03HSTATUS_RESET强制复位
0A10HSTATUS_VAR_READ读变量值
0A11HSTATUS_VAR_WRITE写变量值
0A20HSTATUS_VAR_FORCE_READ读变量强制值
0A21HSTATUS_VAR_FORCE_WRITE写变量强制值
0A30HSTATUS_DEBUG_READ读PLC调试状态
0A31HSTATUS_DEBUG_WRITE写PLC调试状态
0A32HSTATUS_DEBUG_SCAN调试模式扫描
0A33HSTATUS_DEBUG_RESET调试模式复位
0A34HSTATUS_DEBUG_INFOR_READ读调试信息
0A35HSTATUS_DEBUG_INFOR_WRITE写调试信息

功能码参考

PLC控制协议

0100H PLC_CLEAR 清除PLC

PLC_CLEAR指令用于清除PLC用户程序(包括密码)。一旦执行PLC_CLEAR指令,所有的PLC用户程序将被丢失,PLC被停止。由于FLASH的用户程序被清除,这个时候PLC不能直接被运行(PLC某些状态和FLASH数据不匹配),必须通过执行STATUS_RESET使PLC回到出厂状态。通讯端口也恢复成19200波特率、偶校验、1位停止位。

PLC一般通过PLC_CLEAR解除用户FLASH的锁定。通过STATUS_RESET恢复用户FLASH的锁定。故程序的下载必须发生在PLC_CLEAR和STATUS_RESET这两条指令之间。考虑到用户忘记PLC密码的情况,PLC_CLEAR指令的执行不用登陆到PLC。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 01H 00H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 81H 00H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 01H 00H 80H 00H

返回数据(成功)的条件:

返回数据(成功),PLC执行的操作:

0110H PLC_ATTACH 连接PLC

PLC_ATTACH指令用于连接到PLC。连接到PLC需要提供一个16位的登陆密码,PLC根据登陆密码决定是否接受当前连接(登陆密码由上一次下载程序的系统页来设置,出厂值为空密码,即16个连续的16#FF)。若密码正确,PLC进入被登陆状态。绝大部分通讯指令只有在PLC被登陆后才能被执行。PLC记录当前的登陆状态直到下列任一情况发生:PLC_DETACH指令被执行、PLC被断电、PLC被复位。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号 登陆密码(16字节)
00H 14H 01H 10H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 81H 10H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 01H 10H 80H 00H

返回数据(成功)的条件:

返回数据(成功),PLC执行的操作:

0111H PLC_DETACH 断开PLC

PLC_DETACH指令用于断开当前PLC的连接。PLC清除当前的登陆状态。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 01H 11H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 81H 11H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 01H 11H 80H 00H

返回数据(成功)的条件:

返回数据(成功),PLC执行的操作:

0120H GET_PLC_NAME 获得PLC名称

GET_PLC_NAME指令获得目标硬件的PLC类型名称。这个名称和<PlcType>:Name属性对应。若PLC类型名称不足16个字节,以字节0标志结束。

GUTTA软件在上载程序前必须通过通讯确认PLC类型名称。然后在PLC类型库中载入对应的ManagerVar.xml、ManagerFun.xml、SystemBlockDll.dll、CommunicationDll.dll这四个文件。其中后面的两个动态连接库文件可以被PlcType.xml另外指定。若GUTTA软件找不到对应的PLC类型,将会终止当前上载操作。

GUTTA软件在下载程序前必须通过通讯确认PLC类型名称。如果硬件的PLC类型名称和当前用户程序的PLC类型名一致,则开始下载,否则会终止当前下载操作。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 01H 20H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 81H 20H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 PLC名称(16字节)
00H 14H 01H 20H 80H 00H

返回数据(成功)的条件:

0121H GET_PLC_INFOR 获得PLC信息

GET_PLC_INFOR指令获得目标硬件的PLC类型信息。这个信息和<PlcType>:Information属性对应。这个描述信息仅仅只是对名称的一个补充说明,不参与PLC类型的识别。若PLC类型信息不足64个字节,以字节0标志结束。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 01H 21H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 81H 21H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 页号序列(n字节)
00H 44H 01H 21H 80H 00H

返回数据(成功)的条件:

PLC传输协议

0210H DATA_ASK 查询PLC有效数据页

DATA_ASK指令查询目标有效数据页的页号。每个数据页页号为一个字节,返回数据的实际长度根据有效数据页的数量决定。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 02H 10H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 82H 10H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 页号序列(n字节)
n+4 02H 10H 80H 00H

返回数据(成功)的条件:

022XH DATA_PAGE_ASK 查询PLC数据页长度

DATA_PAGE_ASK指令读取指定数据页的长度。数据页页号包含在功能码中,由功能码的最低4位确定页号。因此实际的功能码为0220H~022FH,即最多指定16个数据页。返回数据为指定数据页的长度(字变量),传送时高位在前,低位在后。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 02H 2XH 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 82H 2XH 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 数据页X的长度(2字节)
00H 06H 02H 2XH 80H 00H

返回数据(成功)的条件:

023XH DATA_PAGE_READ 读PLC指定数据页

DATA_PAGE_READ指令读取数据页数据。数据页页号包含在功能码中,由功能码的最低4位确定页号。因此实际的功能码为0230H~023FH,即最多指定16个数据页。返回数据为数据页的数据。GUTTA软件先通过DATA_PAGE_ASK指令获得数据页的数据长度。若数据页的数据长度大于最大通讯数据长度,GUTTA软件会采取多次读取部分数据页数据的方式来完成整个数据页数据的传输。每次读取数据的起始地址由内部包号决定,即内部包号乘以最大通讯数据长度。PLC返回从起始地址开始的对应数据,直到数据结束或者达到最大通讯数据长度。若为最后一包数据,GUTTA软件会置位发送数据内部包号的最高位。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 02H 3XH i

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 82H 3XH i

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 数据页数据(n字节)
n+4 02H 3XH i

返回数据(成功)的条件:

024XH DATA_PAGE_WRITE 写PLC指定数据页

DATA_PAGE_WRITE指令写入数据页数据。数据页页号包含在功能码中,由功能码的最低4位确定页号。因此实际的功能码为0240H~024FH,即最多指定16个数据页。发送数据为数据页的数据。若需要发送数据页的数据长度大于最大通讯数据长度,GUTTA软件会采取多次写入部分数据页数据的方式来完成整个数据页数据的传输。每次写入数据的起始地址由内部包号决定,即内部包号乘以最大通讯数据长度。软件写入从起始地址开始的对应数据,直到数据结束或者达到最大通讯数据长度。若为最后一包数据,GUTTA软件会置位发送数据内部包号的最高位。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号 数据页数据(n字节)
n+4 02H 4XH i

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 82H 4XH i

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 02H 4XH i

返回数据(成功)的条件:

返回数据(成功),PLC执行的操作:

0260H SYSTEM_ASK 查询PLC有效系统页

SYSTEM_ASK指令查询目标有效系统页的页号。每个系统页页号为一个字节,返回数据的实际长度根据有效系统页的数量决定。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 02H 60H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 82H 60H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 页号序列(n字节)
n+4 02H 60H 80H 00H

返回数据(成功)的条件:

027XH SYSTEM _PAGE_ASK 查询PLC系统页长度

SYSTEM _PAGE_ASK指令读取指定系统页的长度。系统页页号包含在功能码中,由功能码的最低4位确定页号。因此实际的功能码为0270H~027FH,即最多指定16个系统页。返回数据为指定系统页的长度(字变量),传送时高位在前,低位在后。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 02H 7XH 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 82H 7XH 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 系统页X的长度(2字节)
00H 06H 02H 7XH 80H 00H

返回数据(成功)的条件:

028XH SYSTEM _PAGE_READ 读PLC指定系统页

SYSTEM_PAGE_READ指令读取系统页数据。系统页页号包含在功能码中,由功能码的最低4位确定页号。因此实际的功能码为0280H~028FH,即最多指定16个系统页。返回数据为系统页的数据。GUTTA软件先通过SYSTEM_PAGE_ASK指令获得系统页的数据长度。若系统页的数据长度大于最大通讯数据长度,GUTTA软件会采取多次读取部分系统页数据的方式来完成整个系统页数据的传输。每次读取数据的起始地址由内部包号决定,即内部包号乘以最大通讯数据长度。PLC返回从起始地址开始的对应数据,直到数据结束或者达到最大通讯数据长度。若为最后一包数据,GUTTA软件会置位发送数据内部包号的最高位。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 02H 8XH i

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 82H 8XH i

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 系统页数据(n字节)
n+4 02H 8XH i

返回数据(成功)的条件:

029XH SYSTEM _PAGE_WRITE 写PLC指定系统页

SYSTEM_PAGE_WRITE指令写入系统页数据。系统页页号包含在功能码中,由功能码的最低4位确定页号。因此实际的功能码为0290H~029FH,即最多指定16个系统页。发送数据为系统页的数据。若需要发送系统页的数据长度大于最大通讯数据长度,GUTTA软件会采取多次写入部分系统页数据的方式来完成整个系统页数据的传输。每次写入数据的起始地址由内部包号决定,即内部包号乘以最大通讯数据长度。软件写入从起始地址开始的对应数据,直到数据结束或者达到最大通讯数据长度。若为最后一包数据,GUTTA软件会置位发送数据内部包号的最高位。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号 系统页数据(n字节)
n+4 02H 9XH i

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 82H 9XH i

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 02H 9XH i

返回数据(成功)的条件:

返回数据(成功),PLC执行的操作:

0300H PROGRAM_ASK 查询PLC有效程序页

PROGRAM_ASK指令查询目标有效程序页的页号。每个程序页页号为一个字节,返回数据的实际长度根据有效程序页的数量决定。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 03H 00H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 83H 00H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 页号序列(n字节)
n+4 03H 00H 80H 00H

返回数据(成功)的条件:

0310H PROGRAM _CONST_ASK 查询PLC常数页长度

PROGRAM _CONST_ASK指令读取常数页的长度。返回数据为常数页的长度(字变量),传送时高位在前,低位在后。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 03H 10H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 83H 10H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 常数页X的长度(2字节)
00H 06H 03H 10H 80H 00H

返回数据(成功)的条件:

0311H PROGRAM_CONST_READ 读PLC指定常数页

PROGRAM_CONST_READ指令读取常数页数据。GUTTA软件先通过PROGRAM_CONST_ASK指令获得常数页的数据长度。若常数页的数据长度大于最大通讯数据长度,GUTTA软件会采取多次读取部分常数页数据的方式来完成整个常数页数据的传输。每次读取数据的起始地址由内部包号决定,即内部包号乘以最大通讯数据长度。PLC返回从起始地址开始的对应数据,直到数据结束或者达到最大通讯数据长度。若为最后一包数据,GUTTA软件会置位发送数据内部包号的最高位。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 03H 11H i

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 83H 11H i

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 常数页数据(n字节)
n+4 03H 11H i

返回数据(成功)的条件:

0312H PROGRAM_CONST_WRITE 写PLC指定常数页

PROGRAM_CONST_WRITE指令写入常数页数据。若需要发送常数页的数据长度大于最大通讯数据长度,GUTTA软件会采取多次写入部分常数页数据的方式来完成整个常数页数据的传输。每次写入数据的起始地址由内部包号决定,即内部包号乘以最大通讯数据长度。软件写入从起始地址开始的对应数据,直到数据结束或者达到最大通讯数据长度。若为最后一包数据,GUTTA软件会置位发送数据内部包号的最高位。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号 常数页数据(n字节)
n+4 03H 12H i

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 83H 12H i

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 83H 12H i

返回数据(成功)的条件:

返回数据(成功),PLC执行的操作:

04XXH PROGRAM_ARGUMENT_ASK 查询PLC参数页长度

PROGRAM_ARGUMENT_ASK指令读取指定参数页的长度。参数页页号包含在功能码中,由功能码的最低8位确定页号。因此实际的功能码为0400H~04FFH,即最多指定256个参数页。返回数据为指定参数页的长度(字变量),传送时高位在前,低位在后。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 04H XXH 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 84H XXH 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 参数页XX的长度(2字节)
00H 06H 04H XXH 80H 00H

返回数据(成功)的条件:

05XXH PROGRAM_ARGUMENT_READ 读PLC指定参数页

PROGRAM_ARGUMENT_READ指令读取参数页数据。参数页页号包含在功能码中,由功能码的最低8位确定页号。因此实际的功能码为0500H~05FFH,即最多指定256个参数页。返回数据为参数页的数据。GUTTA软件先通过PROGRAM_ARGUMENT_ASK指令获得参数页的数据长度。若参数页的数据长度大于最大通讯数据长度,GUTTA软件会采取多次读取部分参数页数据的方式来完成整个参数页数据的传输。每次读取数据的起始地址由内部包号决定,即内部包号乘以最大通讯数据长度。PLC返回从起始地址开始的对应数据,直到数据结束或者达到最大通讯数据长度。若为最后一包数据,GUTTA软件会置位发送数据内部包号的最高位。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 05H XXH i

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 85H XXH i

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 参数页数据(n字节)
n+4 05H XXH i

返回数据(成功)的条件:

06XXH PROGRAM_ARGUMENT_WRITE 写PLC指定参数页

PROGRAM_ARGUMENT_WRITE指令写入参数页数据。参数页页号包含在功能码中,由功能码的最低8位确定页号。因此实际的功能码为0600H~06FFH,即最多指定256个参数页。发送数据为参数页的数据。若需要发送参数页的数据长度大于最大通讯数据长度,GUTTA软件会采取多次写入部分参数页数据的方式来完成整个参数页数据的传输。每次写入数据的起始地址由内部包号决定,即内部包号乘以最大通讯数据长度。软件写入从起始地址开始的对应数据,直到数据结束或者达到最大通讯数据长度。若为最后一包数据,GUTTA软件会置位发送数据内部包号的最高位。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号 参数页数据(n字节)
n+4 06H XXH i

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 86H XXH i

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 06H XXH i

返回数据(成功)的条件:

返回数据(成功),PLC执行的操作:

07XXH PROGRAM_INSTRUCTION_ASK 查询PLC程序页长度

PROGRAM_INSTRUCTION_ASK指令读取指定程序页的长度。程序页页号包含在功能码中,由功能码的最低8位确定页号。因此实际的功能码为0700H~07FFH,即最多指定256个程序页。返回数据为指定程序页的长度(字变量),传送时高位在前,低位在后。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 07H XXH 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 87H XXH 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 程序页XX的长度(2字节)
00H 06H 07H XXH 80H 00H

返回数据(成功)的条件:

08XXH PROGRAM_INSTRUCTION _READ 读PLC指定程序页

PROGRAM_INSTRUCTION _READ指令读取程序页数据。程序页页号包含在功能码中,由功能码的最低8位确定页号。因此实际的功能码为0800H~08FFH,即最多指定256个程序页。返回数据为程序页的数据。GUTTA软件先通过PROGRAM_INSTRUCTION_ASK指令获得程序页的数据长度。若程序页的数据长度大于最大通讯数据长度,GUTTA软件会采取多次读取部分程序页数据的方式来完成整个程序页数据的传输。每次读取数据的起始地址由内部包号决定,即内部包号乘以最大通讯数据长度。PLC返回从起始地址开始的对应数据,直到数据结束或者达到最大通讯数据长度。若为最后一包数据,GUTTA软件会置位发送数据内部包号的最高位。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 08H XXH i

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 88H XXH i

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 程序页数据(n字节)
n+4 08H XXH i

返回数据(成功)的条件:

09XXH PROGRAM_INSTRUCTION_WRITE 写PLC指定程序

PROGRAM_INSTRUCTION_WRITE指令写入程序页数据。程序页页号包含在功能码中,由功能码的最低8位确定页号。因此实际的功能码为0900H~09FFH,即最多指定256个程序页。发送数据为程序页的数据。若需要发送程序页的数据长度大于最大通讯数据长度,GUTTA软件会采取多次写入部分程序页数据的方式来完成整个程序页数据的传输。每次写入数据的起始地址由内部包号决定,即内部包号乘以最大通讯数据长度。软件写入从起始地址开始的对应数据,直到数据结束或者达到最大通讯数据长度。若为最后一包数据,GUTTA软件会置位发送数据内部包号的最高位。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号 程序页数据(n字节)
n+4 09H XXH i

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 89H XXH i

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 09H XXH i

返回数据(成功)的条件:

返回数据(成功),PLC执行的操作:

PLC状态协议

0A00H STATUS_READ 读PLC状态

STATUS_READ指令读取当前PLC的状态。PLC的状态为一个8位的字节:

SYS_STATE
8 7 6 5 4 3 2 1 0
ERROR ATTACH RESET RUN

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 0AH 00H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 8AH 00H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 SYS_STATE(1字节)
00H 05H 0AH 00H 80H 00H

返回数据(成功)的条件:

0A01H STATUS_WRITE 写PLC状态

STATUS_WRITE指令修改当前PLC的状态的RUN位。STATUS_WRITE指令只发送一个字节的数据。若RUN为0,强制PLC进入停止状态。若RUN不为0,强制PLC进入运行状态。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号 RUN(1字节)
00H 05H 0AH 01H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 8AH 01H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 0AH 01H 80H 00H

返回数据(成功)的条件:

返回数据(成功),PLC执行的操作:

0A02H STATUS_SCAN 强制扫描

STATUS_SCAN指令使处于停止状态的PLC进行指定次数的主循环扫描。STATUS_SCAN指令只发送一个字节的数据。这个数据代表主循环扫描的次数。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号 扫描次数(1字节)
00H 05H 0AH 02H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 8AH 02H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 0AH 02H 80H 00H

返回数据(成功)的条件:

返回数据(成功),PLC执行的操作:

0A03H STATUS_RESET 强制复位

STATUS_RESET指令使PLC记录复位请求。当PLC发现有复位请求且可以复位时,执行复位操作。这个复位并不对CPU外设进行硬件复位,而是根据用户FLASH程序对外设硬件进行重新配置(例如通讯口),并且从新初始化PLC需要使用的内存。STATUS_RESET指令一般和PLC_CLEAR指令成对使用(参考PLC_CLEAR指令)。考虑到用户忘记PLC密码的情况,STATUS_RESET指令的执行不用登陆到PLC。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 0AH 03H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 8AH 03H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 0AH 03H 80H 00H

返回数据(成功)的条件:

返回数据(成功),PLC执行的操作:

0A10H STATUS_VAR_READ 读变量值

STATUS_VAR_READ指令读取PLC变量的值,这个值用于GUTTA编程软件在线调试的数据显示。发送数据为需要读变量的地址,返回数据为对应地址上变量的值。为了减少通讯次数,STATUS_VAR_READ一次可以读多个变量的值,发送数据为读变量地址的序列。返回数据为对应地址上变量值的序列。由于变量地址为32位,返回的变量值也是32位,故返回数据的长度总是等于发送数据长度。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号 地址序列(4n字节)
4n+4 0AH 10H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 8AH 10H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 值序列(4n字节)
4n+4 0AH 10H 80H 00H

返回数据(成功)的条件:

地址的格式:

地址(高16位)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
OFFSET
地址(低16位)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
BIT_OFFSET WIDTH SLOT USE

发送时4字节的地址数据按照低字节到高字节的顺序发送。其中USE、WIDTH、BIT_OFFSET字段被忽略。PLC硬件根据SLOT和OFFSET确定变量所在的第一个字节,然后将第一个字节开始的4个字节作为值返回。

返回时4字节的值按照低字节到高字节的顺序返回。

0A11H STATUS_VAR_WRITE 写变量值

STATUS_VAR_WRITE指令写入PLC变量的值。发送数据为地址和值的数据对。STATUS_VAR_WRITE可以一次写入多个变量的值,发送数据为地址和值的序列。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号 地址和值的序列(8n字节)
8n+4 0AH 11H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 8AH 11H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 0AH 11H 80H 00H

返回数据(成功)的条件:

返回数据(成功),PLC执行的操作:

地址和值的序列:

地址和值序列
地址 地址 地址 地址

地址的格式:

地址(高16位)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
OFFSET
地址(低16位)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
BIT_OFFSET WIDTH SLOT USE

发送数据时,4字节的地址数据和4字节的值数据都是按照低字节到高字节的顺序发送。其中USE字段被忽略。PLC根据SLOT、WIDTH、BIT_OFFSET、OFFSET确定需要修改PLC内存的位置和长度,然后根据要求将值中的数据复制到PLC内存中。

0A20H STATUS_VAR_FORCE_READ 读变量强制值

STATUS_VAR_FORCE_READ指令读取PLC变量的强制值,这个强制值用于GUTTA编程软件在线调试的数据显示。发送数据为需要读变量强制值的地址,返回数据为对应地址上变量的强制值。为了减少通讯次数,STATUS_VAR_FORCE_READ一次可以读多个变量的强制值,发送数据为读变量地址的序列。返回数据为对应地址上变量强制值的序列。由于变量地址为32位,返回的变量强制值也是32位,故返回数据的长度总是等于发送数据长度。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号 地址序列(4n字节)
4n+4 0AH 20H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 8AH 20H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 强制值序列(4n字节)
4n+4 0AH 20H 80H 00H

返回数据(成功)的条件:

地址和强制值的格式参照STATUS_VAR_WRITE指令。

0A21H STATUS_VAR_FORCE_WRITE 写变量强制值

STATUS_VAR_FORCE_WRITE指令写入PLC变量的强制值。发送数据为地址和强制值的数据对。STATUS_VAR_FORCE_WRITE可以一次写入多个变量的强制值,发送数据为地址和强制值的序列。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号 地址和强制值的序列(8n字节)
8n+4 0AH 21H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 8AH 21H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 0AH 21H 80H 00H

返回数据(成功)的条件:

返回数据(成功),PLC执行的操作:

地址和强制值的格式参照STATUS_VAR_WRITE指令。

0A30H STATUS_DEBUG_READ 读PLC调试状态

STATUS_DEBUG_READ指令读取当前PLC的调试状态。PLC的调试状态为一个8位的字节:

SYS_STATE
8 7 6 5 4 3 2 1 0
RESET RUN

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 0AH 30H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 8AH 30H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 DEBUG_RUN(1字节)
00H 05H 0AH 30H 80H 00H

返回数据(成功)的条件:

0A31H STATUS_DEBUG_WRITE 写PLC调试状态

STATUS_DEBUG_WRITE指令修改当前PLC的调试状态的RUN位。STATUS_DEBUG_WRITE指令只发送一个字节的数据。若RUN为0,强制PLC进入单步调试的停止状态。若RUN不为0,强制PLC进入单步调试的连续运行状态(可以被断点停止)。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号 DEBUG_RUN(1字节)
00H 05H 0AH 31H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 8AH 31H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 0AH 31H 80H 00H

返回数据(成功)的条件:

返回数据(成功),PLC执行的操作:

0A32H STATUS_DEBUG_SCAN 调试模式扫描

STATUS_DEBUG_SCAN指令使处于单步调试状态的PLC进行单步调试操作。STATUS_DEBUG_SCAN指令只发送一个字节的数据。这个数据可以取下面的值。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号 STEP(1字节)
00H 05H 0AH 32H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 8AH 32H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 0AH 32H 80H 00H

返回数据(成功)的条件:

返回数据(成功),PLC执行的操作:

0A34H STATUS_DEBUG_INFOR_READ 读调试信息

STATUS_DEBUG_INFOR_READ指令读取目标PLC的调试信息。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 0AH 34H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 8AH 34H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号 调试信息(16字节)
00H 14H 0AH 34H 80H 00H

返回数据(成功)的条件:

返回调试信息的格式:

0 BYTE DEBUG_INDEX 调试断点的函数号
1 WORD DEBUG_NETWORK 调试断点的网络号
2
3 WORD DEBUG_STEP 调试断点的步号
4
5 BYTE STATE_INDEX 当前的函数号
6 WORD STATE_NETWORK 当前的网络号
7
8 WORD STATE_STEP 当前的步号
9
10 WORD STACK_DATA 数据栈值
11
12 WORD STACK_LOGIC 辅助栈值
13
14 BYTE SP 调用嵌套层次
15 BYTE ERROR 错误代码

所有的调试信息字数据都按照高字节到低字节的顺序发送。

0A35H STATUS_DEBUG_INFOR_WRITE 写调试信息

STATUS_DEBUG_INFOR_WRITE指令写入目标PLC的调试信息。

发送数据:

GUTTA通讯数据
数据长度 功能码 内部包号 调试信息(5字节)
00H 09H 0AH 35H 80H 00H

返回数据(失败):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 8AH 35H 80H 00H

返回数据(成功):

GUTTA通讯数据
数据长度 功能码 内部包号
00H 04H 0AH 35H 80H 00H

返回数据(成功)的条件:

返回数据(成功),PLC执行的操作:

发送调试信息的格式:

0 BYTE DEBUG_INDEX 调试断点的函数号
1 WORD DEBUG_NETWORK 调试断点的网络号
2
3 WORD DEBUG_STEP 调试断点的步号
4

所有的调试信息数据都按照高字节到低字节的顺序发送。