技术论坛

为什么MB_Client块可以使用同一个背景数据块多次调用,如何实现的?

作者 主题
侠士

经验值: 1746
发帖数: 141
精华帖: 4
主题:【探讨】为什么MB_Client块可以使用同一个背景数据块多次调用,如何实现的?
推荐帖


只看楼主 楼主 2022-07-03 22:52:41

最近查资料,看到官网写的一个文档,链接如下:

S7-1500作为Modbus TCP客户端访问多个设备的方法

https://support.industry.siemens.com/cs/document/109782521


程序里面用同一个背景数据块完成ModbusTCP三次读写任务,思路挺好理解的。但是有处问题想不明白,让我疑惑的是,三次任务都是对MB_Client块无条件调用,那么块的输出引脚应该同一周期输出,要么就只有第一次调用时输出,如果有以上情况,那么程序就不应该能正常执行,但实际上功能又是正常在执行,可以说已经超出了我的理解了,这是怎么实现的,有没有了解的仁兄解答下?


更新:

我自己又把程序写了一遍,用PLCSIM ADVANCED做的测试,结果是可以用的,trace结果也正常。我的问题是它作为FB,同一个背景数据块无条件的多次调用,为什么输出不会混乱?







再次更新:

资料显示,作为异步指令块,其执行确实与引脚参数有关。但是将第一次和第三次的参数设置成一样,第三次的触发完成位Done仍然可以在第三次引脚输出,而不是第一次的,这个是目前我唯一想不通的地方。

如果认为测试有问题的,可以自行测试,指出问题所在,如果知道实现方法,可以跟帖解答,或者参与以下编程挑战【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能


公众号"worksway工方工园",欢迎关注~
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1768829&b_id=66&s_id=0&num=30

至圣

经验值: 127331
发帖数: 22001
精华帖: 824
回复:同一个FB块使用同一个背景数据块多次调用,结果如何执行?
推荐帖


只看楼主 1楼 2022-07-03 23:37:56

这是客户端对同一个服务器的不同数据的读/写。

不可以同时读/写。一个DONE或ERR才可以触发下一个数据的读/写。

(完成了,才有一个周期的DONE/ERR)


学而时习之,不亦说乎?温故而知新,不亦乐乎?
以下网友喜欢您的帖子:

  
奇侠

经验值: 8881
发帖数: 542
精华帖: 4
回复:同一个FB块使用同一个背景数据块多次调用,结果如何执行?
推荐帖


只看楼主 2楼 2022-07-04 08:39:08

指令执行之后要几个周期才会给出完成信号


吾生也有涯,而知也无涯。
以下网友喜欢您的帖子:

  
侠士

经验值: 1746
发帖数: 141
精华帖: 4
回复:同一个FB块使用同一个背景数据块多次调用,结果如何执行?
推荐帖


只看楼主 楼主 3楼 2022-07-04 09:27:10
以下是引用史德利古尔在2022-07-04 08:39:08的发言 >2楼

指令执行之后要几个周期才会给出完成信号

那第三次的调用结果为什么刚好输出给第三次呢?难道块知道同一周期被调用的次数?


公众号"worksway工方工园",欢迎关注~
以下网友喜欢您的帖子:

  
至圣

经验值: 13937
发帖数: 2008
精华帖: 43
回复:同一个FB块使用同一个背景数据块多次调用,结果如何执行?
推荐帖


只看楼主 4楼 2022-07-04 14:07:24

1-又不是同一个扫描周期进行调用的

2-仅仅是个DEMO真正应用起来,那样编写程序不可取的,如果一个连接 需要发送N条命令,那么,需要写个调用N遍的程序吗?


人生就像一场旅行!
以下网友喜欢您的帖子:

  
游士

经验值: 256
发帖数: 33
精华帖: 0
回复:同一个FB块使用同一个背景数据块多次调用,结果如何执行?
推荐帖


只看楼主 5楼 2022-07-04 16:51:37

