技术论坛

1200 S7通讯问题

作者 主题
奇侠

经验值: 5550
发帖数: 626
精华帖: 6
主题:【探讨】1200 S7通讯问题


只看楼主 楼主 2022-06-24 23:26:42

       这几天在调试项目遇到1200  S7通讯一些问题,通过这两天努力基本解决。在这了要感谢西门子1200技术支持工程和我的项目同事。也推翻以前我对西门子S7通讯的一些认知。估计很多人看过我的经历也被现在很多资料给迷惑带到沟里翻车了。下面详细介绍问题点,和如何解决这些问题或是再次对S7有了一些新的认知和纠正了以前的一些错误认知。

       问题点,项目上是一条很大的生产组装生产线,这些生产线有若干个工位,这条生产线由多家公司完成,每个子站都是独立的1200PLC,总调度控制为一台1500PLC,还有上位机。到家公司做大型生产线就会设置到一些站有数据交互,上游厂家规划这些子站数据交互为S7通讯。可能有很多人说,为什么不用PN通讯,应为每个子站都带了变频器和伺服,还有分布式ET200SP模块,1200走PN最大也就能带16个PN。有些子站要和几个其他站交换通讯,PN通讯就有点不够,这样才规划S7通讯。S7通讯我就遇到以前没有遇到的问题,最早我这站要和三个其他子站进行S7通讯,我规划交互方式是字格式(INT)而流水线站却是规划的BOOL量数据通讯格式。其实这些数据这样规划没问题。现在是通讯方式如果我运到问题,我是不会认为有问题。我这边做客户端,流水线要多个子站通讯做服务器端。我用PUT和GET指令读写对方数据。我GTE指令用BOOL就出问题。

问题是指向服务端管脚填写如下

ADDR_1 := P#DB9.DBX10.0 BOOL 8

RD_1 := P#DB230.DBX46.0 BOOL 8

这样填写就出问题了,一监控就报16#0004,我就一直认为这样填写方式没问题,但是这填写就是有问题,估计很多人以前也是这样认为没有问题,也许以前博图软件和PLC固件支持这样做,但是现在是支持。一开始以为是我这边数据定义为INT字格式,服务端定义为16个BOOL量才会造成这个问题,后来我改成这样  RD_1 := P#M800.0 BOOL 8 ,还是不可以。以前用S7都是用字节,字或是双子格式交换数据都没问题,到时昨天第一次用BOOL量就出现问题。我花了几个小时去找资料该程序就是BOOL这种方式不行。我到了下午把程序改成下面方式就可以解决了。

ADDR_1 := P#DB9.DBX10.0 BYTE 1

RD_1 := P#DB230.DBX46.0 BYTE 1

这样一改再去监控程序就没有报错了,也能收到对方BOOL状态。后来试了字,双子都可以正常通讯。昨天解决了就没有深究,到了晚上躺着床上想这个问题,还是不能理解,以前接触的资料介绍BOOL量访问只要是8的倍数就可以正常通讯,为什么到了我这里就不可以。我白天问同事说也是这样说。于是到了今天早上我还是想这个问题,我看到了8点半就电话西门子技术支持,结果西门子技术支持说我理解没有问题,他的理解也是这样。我把我情况告诉他了,我再次将程序修改成BOOL量8的倍数,将我监控的情况告诉西门子技术支持,会报16#0004错误代码,他自己也在做测试,结果是会报错,我估计他是做仿真测试。在修改程序时,我第一次将ADDR_1管脚和RD_1管脚一个BYTE修改成一个BOOL量居然可以通讯。这是歪打正着得到可以访问一个BOOL量。访问一个BOOL量能正常通讯写法如下

ADDR_1 := P#DB9.DBX10.0 BOOL 1

RD_1 := P#DB230.DBX46.0 BOOL 1

