恭喜,你发布的帖子
发布于 2022-07-27 13:51:19
38楼
16L的思路,可以设计几个测试用例进行证明:
比如执行后瞬间修改了输入参数,看能不能正确输出;
比如执行后几个周期通过使能或者 jump 等使别的FB随机不被调用,打乱统计次数;
等等;
目前虽然没测试过,但我觉得通过上面的几个测试用例,可以验证下modbus-tcp库是不是类似16L的思路实现的;
我个人是觉得不是,这个功能实现的关键点应该还是在于“真~异步”;
平常写功能时,所谓异步都是把一个计算功能分摊到多个周期,比如执行一次轮询需要对100项进行处理,为了减少扫描周期,每次执行10项,分摊到10个周期;
但指令本身在每个周期都是执行完的;
但通信不是,modbus-tcp 库从执行到输出,是真的在异步;
命令开始后进行参数校验,通信前的准备,然后开启后台线程执行通信,在通信中收发加解析花了些时间,然后切回CPU线程继续执行指令到输出状态;
虽然整个过程经过了几秒钟,但其实只执行了一次,是一条指令执行一次花了几秒,而不是每个周期执行一点点;
所以它其实不需要在输出瞬间对比当前输入和内部参数,或是计数,或是参数堆栈;
真要记录,它记录的是开始异步前后的线程上下文,这是PLC系统本身的切换线程的功能;
类比下,比如某个UI界面,点击按钮后查询数据库,需要花费很长时间,为了UI不假死,查询是在后台执行的,前台还是能正常操作刷新数据;
有些UI设计的效果可以是在未执行结束前,还是能点击按钮,提示忙碌中,和这个 FB 的 busy 类似;调用多次也是一样;
以上是我的推论,但我觉得应该接近实际了;
至于PLC,不知道有没有异步指令,如果有,倒是可以用来测试验证推论;
异步我是认可的,但是异步的结果如何正确的返回,还能输出到调用的那个块这个是我唯一不能理解的地方。
如果每个块引脚不一致,通过比较块引脚方式是可以的。神奇的是,测试发现MB_Client块允许有两次参数相同的调用,输出还不会混乱。
主楼题目中延时功能可以理解成是异步指令,我设计的这个题目也是为了探讨实现的各种可能性,但是目前还没有人把程序贴出,不要求程序十全十美,只要求能够实现题目功能,大侠可以一试
请填写推广理由:
分享
只看
楼主