首页 理论教育 SCL间接寻址优化策略

SCL间接寻址优化策略

时间:2023-06-30 理论教育 版权反馈
【摘要】:生成一个名为“SCL间接寻址”的项目,CPU为CPU 1214C。SCL用于间接寻址的指令在指令列表的“基本指令”窗格的文件夹“\移动操作\读写存储器”中。生成一个使用SCL语言的名为“PEEK_BOOL”的FC1。将上述输入参数设置为变量,可以很方便地实现间接寻址。在项目“SCL间接寻址”中生成使用SCL语言,名为“POKE_BOOL”的FC5,在FC5的接口区生成输入参数“地址区”“数据块号”“字节偏移”和“位偏移”,以及Bool输入参数“数据值”,下面是FC5中的程序。

SCL间接寻址优化策略

生成一个名为“SCL间接寻址”的项目(见随书光盘中的同名例程),CPU为CPU 1214C。

SCL用于间接寻址的指令在指令列表的“基本指令”窗格的文件夹“\移动操作\读写存储器”中。其中的指令的输入参数area为16#84时,指定的地址区为数据块。它们访问的数据块不能使用“优化的块访问”属性,即该指令仅用于访问“标准”存储区。

1.PEEK_BOOL指令

“读取存储位”指令PEEK_BOOL用于在不指定数据类型的情况下从存储区读取存储位。生成一个使用SCL语言的名为“PEEK_BOOL”的FC1。在FC1中调用指令PEEK_BOOL,其Byte输入参数area为地址区,其值为16#81~16#84时分别为输入、输出、位存储区和DB,area为16#1时为外设输入(仅S7-1500)。DInt输入参数dbNumber是数据块的编号,不是数据块中的地址则为0。DInt输入参数byteOffset为地址的字节编号,Int输入参数bitOffset是地址的位编号。返回的函数值为Bool变量。将上述输入参数设置为变量,可以很方便地实现间接寻址。

在FC1的接口区生成输入参数“地址区”“数据块号”“字节偏移”和“位偏移”,以及输出参数“位地址值”,下面是FC1中的程序。

#位地址值:=PEEK_BOOL(area:=#地址区,

dbNumber:=#数据块号,byteOffset:=#字节偏移,bitOffset:=#位偏移);

生成名为“数据块_1”的DB1,去掉它的“优化的块访问”属性。在其中生成数据类型为Array[1..10] of Byte的数组

在OB1中调用FC1,读取DB1.DBX1.3的值,用M2.0保存(见图5-45)。启动仿真软件S7-PLCSIM,将程序下载到仿真PLC。生成监控表1,在其中监控DB1.DBX1.3,修改它的值为TRUE或FALSE,可以看到程序状态中M2.0的值随之而变。

978-7-111-58719-4-Chapter05-96.jpg

图5-45 读取存储器地址

2.PEEK指令

“读取存储地址”指令PEEK用于在不指定数据类型的情况下从存储区读取存储地址,可以读取字节、字和双字。S7-1500还可以读取64位位字符串(LWord)。

生成使用SCL语言,名为“PEEK_BYTE”的FC2,在其中调用PEEK指令。在程序中将PEEK指令的名称改为“PEEK_”,单击出现的指令列表中的“PEEK_BYTE”(见图5-46),指令名称变为PEEK_BYTE。下面是FC2中的程序。

978-7-111-58719-4-Chapter05-97.jpg

图5-46 调用PEEK_BYTE指令

PEEK_BYTE指令比PEEK_BOOL指令少一个输入参数bitOffset。FC2比FC1少一个输入参数“位偏移”,唯一的输出参数“字节地址值”的数据类型为Byte。

在OB1中调用FC2(见图5-45),读取QB2的值,用MB3保存。仿真时在监控表中修改QB2的值,可以看到程序状态中MB3的值随之而变。

3.PEEK_WORD指令

将FC2复制为FC3,删除接口区中的输出参数“字节地址值”,增添数据类型为Word的输出参数“字地址值”。删除原有的指令,下面是在FC3中调用PEEK_WORD指令的程序。

#字地址值:=PEEK_WORD(area:=#地址区,dbNumber:=#数据块号,byteOffset:=#字节偏移);

在OB1中调用FC3(见图5-45),读取IW4的值,用MW4保存。在S7-PLCSIM的SIM表1中修改IW4的值,可以看到程序状态中MW4的值随之而变。

4.PEEK_DWORD指令