可以通过Trace监控一下,不是一个周期完成的,功能块的Done位只存在一个周期,一般用错误或Done作为轮询的触发条件。


言石
以下网友喜欢您的帖子:

  
至圣

经验值: 127331
发帖数: 22001
精华帖: 824
回复:同一个FB块使用同一个背景数据块多次调用,结果如何执行?
推荐帖


只看楼主 6楼 2022-07-04 16:56:40
以下是引用Setrarin在2022-07-04 09:27:10的发言 >3楼

那第三次的调用结果为什么刚好输出给第三次呢?难道块知道同一周期被调用的次数?

以下是引用史德利古尔在2022-07-04 08:39:08的发言 >2楼:指令执行之后要几个...

引用2楼详细内容:

指令执行之后要几个周期才会给出完成信号

这个MB_CLIENT功能块的背景数据块,可以认为是Modbus TCP通讯处理器的数据缓冲块。

当REQ上升沿出现时,将所有输入接口参数,传送到背景数据块中;然后激活此协议的通讯处理过程。

这是异步通讯,BUSY=1;经过N个扫描周期,内部通讯任务才能完成。即:BUSY=0;Done/ERR=1(仅置位1个扫描周期。你必须在此周期内,处理、移动完成了的数据。)

若此时,REQ仍然=1;将开始下一次完全相同的通讯过程。(连续读或写);

此例中,利用上一次的Done/ERR,将此MB_CLIENT的REQ置一,把输入传送到它的背景数据块;启动通讯过程。BUSY=1;经过数个扫描周期等待,直到完成Done或者出错ERR。


早期的MB_CLIENT这样写法是不允许的。它要求在通讯期间,REQ上升沿激活后 - Done/ERR完成前,功能块的调用期间,输入应保持不变。

可能新版本有所改变?





学而时习之,不亦说乎?温故而知新,不亦乐乎?
以下网友喜欢您的帖子:

  
侠士

经验值: 1746
发帖数: 141
精华帖: 4
回复:同一个FB块使用同一个背景数据块多次调用,结果如何执行?


只看楼主 楼主 7楼 2022-07-04 17:20:29
以下是引用Letham在2022-07-04 14:07:24的发言 >4楼

1-又不是同一个扫描周期进行调用的

2-仅仅是个DEMO真正应用起来,那样编写程序不可取的,如果一个连接 需要发送N条命令,那么,需要写个调用N遍的程序吗?

就是在一个扫描周期无条件调用的


公众号"worksway工方工园",欢迎关注~
以下网友喜欢您的帖子:

  
侠士

经验值: 1746
发帖数: 141
精华帖: 4
回复:同一个FB块使用同一个背景数据块多次调用,结果如何执行?


只看楼主 楼主 8楼 2022-07-04 17:24:26
以下是引用yming在2022-07-04 16:56:40的发言 >6楼

这个MB_CLIENT功能块的背景数据块,可以认为是Modbus TCP通讯处理器的数据缓冲块。

当REQ上升沿出现时,将所有输入接口参数,传送到背景数据块中;然后激活此协议的通讯处理过程。

这是异步通讯,BUSY=1;经过N个扫描周期,内部通讯任务才能完成。即:BUSY=0;Done/ERR=1(仅置位1个扫描周期。你必须在此周期内,处理、移动完成了的数据。)

若此时,REQ仍然=1;将开始下一次完全相同的通讯过程。(连续读或写);

此例中,利用上一次的Done/ERR,将此MB_CLIENT的REQ置一,把输入传送到它的背景数据块;启动通讯过程。BUSY=1;经过数个扫描周期等待,直到完成Done或者出错ERR。


早期的MB_CLIENT这样写法是不允许的。它要求在通讯期间,REQ上升沿激活后 - Done/ERR完成前,功能块的调用期间,输入应保持不变。

可能新版本有所改变?




以下是引用Setrarin在2022-07-04 09:27:10的发言 >3楼:那第三次的调用结果...

引用3楼详细内容:

那第三次的调用结果为什么刚好输出给第三次呢?难道块知道同一周期被调用的次数?

