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

图:西门子S7-1200
概述
使用的PLC是目前主流的西门子S7-1200. 它支持的网络标准/协议很多,比如PROFINET, PROFIBUS等,还可以间接连接Modbus设备。每个标准下都有很多服务/协议,详情可以参考Communication with SIMATIC 。但这些标准有些是用于西门子的设备互联的,不一定适用于PC。
下图是 TIA Portal V14 中通信相关的指令,也可以作为线索。

图: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是测试程序的数据块。

图:数据块及监测值
用Snap7包中自带的(编译好的)测试程序可以查看/修改它的值。

图:Snap7测试程序
访问设置
在读写前需要进行配置和权限的设置:禁用块优化,给予完全访问权限,详见 Snap7的文档。
还有一个文档中没提到的设置:允许来自远程对象的PUT/GET通信访问。否则会出现 “Function not available”,
"function refused by CPU"之类的错误。

图: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=

最低0.47元/天 解锁文章
4875