将FC2复制为FC4,删除接口区中的输出参数“字节地址值”,增添数据类型为DWord的输出参数“双字地址值”。删除原有的指令,下面是在FC4中调用PEEK_DWORD指令的程序。

#双字地址值:=PEEK_DWORD(area:=#地址区,dbNumber:=#数据块号,byteOffset:=#字节偏移);

在OB1中调用FC4(见图5-45),读取MD6的值,用MD10保存。在监控表中修改MD6的值,可以看到程序状态中MD10的值随之而变。

5.POKE_BOOL指令

“写入存储位”指令POKE_BOOL用于在不指定数据类型的情况下将存储位写入存储区。其Byte输入参数area为地址区,其值为16#81~16#84时分别为输入、输出、位存储区和DB,area为16#2时为外设输出(仅S7-1500)。输入参数dbNumber、byteOffset和bitOffset的数据类型和意义与指令PEEK_BOOL的相同。Bool输入参数Value为待写入的值。(www.xing528.com)

在项目“SCL间接寻址”中生成使用SCL语言,名为“POKE_BOOL”的FC5,在FC5的接口区生成输入参数“地址区”“数据块号”“字节偏移”和“位偏移”,以及Bool输入参数“数据值”,下面是FC5中的程序。

POKE_BOOL(area:=#地址区,

dbNumber:=#数据块号,

byteOffset:=#字节偏移,

bitOffset:=#位偏移,

value:=#数据值);

在OB1中调用FC5(见图5-47),将M2.1的值写入DB1.DBX1.4。启动仿真软件S7-PLCSIM,将程序下载到仿真PLC。用监控表1监控DB1.DBX1.4,启动OB1的程序状态,修改M2.1的值,可以看到DB1.DBX1.4的值随之而变。

978-7-111-58719-4-Chapter05-98.jpg

图5-47 写入存储器地址

6.POKE指令

“写入存储地址”指令POKE用于在不指定数据类型的情况下将数据值写入存储区。可以将数值写入字节、字和双字。S7-1500还可以写入64位位字符串(LWord)。

POKE指令的输入参数area、dbNumber、byteOffset和Value的意义与指令POKE_BOOL的相同。

将FC5复制为名为“POKE_BYTE”的FC6。删除输入参数“位偏移”,将输入参数“数据值”的数据类型修改为Byte。删除指令POKE_BOOL,下面是FC6中的程序。

POKE(area:=#地址区,

dbNumber:=#数据块号,

byteOffset:=#字节偏移,

value:=#数据值);

在OB1中调用FC6(见图5-47),将MB14的值写入QB0。将程序下载到仿真PLC,启动OB1的程序状态监控,修改MB14的值,在监控表1中可以看到QB0的值随之而变。

将FC6复制为名为“POKE_WORD”的FC7,将输入参数“数据值”的数据类型修改为Word,程序与FC6的相同。在OB1中调用FC7(见图5-47),将MW16的值写入MW18。将程序下载到仿真PLC,启动OB1的程序状态监控,修改MW16的值,用监控表1可以看到MW18的值随之而变。

将FC6复制为名为“POKE_DWORD”的FC8,将输入参数“数据值”的数据类型修改为DWord,程序与FC6的相同。在OB1中调用FC8(见图5-47),将MD24的值写入MD20。将程序下载到仿真PLC,启动OB1的程序状态监控。修改MD24的值,用监控表1可以看到MD20的值随之而变。

7.POKE_BLK指令

“写入存储区”指令POKE_BLK用于在不指定数据类型的情况下将存储区内容复制到另一个存储区。输入参数area_src和area_dest分别为源存储区和目的存储区。它们为16#81~16#84时,分别为输入、输出、位存储区和DB。它们的数据类型为Byte,其他参数的数据类型为DInt。参数dbNumber_src和dbNumber_dest分别是源和目的存储区中的数据块编号,不是数据块则为0。参数byteOffset_src和byteOffset_dest分别是源和目的存储区的字节编号,参数count为要复制的字节数。

生成FC9,在其中调用POKE_BLK指令(见图5-48),它的实参“源地址区”等是FC9的输入参数。在OB1中调用FC9(见图5-49),将DB1.DBB2~DB1.DBB4传送到MB28~MB30。下载到仿真PLC后,在监控表中用十六进制格式监视DB1.DBD2和MD28。修改DB1.DBD2的值,可以看到MD28的前3个字节(MB28~MB30)的值随之而变。

978-7-111-58719-4-Chapter05-99.jpg

图5-48 FC9中的程序

978-7-111-58719-4-Chapter05-100.jpg

图5-49 在OB1中调用FC9

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