以下是引用史德利古尔在2022-07-04 08:39:08的发言 >2楼:指令执行之后要几个...

引用2楼详细内容:

指令执行之后要几个周期才会给出完成信号

那第三次调用被触发之后,怎么输出不落在第一个调用引脚,而刚好输出在第三个呢?


公众号"worksway工方工园",欢迎关注~
以下网友喜欢您的帖子:

  
侠士

经验值: 1746
发帖数: 141
精华帖: 4
回复:同一个FB块使用同一个背景数据块多次调用,结果如何执行?


只看楼主 楼主 9楼 2022-07-04 17:35:41
以下是引用JUST GAN在2022-07-04 16:51:37的发言 >5楼

可以通过Trace监控一下,不是一个周期完成的,功能块的Done位只存在一个周期,一般用错误或Done作为轮询的触发条件。

我自己又把程序写了一遍,用PLCSIM ADVANCED做的测试,结果是可以用的,trace结果也正常。我的问题是它作为FB,同一个背景数据块无条件的多次调用,为什么输出不会混乱?










公众号"worksway工方工园",欢迎关注~
以下网友喜欢您的帖子:

  
游士

经验值: 152
发帖数: 8
精华帖: 0
回复:同一个FB块使用同一个背景数据块多次调用,结果如何执行?


只看楼主 10楼 2022-07-04 22:00:49

这是轮询的方式,上一个命令结束才会执行下一个,如果你同给多个FB给访问指令就会报错了


 
以下网友喜欢您的帖子:

  
至圣

经验值: 127331
发帖数: 22001
精华帖: 824
回复:为什么MB_Client块可以使用同一个背景数据块多次调用,如何实现的?


只看楼主 11楼 2022-07-05 09:20:48
以下是引用Setrarin在2022-07-04 17:24:26的发言 >8楼

那第三次调用被触发之后,怎么输出不落在第一个调用引脚,而刚好输出在第三个呢?

以下是引用yming在2022-07-04 16:56:40的发言 >6楼:这个MB_CLIEN...

引用6楼详细内容:

这个MB_CLIENT功能块的背景数据块,可以认为是Modbus TCP通讯处理器的数据缓冲块。

当REQ上升沿出现时,将所有输入接口参数,传送到背景数据块中;然后激活此协议的通讯处理过程。

这是异步通讯,BUSY=1;经过N个扫描周期,内部通讯任务才能完成。即:BUSY=0;Done/ERR=1(仅置位1个扫描周期。你必须在此周期内,处理、移动完成了的数据。)

若此时,REQ仍然=1;将开始下一次完全相同的通讯过程。(连续读或写);

此例中,利用上一次的Done/ERR,将此MB_CLIENT的REQ置一,把输入传送到它的背景数据块;启动通讯过程。BUSY=1;经过数个扫描周期等待,直到完成Done或者出错ERR。


早期的MB_CLIENT这样写法是不允许的。它要求在通讯期间,REQ上升沿激活后 - Done/ERR完成前,功能块的调用期间,输入应保持不变。

可能新版本有所改变?




以下是引用Setrarin在2022-07-04 09:27:10的发言 >3楼:那第三次的调用结果...

引用3楼详细内容:

那第三次的调用结果为什么刚好输出给第三次呢?难道块知道同一周期被调用的次数?

以下是引用史德利古尔在2022-07-04 08:39:08的发言 >2楼:指令执行之后要几...

引用2楼详细内容:

指令执行之后要几个周期才会给出完成信号

内部有个机制,每次调用,需要比较所有输入。

只有所有输入没有变化的那个被激活的调用,才会执行输出。


这也是要求调用期间,输入保持一致性的一个原因吧。


学而时习之,不亦说乎?温故而知新,不亦乐乎?
以下网友喜欢您的帖子:

  
侠士

经验值: 1746
发帖数: 141
精华帖: 4
回复:为什么MB_Client块可以使用同一个背景数据块多次调用,如何实现的?


