STEP7——POINTER指针详解
- 格式:doc
- 大小:57.00 KB
- 文档页数:3
Step7-数据类型详细说明总结汇总STEP7中的基本数据类型⑴位(BOOL)位数据的数据类型为BOOL(布尔)型,在软件编程中BOOL 变量的值1和0常用英语词TURE(真)和FALSE(假)来表示,对应二进制数中的“1”和“0”,常用于开关量的逻辑运算,存储空间为1位。
⑵字节(BYTE)字节数据长度为8位,数据格式为B#16#,B代表BYTE,表示数据长度为一个字节(8位),#16#表示十六进制,取值范围为B#16#0~B#16#FF。
⑶字(WORD)字数据长度为16位,这种数据可采用4种方法进行描述。
二进制:二进制的格式为2#,如2#101,取值范围为2#0~2#1111_1111_1111_1111,书写时每4位可用下划线隔开,也可直接表示为2#111111111111。
十六进制:十六进制的格式为W#16#,W代表WORD,表示数据长度为16位,#16#表示十六进制,数据取值范围为W #16#0~W#16#FFFF。
BCD码:BCD码的格式为C#,取值范围为C#0~C#999。
BCD码是用4位二进制表示1位十进制数,4位二进制中的0000~1001组合分别表示十进制中的0~9,4位二进制中的1010~1111组合放弃不用。
BCD码的最高4位用来表示符号,十六位BCD码的取值范围为-999~+999。
在STEP7的数据格式中,BCD码的取值只取正值,与最高4位的符号无关。
无符号十进制数:无符号十进制数的格式为B#(×,×),取值范围为B#(0,0)~B#(255,255),无符号十进制数是用十进制的0~255对应二进制数中的0000_0000~1111_1111(8位),16位二进制数就需要两个0~255的数来表示,例如:B#(12,254)=2#0000_1100_1111_111012 254上面4种数据都是描述一个长度位16位的二进制数,无论你使用哪种方式都可以。
完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如NOT等)。
其中的操作数是指令要执行的目标,也就是指令要进行操作的地址。
我们知道,在PLC中划有各种用途的存储区,比如物理输入输出区P、映像输入区I、映像输出区Q、位存储区M、定时器T、计数器C、数据区DB和L等,同时我们还知道,每个区域可以用位(BIT)、字节(BYTE)、字(WORD)、双字(DWORD)来衡量,或者说来指定确切的大小。
当然定时器T、计数器C不存在这种衡量体制,它们仅用位来衡量。
由此我们可以得到,要描述一个地址,至少应该包含两个要素:1、存储的区域2、这个区域中具体的位置比如:A Q2.0其中的A是指令符,Q2.0是A的操作数,也就是地址。
这个地址由两部分组成:Q:指的是映像输出区2.0:就是这个映像输出区第二个字节的第0位。
由此,我们得出,一个确切的地址组成应该是:〖存储区符〗〖存储区尺寸符〗〖尺寸数值〗.〖位数值〗地址标识符例如:DBX200.0。
其中,我们又把〖存储区符〗〖存储区尺寸符〗这两个部分合称为:地址标识符。
这样,一个确切的地址组成,又可以写成:地址标识符+ 确切的数值单元【间接寻址的概念】寻址,就是指定指令要进行操作的地址。
给定指令操作的地址方法,就是寻址方法。
在谈间接寻址之前,我们简单的了解一下直接寻址。
所谓直接寻址,简单的说,就是直接给出指令的确切操作数,像上面所说的,A Q2.0,就是直接寻址,对于A这个指令来说,Q2.0就是它要进行操作的地址。
这样看来,间接寻址就是间接的给出指令的确切操作数。
对,就是这个概念。
比如:A Q[MD100] ,A T[DBW100]。
程序语句中用方括号[ ] 标明的内容,间接的指明了指令要进行的地址,这两个语句中的MD100和DBW100称为指针Pointer,它指向它们其中包含的数值,才是指令真正要执行的地址区域的确切位置。
间接由此得名。
西门子的间接寻址方式有两大类型:存储器间接寻址和寄存器间接寻址。
完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如NOT等)。
其中的操作数是指令要执行的目标,也就是指令要进行操作的地址。
我们知道,在PLC中划有各种用途的存储区,比如物理输入输出区P、映像输入区I、映像输出区Q、位存储区M、定时器T、计数器C、数据区DB和L等,同时我们还知道,每个区域可以用位(BIT)、字节(BYTE)、字(WORD)、双字(DWORD)来衡量,或者说来指定确切的大小。
当然定时器T、计数器C不存在这种衡量体制,它们仅用位来衡量。
由此我们可以得到,要描述一个地址,至少应该包含两个要素:1、存储的区域2、这个区域中具体的位置比如:A Q2.0 其中的A是指令符,Q2.0是A的操作数,也就是地址。
这个地址由两部分组成:Q:指的是映像输出区2.0:就是这个映像输出区第二个字节的第0位。
由此,我们得出,一个确切的地址组成应该是:〖存储区符〗〖存储区尺寸符〗〖尺寸数值〗.〖位数值〗,例如:DBX200.0。
DB X 200 . 0 其中,我们又把〖存储区符〗〖存储区尺寸符〗这两个部分合称为:地址标识符。
这样,一个确切的地址组成,又可以写成:地址标识符+ 确切的数值单元【间接寻址的概念】寻址,就是指定指令要进行操作的地址。
给定指令操作的地址方法,就是寻址方法。
在谈间接寻址之前,我们简单的了解一下直接寻址。
所谓直接寻址,简单的说,就是直接给出指令的确切操作数,象上面所说的,A Q2.0,就是直接寻址,对于A这个指令来说,Q2.0就是它要进行操作的地址。
这样看来,间接寻址就是间接的给出指令的确切操作数。
对,就是这个概念。
比如:A Q[MD100] ,A T[DBW100]。
程序语句中用方刮号[ ] 标明的内容,间接的指明了指令要进行的地址,这两个语句中的MD100和DBW100称为指针Pointer,它指向它们其中包含的数值,才是指令真正要执行的地址区域的确切位置。
间接由此得名。
指针(pointer——C/C++的精髓!你不得不学好它!指针(pointer指针是一种数据类型,用于存放某个变量的地址值。
此时该指针被称为是指向该变量。
一个指针的类型决定于它所指向的变量的类型。
指针既可指向基本数据类型(即预定义数据类型),又可指向数组、函数、类和文件等用户自定义数据类型。
指针可以初始化为0、NULL(即0,这是标准库头文件中定义的符号化常量)或一个地址。
内容为0或NULL的指针不指向任何变量,称为空指针。
例如:int a;int *ptr;指针ptr在下式中被初始化为指向变量a。
ptr = &a;两条语句也可组合地表示为:a = *ptr;其中&为存地址运算符,而*则为取内容运算符。
int a, *ptr;ptr = &a;指针与数组数组名是一个指向该数组的常量指针(其值不能改变),也是该数组中首单元的地址值。
一维数组的指针如下:int arr[5] = { 1, 3, 5, 7, 9 };int *ptra;ptra = arr;数组指针与数组名两者的异同:(1)整型变量指针ptr与整型数组指针ptra的说明格式相同,其间空格可放可不放。
(2)arr既是数组名,又是数组地址,还是数组指针(称为常量指针),三位一体。
因此arr可在一定范围内与ptra等效地使用。
[ ]可在一定范围内与 * 等效地使用。
但arr不准重新赋值。
例如:arr[0]即*arr即*ptra即ptra[0] = 1arr[3]即*(arr+3即*(ptra+3即ptra[3] = 7但arr的使用不如ptra灵活,如:不允许*arr++,而允许*ptra++。
见以下例子:§2.2中[例1]的主程序void main({int arr[5] = {1, 3, 5, 7, 9};for ( int i = 0; i < 5; i++cout << arr[i] << endl; //数组名}其中的for语句可改为:for ( int i = 0; i < 5; i++cout << *(arr+i << endl; //指针// 但不允许arr加减,即不允许:// cout << *(arr++ << endl; not allowed但可使用以下指针ptra:int *ptra = arr;for ( int i = 0; i < 5; i++cout << *(ptra++ << endl;// 此处可以将指针加减(3)字符串与字符数组:字符串一般使用指针(包括变量指针和常量指针两种方式)表示其地址和内容,此地址也即其第一个字符的地址。
parator== IN1等于IN2<> IN1不等于IN2> IN1大于IN2< IN1小于IN2>= IN1大于或等于IN2<= IN1小于或等于IN22.整数就是没有小数位都是零的数,即能被1整除的数(如-1,-2,0,1,……)CMP ?I(INT)整数比较CMP ?D (DINT)比较双精度整数CMP ?R (REAL)比较实数3.转换指令概述BCD_I BCD码转换为整数I_BCD 整型转换为BCD码BCD_DI BCD码转换为双精度整数I_DINT 整型转换为长整型DI_BCD 长整型转换为BCD码DI_REAL 长整型转换为浮点型4 计数器指令S_CUD 双向计数器S_CD 降值计数器S_CU 升值计数器---( SC ) 设置计数器线圈•---( CU ) 升值计数器线圈•---( CD ) 降值计数器线圈5.S_CUD 双向计数器`6. S_CU 升值计数器7. S_CD 降值计数器8. ---( SC ) 设置计数器值9. ---( CU ) 升值计数器线圈10. ---( CD ) 降值计数器线圈11. ---(OPN)打开数据块:DB或DI如果想将数据块中的数据读出(如DB和DI),需要通过(OPN)打开数据块后才可读出。
12. ---(JMP)--- 无条件跳转13. ---(JMPN) 若“否”则跳转14. LABEL标号【整型数学运算指令】整型数学运算指令概述说明使用整数运算,您可以对两个整数(16和32位)执行以下运算:•ADD_I 加整数•SUB_I 减整型•MUL_I 乘整型•DIV_I 除整型•ADD_DI 加双精度整数•SUB_DI 减长整型•MUL_DI 乘长整型•DIV_DI 除长整型•MOD_DI 返回分数长整型15. ADD_I 整数加16. SUB_I 整数减17. MUL_I 整数乘18. DIV_I 整数除19. MOD_DI 返回长整数余数20. 浮点运算指令概述IEEE32位浮点数属于REAL数据类型。
parator== IN1等于IN2<> IN1不等于IN2> IN1大于IN2< IN1小于IN2>= IN1大于或等于IN2<= IN1小于或等于IN22.整数就是没有小数位都是零的数,即能被1整除的数(如-1,-2,0,1,……)CMP ?I(INT)整数比较CMP ?D (DINT)比较双精度整数CMP ?R (REAL)比较实数3.转换指令概述BCD_I BCD码转换为整数I_BCD 整型转换为BCD码BCD_DI BCD码转换为双精度整数I_DINT 整型转换为长整型DI_BCD 长整型转换为BCD码DI_REAL 长整型转换为浮点型4 计数器指令S_CUD 双向计数器S_CD 降值计数器S_CU 升值计数器---( SC ) 设置计数器线圈•---( CU ) 升值计数器线圈•---( CD ) 降值计数器线圈5.S_CUD 双向计数器`6. S_CU 升值计数器7. S_CD 降值计数器8. ---( SC ) 设置计数器值9. ---( CU ) 升值计数器线圈10. ---( CD ) 降值计数器线圈11. ---(OPN)打开数据块:DB或DI如果想将数据块中的数据读出(如DB和DI),需要通过(OPN)打开数据块后才可读出。
12. ---(JMP)--- 无条件跳转13. ---(JMPN) 若“否”则跳转14. LABEL标号【整型数学运算指令】整型数学运算指令概述说明使用整数运算,您可以对两个整数(16和32位)执行以下运算:•ADD_I 加整数•SUB_I 减整型•MUL_I 乘整型•DIV_I 除整型•ADD_DI 加双精度整数•SUB_DI 减长整型•MUL_DI 乘长整型•DIV_DI 除长整型•MOD_DI 返回分数长整型15. ADD_I 整数加16. SUB_I 整数减17. MUL_I 整数乘18. DIV_I 整数除19. MOD_DI 返回长整数余数20. 浮点运算指令概述IEEE32位浮点数属于REAL数据类型。
S7-300/400得编程语言与指令系统3、1 S7-300/400得编程语言3、1、1 PLC编程语言得国际标准IEC 61131就是PLC得国际标准,1992~1995年发布了IEC 61131标准中得1~4部分,我国在1995年11月发布了GB/T15969-1/2/3/4(等同于IEC 61131-1/2/3/4)。
IEC 61131-3广泛地应用PLC、DCS与工控机、“软件PLC”、数控系统、RTU等产品。
定义了5种编程语言1) 指令表IL(Instruction list):西门子称为语句表STL。
2) 结构文本ST(Structured text):西门子称为结构化控制语言(SCL)。
3) 梯形图LD(Ladder diagram):西门子简称为LAD。
4)功能块图FBD (Function block diagram):标准中称为功能方框图语言。
5)顺序功能图SFC(Sequential function chart):对应于西门子得S7 Gra ph。
3、1、2 STEP 7中得编程语言梯形图、语句表与功能块图就是3种基本编程语言,可以相互转换。
ﻩ1.顺序功能图(SFC) :STEP 7中得S7 Graph2.梯形图(LAD)直观易懂,适合于数字量逻辑控制。
“能流”(Power flow)与程序执行得方向。
3、语句表(STL):功能比梯形图或功能块图强。
4.功能块图(FBD):“LOGO!”系列微型PLC使用功能块图编程。
5.结构文本(ST):STEP 7得S7SCL(结构化控制语言)符合EN 61131-3标准。
SCL适合于复杂得公式计算、复杂得计算任务与最优化算法,或管理大量得数据等。
6.S7 HiGraph 编程语言图形编程语言S7 HiGraph 属于可选软件包,它用状态图(state graphs)来描述异步、非顺序过程得编程语言。
7.S7 CFC 编程语言可选软件包CFC(Continuous Function Chart,连续功能图)用图形方式连接程序库中以块得形式提供得各种功能。
精心整理参数类型ANY的格式STEP 7以10个字节存储参数类型ANY。
当构造类型为ANY的参数时,必须确保所有10个字节都被占用,因为调用块估计参数整个内容的值。
例如,如果以字节4指定DB编号,也必须以字节6明确地指定存储器区。
地址以格式Byte.Bit存储,此处字节寻址存储在字节7的位0 - 2,节字8的位0 - 7,节字9的位3 - 7。
位地址存储在字节9的位0 - 2。
对于类型NIL的空指针,所有来自字节1的字节设置为0。
下表给出参数类型ANY的数据类型或存储区域的编码。
对于参数类型,STEP 7存储数据类型和参数的地址。
重复因子始终是1。
字节4、5和7始终是0。
字节8和9指示定时器、计数器或块的编号。
下表为参数类型显示参数类型ANY的数据类型编码。
使用参数类型ANY∙基本数据类型:指定实际参数的绝对地址或符号名称。
∙复杂数据类型:指定复杂数据类型的数据符号名称(例如,数组和结构)。
∙定时器、计数器和块:指定编号(例如,T1、C20或FB6)。
∙下图说明数据如何传送到具有ANY数据类型参数的FC。
在此实例中,FC100具有三个参数(in_par1、in_par2和in_par3),声明为ANY 数据类型。
∙当FB10调用FC100时,FB10传送一个整数(静态变量speed)、一个字(MW100)和一个双字到DB10 (DB10.DBD40)。
∙当FB11调用FC100时,FB11传送一个实数数组(临时变量"Thermo")、一个布尔值(M1.3)和一个定时器(T2)。
为ANY参数指定数据区不仅可以分配各个地址(例如,MW100)给ANY参数,而且可以指定数据区。
如使用参数类型ANY的实例下列实例给出了如何使用参数类型ANY和系统功能SFC20 BLKMOV复制10个字节的存储区域。
参数类型POINTER的格式下图给出了存储在每个字节中的数据类型。
参数类型POINTER存储下列信息:∙DB编号(或0,如果数据没有存储在DB中)∙CPU中的存储区域(下表给出了参数类型POINTER存储器区的十六进制代码)十六进制代码存储区描述b#16#81I输入区域b#16#82Q输出区域b#16#83M位存储区域b#16#84DB数据块b#16#85DI背景数据块b#16#86L本地的数据(L堆栈)b#16#87V先前的本地数据∙数据的地址(格式为字节.位)STEP7提供指针格式:p#memory_area byte.bit_address.(如果形式参数被声明为参数类型POINTER,只需要指出存储区域和地址。
STEP7将自动地重定输入指针的格式。
)下面的实例说明如何为以M50.0开始的数据输入参数类型POINTER:∙P#M50.0∙M50.0(如果形式参数声明为POINTER)。
使用参数类型POINTER指针用于指向地址。
这种寻址方式的优点是可以在程序处理期间动态地修改语句的地址。
存储器间接寻址的指针使用存储器间接寻址的程序语句由指令、地址标识符和偏移量组成(偏移量必须在方括号内给出)。
双字格式指针的实例:L P#8.7装载指针的值到累加器1。
T MD2传送指针到MD2。
A I[MD2]询问输入位I8.7的信号状态,并=Q[MD2]将信号状态分配给输出位Q8.7。
区域内部和区域交叉寻址的指针使用这些寻址方式的程序语句包含指令和下列部分:地址标识符、地址寄存器标识符、偏移量。
地址寄存器(AR1/2)和偏移量必须在方括号内一起指定。
区域内部寻址的实例指针不包含存储器区的指示:L P#8.7装载指针的值到累加器1。
LAR1将指针从累加器1装载到AR1。
A I[AR1,P#0.0]询问输入位I8.7的信号状态,并=Q[AR1,P#1.1]将信号状态分配给输出位Q10.0。
偏移量0.0没有影响。
STEP7——ANY指针详解参数类型ANY的格式STEP 7以10个字节存储参数类型ANY。
当构造类型为ANY的参数时,必须确保所有10个字节都被占用,因为调用块估计参数整个内容的值。
例如,如果以字节4指定DB编号,也必须以字节6明确地指定存储器区。
STEP 7管理基本和复杂数据类型的数据与参数类型的数据不同。
数据类型的ANY格式对于基本和复杂数据类型,STEP 7存储下列数据:数据类型重复因子DB编号信息存储的存储区域数据的起始地址重复因子识别由参数类型ANY传送的指示数据类型的数量。
这意味着可以指定数据区,也可以和参数类型ANY结合使用数组和结构。
STEP 7将数组和结构识别为数据类型的编号(借助重复因数)。
例如,如果要传送10个字,必须为重复因子输入数值10,并且必须为数据类型输入数值04。
地址以格式Byte.Bit存储,此处字节寻址存储在字节7的位0 - 2,节字8的位0 - 7,节字9的位3 - 7。
位地址存储在字节9的位0 - 2。
对于类型NIL的空指针,所有来自字节1的字节设置为0。
下表给出参数类型ANY的数据类型或存储区域的编码。
参数类型的ANY格式对于参数类型,STEP 7存储数据类型和参数的地址。
重复因子始终是1。
字节4、5和7始终是0。
字节8和9指示定时器、计数器或块的编号。
下表为参数类型显示参数类型ANY的数据类型编码。
使用参数类型ANY可以为适合于任何数据类型的实际参数的块定义形式参数。
当调用块是未知或可以改变时(和当允许任何数据类型时),已提供了实际参数的数据类型时,这尤其有用。
在块的变量声明中,可以声明参数为数据类型ANY。
然后可以在STEP 7中分配任何数据类型的实际参数。
STEP 7为ANY数据类型的变量分配存储器的80个位。
如果分配实际参数给此形式参数,STEP 7在80个位中编码起始地址、数据类型和实际参数的长度。
调用块为ANY参数分析保存数据的80个位,并获取进一步处理所需的信息。
参数类型POINTER的格式
下图给出了存储在每个字节中的数据类型。
参数类型POINTER存储下列信息:
•DB编号(或0,如果数据没有存储在DB中)
•CPU中的存储区域(下表给出了参数类型POINTER存储器区的十六进制代码)
十六进制代码存储区描述
b#16#81I输入区域
b#16#82Q输出区域
b#16#83M位存储区域
b#16#84DB数据块
b#16#85DI背景数据块
b#16#86L本地的数据(L堆栈)
b#16#87V先前的本地数据
•数据的地址(格式为字节.位)
STEP 7提供指针格式:p#memory_area byte.bit_address.(如果形式参数被声明为参数类型POINTER,只需要指出存储区域和地址。
STEP 7将自动地重定输入指针的格式。
) 下面的实例说明如何为以M50.0开始的数据输入参数类型POINTER:
•P#M50.0
•M50.0 (如果形式参数声明为POINTER)。
使用参数类型POINTER
指针用于指向地址。
这种寻址方式的优点是可以在程序处理期间动态地修改语句的地址。
存储器间接寻址的指针
使用存储器间接寻址的程序语句由指令、地址标识符和偏移量组成(偏移量必须在方括号内给出)。
双字格式指针的实例:
区域内部和区域交叉寻址的指针
使用这些寻址方式的程序语句包含指令和下列部分:地址标识符、地址寄存器标识符、偏移量。
地址寄存器(AR1/2)和偏移量必须在方括号内一起指定。
区域内部寻址的实例
指针不包含存储器区的指示:
偏移量0.0没有影响。
输出10.0由8.7 (AR1)加上偏移量1.1计算出来。
结果是10.0而不是9.8,参见指针格式。
区域交叉寻址的实例
在区域交叉寻址中,存储区域在指针中指出(在实例I和Q中)。
偏移量0.0没有影响。
输出10.0由8.7 (AR2)加上偏移量1.1计算出来。
结果是10.0而不是9.8,参见指针格式。