S7-1200PLC数组和间接寻址访问

上传人:Sc****h 文档编号:129429469 上传时间:2022-08-03 格式:DOC 页数:14 大小:1,007.51KB
返回 下载 相关 举报
S7-1200PLC数组和间接寻址访问_第1页
第1页 / 共14页
S7-1200PLC数组和间接寻址访问_第2页
第2页 / 共14页
S7-1200PLC数组和间接寻址访问_第3页
第3页 / 共14页
点击查看更多>>
资源描述
S7-1200 PLC数组和间接寻址访问S7-1200 PLC ARRAY data type and indirect field accessesSingle FAQ 2014-03摘 要 本文提供一个S7-1200 通过数组和间接寻址方式,以实现程序动态修改程序变量的地址和内容。而有效的提升程序的灵活性和适用范围;但S7-1200 PLC在实际的使用过程中,没有POINTER、ANY指针的数据类型,而通过数组和间接寻址方式替代指针的一般应用。 关键词 S7-1200 数组 间接寻址访问Key Words S7-1200 ARRAY data indirect field accesses目 录1概述42S7-1200间接寻址42.1 TIA PROTAL V12 为S7-1200 提供以下标准编程语言52.2 LAD/FBD编程S7-1200的间接寻址52.3 SCL编程S7-1200的间接寻址63S7-1200数组数据类型的间接访问83.1一维数组类型的间接访问93.2多维数组类型的间接访问104S7-1200数组应用实例121概述 SIMATIC S7-1200 是 SIMATIC S7 可编程控制器系列中的新型模块化微型 PLC。由于其紧凑型模块化设计及高性能,SIMATIC S7-1200 适用于大量自动化应用,而且成本非常合算;其大量的指令集使得 SIMATIC S7-1200 可解决小到中型自动化应用。 但在其使用的过程中用户提出其该系列PLC不支持POINTER、ANY指针的应用。其实应该问的是既然有了数组,指针的应用可以用数组替换吗?我们知道执行指针是危险的,执行指针很容易就会现在指针越界问题,如果是赋值操作将会对系统造成很大的危险,相信每一个程序员都会用指针取数时取过不属于自已定义的内存单元。并且数组有它自已的优点: 1、数组定义的是一组连续的内存空间,可以说每个单元都有自已的变量名(数组名+下标),这样如果执行越界操作时,程序将会报错; 2、数组更好管理和直观一些!如果程序里有使用很多指针,我们知道执行指针是危险的,多一个针指操作就多一分危险,你能保证,程序编写一次就能正常运行,你这么多的针指就不会指向一些重要的系统或用户数组去操作? 而S7-1200 PLC能通过数组和间接寻址方式替代指针的一般应用。2S7-1200间接寻址2.1、TIA PROTAL V12 为S7-1200 提供以下标准编程语言 LAD(梯形图逻辑)是一种图形编程语言。 它使用基于电路图的表示法。 FBD(功能块图)是基于布尔代数中使用的图形逻辑符号的编程语言。 SCL(结构化控制语言)是一种基于文本的高级编程语言。创建代码块时,应选择该块要使用的编程语言。2.2、LAD/FBD编程S7-1200的间接寻址 LAD/FBD编程S7-1200的间接寻址:FieldRead(读取域)、FieldWrite(写入域)。 FieldRead(读取域): 以下示例说明了该指令的工作原理: 下表将通过具体的操作数值对该指令的工作原理进行说明:参 数变 量值INDEXa_index4MEMBERDB_1.Main_Field-10数据块“DB_1”中域“Main_Field-10.10 of REAL”的第一个元素VALUEa_real域“Main_Field-10.10 of REAL”中下标为 4 的元素 该指令是从域“Main_Field-10.10 of REAL”读取下标为 4 的域元素,并将其写入“a_real”变量。 待读取域的元素由输入 INDEX 中的值指定。 FieldWrite(写入域): 以下示例说明了该指令的工作原理: 下表将通过具体的操作数值对该指令的工作原理进行说明:参 数变 量值INDEXa_index4VALUEa_real10.54MEMBERDB_1.Main_Field-10数据块“DB_1”中域“Main_Field-10.10 of REAL”的第一个元素 该指令是变量“a_real”的值“10.54”,将写入域“Main_Field-10.10 of REAL”中下标为 4 的域元素。 通过 INDEX 输入中的值,指定要传送变量“a_real”内容的域元素的下标。2.3、SCL编程S7-1200的间接寻址 SCL编程S7-1200的间接寻址:POKE、POKE_BOOL、PEEK、PEEK_BOOL、POKE_BLK指令。其中AREA可以选择以下区域: 16#81: Input 16#82: Output 16#83: 位存储区 16#84: DB 16#2: 外设输出(仅 S7-1500) POKE(写入存储器地址): 以下示例说明了该指令的工作原理:POKE(AREA := Tag_Area, DBNUMBER := Tag_DBNumber, BYTEOFFSET := Tag_Byte, VALUE := Tag_Value); 下表将通过具体的操作数值对该指令的工作原理进行说明:参 数操作数值AREATag_Area16#84DBNUMBERTag_DBNumber5BYTEOFFSETTag_Byte20VALUETag_Value16#11 该指令使用值“16#11”覆盖数据块“5”中的存储地址“20”。 POKE_BOOL(写入存储器位): 以下示例说明了该指令的工作原理:POKE(AREA := Tag_Area, DBNUMBER := Tag_DBNumber, BYTEOFFSET := Tag_Byte, BITOFFSET := Tag_Bit, VALUE := Tag_Value); 下表将通过具体的操作数值对该指令的工作原理进行说明:参 数操作数值AREATag_Area16#84DBNUMBERTag_DBNumber5BYTEOFFSETTag_Byte20BITOFFSETTag_Bit3VALUETag_ValueM0.0 该指令使用值“M0.0”覆盖数据块“5”中字节“20”的存储器位“3”。 PEEK(读取存储器地址): 以下示例说明了该指令的工作原理:Tag_Result1 := PEEK(AREA := Tag_Area, DBNUMBER := Tag_DBNumber, BYTEOFFSET := Tag_Byte);Tag_Result2 := PEEK_WORD(AREA := Tag_Area, DBNUMBER := Tag_DBNumber, BYTEOFFSET := Tag_Byte); 下表将通过具体的操作数值对该指令的工作原理进行说明:参 数操作数值AREATag_Area16#84DBNUMBERTag_DBNumber5BYTEOFFSETTag_Byte20函数值Tag_Result1字节值20函数值Tag_Result2字值20 该指令从数据块“5”中的“Tag_Byte”操作数内读取地址值“20”,并将结果作为“Tag_Result”操作数的函数值返回。 PEEK_BOOL(读取存储器位): 以下示例说明了该指令的工作原理:Tag_Result := POKE_BOOL(AREA := Tag_Area, DBNUMBER := Tag_DBNumber, BYTEOFFSET := Tag_Byte, BITOFFSET := Tag_Bit); 下表将通过具体的操作数值对该指令的工作原理进行说明:参 数操作数值AREATag_Area16#84DBNUMBERTag_DBNumber5BYTEOFFSETTag_Byte20BITOFFSETTag_Bit3函数值Tag_ResultTag_Bit的状态 该指令从数据块“5”中字节“20”的“Tag_Bit”操作数内读取存储器位值“状态”,并将结果作为函数值在“Tag_Result”操作数中返回。 POKE_BLK(写入存储区): 以下示例说明了该指令的工作原理:POKE_BLK(AREA_SRC := Tag_Source_Area, DBNUMBER_SRC := Tag_Source_DBNumber, BYTEOFFSET_SRC := Tag_Source_Byte), AREA_DEST := Tag_Destination_Area, DBNUMBER_DEST := Tag_Destination_DBNumber, BYTEOFFSET_DEST := Tag_Destination_Byte, COUNT := Tag_Count); 下表将通过具体的操作数值对该指令的工作原理进行说明:参 数操作数值AREA_SRCTag_Source_Area16#84DBNUMBER_SRCTag_Source_DBNumber5BYTEOFFSET_SRCTag_Source_Byte20AREA_DESTTag_Destination_Area16#83DBNUMBER_DESTTag_Destination_DBNumber0BYTEOFFSET_DESTTag_Destination_Byte30COUNTTag_Count100 该指令将数据块“5”中从地址“20”开始的 100 个字节写入位存储区中从地址“30”开始的存储区内。3S7-1200数组数据类型的间接访问 S7-1200动态访问数据可以通过数组来实现。数组的访问方式,使程序不需要创建复杂的指针类型。一个指针和偏移量实现的表达式可通过数组和下标等价实现;但是,数组名和指针之间有一个不同之处,指针是一个变量,因此,定义int *pa,语句pa=a和pa+都是合法的。但数组名不是变量,因此,类似于定义a,a=pa和a+形式的语句是非法的。 S7-1200运行时的动态访问: SCL: 1 #Field_Number := Field_Data.Numbers#i; 23.1、一维数组类型的间接访问 下表列出了一维 Array 变量的声明:名 称数据类型注 释Op_TempArray1.3 of INT包括 3 个元素的一维数组变量。 下图所示为已声明数组变量的结构: 访问 ARRAY 元素,通过下标访问各数组元素。 第一个 ARRAY 元素的下标为 1,第二个元素的下标为 2,第三个元素的下标为 3。 要访问第二个 ARRAY 元素的值,需要在程序中声明“Op_Temp2”。 下面以 SCL 为例,举例说明了对 ARRAY 元素进行的间接索引。MOTOR 是一个包含三个元素的一维 ARRAY_of_INT。VALUES 是一个整型的 PLC 变量。 在 SCL 中寻址说明 : #MOTOR2 := VALUES; (直接寻址:将 VALUES 指定给 ARRAY MOTOR*) 的第二元素。 #MOTORTag_1 := VALUES;(间接寻址: 将 VALUES 分配给由 Tag_1 指定的 ARRAY MOTOR*) 的元素 #MOTORTag_2+Tag_3 := #Values;(间接寻址: 将 VALUES 分配给由表达式 Tag_2+Tag_3 指定的 ARRAY MOTOR*) 的元素3.2、多维数组类型的间接访问 下表列出了二维 Array 变量的声明:名 称数据类型注 释Betr_TempArray1.2, 1.3 of INT包括 6 个元素的二维数组变量。 下图所示为已声明数组变量的结构: 访问 ARRAY 元素,通过下标访问各数组元素的值。 例如,第一个数组元素的下标为 1,1,第四个元素的下标为 2,1。 例如,要访问第四个数组元素的值,需要在程序中声明“Betr_Temp2,1”。 下表列出了三维 Array 变量的声明:名 称数据类型注 释aArray1.3, 1.4,1.2 of INT包括 24 个元素的三维数组变量。 下图所示为已声明数组变量的结构: 访问 ARRAY 元素,通过下标访问各数组元素的值。 例如,第一个数组元素的下标为 1,1,1,最后一个元素的下标为 3,4,2。 例如,要访问第11个数组元素的值,需要在程序中声明“a2,2,1”。 下面举例说明了用于“Data_DB”数据块中声明的“Quantities”数组的间接索引: Data_DB. Variable i,j / 多维数组 Data_DB. Variable i,j.a / STRUCT 的多维数组 部 分描 述Data_DB数组所在数据块的名称VariableArray 数据类型的变量i, j用作指针的整型 PLC 变量a结构的附加局部变量 4S7-1200数组应用实例 如果对一个电机进行完全的控制,可能需要的PLC语句要几十甚至上百条,如果要控制的电机有几百台的话,那语句就要几万条,如果再加上过程控制的逻辑语句,那么这个程序就要非常之大,这么大的程序也会使编程人员要耗费大量的精力来编制、同时程序执行一次的循环时间要长很多很多,同时也使程序的可读性、维护性、扩展性都大幅度的降低。如果要改变这种状况、目前比较流行的是编制功能块、对电机的控制特性编写一个通用的功能块,对每一台电机的控制都调用一次功能块。这种方法虽然理解起来比较容易令人接受,但其实也有着它的缺点,编制功能块虽然看起来简单了,但其实这种方法实际上只是减少了程序编制的工作量,但程序的大小并没有缩小很多,因为对应每个电机都要调用一次功能块,如果有几百台电机,就要调用几百次;而程序的执行时间并没有缩短,因为每次都要对几百个功能块进行扫描、而每个功能块都是由上百条语句完成的,执行时间不言而喻。 让程序编写容易、扫描时间缩短、程序变得简洁有一种更好的方法,那就是用PLC中的数组运算来处理这一切,无论有多少台电机,用数组运算处理,几毫秒的时间就可以完成运算。总体逻辑视图:手动启停信号当前启停状态信号XOR运算OR运算ANDAND延 时报 警输出映像区报警确认故障信号自动启停信号反馈信号 程序的编制,首先要建立一批数组,用来存放不同的数据(eg: Manual start-stop0)。然后,我们数组中每一个数的每一位与相对应的IO输入和输出与数组中对应的位关联(eg:Manual start-stop0.x0)。 下图为数组处理的逻辑图,将以上逻辑以程序方式实现后,即可实现手自动的控制。 经过总逻辑视图运算,即可对发实现一个完整的逻辑控制,同时程序也十分简洁。并且有着很强的扩展性。一个INT型整数有16位,如果处理160个电机只需要建立包含10个整数的数组,逻辑不用变化,把数组的标识符改为变量(eg: Manual start-stopi),进行循环运算。同时运算速度几乎没有什么显著的变化。参考:SIMATIC S7 S7-1200 可编程控制器系统手册:注意事项 应用示例与所示电路、设备及任何可能结果没有必然联系,并不完全相关。应用示例不表示客户的具体解决方案。它们仅对典型应用提供支持。用户负责确保所述产品的正确使用。这些应用示例不能免除用户在确保安全、专业使用、安装、操作和维护设备方面的责任。当使用这些应用示例时,应意识到西门子不对在所述责任条款范围之外的任何损坏/索赔承担责任。我们保留随时修改这些应用示例的权利,恕不另行通知。如果这些应用示例与其它西门子出版物(例如,目录)给出的建议不同,则以其它文档的内容为准。声明我们已核对过本手册的内容与所描述的硬件和软件相符。由于差错难以完全避免,我们不能保证完全一致。我们会经常对手册中的数据进行检查,并在后续的版本中进行必要的更正。欢迎您提出宝贵意见。版权 西门子(中国)有限公司2001-2011 版权保留复制、传播或者使用该文件或文件内容必须经过权利人书面明确同意。侵权者将承担权利人的全部损失。权利人保留一切权利,包括复制、发行,以及改编、汇编的权利。西门子(中国)有限公司Siemens Ltd. China Industry sectorIndustry Product and System Sales Region North Regional Customer Support Page 14/14
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 幼儿教育


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!