恭喜,你发布的帖子
发布于 2019-12-27 15:47:23
6楼
关于在子程序中使用边沿信号功能,直接使用系统的上升沿或者下降沿指令是完全不行的,除非这个子程序不会被重复调用,否则一定会产生bug。
本来我一直觉得,子程序内基本不可能使用边沿信号的。
不过后来,再结合之前一个他人自制的定时器子程序和我偶发学习某款8位单片机的时候产生了灵感。
总而言之,我写出了一个上升沿子程序,可以在子程序中调用,这样就可以直观的在子程序中使用边沿指令了。
本程序已经过实际测试,完全可用,目前没有发现bug。
制作思路先不提,我先简述下这个程序要如何使用,因为使用较为麻烦。
1,选择一部分你绝对不会使用的v存储区,比如大于vb5000。然后将其指针值写入存储其指针的地址。比如VD4990。之后一直将0传入计数用的地址VD4994。
初始化程序如下图。
第一段无所谓,但第二段一定要用sm0.0,否则程序会出bug。
2、打开编写好的上升沿子程序P1,只修改第一段就行。
第一段第一个指令块,输入输出全为VD4994.
第一段最后一个指令块,第一个输入改为VD4990。
结果如下图。
前期修改结束,可以愉快的在子程序内使用这个上升沿子程序,不会产生问题。
以下为我测试使用的程序。
写了一个标准的单键启停,主程序中调用两次,已经过测试,不会出现bug。
如有问题可以联系我。
使用截图如下。
1,单建启停子程序,调用P1
2,主程序,初始化程序和单建启停子程序调用两次,已经过实际测试,下载如PLC中,经测试后暂无BUG。
本身不是什么大东西,我也就不加密了(加密了就改不了了,不好用了。)
各位可以进行测试,这个程序我只下到plc里测试过,但仿真基本没有办法测试这个程序。
有问题可以联系我,qq:834367351 wx:c834367351
最后做下简单的总结,确实有其他的方法来实现子程序内使用边沿信号,主要是依靠子程序的IN/OUT接口,但如果边沿信号写入第3层,第4层子程序,那么第2层,第1层子程序都要增加最底层使用边沿信号所用的IN/OUT变量,不只降低了可读性,也使得编程变得麻烦了些,而且很可能反而变得难以调试(中间某一层每写,都很可能找不着)。
不过本程序也不完美,使用这个程序之后,VB5000以后的v区尽量不要使用,一个扫描周期内调用一次这个子程序,会用掉v5000.1,调用10次上升沿子程序就用掉VB5000.1-VB5001.2。调用次数越多,使用的内存就越多。当然这是正常消耗,主要还是本程序使用了不少的字操作指令,比较消耗运算量,大量使用可能会较长的增加扫描周期。
最后,也接受各路大佬的批评指正,能改的我想办法改。
如果子程序是条件调用呢?上一个周期是调用了2个,下一个周期只调用了一个呢?
请填写推广理由:
分享
只看
楼主