只看楼主 楼主 12楼 2022-07-05 10:09:10
以下是引用yming在2022-07-05 09:20:48的发言 >11楼

内部有个机制,每次调用,需要比较所有输入。

只有所有输入没有变化的那个被激活的调用,才会执行输出。


这也是要求调用期间,输入保持一致性的一个原因吧。

以下是引用Setrarin在2022-07-04 17:24:26的发言 >8楼:那第三次调用被触发...

引用8楼详细内容:

那第三次调用被触发之后,怎么输出不落在第一个调用引脚,而刚好输出在第三个呢?

以下是引用yming在2022-07-04 16:56:40的发言 >6楼:这个MB_CLIEN...

引用6楼详细内容:

这个MB_CLIENT功能块的背景数据块,可以认为是Modbus TCP通讯处理器的数据缓冲块。

当REQ上升沿出现时,将所有输入接口参数,传送到背景数据块中;然后激活此协议的通讯处理过程。

这是异步通讯,BUSY=1;经过N个扫描周期,内部通讯任务才能完成。即:BUSY=0;Done/ERR=1(仅置位1个扫描周期。你必须在此周期内,处理、移动完成了的数据。)

若此时,REQ仍然=1;将开始下一次完全相同的通讯过程。(连续读或写);

此例中,利用上一次的Done/ERR,将此MB_CLIENT的REQ置一,把输入传送到它的背景数据块;启动通讯过程。BUSY=1;经过数个扫描周期等待,直到完成Done或者出错ERR。


早期的MB_CLIENT这样写法是不允许的。它要求在通讯期间,REQ上升沿激活后 - Done/ERR完成前,功能块的调用期间,输入应保持不变。

可能新版本有所改变?




以下是引用Setrarin在2022-07-04 09:27:10的发言 >3楼:那第三次的调用结...

引用3楼详细内容:

那第三次的调用结果为什么刚好输出给第三次呢?难道块知道同一周期被调用的次数?

以下是引用史德利古尔在2022-07-04 08:39:08的发言 >2楼:指令执行之后要几...

引用2楼详细内容:

指令执行之后要几个周期才会给出完成信号

yming大神说的有道理,我看了关于异步指令的帮助部分,里面也明确说明

“使用指令的作业标识输入参数。在异步指令的执行过程中,这些输入参数必须与执行

过程中的各调用相匹配。”

还有个疑问是第一个调用和第三个调用的参数是一样的,但是结果仍然可以正常完成,说明程序块不止使用参数做比较。

如果前三个调用块的参数都一样的,也是以上一个Done来顺序调用,就只有第三个块有输出。猜测还使用了参数堆栈之类的方法,而且程序还知道每次的执行是不是在同一个周期内。



公众号"worksway工方工园",欢迎关注~
以下网友喜欢您的帖子:

  
侠士

经验值: 1746
发帖数: 141
精华帖: 4
回复:为什么MB_Client块可以使用同一个背景数据块多次调用,如何实现的?


只看楼主 楼主 13楼 2022-07-05 10:27:00

设置第一个调用和第三个调用的参数是一样的,Trace:

看图可以得出结论,Busy信号是跟参数相比较的 



公众号"worksway工方工园",欢迎关注~
以下网友喜欢您的帖子:

  
侠士

经验值: 1746
发帖数: 141
精华帖: 4
回复:为什么MB_Client块可以使用同一个背景数据块多次调用,如何实现的?


只看楼主 楼主 14楼 2022-07-05 10:34:36

前三次参数设置成一样,Trace结果:

只有极少数Done1,Done2有信号,99%都是只有Done3有信号



公众号"worksway工方工园",欢迎关注~
以下网友喜欢您的帖子:

  
至圣

经验值: 127331
发帖数: 22001
精华帖: 824
回复:为什么MB_Client块可以使用同一个背景数据块多次调用,如何实现的?


只看楼主 15楼 2022-07-05 10:37:06
以下是引用Setrarin在2022-07-05 10:09:10的发言 >12楼

