目录
前言
已经经历了种种磨难来记录我的数据(使用过填表程序、触摸屏的历史记录和数据归档)之后,具体可以看看这篇文章:🚪西门子S7-200PLC的数据归档怎么用?,出现了新的问题。
问题的提出
最新的数据归档方式,无论是利用线圈互锁还是定时器触发数据归档的上升沿,最快最快1s时间内能记录37个数据。无论我怎么调小定时器的时间间隔,最多只能记录37个。这距离我的理想状态(1s记录50个数据)还是有一点差距。
问题解决1
打电话问了西门子售后服务电话,她给我提出了三点非常珍贵的建议:
- 之所以1s最多记录37个数据,这与数据归档写在子程序中有关,和程序的扫描周期有影响。
- 之前把数据归档放在中断子程序里不能用,所以把中断子程序换成子程序,因为在中断程序里没有上升沿的作用
- 应该如何解决,能够记录更多的数据个数,可以试一试定时中断的功能(特殊寄存器SMB34、35,定时器T32、96)
于是我用T32和T96定时器+中断程序(这里写在子程序里面)的方式,再在中断程序里进行数据归档。
在它的中断程序第一行就写了一个加法器,看有没有进中断。
调试结果1
根本没有进中断程序,监控状态时这里面一片灰色,就连SM0.0都没有闭合。
问题解决2
是不是因为中断程序不能在子程序中使用,而必须在主程序中进行中断初始化,于是有了以下尝试,把中断程序写在主程序里面:
同样的,也是在中断程序第一行写加数器,观察有没有进入中断。
调试结果2
监控模式下确实能看到它的数字在上升了,这应该就是进中断了吧。
但是我是利用定时中断+数据归档的方式记录数据,数据归档子程序的Error显示报错信息132,代表指令访问存储卡失败,这是怎么回事呢?
我的疑问
Q1:中断程序的初始化是只有在主程序当中才能使用吗?
Q2:为什么会出现数据归档132错误?(是我中断程序里面数据归档前面多加了一个上升沿导致的吗?)
Q3:利用定时中断+数据归档的方式,在中断程序初始化要用上升沿触发,在中断程序里面数据归档前还要用上升沿吗?
我整个PLC程序不止用到一个定时中断,我总共用到了SMB34、定时器T32、T96进行定时中断,
Q4: 开中断的线圈ENI要放在哪里?是只能放在中断程序初始化ATCH同一个网络之下吗?主程序和子程序里面都能放吗?
西门子PLC论坛里的讨论和提问链接我也放一下,🔗这个问题的讨论;🔗这个问题的提问
虽然我知道这个社区可能关注西门子PLC的人不多,但如果碰到一位大佬刚好看到我这个问题了呢。
非常感谢大家!!!
2024.04.25 第一次更新
两个错误
回顾之前和西门子售后的通话和查看定时中断的例程,发现自己出现了两个错误:
错误1:如果是在中断程序里面写数据归档程序,虽然数据归档程序是需要上升沿来触发,但是在中断程序里面上升沿是不起作用的,所以中断程序里-数据归档子程序之前不需要使用上升沿;
错误2:在进行问题解决1中,我使用了定时器+中断程序的方式,但是我仔细查找定时中断例程(🔗西门子官方定时中断),发现第二行网络的T32应该为常开触点,而不是常闭触点,如下图。
把这两处错误改正之后再进行测试,其结果和之前一样(问题解决1章节的图片一样)根本无法进入中断程序,中断程序是一片灰色。
中断初始化放在主程序
所以还真有可能是中断程序不能放在子程序,而要放在主程序,于是我把定时中断这三行代码剪切到主程序里面,在进行调试,其结果如下图所示:
仍然是Error132,指令访问存储卡失败。
启发的建议
我想起西门子PLC官方提问问答那个老哥说的,在中断程序里面设置置位复位中间继电器,在子程序里面根据这个继电器的开关来触发数据归档的上升沿。
新的定时中断+数据归档
于是计从中来,
STEP1:在主程序中进行T32定时器中断程序初始化;
STEP2:在子程序中设置中间继电器触点对数据归档子程序的上升沿进行触发;
STEP3:在中断程序中设置线圈互锁的中间继电器。



调试结果是:
- T32时间为1000ms时,上载的数据归档记录是1s大概能计1个数据;
- T32时间为20ms时,上载的数据归档记录是1s大概能计20个数据;
应该还能记录更多,把时间继续调小,没有时间来验证,下次再调试!
但是怎么好像还是和之前的错误一样,其中存在程序扫描周期的影响,所以最多只能记录37个数据。
有一定的预感,就算我把T32调成了2ms,其数据也就最多记录37个。只有试了才知道!
2024.04.26第二次更新
继续之前的调试记录,不断把T32的时间调低,以下是结果:
- T32时间为10ms时,上载的数据归档记录是1s大概能计30个数据;
- T32时间为6ms时,上载的数据归档记录是1s大概能计32个数据;
- T32时间为2ms时,上载的数据归档记录是1s大概能计33个数据;
- T32时间为1ms时,上载的数据归档记录是1s大概能计32个数据。
还真是和之前预测的一样,无法实现1s记录50个数据的理想状态。
我还试了那位老哥说的在中断程序中设置置位复位指令,具体可以看下图:
进入中断程序进行加法器计数,这个数VW512除以2得到余数,如果余数是1(VW512为奇数)就对中间触点M3.4进行置位,如果余数是2(VW512为偶数)就对中间触点M3.4进行复位,这样来触发在子程序中数据归档子程序前的上升沿。
但是结果是也只进行触发了一次,因为上传的数据归档.CSV文件只有一个数据,这也算是一个简单的尝试吧。
之前就有人在论坛中提醒我,20ms记录一个数据无法实现,就连工业级的工控机也无法实现,可能当时那个西门子售后客服也没有想到这么多,就让我去试一试,他可能认为可行的吧。花了这么长时间在这个上面了,终于是否定这一个想法了。
这个过程也让我完完全全懂得了如何使用S7-200的定时器中断和数据归档了,给它交学费了!
回答我的疑问
由于没有预约到西门子售后的电话,我只能通过我这么多次调试试验及其结果的前提下,尝试回答之前提出的四个问题。
A1:中断程序初始化确实在主程序和子程序中都能使用(之前出现中断程序里面SM0.0都不亮是因为我定时中断初始化部分第二行网络T32的常开触点写成了常闭,所以一直不能进入中断);
A2:并不是因为我在中断程序里面多加了一个上升沿所以才出现数据归档显示Error132,我觉得应该是不应该把数据归档子程序放置在中断程序里面;
A3:利用定时中断+数据归档的方式,在中断程序初始化要用上升沿触发,在中断程序里面数据归档前不用上升沿,但是根据A2的回答,不能在中断程序里面使用数据归档子程序;
A4:我认为最好和给的例程一样,在中断程序初始化的下面一行就打开中断ENI为好。
查看🔗官方文档:子程序和中断服务程序 ,有下面两张图,尤其要注意红框里面的内容:
从中我们可以得知,中断程序中能调用一层子程序,但是此程序不能是嵌套程序。我们知道数据归档就是一个子程序,我当时在中断程序中调用了数据归档子程序,得出的效果是Error132错误。这个数据归档子程序DAT_WRITE是通过向导生成的,里面具体的内容西门子不让看,这么想来此子程序里面可能嵌套了一些其他东西,所以导致了Error132——指令访问存储卡失败。
综上所述,不能在中断程序里面调用数据归档子程序!!!