当前位置:   article > 正文

折腾记:C++用开源库Snap7通过S7协议连接西门子PLC_c++ s7协议

c++ s7协议

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


        不是教程,是避坑指南。使用了S7-200smart和S7-1200这两款PLC。

目录

什么是snap7

下载

编译

S7-200smart准备

IP要弄清楚

数据准备

使用Snap7采集S7-200smart

S7-1200准备

使用Snap7采集1200

交叉编译


什么是snap7

        snap7是个开源库,用来访问西门子PLC的S7协议,支持C/C++以及很多很多别的语言(别的是啥咱不关心)。

下载

        搜官网下载啦,很简单的。

编译

        下载过来的压缩包打开,进到build目录看,有说明文件,非常简单明了。(以后有闲可以整教程出来,不过真的很简单啊,我重点记录遇到的困难)

S7-200smart准备

IP要弄清楚

        设置IP并牢记。Setp7-micro/win smart的搜索功能不好用(这可能是操作系统加强了网络安全的原因)。通过IP能连接到PLC就算正常了。

数据准备

        200smart的数据区是V,snap7是不支持的。我的数据放在VB0和VB1,用HSL可以读取(虽然地址示例没有V,但是可以用),snap7没有对应的函数,所以创建了一个数据块。

        如何创建数据块:

        先连接PLC,底部状态栏显示PLC地址和“已连接”。左侧树,“数据块”,“插入数据页”,右侧下部“数据块”窗口,倒数第三个图标,像个“+R”的,“通过RAM创建数据块”,自动根据内存创建数据块,数据块索引究竟是0还是1不确定,没有地方设置,多尝试几个看看。创建完数据块要下载程序,然后把PLC设置为运行状态,然后就可以用读数据块的函数来读取数据了。

        下载程序之后读取数据一直不变,我还以为是静态的,看了一眼PLC发现处于暂停状态,启动之后就一切正常了。因为开始我有两个数据块所以后一个索引是1是可以理解的,但是删除前一个之后仍然是1(这也可以理解啊,固定坑位模式吧),所以这个不能猜,要靠试。

使用Snap7采集S7-200smart

        Snap7编译结果只有一个so,没有头文件。C++的包装文件是一对h和cpp,在代码示例里面,相同位置有个client的文件,是客户端的代码,把这三个文件拿去用就可以了。

        client.cpp有main函数,改个名就能合在自己的项目里面了。

        由于snap7并未明确支持S7-200smart,所以有点麻烦。

        实际测试发现参数要用(0,1)(机架号和槽位,下同),以及连接类型要设置为3(示例代码没有设置连接类型),不然可能无法连接。200smart其实是没有机架号和槽位参数的。

        HSL的200smart并不需要设置这些。C#就是强些(我现在同时用C++和C#,C#确实舒服很多啊,但是程序太大放不进设备,没办法)。

        实测连接类型为3,参数(0,0)和(0,1)正常,(0,5)和(1,0)则无法连接。

        实测参数(0,0),连接类型不设置无法连接,连接类型0、1、4无法连接,2、3正常连接。

        至于测试代码,除了client的测试,就是用了读数据块的函数。

S7-1200准备

        S7-1200连接比较容易,用正确的参数(0、1)直接就连上了(不正确连不上),但是读数据始终出错,HSL也报错,此时PLC里面还是原来的程序,看不太懂。然后下载了我自己的程序,读取指定的数据块,一样报错,这就抓狂了,看各种设置都正确的,却始终无法读取,最后搜到一个帖子说“恢复出厂设置能解决问题”,于是就恢复出厂设置,重新下载程序,一切OK了。

使用Snap7采集1200

        我的程序包含一个数据块,索引为2,总长度为26个字节。使用DBRead读取成功,数据都正确,但是要注意,数据块是有范围的,读取位置不能超出范围,否则失败。

        实测无需设置连接类型,或者设置为1、2、3(0或4就不行了,文档里说3-10都是“S7 basic”啊,当然0确实不是有效值)。

交叉编译

        交叉编译到arm64只需要把common.mk(build/unix下面)里面的指令换一下就可以了,很简单。arm v6、arm v7啥意思我不懂,我还是用的x86_64_linux.mk,实测程序正常运行。


(这里是结束)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/949127
推荐阅读
相关标签
  

闽ICP备14008679号