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

已锁定

xinchen

  • 帖子

    230
  • 精华

    1
  • 被关注

    5

论坛等级:侠圣

注册时间:2015-11-05

白金 白金 如何晋级?

发布于 2022-07-28 09:01:19

39楼

展开查看
以下是引用Setrarin在2022-07-27 13:51:19的发言 >38楼

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

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

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


以下是引用xinchen在2022-07-27 09:56:22的发言 >37楼:16L的思路,可以设...

引用37楼详细内容:

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

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

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

等等;


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


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

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

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


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

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

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

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

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


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

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


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

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






确认了有异步指令,那就简单了,直接使用异步指令就完事了,之后有空了我也会研究学习;


不用纠结异步怎样正确输出,它也是一条指令,内部按照代码一句句执行,只是执行在另一个线程,多花费N个周期,执行到通信时收发加解析,完成后执行下面的指令输出结果;


本质上,它和别的函数调用一样,调用前后的入栈出栈,这个看看c/汇编的函数调用相关知识了解下(不清楚plc底层调用约定是啥,stdcall,fastcall,cdecl,还是别的);


异步执行,参考比如 C# async 相关执行顺序;


注意事项应该就是 考量执行过程中的其他调用的输出和 内部执行完成后的输出 能不能被覆盖,就像 只在发起通信时复位done,busy为true时 任意时候调用都不会赋  done 为 false,直到发起通信的那次完成,置位done;

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1500系列

共有10587条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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