Ubuntu 通过snap7连接西门子1200

前两天搞了一个西门子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具体的使用方法网上还是有不少的,直接搜就好了!

原文地址:https://www.cnblogs.com/yinsedeyinse/p/13657904.html