今天我们来演示如何使用两个S7-1200 G2 PLC进行S7通信。在自动化设备中,常常需要多个设备协同动作,通信就必不可少。西门子的S7通信简单、便捷、高效,今天我们来学习如何实现两个1200之间的数据交换。
我们先明确一下控制要求:
(1)两个1200PLC,一个作为客户端,一个作为服务器。
(2)客户端将本地DB3中的10个字节数据发送到服务器的DB1中。
(3)客户端从服务器的DB2中读取10个字节数据,存到本地的DB4中。
简单来说,就是客户端既能发也能收,服务器被动响应。
第一步:创建两个PLC并启用远程访问
打开博途软件,新建一个项目。先添加第一个PLC,命名为“客户端”,选择对应的CPU型号。在设备组态中,找到“组态”->“常规”->“防护与安全”->“连接机制”,勾选“允许来自远程对象的PUT/GET通信访问”。这一步很重要,否则对方无法访问我们的数据块。
用同样的方法再添加一个PLC,命名为“服务器”,同样勾选“允许来自远程对象的PUT/GET通信访问”。两个PLC都设置好后,我们就有了两个独立的设备。
第二步:建立数据块
在客户端项目中,添加一个数据块,命名为“DB3”。打开DB3,创建一个数组,数据类型为Byte,范围0..9,这样就有了10个字节的存储区。这个DB3用来存放要发送给服务器的数据。
再添加一个数据块“DB4”,同样创建数组[0..9] of Byte,用来存放从服务器读取回来的数据。注意,这两个DB块最好都取消“优化的块访问”,或者保持默认,但在S7通信中建议使用标准访问,我们这里先不管,后面有问题再调整。
在服务器项目中,添加数据块“DB1”,也是数组[0..9] of Byte,用来接收客户端发来的数据。
再添加“DB2”,同样数组[0..9] of Byte,用来存放准备让客户端读取的数据。注意,服务器上的DB1和DB2也要允许非优化访问,或者在属性里勾选“允许来自远程的访问”。
第三步:建立S7连接
现在回到客户端项目(或者可以在同一个项目中操作两个设备),切换到网络视图。你会发现两个PLC的图标都在,用鼠标点中客户端PLC的网口,拖出一条线连到服务器PLC的网口,松开后会自动弹出一个连接对话框,选择“S7连接”,然后确定。这时两个PLC之间就出现了一条连接线,表示S7连接已建立。
双击这条连接线,可以看到连接的详细信息,里面有一个“ID”,这个ID很重要,编程时会用到。比如这里的ID可能是十六进制的100,记下它。
第四步:编写客户端程序
在客户端项目中打开程序块,添加一个新的组织块,比如循环中断OB1。我们需要调用两个通信指令:PUT(发送)和GET(读取)。在指令列表的“通信”->“S7通信”中可以找到“PUT”和“GET”。
先拖入一个PUT指令。它的参数比较多,我们重点关注几个:
· REQ:触发脉冲,可以用一个时钟脉冲或一个常开触点,比如M0.0。
· ID:连接的ID,填我们刚才看到的十六进制值,比如W#16#100。
· ADDR_1:远程服务器的地址,格式是P#DB1.DBX0.0 BYTE 10,表示从服务器的DB1的0号字节开始的10个字节。
· SD_1:本地发送地址,格式是P#DB3.DBX0.0 BYTE 10,表示从本地的DB3的0号字节开始的10个字节。
· DONE、ERROR、STATUS:用于监控状态。
再拖入一个GET指令,参数类似:
· ID:同样的连接ID。
· ADDR_1:远程服务器的地址,这里是P#DB2.DBX0.0 BYTE 10,表示从服务器的DB2读取数据。
· RD_1:本地接收地址,P#DB4.DBX0.0 BYTE 10,存到本地的DB4中。
· 其他状态管脚同样接上。
注意,这里用到的地址都是绝对地址,如果DB块用的是优化访问,则需要先改成标准访问或者使用符号名加偏移。为了简单起见,建议在DB块属性中去掉“优化的块访问”的勾选。
第五步:程序验证
把两个PLC分别下载到仿真器或实际硬件中。在客户端程序里,我们可以给DB3的数组赋值,比如将0~9填入,然后观察服务器的DB1是否收到同样的值。同时,可以在服务器的DB2中填入一些数,比如10~19,看客户端的DB4是否能读到。
启动仿真,运行程序。我们看到,只要触发REQ,数据就传输过去了。注意,PUT和GET指令都是边沿触发的,如果想让数据循环交换,可以加一个定时器或循环触发。
注意事项
· 一定要在两侧PLC都勾选“允许来自远程对象的PUT/GET通信访问”,否则连接会失败。
· 连接ID必须一致,可以在网络视图的连接属性中查看。
· 数据块建议使用标准访问,否则地址写法可能不同。
· 如果通信不成功,检查IP地址是否在同一网段,并且仿真环境下也要设置好IP。
总结
通过以上步骤,我们就实现了两个S7-1200 G2之间的S7通信。客户端可以主动发送数据到服务器,也能主动读取服务器的数据,整个过程不需要在服务器侧编写任何通信程序,非常方便。这种通信方式常用于分布式控制系统中,比如一个主站采集多个从站的数据。大家可以在实际项目中灵活运用。