登录
首页 PLC论坛 西门子SIEMENS
回帖 发帖
正文

主题:S7-400之间的通讯问题,似乎有点儿麻烦!

点击:9865 回复:12

是关于西门子S7-400系列的,系统有若干个PLC;PLC之间的连接是采用工业以太网,通讯模块是CP443;单个PLC为核心的子网采用profibus;
现在的问题是关于PLC与PLC通讯的,网络组态中cp443之间采用的是工业Ethernet,假设其中的一个PLC定义为take—up,一个定义为pay-off;要求这两个CPU之间进行数据交换;pay-off中定义的连接如下:
附件
连接属性如下:
附件
同时take-up中也有类似的定义。
在程序OB1中有关于数据通讯的程序段,如下:
附件
AG_LSEND是发送数据的,接受的PLC中也有对应的的AG_LRECV
目前take-up有一组数据需要发送到pay-off,同时pay-off也有一组数据发送到take-up,我看到在CPU中创建了两个ISO_ON_TCP连接,我的问题是如果我要增加take-up到pay-off的数据通讯,是不是也要在网络组态中增加相应的ISO_ON_TCP连接;换个角度说,是不是在OB1中有几个AG_LSEND和AG_LRECV命令,就要定义几个ISO_ON_TCP连接?
顺便再问个问题,有没有在工业Ethernet中可以使用的全局变量,用上面的方法,PLC之间数据交换显得麻烦。要是不需要考虑通讯命令就可以使用变量就方便了。
希望高手能够解答;万分感谢!
07-11-12 12:03
philking:
好家伙! 为了和其它两台S7-400进行以态网通讯, 你弄了四条组态啊!
S7-400 "pay-off"与"Galvanic/CPU412-2"进行以态网通讯, 只需在NetPro中进行一条组态;
S7-400 "pay-off"与"take up/CPU412-2"进行以态网通讯, 只需在NetPro中进行一条组态;
因此, 在NetPro中我们只需2条组态.
关于"激活的连接伙伴", 要么在本地激活, 要么在伙伴方激活也行. 只要在一方设定为"是"即可!
07-11-13 06:22
philking:
S7-400"take-up"与S7-400"pay-off"进行以态网通讯(ISO_on_TCP connection), 在NetPro中你只需组态一条信息就能轻松完成.
我认为你要理解并记住: 关于"激活的连接伙伴", 要么在本地激活, 要么在伙伴方激活也行. 只要在一方设定为"是"即可! 这样一来, 就创建双向数据交流.
如果发送量小于240字节, 或者接收量小于240字节, 则你在OB1中分别调用一次AG_LSEND和AG_LRECV即可解决问题.
07-11-13 06:33
philking:
很遗憾! 西门子至今没有在工业Ethernet中可以使用的全局变量! 只能依靠编程的方法,来实现PLC之间数据交换。
据悉 Rockwell公司的工业Ethernet中可以使用的全局变量, 使用起来非常灵活机动. 值得西门子公司去学习参考!
07-11-13 06:38
感谢你的回答,我没有作过类似的项目,这次看到老外设备里面的程序中定义l了那么多的ISO-ON-TCP连接我就开始疑惑了,而且以为只要调用一次AG_lsend就要创建一个ISO-ON-TCP连接。
但是按照你的回答,我的疑惑又来了,如果take_up 和pay_off之间只有一个ISO-ON-TCP连接,如果我调用两个AG_lsend,一个AG_lsend将db1的100个字节发送到pay_off,另一个AG_lsend将db2的100个字节发送到pay_off,而两个AG_lsend的ID号又是一样的,那么接受端pay_off的AG_LRECV怎么去判断接受对方的哪个AG_lsend数据呢?
另外AG_lsend传送的数据只能小于240字节吗?我怎么好像哪儿看到过可以达到几K?
如果确实只有240字节那么,大于240字节的我怎么传送?
07-11-14 16:17
对这个贴我很有感受,我不是用PLC的,是用单片机的做设备的,单片机同样有多台设备组网的问题,我在考虑是不是用单片机开发一个自动组网模块,不用PLC编程就可以将多台的PLC数据共享,已解工控朋友们在多台PLC组网时的不便。
不知道这个想法是否可行啊?希望大家多提意见。QQ:260395786
07-11-14 19:03
philking:
你没有作过S7-400通讯的项目,没关系! 做过两三次, 你就觉得手很顺!
通常, 我们在使用"TCP connection"进行S7-400之间的以太网通讯, 才必须使用"AG_LSEND"和"AG_LRECV". 如果采用"ISO-on-TCP"方式的话, 我们大多数人都是调用"AG_SEND"和"AG_RECV". 例如:
CALL  "AG_RECV"      // FC6
      ID    :=1
      LADDR :=W#16#100
      RECV  :=P#DB2.DBX0.0 BYTE 50
      NDR   :=M20.0
      ERROR :=M20.1
      STATUS:=MW30
      LEN   :=MW32
 CALL  "AG_SEND"    // FC5
      ACT   :=M0.0
      ID    :=1
      LADDR :=W#16#100
      SEND  :=P#DB1.DBX0.0 BYTE 50
      LEN   :=MW10
      DONE  :=M0.1
      ERROR :=M0.2
      STATUS:=MW12
