回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能

已锁定

Setrarin

  • 帖子

    139
  • 精华

    4
  • 被关注

    101

论坛等级:侠士

注册时间:2016-08-10

普通 普通 如何晋级?

发布于 2022-07-27 13:51:19

38楼

展开查看
以下是引用xinchen在2022-07-27 09:56:22的发言 >37楼

16L的思路,可以设计几个测试用例进行证明:

比如执行后瞬间修改了输入参数,看能不能正确输出;

比如执行后几个周期通过使能或者 jump 等使别的FB随机不被调用,打乱统计次数;

等等;


目前虽然没测试过,但我觉得通过上面的几个测试用例,可以验证下modbus-tcp库是不是类似16L的思路实现的;


我个人是觉得不是,这个功能实现的关键点应该还是在于“真~异步”;

平常写功能时,所谓异步都是把一个计算功能分摊到多个周期,比如执行一次轮询需要对100项进行处理,为了减少扫描周期,每次执行10项,分摊到10个周期;

但指令本身在每个周期都是执行完的;


但通信不是,modbus-tcp 库从执行到输出,是真的在异步;

命令开始后进行参数校验,通信前的准备,然后开启后台线程执行通信,在通信中收发加解析花了些时间,然后切回CPU线程继续执行指令到输出状态;

虽然整个过程经过了几秒钟,但其实只执行了一次,是一条指令执行一次花了几秒,而不是每个周期执行一点点;

所以它其实不需要在输出瞬间对比当前输入和内部参数,或是计数,或是参数堆栈;

真要记录,它记录的是开始异步前后的线程上下文,这是PLC系统本身的切换线程的功能;


类比下,比如某个UI界面,点击按钮后查询数据库,需要花费很长时间,为了UI不假死,查询是在后台执行的,前台还是能正常操作刷新数据;

有些UI设计的效果可以是在未执行结束前,还是能点击按钮,提示忙碌中,和这个 FB 的 busy 类似;调用多次也是一样;


以上是我的推论,但我觉得应该接近实际了;

至于PLC,不知道有没有异步指令,如果有,倒是可以用来测试验证推论;






异步我是认可的,但是异步的结果如何正确的返回,还能输出到调用的那个块这个是我唯一不能理解的地方。

如果每个块引脚不一致,通过比较块引脚方式是可以的。神奇的是,测试发现MB_Client块允许有两次参数相同的调用,输出还不会混乱。

主楼题目中延时功能可以理解成是异步指令,我设计的这个题目也是为了探讨实现的各种可能性,但是目前还没有人把程序贴出,不要求程序十全十美,只要求能够实现题目功能,大侠可以一试


但行好事,莫问前程
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1500系列

共有10592条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

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