作者 | 主题 |
---|---|
沉年c 游侠 经验值: 419 发帖数: 48 精华帖: 0 |
楼主 2019-12-26 10:46:49
主题:【分享】子程序内使用边沿信号的新方法 关于在子程序中使用边沿信号功能,直接使用系统的上升沿或者下降沿指令是完全不行的,除非这个子程序不会被重复调用,否则一定会产生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。调用次数越多,使用的内存就越多。当然这是正常消耗,主要还是本程序使用了不少的字操作指令,比较消耗运算量,大量使用可能会较长的增加扫描周期。 最后,也接受各路大佬的批评指正,能改的我想办法改。
宝剑尚未配齐,确已身入江湖
|
Zaxife 至圣 经验值: 12573 发帖数: 2503 精华帖: 31 |
2楼 2019-12-26 12:07:08
主题:回复:【分享】子程序内使用边沿信号的新方法
我擦…
子程序里面使用上升沿逻辑用得着这么麻烦了? 定位三个Bool IO都选为InOut类型,一个Bool是要判断上升沿的位,一个Bool是上升沿缓存位,一个Bool是输出。逻辑就这样子,每次In上升沿时Out都输出一个脉冲。 |
沉年c 游侠 经验值: 419 发帖数: 48 精华帖: 0 |
3楼 2019-12-26 12:26:56
主题:回复:【分享】子程序内使用边沿信号的新方法
宝剑尚未配齐,确已身入江湖
|
lf184452 侠圣 经验值: 2440 发帖数: 467 精华帖: 6 |
5楼 2019-12-27 13:50:03
主题:回复:【分享】子程序内使用边沿信号的新方法 写个200PLC程序,你还搞个3 层 4层 甚至5-6层嵌套?PLC程序不需要许多令人费解的小技巧,搞了这么多年的大型动力总成装配线,在充分考虑到维护性和可接手性,总结出以下PLC程序编写经验, 第一:结构明了,逻辑清晰,注释详细; 第二:能用简单方法就用简单的方法,哪怕是简单的方法笨一点,尽量不去使用令人费解的算法; 第三:不得万不得已不要去使用指针去间接寻址; 我经常跟手底下的供应商说,PLC编程不需要奇技*巧,最重要的是通俗易懂,因为你不知道你后面接你手人或维保人的能力有多高。 |
shine 至圣 经验值: 19949 发帖数: 8944 精华帖: 39 |
6楼 2019-12-27 15:47:23
主题:回复:【分享】子程序内使用边沿信号的新方法 如果子程序是条件调用呢?上一个周期是调用了2个,下一个周期只调用了一个呢? |
shine 至圣 经验值: 19949 发帖数: 8944 精华帖: 39 |
8楼 2019-12-27 16:12:22
主题:回复:【分享】子程序内使用边沿信号的新方法 你没理解我的意思,我是说如果SBR_1和SBR_2是条件调用的话,你的上升沿会出错。 你的目的是做一个通用的可以在子程序中调用的上升沿,你的思路是通过一个指针,记录当前调用的顺序,将输入状态按顺序保存到指针指向的区域中。但是,这只能用于每个周期这个块的调用的顺序都一样才可以。 |