UM4002


UM4002 变量描述文件规范
   PDF格式完整版本下载

概述

在GUTTA平台中,PLC对内存的访问是按“区域”来进行的。例如:I0.0表示离散量输入区域第0个字节的第0个位;M30.2表示中间变量区域第30个字节的第2个位;MW20表示中间变量区域第20个字节开始的字(由MB20和MB21这两个字节构成)。在不同的PLC实现中,根据目标硬件的资源的不同、需要处理的外部数字量以及模拟量数量的不同,往往分配给最终用户使用的每个区域的大小是不一样的。在某些情况下甚至区域的分布也有所不同。因此,对于任何一个PLC系统,开发者必须提供一个变量描叙文件。这个文件可以被GUTTA编程软件识别并记忆。一方面,在使用GUTTA软件编辑梯形图或指令表程序时,软件可以根据描述文件判断用户输入的变量是否合法。另一方面,在使用GUTTA软件编译梯形图或指令表时,软件可以根据描述文件给出错误信息并阻止错误的变量访问下载到目标系统中去。因此,编辑或修改变量描述文件是构建任何一个PLC系统的必须过程。阅读变量描述文件是确认一个PLC系统变量分布的最直接途径。

MODBUS变量区间

GUTTA变量描述文件的变量区间划分是在MODBUS变量区间划分的基础上进行的一种二次划分。并且PLC系统在进行MODBUS通讯时,依然依据MODBUS变量系统对内存进行访问。因此在这里有必要先明确MODBUS的变量区间。在标准的MODBUS PLC中,一般认为有下面4种变量区间。

其中,输入线圈可以使用02通讯指令操作;输出线圈可以使用01,05,15通讯指令操作;输入寄存器可以使用04通讯指令操作;保持寄存器可以使用03、06、16通讯指令操作。通讯指令对输入线圈和输入寄存器只能进行读操作。通讯指令对保持线圈和保持寄存器除了可以进行读操作之外,还能进行写操作。输入线圈和输入寄存器顾名思义,一般被做为离散量输入和模拟量输入的映像。保持线圈和保持寄存器除了被做为离散量输出和模拟量输出的映像之外,还可用来存储PLC程序中的中间变量(又称中间线圈或中间寄存器)。在作为输入输出映像的时候,可以通过一个叫做IO映射表的部件来配置(又称IOMAP)。

(在GUTTA平台中,IO映射表是固定的,用户不能够任意配置。在需要经常进行IO重映射的时候,建议使用符号表来进行IO的替换。但这样的替换是静态的,程序重新下载到PLC后,配置才生效。因此即使使用了符号表,也不能实现动态的IO重映设)

MODBUS通讯协议中,输入线圈、保持线圈以位为单位操作。以位为单位意味着最小的操作单元是位,并且通讯中的偏移字段代表的也是位偏移。输入寄存器、保持寄存器以字为单位操作(2字节)。以字为单位操作意味着最小的操作单元是字,并且通讯中的偏移字段代表的也是字偏移。

GUTTA需要扩展的变量区间

完整的GUTTA系统中,在MODBUS提供的4类变量空间的基础上,还需要拓展两类变量空间。他们是常数区域和临时区域。由于这两个区域在MODBUS定义之外,因此这些区域的值不能被标准的MODBUS通讯协议直接访问。但是这些区域的值可以由GUTTA通讯协议直接访问。详情可参考文档:《UM4001 GUTTA通讯协议》

常数区域用来存放PLC程序中使用的所有常数(指令中的立即数);临时区域用来存放调用单元(函数调用或中断调用)中需要使用的临时变量。临时变量除了存放调用单元需要使用的临时变量,也可用于函数调用的参数传递。

典型的变量描述文件一览

变量描述文件以XML(Extensible Markup Language)格式保存,一般保存在GUTTA Ladder软件安装文件夹中。在软件的安装文件夹中,有一个名为GuttaLad的子文件夹。在GuttaLad子文件夹中,又存在若干子文件夹,其中每一个子文件夹代表一种CPU配置。每个CPU配置下面分别有ManagerEnu和ManagerChs这两个子文件夹。这两个文件夹中的文件内容基本一致。只不过对应的语言选项不同。ManagerEnu对应的语言选项为英文,ManagerChs对应的语言选项为中文。如果不考虑多语言的支持,PLC的构建者可以让两个文件夹中的文件保持一致(直接拷贝)。软件GUTTA Ladder在启动时根据当前的语言选项,载入这两个文件夹中的其中一个。

