前两天搞了一个西门子1214的PLC,以前跟树莓派连过,想着没事看看能跟笔记本连上读个数据不。经过一晚上的努力,终于还是搞定了!把整个流程记一下。
首先是包的下载,直接通过pip下载就行了,
pip3 install python-snap7
可以在terminal里试一下,导入是没问题的
但是对client实例化的时候还是会报错
注意一下报错的信息,是common.py文件里load_library里有点问题
在windows环境下,我们是通过两个dll动态库文件来执行程序的, 在linux下差不多,但是文件是so类型的。
下载snap7的完整程序包,这是我放在网盘里的程序包
https://pan.baidu.com/s/1rVoyAYmOOFPi43Ab_NFh0Q 密码44ln
下载完了以后解压,注意看一下readme文件,进入文件夹下build/unix路径,看下readme里对应的系统版本,编译文件,由于我的系统是x86架构,直接按照说明里的运行
sudo make -f x86_64_linux.mk all
然后就生成了我们需要的so文件,
对应的路径就是我们执行的mk文件名,然后我们把这个文件复制到一个固定的地方
sudo cp /Desktop/snap7-full-1.4.2/build/bin/x86_64-linux/libsnap7.so /usr/lib/libsnap7.so
注意要记得后面那个地址,一会要用到
还记得前面报错的commen.py文件么?直接vi进去修改
class Snap7Library(object): """ Snap7 loader and encapsulator. We make this a singleton to make sure the library is loaded only once. """ _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = object.__new__(cls) cls._instance.lib_location = None cls._instance.cdll = None return cls._instance def __init__(self, lib_location=None): #加上lib_location的地址 lib_location='/usr/lib/libsnap7.so' if self.cdll: return self.lib_location = lib_location or self.lib_location or find_library('snap7') if not self.lib_location: msg = "can't find snap7 library. If installed, try running ldconfig" raise Snap7Exception(msg) self.cdll = cdll.LoadLibrary(self.lib_location)
在构造函数中我们要加上lib_location的地址,就是前面复制到的地址。保存退出
然后就成功了!
试一下直接读取PLC里db1里的数据
至于snap7具体的使用方法网上还是有不少的,直接搜就好了!