恭喜,你发布的帖子
发布于 2022-11-21 22:06:21
16楼
出现问题的原理:
当数据块在优化访问模式时,DB变量作为输入输出参数,对其进行访问。
在此情况下,数据是用复制模式传送的。运算数据复制后,即使数据未改变,也会在数据块结尾处再次写入回该数据。因此,在数据块过程中HMI系统写入的数据会丢失。
西门子手册:
2.6.5优化和非优化访问的块之间的参数传输
当将结构作为输入/输出参数(InOut)传输到被调用块时,它们默认作为引用传输
但是,如果其中一个块具有“优化访问”属性而另一个块具有“默认访问”属性(我翻译一下,就是FB块和IN/OUT的形参数据一个为优化访问快,一个为非优化访问快),则情况并非如此。在这种情况下,所有参数通常作为副本传输(参见第3.3.1章按值调用)。
在这种情况下,被调用块始终使用复制的值。在块处理期间,这些值可能会更改,并且在处理块调用后将它们复制回原始操作数。
如果原始操作数被异步进程(例如,被HMI或中断OB访问)更改,这可能会出问题。如果在块处理之后将复制的值复制回原始操作数,则原始操作数上异步执行的更改将被覆盖。
实际编程问题:
1513 CPU,
建立一个FB1块(优化访问块),一个IN/OUT接口 ,UDT_AA;
建立一个DB10块(非优化访问快,UDT_AA)DB变量作为输入输出参数
我通过WINCC 或者PLC的监控与强制表,去操作DB块,那么由于调用了FB1, 然后形参使用了DB10。那么会出现操作失败的现象。
比如10bool变量赋值1,赋值0。经常会出现,只能赋值9个,另外有一个无法赋值成功,随机发生。
求助的最终问题:
如果FB和DB 都是优化访问快,或者非优化访问快,则不会出现这个问题。
FB是优化块,INOUT接口参数是非优化块,所以是传值而非传引用
所以问题就是由于一个是优化,一个是非优化,所以IN/OUT变成值传递了。能不能通过VARIANT的什么办法,改成指针传递,然后如何可以解决问题。
资料1:
这个似乎是一个官方的回复,但是有点不理解。
文中提到的补救方法:
在共享数据块中定义变量,并且使用共享DB块变量作为块参数。
我理解他的意思是共享数据块也为优化访问快,但是上位机给的命令,怎么给到这个共享的优化访问快呢?
资料2
https://support.industry.siemens.com/cs/document/109478253/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9C%A8-s7-1500-%E4%B8%AD-hmi-%E7%B3%BB%E7%BB%9F%E6%88%96-web-server-%E7%9A%84%E6%95%B0%E6%8D%AE%E6%9C%89%E6%97%B6%E4%BC%9A%E8%A6%86%E7%9B%96%EF%BC%9F?dti=0&lc=zh-WW
资料3
https://www.ad.siemens.com.cn/club/bbs/PostStory.aspx?a_id=1536064&b_id=84
资料2,和资料3,都是说建立两个平行的相同的数据块,HMI操作一个DB,程序操作一个DB。
但是两者数据的交互是个大问题呀,如果在FB的开始,将HMI的数据传给程序的DB,FB结束将程序DB给到HMI的DB。
这意味着在块运行期间,操作数(或操作数的一部分)的异步改变(通过 HMI 写访问或者更高优先等级的运行系统)将会丢失,因为块被调用后,操作数的值会被覆盖。
用仿真按楼主测试了一下,没有发现无法赋值不成功的问题
请填写推广理由:
分享
只看
楼主