yming大神说的有道理,我看了关于异步指令的帮助部分,里面也明确说明

“使用指令的作业标识输入参数。在异步指令的执行过程中,这些输入参数必须与执行

过程中的各调用相匹配。”

还有个疑问是第一个调用和第三个调用的参数是一样的,但是结果仍然可以正常完成,说明程序块不止使用参数做比较。

如果前三个调用块的参数都一样的,也是以上一个Done来顺序调用,就只有第三个块有输出。猜测还使用了参数堆栈之类的方法,而且程序还知道每次的执行是不是在同一个周期内。


以下是引用yming在2022-07-05 09:20:48的发言 >11楼:内部有个机制,每次...

引用11楼详细内容:

内部有个机制,每次调用,需要比较所有输入。

只有所有输入没有变化的那个被激活的调用,才会执行输出。


这也是要求调用期间,输入保持一致性的一个原因吧。

以下是引用Setrarin在2022-07-04 17:24:26的发言 >8楼:那第三次调用被触发...

引用8楼详细内容:

那第三次调用被触发之后,怎么输出不落在第一个调用引脚,而刚好输出在第三个呢?

以下是引用yming在2022-07-04 16:56:40的发言 >6楼:这个MB_CLIE...

引用6楼详细内容:

这个MB_CLIENT功能块的背景数据块,可以认为是Modbus TCP通讯处理器的数据缓冲块。

当REQ上升沿出现时,将所有输入接口参数,传送到背景数据块中;然后激活此协议的通讯处理过程。

这是异步通讯,BUSY=1;经过N个扫描周期,内部通讯任务才能完成。即:BUSY=0;Done/ERR=1(仅置位1个扫描周期。你必须在此周期内,处理、移动完成了的数据。)

若此时,REQ仍然=1;将开始下一次完全相同的通讯过程。(连续读或写);

此例中,利用上一次的Done/ERR,将此MB_CLIENT的REQ置一,把输入传送到它的背景数据块;启动通讯过程。BUSY=1;经过数个扫描周期等待,直到完成Done或者出错ERR。


早期的MB_CLIENT这样写法是不允许的。它要求在通讯期间,REQ上升沿激活后 - Done/ERR完成前,功能块的调用期间,输入应保持不变。

可能新版本有所改变?




以下是引用Setrarin在2022-07-04 09:27:10的发言 >3楼:那第三次的调用结...

引用3楼详细内容:

那第三次的调用结果为什么刚好输出给第三次呢?难道块知道同一周期被调用的次数?

以下是引用史德利古尔在2022-07-04 08:39:08的发言 >2楼:指令执行之后要...

引用2楼详细内容:

指令执行之后要几个周期才会给出完成信号

如果输入参数完全一致(包括数据发送接收区),它就与REQ一直保持=1是一样的。

连续读/写。逐一执行。



学而时习之,不亦说乎?温故而知新,不亦乐乎?
以下网友喜欢您的帖子:

  
侠士

经验值: 1746
发帖数: 141
精华帖: 4
回复:为什么MB_Client块可以使用同一个背景数据块多次调用,如何实现的?


只看楼主 楼主 17楼 2022-07-05 11:12:59
以下是引用yming在2022-07-05 10:37:06的发言 >15楼

如果输入参数完全一致(包括数据发送接收区),它就与REQ一直保持=1是一样的。

连续读/写。逐一执行。


以下是引用Setrarin在2022-07-05 10:09:10的发言 >12楼:yming大神说的有道理...

引用12楼详细内容:

yming大神说的有道理,我看了关于异步指令的帮助部分,里面也明确说明

“使用指令的作业标识输入参数。在异步指令的执行过程中,这些输入参数必须与执行

过程中的各调用相匹配。”

还有个疑问是第一个调用和第三个调用的参数是一样的,但是结果仍然可以正常完成,说明程序块不止使用参数做比较。

如果前三个调用块的参数都一样的,也是以上一个Done来顺序调用,就只有第三个块有输出。猜测还使用了参数堆栈之类的方法,而且程序还知道每次的执行是不是在同一个周期内。