变量描述文件就在这两个目录中,文件名为ManagerVar.xml。一个最简单的ManagerVar.xml看起来应该是这个样子的:

<ManagerVar Base="0"
           BitBase="0"
           Length="0"
           BitLength="0"
           Marker="0">
 <Region Slot="0"
         Name="I"
         Area="Di"
         AreaBegin="0"
         AreaEnd="16"
         Use="Value"
         Comment="Discrete inputs">
   <Access Name="" Width="Bit" Step="Byte" Offset="Byte"/>
   <Access Name="B" Width="Byte" Step="Byte" Offset="Byte"/>
   <Access Name="W" Width="Word" Step="Byte" Offset="Byte"/>
   <Access Name="D" Width="Dword" Step="Byte" Offset="Byte"/>
 </Region>
 </Region>
</ManagerVar>

在这个XML文件中,根节点为ManagerVar,这个节点中包含若干个Region节点。每一个Region节点对应了实际在PLC中能够使用的一个变量域。上面这段XML代码的大致意思就是:在这个PLC变量系统中,只有一个名称为I(Name=”I”)的变量域。这个域分配在输入线圈中(Area=”Di”)的前16个字节(MODBUS的10001到10128)。对这个域的访问只能使用直接取值的方式(Use=”Value”)。取值有4种方式:按位取值(例如I1.2)、按字节取值(例如IB10)、按字取值(例如IW8)、按双字取值(例如ID6)。

变量描述文件节点属性说明

<ManagerVar>节点

ManagerVar是变量描述文件的根节点。同时每个变量描述文件的根节点必须是ManagerVar。

<ManagerVar>:Base属性

数据类型为INT(保留属性,目前GUTTA Ladder 1.0版本不能识别)。

节点ManagerVar的Base属性表示变量系统中变量偏移数值的开始值。在MODBUS中,40001表示保持寄存器的首个字,偏移是从1开始,那么Base的值就应该是1。在CPU-EC20中,MW0表示中间变量的第首个字。偏移是从0开始,那么Base的值就应该是0。Base的值也可以取0和1以外的值,不过不建议这么做。除非有特殊含义,其它的值很可能对PLC的使用者造成困惑和不便。

<ManagerVar>:BitBase属性

数据类型为INT(保留属性,目前GUTTA Ladder 1.0版本不能识别)。

节点ManagerVar的BitBase属性和Base属性类似,用来说明位偏移的数值的开始值。在CPU-EC20中,M100.0表示第100个字节的最低位,那么BitBase的值就应该是0。若BitBase的值是1,那么就必须用M100.1表示第100个字节最低位。BitBase的值也可以取0和1以外的值,不过不建议这么做。除非有特殊含义,其它的值很可能对PLC的使用者造成困惑和不便。

<ManagerVar>:Length属性

数据类型为INT(保留属性,目前GUTTA Ladder 1.0版本不能识别)。

节点ManagerVar的Length属性定义了变量偏移的字符串长度。在MODBUS中,变量40001给变量偏移保留了4个0字符,故变量偏移的字符串长度为5。Length为0表示不添加占位的字符0。

<ManagerVar>:BitLength属性

数据类型为INT(保留属性,目前GUTTA Ladder 1.0版本不能识别)。

节点ManagerVar的BitLength属性和Length属性类似,定义了位变量偏移的字符串长度。BitLength为0表示不添加占位的0。

<ManagerVar>:Marker属性

数据类型为INT(保留属性,目前GUTTA Ladder 1.0版本不能识别)。

在IEC61131-6的标准中,所有直接地址前需要加入标识符“%”,以区别于符号地址。由于在小型PLC系统中,直接地址比符号地址更加常用,因此在很多软件中“%”可以省略。Marker为0表示系统在显示直接变量时前面省略“%” 标识符。Marker为非0的值表示系统在显示直接变量时前面必须加上“%” 标识符。

<ManagerVar>:<Region>节点

<ManagerVar><Region>:Slot属性