我想是访问两个BOOL就开始报错了,我把这个结果告诉西门子技术支持了,他说好像这样以前是不可以。我同事说访问一个BOOL量确实可以,以前他用过。这时西门子技术支持说他测试一下会再次电话联系我,告诉我结果。到了下午1点多,上午那个西门子技术支持给我来电话了,在这里感谢这位西门子技术支持和他们团队。西门子技术支持说了以前好像是可以直接访问BOOL量,只要是8的倍数就可以,现在不可以了,反倒是可以访问一个BOOL可以。西门子技术支持说测试结果和我一样,不过RD_1管脚是可以写成P#DB230.DBX46.0 BOOL 8  这个格式,但是可以这样写ADDR_1 := P#DB9.DBX10.0 BYTE 1。

    今天在这个调试对S7通讯有了新的认识。不管是GET还是PUT都可以按照如下格式读写。

GET中的ADDR管脚可以设置BOOL量只能读取1个BOOL量,字节,字,双字没有限制,只要不超过S7通讯允许最大字节数就可以,这里ADDR管脚数据长度一定要和RD管脚数据长度一致,不管你ADDR填写什么数据类型,都要和RD管脚数据长度一致,哪怕ADDR管脚访问的是字节格式,长度是8个,你RD管脚数据可以是字节,字,双字或是位,只要长度对应是8个字节就可以正常通讯,PUT指令也是一样。ADDR管脚也可以写一个位方位,SD管脚也可以是一个位,只要数据长度一致,数据格式不一样没关系,同样ADDR管脚填写位只能是一个位,不能填写8的倍数,字节,字,双字只要不超过最大长度就可以。下图是我程序格式和监控状态两张图片。




大家以前有没有遇到过我遇见的问题,有没有好的见解。       


 
以下网友喜欢您的帖子:

  
重要声明:

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

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

至圣

经验值: 127355
发帖数: 22002
精华帖: 824
回复:1200 S7通讯问题


只看楼主 1楼 2022-06-25 13:44:17

唉,怎么说呢。

PN系统下的S7协议,实际上是 S7 TCP通讯。基于TCP/IP协议通讯架构上的S7协议。

TCP通讯从来就不支持位的传输,即便要交换的内容是位,也是用字节来传输。

即使内容是1个字节,TCP打包后也变成N多个字节来传输(头部就20字节)。外层还有IP打包。效率太低了。


所以,最好是组织好,推荐全部使用word来传输。规范它。一个字=16个位;一个模拟量=4000 hex=100.00%;控制字、状态字


交换速率不变。


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

  
奇侠

经验值: 5550
发帖数: 626
精华帖: 6
回复:1200 S7通讯问题


只看楼主 楼主 2楼 2022-06-25 15:54:47
以下是引用yming在2022-06-25 13:44:17的发言 >1楼

唉,怎么说呢。

PN系统下的S7协议,实际上是 S7 TCP通讯。基于TCP/IP协议通讯架构上的S7协议。

TCP通讯从来就不支持位的传输,即便要交换的内容是位,也是用字节来传输。

即使内容是1个字节,TCP打包后也变成N多个字节来传输(头部就20字节)。外层还有IP打包。效率太低了。


所以,最好是组织好,推荐全部使用word来传输。规范它。一个字=16个位;一个模拟量=4000 hex=100.00%;控制字、状态字


交换速率不变。

感谢乐工讲解,由于对TCP和S7协议数据格式不懂,造成了上面一些列问题。以前一直就认为S7访问位,需要是8的倍数,现在用到项目上不灵了,以前用S7交换数据都是字格式或是字节,双字格式,就不会有问题。只要程序能正常通讯,就不会研究更细规则。TCP通讯到倒是知道不能访问位格式。做好一个编程人员,还有有理论支持,不然只会应用会在使用过程经常会踩雷。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 127355
发帖数: 22002
精华帖: 824
回复:1200 S7通讯问题


只看楼主 3楼 2022-06-25 18:04:34
以下是引用Siemens automation在2022-06-25 15:54:47的发言 >2楼

感谢乐工讲解,由于对TCP和S7协议数据格式不懂,造成了上面一些列问题。以前一直就认为S7访问位,需要是8的倍数,现在用到项目上不灵了,以前用S7交换数据都是字格式或是字节,双字格式,就不会有问题。只要程序能正常通讯,就不会研究更细规则。TCP通讯到倒是知道不能访问位格式。做好一个编程人员,还有有理论支持,不然只会应用会在使用过程经常会踩雷。

以下是引用yming在2022-06-25 13:44:17的发言 >1楼:唉,怎么说呢。PN...

