我用精灵导向设定NETR与NETW的PPI网络通讯,有1台MASTER然后与7台SLAVE 通讯。网络线及接头均使用西门子原厂。通讯速度为187.5K。整个网络在50米内。我用SM0.0 常ON呼叫 NET_EXE这个子程序。Timeout设定0,开始通讯都是正常的,可是不知什么原因不定时就会发生错误,结果NET_EXE就不执行了,我监看Cycle的状态就不动作了。结果我将PLC 切STOP至RUN又正常。可是我现在将网络接头拔掉再重插还是会自己通讯起来。所以想请问题
1.有什么原因造成NET_EXE这个指令就不执行了,而且也应该不是干扰的问题,因为现场就只有PLC没有变频器及马达。
2.如果发生这个情形,有办法透过程序让这个指令再执行吗?书上有写 ”清除网络读写指令数据缓冲区中的(故障)状态字节可以恢复“死掉”的通信。但还是建议用户采用比较正规的编程方法。” 请问正规的编程方法是什么?有什么正规的编程方法让通讯再恢复吗?还有指令数据缓冲区是哪里的区域,我根本就不知道NET_EXE所使用缓存器的位置啊!!
最佳答案
结果我将PLC 切STOP至RUN又正常。可是我现在将网络接头拔掉再重插还是会自己通讯起来?
这表明子程序被锁死,STOP至RUN一个初始化又运行了。可能在子程序执行过程中出现了条件不成立、溢出等原因。
1、转帖:使用子程序时,为何动作只能执行一次,或者某些状态不能结束?
如果发生动作不能重复执行,或者状态不能结束(像锁死了一样),而这些功能都与子程序有关时,请检查是否有条件调用子程序。调用子程序的条件在上述动作执行后,或者进入某个状态后不再有效,无法再次“激活”,而脱离上述状态或复位的指令正好在子程序内,必然造成上述的现象。
2、子程序编制规范:
、子程序在调用时会保持当前的逻辑运算结果,但是不保存累加器(ACx)的内容
、子程序在执行到末尾时自动返回,不必加返回指令;在子程序中间也可以使用条件返回指令
、子程序不能使用跳转语句跳入、跳出
、子程序返回时,回到调用子程序的指令后面,继续执行上一级程序
、S7-200 CPU最多可以调用64个子程序(CPU226为128个)
、子程序可以嵌套调用,即子程序中再调用子程序,一共可以嵌套8层
、在中断服务程序中不能欠套调用子程序,被中断服务程序调用的子程序中不能再出现子程序调用
、子程序可以带参数调用,在子程序的局部变量表中设置参数的类型;一共可以带16个参数(形式参数)
3、还有指令数据缓冲区是哪里的区域,我根本就不知道NET_EXE所使用缓存器的位置啊?
在调用子程序是会指定对所要传送数据的地址及大小,这些就是数据缓冲区。
提问者对于答案的评价:
thx
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc301347.html