数据类型为INT,范围为0~15(16#00~16#0F)。

Region的Slot属性定义当前变量域的识别码。由于效率的原因,GUTTA PLC固件不能识别字符串形式的变量。梯形图或指令表中的变量必须以二进制的形式下载到PLC中(编译型的PLC需要根据此二进制继续生成特定的语言)。Slot的二进制值是PLC固件识别本变量域的唯一标识。

<ManagerVar><Region>:Name属性

数据类型为STRING,可以为字母或数字,至少一个字符长度。

Region的Name属性定义当前变量域的名称。名称Name和识别码Slot一一对应。在CPU-EC20中,中间变量的名称是“M”(例如MW20),系统变量的名称是“SM”(例如SMB20)。

<ManagerVar><Region>:Area属性

数据类型为STRING,可能的值有:“Di”“Do”“Ri”“Ro”“Const”“Local”。

Region的Area属性定义当前变量域所在的分区:

需要注意的是,ManagerVar的所有Region中,必须有一个且只能有一个Area为“Const”的Region;必须有一个且只能有一个Area为“Local”的Region。否则GUTTA Ladder Editor在启动的时候会返回错误而终止程序的启动。

<ManagerVar><Region>:AreaBegin属性

数据类型为INT。

Region的AreaBegin属性表示本区域在Area中的开始地址。

<ManagerVar><Region>:AreaEnd属性

数据类型为INT。

Region的AreaEnd属性表示本区域在Area中的结束地址。

<ManagerVar><Region>:Use属性

数据类型为STRING,可能的值有:“Address”“Value”“Pointer”。Use的值也可以是这些可能的值的复合形式,例如“Address| Value”表示即支持Address用法,也支持Value用法。

Region的Use属性表示本区域可能的用法。

对于不支持地址变量的精简GUTTA PLC系统,所有的区域都必须只有Value用法。

<ManagerVar><Region>:Comment属性

数据类型为STRING。

对本变量区域的一个描述。对读者来说是一个注释,以方便理解本区域的作用。简单的处理可以直接设为空字符串。设置时需要考虑当前变量描述文件所属的语言。

<ManagerVar><Region><Access>节点

在Region节点中应该至少包含一个Access节点。Acess节点定义了对本变量区域的一种具体引用类型。

<ManagerVar><Region><Access>:Name属性

数据类型为STRING。

Access的Name属性定义当前引用类型的后缀。GUTTA PLC系统通过此后缀确定当前的引用类型。例如在CPU-EC20中,MB20的“M”表示中间变量区域(中间变量区域的名称是“M”)。同时,“B”表示在中间变量区域中的引用类型后缀(由于后缀名为“B”的引用类型的数据宽度是字节,故MB20表示引用一个字节)。

<ManagerVar><Region><Access>:Width属性

数据类型为STRING。可能的值有“Bit”、“Byte”、“Word”、“Dword”。

Access的Width属性定义当前引用类型的的数据宽度。“Bit”、“Byte”、“Word”、“Dword”代表的数据宽度分别为位、字节(8bit)、字(8bit)、双字(32bit)。

<ManagerVar><Region><Access>:Step属性

数据类型为STRING。可能的值有“Bit”、“Byte”、“Word”、“Dword”。

Access的Step属性定义当前引用类型的对齐宽度。“Bit”、“Byte”、“Word”、“Dword”代表的数据宽度分别为位(1bit)、字节(8bit)、字(8bit)、双字(32bit)。例如在CPU-EC20系统中,由于M区域中D引用类型的对齐宽度为“Byte”,因此MD0、MD1、MD2、MD3、MD4都是合法的变量,因为他们都是字节(8bit)对齐的。若将对齐宽度改为“Word”,那么以上变量中就只有MD0、MD2、MD4是合法变量了,因为他们是字(16bit)对齐的。若将此值改为“Dword”,那么以上变量中就只有MD0、MD4是合法变量了,因为他们是双字(32bit)对齐的。

在一些CPU架构中,CPU不支持非对齐数据的访问。例如ARM7就没有非字对齐的字载入指令。在种CPU架构中,可以通过限制非对齐变量的访问来提高执行效率。

<ManagerVar><Region><Access>:Offset属性

数据类型为STRING。可能的值有“Bit”、“Byte”、“Word”、“Dword”。

Access的Offset属性定义当前引用类型的偏移单位宽度。例如在CPU-EC20中,MB20表示M区域开始的第20个字节。而T20表示T区域开始的第20个字(第40个字节位置开始的字)。因为MB20对应的引用类型偏移单位宽度为“Byte”,而T20对应的引用类型偏移单位宽度为“Word”。

附录

CPU-EC20变量描述文件范例

<ManagerVar Base="0"
<ManagerVar Base="0"
           BitBase="0"
           Length="0"
           BitLength="0"
           Marker="0">
 <Region Slot="0"
         Name="I"
         Area="Di"
         AreaBegin="0"
         AreaEnd="16"
         Use="Value"
         Comment="Discrete inputs">
   <Access Name="" Width="Bit" Step="Byte" Offset="Byte"/>
   <Access Name="B" Width="Byte" Step="Byte" Offset="Byte"/>
   <Access Name="W" Width="Word" Step="Byte" Offset="Byte"/>
   <Access Name="D" Width="Dword" Step="Byte" Offset="Byte"/>
 </Region>
 <Region Slot="1"
         Name="Q"
         Area="Do"
         AreaBegin="0"
         AreaEnd="16"
         Use="Value"
         Comment="Discrete outputs">
   <Access Name="" Width="Bit" Step="Byte" Offset="Byte"/>
   <Access Name="B" Width="Byte" Step="Byte" Offset="Byte"/>
   <Access Name="W" Width="Word" Step="Byte" Offset="Byte"/>
   <Access Name="D" Width="Dword" Step="Byte" Offset="Byte"/>
 </Region>
 <Region Slot="2"
         Name="AI"
         Area="Ri"
         AreaBegin="0"
         AreaEnd="16"
         Use="Value"
         Comment="Analog inputs">
   <Access Name="B" Width="Byte" Step="Byte" Offset="Byte"/>
   <Access Name="W" Width="Word" Step="Byte" Offset="Byte"/>
   <Access Name="D" Width="Dword" Step="Byte" Offset="Byte"/>
 </Region>
 <Region Slot="3"
         Name="AQ"
         Area="Ro"
         AreaBegin="0"
         AreaEnd="16"
         Use="Value"
         Comment="Analog outputs">
   <Access Name="B" Width="Byte" Step="Byte" Offset="Byte"/>
   <Access Name="W" Width="Word" Step="Byte" Offset="Byte"/>
   <Access Name="D" Width="Dword" Step="Byte" Offset="Byte"/>
 </Region>
 <Region Slot="4"
         Name="M"
         Area="Ro"
         AreaBegin="16"
         AreaEnd="416"
         Use="Address|Value|Pointer"
         Comment="Internal memory">
   <Access Name="" Width="Bit" Step="Byte" Offset="Byte"/>
   <Access Name="B" Width="Byte" Step="Byte" Offset="Byte"/>
   <Access Name="W" Width="Word" Step="Byte" Offset="Byte"/>
   <Access Name="D" Width="Dword" Step="Byte" Offset="Byte"/>
 </Region>
 <Region Slot="5"
         Name="T"
         Area="Ro"
         AreaBegin="416"
         AreaEnd="480"
         Use="Value"
         Comment="Timer currents">
   <Access Name="" Width="Word" Step="Word" Offset="Word"/>
 </Region>
 <Region Slot="6"
         Name="C"
         Area="Ro"
         AreaBegin="480"
         AreaEnd="512"
         Use="Value"
         Comment="Counter currents">
   <Access Name="" Width="Word" Step="Word" Offset="Word"/>
 </Region>
 <Region Slot="7"
         Name="SM"
         Area="Ro"
         AreaBegin="512"
         AreaEnd="544"
         Use="Address|Value"
         Comment="Special memory">
   <Access Name="" Width="Bit" Step="Byte" Offset="Byte"/>
   <Access Name="B" Width="Byte" Step="Byte" Offset="Byte"/>
   <Access Name="W" Width="Word" Step="Byte" Offset="Byte"/>
   <Access Name="D" Width="Dword" Step="Byte" Offset="Byte"/>
 </Region>
 <Region Slot="8"
         Name="J"
         Area="Ro"
         AreaBegin="544"
         AreaEnd="560"
         Use="Value"
         Comment="Jumper memory">
   <Access Name="" Width="Byte" Step="Byte" Offset="Byte"/>
 </Region>
 <Region Slot="9"
         Name="K"
         Area="Const"
         AreaBegin="0"
         AreaEnd="128"
         Use="Value"
         Comment="Const memory">
   <Access Name="" Width="Bit" Step="Byte" Offset="Byte"/>
   <Access Name="B" Width="Byte" Step="Byte" Offset="Byte"/>
   <Access Name="W" Width="Word" Step="Byte" Offset="Byte"/>
   <Access Name="D" Width="Dword" Step="Byte" Offset="Byte"/>
 </Region>
 <Region Slot="10"
         Name="L"
         Area="Local"
         AreaBegin="0"
         AreaEnd="32"
         Use="Address|Value|Pointer"
         Comment="Local variable memory">
   <Access Name="" Width="Bit" Step="Byte" Offset="Byte"/>
   <Access Name="B" Width="Byte" Step="Byte" Offset="Byte"/>
   <Access Name="W" Width="Word" Step="Byte" Offset="Byte"/>
   <Access Name="D" Width="Dword" Step="Byte" Offset="Byte"/>
 </Region>
</ManagerVar>