来自西门子技术支持热线的故事:关于指针编程

已锁定

西门子Auto

官方工程师

  • 帖子

    132
  • 精华

    16
  • 被关注

    227

论坛等级:侠圣

注册时间:2007-08-03

普通 普通 如何晋级?

来自西门子技术支持热线的故事:关于指针编程

10393

21

2010-11-10 11:31:51

使用过指针的工程师都知道指针灵活,用简短的语句就能实现大量重复性的工作,但是难以驾御,查错也不容易,这回讲讲在使用指针编程中比较容易忽视的故障。
系统提供了四个可供我们操作的寄存器:两个地址寄存器AR1,AR2和两个数据块寄存器DB和DI在监控中显示为DB1,DB2。
先看一个例子


图一 FC1


图二 WinAC OB1监视图
图一为功能块FC1,其功能为修改四个寄存器内容
我们在WinAC或PLCSIM中运行,见图二,调用FC1前后寄存器内容没有变化,FC前后两条指令意思相同均为
L B [AR1,P#0.0] // L DB1.DBB0
L B [AR2,P#0.0] // L DB2.DBB0
接下来在S7-300/400系列CPU中运行
观察图三,OB1调用FC1前后AR1和AR2寄存器的内容发生变化
L B [AR1,P#0.0] // L DB1.DBB0
L B [AR2,P#0.0] // L DB2.DBB0
CALL FC 1
L B [AR1,P#0.0] // 由于AR1内容被修改为P#I0.0,所以该语句实际为L IB0;
L B [AR2,P#0.0] // 同样该语句实际为L QB0


图三 S7-300/400 OB1监视图
通过在不同系列的PLC中实验发现,在WinAC和PLCSIM中FC对AR1,AR2,DB1,DB2寄存器的修改不影响调用块这四个寄存器的内容,而S7-300/400系列PLC中如果在FC中修改了这四个寄存器,在从FC返回后AR1和AR2仍然保持为修改后的值,数据块寄存器不受影响。
如何保证程序能在不同系列的PLC上都能正常运行呢?
养成一个良好的编程习惯,在使用地址寄存器和数据块寄存器前先保存当前状态到中间变量,使用完后再恢复为使用前各寄存器状态。
以下为参考例程
VAR_TEMP
AR1_SAVE : DWORD ;
AR2_SAVE : DWORD ;
DB1_SAVE : WORD ;
DB2_SAVE : WORD ;

NETWORK
TITLE =Save Registers
TAR1 #AR1_SAVE; //AR1寄存器状态保存到#AR1_SAVE
TAR2 #AR2_SAVE; //AR2寄存器状态保存到#AR2_SAVE
L DBNO;
T #DB1_SAVE; //DB寄存器状态保存到#DB1_SAVE
L DINO;
T #DB2_SAVE; //DI寄存器状态保存到#DB2_SAVE

NETWORK
TITLE =User Program
。。。。。

NETWORK
TITLE =Resume Registers
LAR1 #AR1_SAVE; //AR1寄存器恢复到使用前状态
LAR2 #AR2_SAVE; //AR2寄存器恢复到使用前状态
OPN DB [#DB1_SAVE]; //DB寄存器恢复到使用前状态
OPN DI [#DB2_SAVE]; //DI寄存器恢复到使用前状态
BEU ;

这样在无论FC中怎样操作地址寄存器,在从FC返回后都能保证其调用块地址寄存器内容的确定性。

来自西门子技术支持热线的故事:关于指针编程 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54045条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。