07-11-15 03:56
philking:
你提的问题很有挑战性!-----"如果take_up 和pay_off之间只有一个ISO-ON-TCP连接,如果我调用两个AG_lsend,一个AG_lsend将db1的100个字节发送到pay_off,另一个AG_lsend将db2的100个字节发送到pay_off,而两个AG_lsend的ID号又是一样的,那么接受端pay_off的AG_LRECV怎么去判断接受对方的哪个AG_lsend数据呢?"
在前后两次调用"AG_LSEND"或者"AG_SEND"的时候, 除了本地的ID号, 我们看不见区分前后两次发送任务的特殊标号. 确实存在你讲的问题"接受端pay_off的AG_LRECV怎么去判断接受对方的哪个AG_lsend数据呢?"
所以, 在发送量<=240字节的场合, 调用"AG_LSEND"或者"AG_SEND" 挺受欢迎!
07-11-15 04:17
philking:
大于240字节的我们怎么传送?
西门子提供了功能强大的"S7-connection"连接方式来完成S7-400之间的以太网通讯! 这种连接方式, 最大可支持 64000字节的通讯量, 而且有数据校验. 当然, "S7-connection"是我最喜欢的通讯方式. 今年年初, 我在实验室里做"S7-connection"通讯, 成功地试到第1200字节. 那种感觉别提多爽啦!
07-11-15 04:30
简单地说明一下"S7-connection"在程序中如何编:
CALL  #SEND_a      // 第一次调用SFB12!
      REQ   :=M1.5
      R     :=
      ID    :=W#16#1
      R_ID  :=DW#16#12  // 注意:发送任务的特殊标号.
      DONE  :=M0.0
      ERROR :=M0.1
      STATUS:=MW2
      SD_1  :=P#DB10.DBX0.0 BYTE 300 // 最大300个字节!
      LEN   :=MW8
     CALL  #SEND_b   // 第二次调用SFB12!
      REQ   :=M1.5
      R     :=
      ID    :=W#16#1
      R_ID  :=DW#16#13  // 注意:发送任务的特殊标号.
      DONE  :=M100.0
      ERROR :=M100.1
      STATUS:=MW4
      SD_1  :=P#DB10.DBX300.0 BYTE 300 // 最大300个字节!
      LEN   :=MW8
     CALL  #SEND_c  // 第三次调用SFB12!
      REQ   :=M1.5
      R     :=
      ID    :=W#16#1
      R_ID  :=DW#16#14 // 注意:发送任务的特殊标号.
      DONE  :=M200.0
      ERROR :=M200.1
      STATUS:=MW6
      SD_1  :=P#DB10.DBX600.0 BYTE 300 // 最大300个字节!
      LEN   :=MW8
当然, 你还可以第四次, 第五次, ......, 第N次调用"BSEND" (SFB12).
07-11-15 04:45

上一页下一页

工控新闻

更多新闻资讯