PLC与PC网络通信实验


因项目需要PLC与PC连接,传输一些状态和控制信息。为了最快的响应速度,保险的方式是采用I/O直接连接。但这需要额外增加I/O卡,而且和PLC的I/O功能有些重复。那么,网络通信是否可行呢?本文将进行一些实验。

西门子S7-1200

图:西门子S7-1200

概述

使用的PLC是目前主流的西门子S7-1200. 它支持的网络标准/协议很多,比如PROFINET, PROFIBUS等,还可以间接连接Modbus设备。每个标准下都有很多服务/协议,详情可以参考Communication with SIMATIC 。但这些标准有些是用于西门子的设备互联的,不一定适用于PC。

下图是 TIA Portal V14 中通信相关的指令,也可以作为线索。

plc通信指令

图:PLC通信指令

和PC的通信,一种方式是使用OPC server,但它是基于OLE/COM的,只能用于Windows。有些软件比如LabView提供了和西门子PLC通信的支持。跨平台的开源的方案,有一个是Snap7。我们可以先试试这个。另外可以尝试最原始的TCP协议。

Snap7

Snap7是针对西门子S7协议的。PLC不需任何配置就是S7的server,而我们只需要利用Snap7 lib,就可以让PC作为S7 client,读/写服务器端的数据块。

数据块映射

数据块分为输入区(DI, AI),输出区(DQ, AQ),程序数据块(DB)等等。下图中,DB3是测试程序的数据块。

PLC数据块及监测值

图:数据块及监测值

Snap7包中自带的(编译好的)测试程序可以查看/修改它的值。

Snap7测试程序

图:Snap7测试程序

访问设置

在读写前需要进行配置和权限的设置:禁用块优化,给予完全访问权限,详见 Snap7的文档

还有一个文档中没提到的设置:允许来自远程对象的PUT/GET通信访问。否则会出现 “Function not available”,
"function refused by CPU"之类的错误。

Snap7通信的权限设置

图:Snap7通信的访问设置

Python版的Snap7

有时使用脚本语言会更方便一些。python-snap7就是一个Snap7 lib的Python封装。因为只是接口层的封装,对速度的影响很小。

安装时需要先安装Snap7的库,再用pip安装python-snap7。有些平台没有现成的Snap7的库,需要自己编译。反正树莓派上我是自己编译的。 实测Python2和Python3都可以工作。

核心调用代码如下。因为I/O只有两字节,就直接读/写两字节了。

import snap7
from snap7.snap7types import S7AreaDB, S7AreaPA, S7AreaPE

class S7Client:

    def __init__(self, ip, slot=1, rack=
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值