技术论坛

关于1200 Modbus通讯轮询及共用背景数据块的问题

作者 主题
游民

经验值: 73
发帖数: 4
精华帖: 0
主题:【探讨】关于1200 Modbus通讯轮询及共用背景数据块的问题


只看楼主 楼主 2019-05-10 10:57:39

最近在做一个项目,要求使用1200读取电控柜里面一个仪表的参数,有8,9个参数,大概需要分4次读取。于是就是选取了1214C+CM1241Mobus这种方式进行。在编程时遇到疑问:原因时Modbus_Comm_Load的MB_DB参数需要连接下面Modbus_Master功能块的背景数据块,这样对于多次调用Modubs_Master就是个问题了。



 

于是参考了下西门子官方的MODBUS轮询例程,大概进行如下的编写。



到这里就比较惊讶 了,于是去查了下


MB_Master这个就是个FB功能块,带背景数据块,如果按照例程中那样调用,就是出现在程序中多次使用同一个背景数据块的问题,这会不会产生什么问题呢?

(由于手里暂时没有硬件,所以暂时不知道例程是否能得到正确的结果)

 

于是我就做了个测试,目的就是看对于调用同一个同样背景数据库的程序会产生什么影响:

 

1.       首先生成一个公共调用的FB块,分别带了bool和real的数据输入、输入输出、输出和在里面生成的静态变量


2.       程序如下:


Net1如果第一个bool参数(bit1)为True,则将输入的数据+88然后输出到输出变量1 outval1

Net2如果第二个bool参数(bit2)的上升沿,则将第一个输入输出(inoutval1)变量自加1,而将其内部的静态数据(intervals[0])自减1,将结果分别赋值给输出变量2(outval2)和输入输出变量2(inoutval2)

 

3.       生成外部调用

首先使用一个2HZ的脉冲进行将MW50从0~2变化,然后按MW50分别触发bit2的脉冲,


然后下面分3次调用:

 

第一次:


第二次


第三次


 

4.       测试

经过测试,得出如下结果:

a.       如果输入1(bit1)为True时,程序想要的时将输入1(val1)+88.0然后输出到输出变量(outval1)


结果如下:如果3次调用都是false,则对3个的输出结果都不影响。任意一个调用为True,该调用将会影响所有结果,直到下一个调用为真的更改结果。

 

b.       如果bit2有脉冲输入时,那么FB里面想要结果:


输入变量2(bit2)的上升沿会将输入输出1(inoutval1)的结果自加1

同时将内部静态变量intervals[0]自减去1,然后再将该值输出到输出变量2(outval2)和输入输出变量2(inoutval2)

 

而调用的结果:


对于打开脉冲的那个功能块,输入输出2(inoutval2)在跟随变化,而且变化频率是和触发的频率一致,而Outval2的变化会多1,是因为第3个也是打开了脉冲功能。

而对于第一个,关掉脉冲的:


结果输入输出不受影响,而输出将会也是跟随前面的功能块变化。

 

总结:如果非得在同一个程序使用相同的FB背景数据块,那么可能会产生如下结果:

1.       对于输出型的变量,值永远会刷新到输出连接的变量,只要有任何地方更改了改变量值。所有的输出都会是一样并且输出到连接的变量。也就是说,输出变量是共用的。

2.       对于输入输出的变量,如果不触发,则似乎不受影响。变量不共用。

3.       对于内部static变量,里面的所有变量会是共用的,例如如果想使用里面做沿触发存储位是会出错的。

那么问题来了,对于Modbus_Master里面的变量,


这些部分都会是共用,那么数据会得到准确的数值吗?

 

最后看到有人另外一种方案:使用Modbus_Master的输出参数作为变量,然后每次调用完后及时取出来,然后更改参数再读取,可能这样比较靠谱些。



国产的也不错,但比起老外差远了,有太多的需要跟德国人学习。
以下网友喜欢您的帖子:

  
重要声明:

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

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

至圣

经验值: 14883
发帖数: 1015
精华帖: 1
回复:关于1200 Modbus通讯轮询及共用背景数据块的问题


只看楼主 1楼 2019-05-10 13:39:46

 占个沙发,以前经常用300去写这个轮询程序,还行


