签到有奖
消息提醒
运维工程师专区
官方商城
扫码分享好友 任选多种周边
这几天在调试项目遇到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
唉,怎么说呢。
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通讯到倒是知道不能访问位格式。做好一个编程人员,还有有理论支持,不然只会应用会在使用过程经常会踩雷。
引用1楼详细内容:
是需要知道一些差别。
若是1500,优化的块根本没有位存储一说。你定义的每一个位BOOL存储,都是用一个字节来存储。
引用2楼详细内容:
乐工,这个项目两次发帖你得到你详细讲解,第一次是关于G120C编写有什么好的方法编写,您推荐您以前帖子给我看。我在您以前帖子上学到很多东西,这次得到了您详细讲解。感谢乐工无私奉献的精神。
发几个概念上的图
1、1200中标准数据块和优化的数据块不同 DB
2、1500中标准数据块和优化的数据块不同
3、标准块中与优化块中数据格式差异
4、TIA组态传输的自动兼容。TSend_C
要是与第三方通讯,就有点挠头。
刚在试S7通讯,原来的报文好像不能连了。就是上位机直接用报文做的,有谁有同样问题吗。
第一次的握手报文就给拒了??
4.4的固件
看了乐工这个资料,确实让我受益匪浅。以前还真不是很了解这个问题,也没有仔细研究这方面。以前是应有得手没有问题,就没有想过这些底层的东西。
分享
扫码分享好友 任选多种好礼
收藏
有帮助
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
密码至少8位,包含大、小写字母,数字和符号至少三种。
允许邮箱和手机接收来自支持中心网站的信息
我已同意《支持中心网站注册协议和隐私政策》
微信登录扫码一键登录
验证码登录
密码登录
二维码失效点击重试
打开微信扫一扫,快速登录/注册
未注册手机验证后自动登录,注册即代表同意《支持中心网站注册协议和隐私政策》
三日内免验证登录
短信登录
登录