技术论坛

 来自西门子技术支持热线的故事:S7-200累加器----不能不说的秘密

返回主题列表
作者 主题
西门子Auto
官方工程师
西门子官方工程师西门子官方工程师

经验值:2462
发帖数:126
精华帖:16
楼主    2012-10-15 11:21:55
主题:来自西门子技术支持热线的故事:S7-200累加器----不能不说的秘密 精华帖 
众所周知S7-200拥有AC0~3共计4个累加器,累加器是可以象存储器一样使用的读写设备。例如,可用它来向子程序传递参数,也可以从子程序返回参数,或者存储计算的中间结果。当然也可以使用累加器(只能使用AC1~3)存储或传递指针。
在热线上曾有客户需要实现这样一个数据传递功能:数据块中预置VD0~VD396共计100个双字的初始数据,通过定时中断程序(或其他中断方式)将这100个双字依次转移到VD1000~VD1396。程序思路:在主程序给AC1写入指针(&VB0),AC2写入指针(&VB1000),然后在中断程序中对AC1和AC2累加器做累加,每次累加4个字节的偏移量,并在中断程序中将AC1指针中的数值依次传送到AC2指针中指定的V区位置(例如,第一次中断,VD4传给VD1004;第二次中断,VD8传给VD1008……);上述编程思路清晰,貌似没有问题;下载程序测试后,却发现功能没有实现。
同时用户反映,若将累加器AC1和AC2用V区地址代替,数据传递功能能实现,这究竟是为什么呢?
通过如下程序对累加器进行测试:



图1 主程序



图2 子程序



图3 中断程序

首先,操作M0.0和M0.1分别置1时,主程序和子程序中的累加器AC1都进行了加1操作,并通过VD1000得到输出值。
然后,通过外部信号I0.0接通硬件中断后,中断子程序中的累加器AC1进行了加100的操作,并通过VD1008得到输出值。
测试发现中断程序中的累加器AC1的值并未得到来自主程序中的累加器的值的传递(否则,VD1008应为102),状态表如下:



图4 状态监控表

仔细查阅《S7-200可编程控制器系统手册》中关于中断程序的内容,其中第155页有关于累加器的说明,截图如下:



借此案例提醒使用S7-200的工程师,在主程序和中断程序中使用同一累加器时有这么个小小的“秘密”需要注意。
蓝色的小尾巴
侠士

经验值:1339
发帖数:214
精华帖:5
8楼    2012-10-31 14:10:49
精华帖  主题:回复:来自西门子技术支持热线的故事:S7-200累加器----不能不说的秘密
我的测试得出的结论:
1、中断程序内用的累加器,是同一个累加器,例如中断1用AC1,中断2用AC1 。
2、主程序、子程序用的累加器与中断程序内用的累加器,不是“同一个”累加器,虽然符号相同,他们之间没有任何关系,不会相互影响,例如,例如中断1用AC1 ,主程序用AC1。
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。