自己不努力,一切全白费
以下网友喜欢您的帖子:

  
奇侠

经验值: 9621
发帖数: 1550
精华帖: 14
回复:关于1200 Modbus通讯轮询及共用背景数据块的问题


只看楼主 2楼 2019-05-10 13:58:12

多次使用背景数据块正是为多次重复使用FB,减少多次使用背景数据块才重复使用的。

通讯数据是读写DATA_PTR指定的地址中,与楼主说的不是一会儿事吧


 
以下网友喜欢您的帖子:

  
游民

经验值: 73
发帖数: 4
精华帖: 0
回复:关于1200 Modbus通讯轮询及共用背景数据块的问题


只看楼主 楼主 3楼 2019-05-10 14:14:10
以下是引用weiyt在2019-05-10 13:58:12的发言 >2楼

多次使用背景数据块正是为多次重复使用FB,减少多次使用背景数据块才重复使用的。

通讯数据是读写DATA_PTR指定的地址中,与楼主说的不是一会儿事吧

多次调用同一个背景数据块,就会出现Output的变量和Static区的变量会在下一个调用的地方同样有效,这估计就是单纯的数据赋值了。而DATA_PTR是InOut,使用的指针寻址,不是简单的复制变量值,估计才保持Inout的变量不受影响。

对于Modbus_Master块来说,关键就是输出的 Done,Busy,Error和Status这几个输出变量。这就需要看Modbus_Master内部如何编写的程序(不得知),如果是使用=指令,则就不会有问题,如果分开了R和S那么就会出现如果R和S都不生效情况下,就会是上一个调用FB来影响。


国产的也不错,但比起老外差远了,有太多的需要跟德国人学习。
以下网友喜欢您的帖子:

  
至圣

经验值: 127355
发帖数: 22002
精华帖: 824
回复:关于1200 Modbus通讯轮询及共用背景数据块的问题


只看楼主 4楼 2019-05-10 16:26:53

要知道:modbus_comm_load 是配置那个CM用的。如果不需要改变。仅需要执行一次。

而Modbus_Master功能块的背景数据块是用于PLC本体与CM交换数据用的。

当每次REQ出现上升沿的时候,本体开始通过其背景数据块与CM模块交换数据,执行通讯过程。直到CM完成通讯过程,将结果放到这个背景数据块中;根据通讯结果,置位功能块的输出。在此期间,不能人为修改这个背景数据块。

也就是说,不管程序中,使用多少个相同的Modbus_Master功能块和相同的背景数据块,只要保证每次只有一个REQ(上升沿)使能。都不会出现错误。

有几点需要注意:

1、这是异步通讯,不要做定时的REQ。

2、REQ仅需要个低电平到高电平;既可以使用脉冲,也可以用状态位来复位。



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

  
游侠

经验值: 495
发帖数: 27
精华帖: 0
回复:关于1200 Modbus通讯轮询及共用背景数据块的问题


只看楼主 7楼 2019-07-02 12:54:14

也还没搞通这个轮询现在




你不知道的西家
以下网友喜欢您的帖子:

  
游侠

经验值: 347
发帖数: 38
精华帖: 0
回复:关于1200 Modbus通讯轮询及共用背景数据块的问题


只看楼主 8楼 2019-10-12 18:34:55

Master功能块中DATA_PTR脚连接的一个缓冲数据块,通过缓冲数据块进行读写操作,保证数据一致性。



 
以下网友喜欢您的帖子:

  
版主

经验值: 76239
发帖数: 19148
精华帖: 378
回复:关于1200 Modbus通讯轮询及共用背景数据块的问题


只看楼主 9楼 2019-10-13 22:56:40

博图环境下Modbus-RTU应用入门之任务轮询


或许可以解答楼主的一些问题


Zane 注册自动化系统工程师 Always save before download
以下网友喜欢您的帖子:

  
游民

经验值: 88
发帖数: 6
精华帖: 0
回复:关于1200 Modbus通讯轮询及共用背景数据块的问题


只看楼主 10楼 2019-10-18 13:32:40
完成位和错误位触发下一个指令。西门子有例程的
 
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
关于1200 Modbus通讯轮询及共用背景数据块的问题
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。