引用1楼详细内容:

唉,怎么说呢。

PN系统下的S7协议,实际上是 S7 TCP通讯。基于TCP/IP协议通讯架构上的S7协议。

TCP通讯从来就不支持位的传输,即便要交换的内容是位,也是用字节来传输。

即使内容是1个字节,TCP打包后也变成N多个字节来传输(头部就20字节)。外层还有IP打包。效率太低了。


所以,最好是组织好,推荐全部使用word来传输。规范它。一个字=16个位;一个模拟量=4000 hex=100.00%;控制字、状态字


交换速率不变。

是需要知道一些差别。

若是1500,优化的块根本没有位存储一说。你定义的每一个位BOOL存储,都是用一个字节来存储。


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

  
奇侠

经验值: 5550
发帖数: 626
精华帖: 6
回复:1200 S7通讯问题


只看楼主 楼主 4楼 2022-06-26 08:05:00
以下是引用yming在2022-06-25 18:04:34的发言 >3楼

是需要知道一些差别。

若是1500,优化的块根本没有位存储一说。你定义的每一个位BOOL存储,都是用一个字节来存储。

以下是引用Siemens automation在2022-06-25 15:54:47的发言 >2楼:感谢乐工讲解,由于...

引用2楼详细内容:

感谢乐工讲解,由于对TCP和S7协议数据格式不懂,造成了上面一些列问题。以前一直就认为S7访问位,需要是8的倍数,现在用到项目上不灵了,以前用S7交换数据都是字格式或是字节,双字格式,就不会有问题。只要程序能正常通讯,就不会研究更细规则。TCP通讯到倒是知道不能访问位格式。做好一个编程人员,还有有理论支持,不然只会应用会在使用过程经常会踩雷。

以下是引用yming在2022-06-25 13:44:17的发言 >1楼:唉,怎么说呢。PN...

引用1楼详细内容:

唉,怎么说呢。

PN系统下的S7协议,实际上是 S7 TCP通讯。基于TCP/IP协议通讯架构上的S7协议。

TCP通讯从来就不支持位的传输,即便要交换的内容是位,也是用字节来传输。

即使内容是1个字节,TCP打包后也变成N多个字节来传输(头部就20字节)。外层还有IP打包。效率太低了。


所以,最好是组织好,推荐全部使用word来传输。规范它。一个字=16个位;一个模拟量=4000 hex=100.00%;控制字、状态字


交换速率不变。

   乐工,这个项目两次发帖你得到你详细讲解,第一次是关于G120C编写有什么好的方法编写,您推荐您以前帖子给我看。我在您以前帖子上学到很多东西,这次得到了您详细讲解。感谢乐工无私奉献的精神。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 127355
发帖数: 22002
精华帖: 824
回复:1200 S7通讯问题


只看楼主 5楼 2022-06-26 11:17:33

发几个概念上的图

1、1200中标准数据块和优化的数据块不同 DB



2、1500中标准数据块和优化的数据块不同




3、标准块中与优化块中数据格式差异




4、TIA组态传输的自动兼容。TSend_C



要是与第三方通讯,就有点挠头。


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

  
游民

经验值: 63
发帖数: 5
精华帖: 0
回复:1200 S7通讯问题


只看楼主 6楼 2022-06-27 16:07:09

刚在试S7通讯,原来的报文好像不能连了。就是上位机直接用报文做的,有谁有同样问题吗。

第一次的握手报文就给拒了??

4.4的固件  


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 5550
发帖数: 626
精华帖: 6
回复:1200 S7通讯问题


只看楼主 楼主 7楼 2022-06-28 20:42:02
以下是引用yming在2022-06-26 11:17:33的发言 >5楼

发几个概念上的图

1、1200中标准数据块和优化的数据块不同 DB



2、1500中标准数据块和优化的数据块不同




3、标准块中与优化块中数据格式差异




4、TIA组态传输的自动兼容。TSend_C



要是与第三方通讯,就有点挠头。

看了乐工这个资料,确实让我受益匪浅。以前还真不是很了解这个问题,也没有仔细研究这方面。以前是应有得手没有问题,就没有想过这些底层的东西。


 
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
1200 S7通讯问题
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。