简介
最近在开发一个项目,作为技术帝,已经完成工艺、机械设计的设计,项目过多,也是为了让自己更加?叉,就开始尝试做电气制图和PLC编程。结合物联网的发展,有一种想法,将数据传输到Linux的数据库中保存,从而实现内网或者外网的远程监控,以及集合AI技术,将工艺参数进行分析,从而优化工艺与报警。
在问度娘PLC与树莓派连接时,发现了Snap 7。从而PLC数据传输到Linux下能搞定。
Snap7 资料比较少,并且均为英文的。
以下做个总结,便于大家学习。
参考
Snap7 官方网站:http://snap7.sourceforge.net/
https://pypi.org/project/python-snap7/
http://www.6dm.club/index.php/2018/04/07/
https://blog.csdn.net/zxpbuct/article/details/80079698
Snap7 简介
Snap7 用途
Snap7 是一个基于以太网与S7系列的西门子PLC通讯的开源库。
支持包括S7系列的S7-200、S7-200 Smart、S7-300、S7-400、S7-1200以及S7-1500的以太网通信。
适用系统
支持32/64位英特尔/ AMD的所有平台。
例如:
Windows ( 除了 windows Me和95);
Linux和类Linux(树莓派,UBeagleBone Black,DOO 等),
BSD;
Oracle Solaris ;
Apple OSX
支持语言
支持语言比较广
Pascal;
C#;
C++;
C;
LabVIEW
Python;
Node.js
Java.
其中介绍比较多的是Python。
西门子S7通信介绍
西门子S7系列PLC采用以下两种通讯方式:
1)开放式的TCP\IP,可以用于连接PLC与其他非西门子硬件
2) 西门子自己开发的S7 Protocol以太网通讯协议,用于西门子内部硬件通讯
这两者的传输报文是不一样的,如下图:
西门子数存储到二进制时方式是大端模式(BIG-Endian),而我们的普通电脑常常为小端模式(Liitle-Endian)。
大端模式是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中.
小端模式是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
例如:双字 DWORD 0X2F11214C
PLC
PC
所以数据需要进行转换
Snap7 组件
Snap7 时将PC站点与PLC网路完全连接到一起,所以它也要和S7一样包含三个对象组件:
1)客户端
2)服务器
3)协作者
注意:三个对象可以在同一个应用程序中同时使用;许多相同类型的对象可以同时实例化;许多应用程序可以同时使用Snap7。
关于这个三个对象组件,不是很理解,可以参考http://www.6dm.club/index.php/2018/04/07和http://snap7.sourceforge.net/。
Sanp7 API
如果我们需要读取192.168.10.100 S7-300PLC 中DB32的16位数据,需要:
1)创建Snap7 Client连接;
2) 连接到PLC;
3) 读取DB数据;
4) 关闭Client(连接会自动销毁)
C++源码
#include “snap7.h”;
byte MyDB32[256]; //
byte is a portable type of snap7.h
TS7Client *Client;
void SymplyGet()
{
MyClient = new TS7Client();
MyClient->ConnectTo(“192.168.10.100”,0,2);
MyClient->DBRead(32, 0, 16, &MyDB32);
delete MyClient;
}
Jetbrains全家桶1年46,售后保障稳定
C语言
#include “snap7.h”;
byte MyDB32[256];
S7Object Client; // It’s a native integer
void SymplyGet()
{
MyClient =
Cli_Create();
Cli_ConnectTo(MyClient, “192.168.10.100”,0,2);
Cli_DBRead(MyClient, 32, 0, 16, &MyDB32);
Cli_Destroy(&MyClient); // passed by
ref
}
#include “snap7.h”;
byte MyDB32[256]; //
byte is a portable type of snap7.h
TS7Client *Client;
void SymplyGet()
{
MyClient = new TS7Client();
MyClient->ConnectTo(“192.168.10.100”,0,2);
MyClient->DBRead(32, 0, 16, &MyDB32);
delete MyClient;
}
源码、手册、样例下载
源码下载:https://sourceforge.net/projects/snap7/files/1.4.2/snap7-full-1.4.2.7z/download
源码下载非常慢:可以在百度云中下载:https://pan.baidu.com/s/1pZPmijUQdYN-xia6Ll4VYg,密码:6eo8
后续将根据个人学习操作过程,逐步记录下来。