技术论坛

 【分享】子程序内使用边沿信号的新方法

返回主题列表
作者 主题
沉年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。



本身不是什么大东西,我也就不加密了(加密了就改不了了,不好用了。)

上升沿子程序(可用于子程序内).rar

各位可以进行测试,这个程序我只下到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
主题:回复:【分享】子程序内使用边沿信号的新方法

我稍微说了下原因:如果是嵌套调用呢,第三层和第四层,甚至5-6层,你要把缓存位传递到主程序。你就得每个中间子程序都写个inout用来传递缓存位,最后传到主程序。

实话说也挺麻烦的

宝剑尚未配齐,确已身入江湖
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是条件调用的话,你的上升沿会出错。

你的目的是做一个通用的可以在子程序中调用的上升沿,你的思路是通过一个指针,记录当前调用的顺序,将输入状态按顺序保存到指针指向的区域中。但是,这只能用于每个周期这个块的调用的顺序都一样才可以。




您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。