以下是引用yming在2022-07-05 09:20:48的发言 >11楼:内部有个机制,每次...

引用11楼详细内容:

内部有个机制,每次调用,需要比较所有输入。

只有所有输入没有变化的那个被激活的调用,才会执行输出。


这也是要求调用期间,输入保持一致性的一个原因吧。

以下是引用Setrarin在2022-07-04 17:24:26的发言 >8楼:那第三次调用被触...

引用8楼详细内容:

那第三次调用被触发之后,怎么输出不落在第一个调用引脚,而刚好输出在第三个呢?

以下是引用yming在2022-07-04 16:56:40的发言 >6楼:这个MB_CLIE...

引用6楼详细内容:

这个MB_CLIENT功能块的背景数据块,可以认为是Modbus TCP通讯处理器的数据缓冲块。

当REQ上升沿出现时,将所有输入接口参数,传送到背景数据块中;然后激活此协议的通讯处理过程。

这是异步通讯,BUSY=1;经过N个扫描周期,内部通讯任务才能完成。即:BUSY=0;Done/ERR=1(仅置位1个扫描周期。你必须在此周期内,处理、移动完成了的数据。)

若此时,REQ仍然=1;将开始下一次完全相同的通讯过程。(连续读或写);

此例中,利用上一次的Done/ERR,将此MB_CLIENT的REQ置一,把输入传送到它的背景数据块;启动通讯过程。BUSY=1;经过数个扫描周期等待,直到完成Done或者出错ERR。


早期的MB_CLIENT这样写法是不允许的。它要求在通讯期间,REQ上升沿激活后 - Done/ERR完成前,功能块的调用期间,输入应保持不变。

可能新版本有所改变?




以下是引用Setrarin在2022-07-04 09:27:10的发言 >3楼:那第三次的调用...

引用3楼详细内容:

那第三次的调用结果为什么刚好输出给第三次呢?难道块知道同一周期被调用的次数?

以下是引用史德利古尔在2022-07-04 08:39:08的发言 >2楼:指令执行之后要...

引用2楼详细内容:

指令执行之后要几个周期才会给出完成信号

我觉得不一样,否则就应该输出在第一个块,而不是第三个块。


公众号"worksway工方工园",欢迎关注~
以下网友喜欢您的帖子:

  
侠士

经验值: 1746
发帖数: 141
精华帖: 4
回复:为什么MB_Client块可以使用同一个背景数据块多次调用,如何实现的?


只看楼主 楼主 19楼 2022-07-05 13:23:11
以下是引用kenshinguo在2022-07-05 13:18:14的发言 >18楼

说不定这个client只在req为1,busy为0时才会读取管脚参数,启动新的查询呢

读取好理解,输出呢?为什么还能输出到对应块的引脚呢?如果第三次调用和第一次的参数是一样的,在第三次调用激活后,完成信号在几个周期后,Done的完成位为什么没有在第一个块的引脚?


公众号"worksway工方工园",欢迎关注~
以下网友喜欢您的帖子:

  
至圣

经验值: 127331
发帖数: 22001
精华帖: 824
回复:为什么MB_Client块可以使用同一个背景数据块多次调用,如何实现的?


只看楼主 20楼 2022-07-05 22:43:01

不要去纠结了。

三次同一调用,就是在一个循环中调用了三次。因为是同一扫描周期,若恰好第一次有结果,它们的Done 可能都为1。


学而时习之,不亦说乎?温故而知新,不亦乐乎?
以下网友喜欢您的帖子:

  
至圣

经验值: 19839
发帖数: 4383
精华帖: 2
回复:为什么MB_Client块可以使用同一个背景数据块多次调用,如何实现的?


只看楼主 21楼 2022-07-06 13:51:37

一个循环,三次调用。


 
以下网友喜欢您的帖子:

  
收起
为什么MB_Client块可以使用同一个背景数据块多次调用,如何实现的?
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。