QT mingw编译器下使用snap7库与西门子200smart-PLC(网口)通信实现代码

近期想要试一下QT与plc通信,正好朋友有个西门子200smart,于是乎~开整!
百度了会,发现有个博主写的qt通过snap7来与200smart通信的,那么就来配置snap7吧
首先去官网下载:https://sourceforge.net/projects/snap7/files/1.4.1/
我下载的是:snap7-full-1.4.1.zip

下载完后解压得到:
QT mingw编译器下使用snap7库与西门子200smart-PLC(网口)通信实现代码_第1张图片
将snap7-full-1.4.1文件复制到项目文件内

在pro文件中添加下述代码

LIBS += E:\Qt5.9.7\Tools\mingw530_32\i686-w64-mingw32\lib\libws2_32.a
LIBS += E:\Qt5.9.7\Tools\mingw530_32\i686-w64-mingw32\lib\libwinmm.a

(这是我自己qt安装的路径,按自己qt安装路径来)

将此路径内的snap7.h和snap7.cpp,snap7.dll,snap7.lib文件复制到项目文件内,添加现有文件
QT mingw编译器下使用snap7库与西门子200smart-PLC(网口)通信实现代码_第2张图片
QT mingw编译器下使用snap7库与西门子200smart-PLC(网口)通信实现代码_第3张图片
添加完成后如下图:
QT mingw编译器下使用snap7库与西门子200smart-PLC(网口)通信实现代码_第4张图片
继续添加现有文件,如下:

SOURCES += \
        main.cpp \
        mainwindow.cpp \
    snap7.cpp \
    snap7-full-1.4.1/src/core/s7_client.cpp \
    snap7-full-1.4.1/src/core/s7_isotcp.cpp \
    snap7-full-1.4.1/src/core/s7_micro_client.cpp \
    snap7-full-1.4.1/src/core/s7_partner.cpp \
    snap7-full-1.4.1/src/core/s7_peer.cpp \
    snap7-full-1.4.1/src/core/s7_server.cpp \
    snap7-full-1.4.1/src/core/s7_text.cpp \
    snap7-full-1.4.1/src/sys/snap_msgsock.cpp \
    snap7-full-1.4.1/src/sys/snap_sysutils.cpp \
    snap7-full-1.4.1/src/sys/snap_tcpsrvr.cpp \
    snap7-full-1.4.1/src/sys/snap_threads.cpp \
    snap7-full-1.4.1/src/lib/snap7_libmain.cpp

HEADERS += \
        mainwindow.h \
    snap7.h \
    snap7-full-1.4.1/src/core/s7_client.h \
    snap7-full-1.4.1/src/core/s7_firmware.h \
    snap7-full-1.4.1/src/core/s7_isotcp.h \
    snap7-full-1.4.1/src/core/s7_micro_client.h \
    snap7-full-1.4.1/src/core/s7_partner.h \
    snap7-full-1.4.1/src/core/s7_peer.h \
    snap7-full-1.4.1/src/core/s7_server.h \
    snap7-full-1.4.1/src/core/s7_text.h \
    snap7-full-1.4.1/src/core/s7_types.h \
    snap7-full-1.4.1/src/sys/snap_msgsock.h \
    snap7-full-1.4.1/src/sys/snap_platform.h \
    snap7-full-1.4.1/src/sys/snap_sysutils.h \
    snap7-full-1.4.1/src/sys/snap_tcpsrvr.h \
    snap7-full-1.4.1/src/sys/snap_threads.h \
    snap7-full-1.4.1/src/sys/sol_threads.h \
    snap7-full-1.4.1/src/sys/unix_threads.h \
    snap7-full-1.4.1/src/sys/win_threads.h \
    snap7-full-1.4.1/src/lib/snap7_libmain.h

鼠标右击项目->添加库->外部库
QT mingw编译器下使用snap7库与西门子200smart-PLC(网口)通信实现代码_第5张图片
配置完成!

下面我们来写代码和plc通讯
.h

	TS7Client *client;

.cpp
初始化

    client = new TS7Client();
    word type = 0x02;
    client->SetConnectionType(type);

建立连接:

	QString strip = ui->lineEdit->text();  // ip
    std::string stri = strip.toStdString();
    const char *ip = stri.c_str();
    qDebug() << "ip:" << ip << endl;
    int rack = ui->lineEdit_2->text().toInt();
    int slot = ui->lineEdit_3->text().toInt();
    int reg = client->ConnectTo(ip,rack,slot);
    if(reg == 0)
    {
        qDebug() << "success" << endl;
    }
    else
    {
        QMessageBox::information(this,"提示","连接失败");
        qDebug() << "failed";
    }

发送数据:

	//写VW区数据
    int plcDZ    = ui->lineEdit_4->text().toInt();	//需要写入的plc地址
    int plcValue = ui->lineEdit_5->text().toInt();	//需要写入的数据
    //写v区数据 需要定义一个word类型数据  占两个字节
    word value = plcValue ;
    value = slot_HighChangeLow(value);	//需要高低位转换一下再写入plc内,因为plc里的高低位和我们电脑上面的高低位反着来的
    ///DBWrite函数需要四个值
    //1.和200smart通讯我用的都是1
    //2.需要写入plc的地址
    //3.从这个地址往后写几个字节(我们要写入的是两个字节的unsigned short,所以填2)
    //4.写入的数据
    client->DBWrite(1,plcDZ,2,&value);

//16位高低位转换函数
word WorkThread::slot_HighChangeLow(word buff)
{
    word high = (buff >> 8)&0xff;     //高8位
    word low  = buff & 0xff;          //低8位

    word buff2 = (low << 8) | high;
    return buff2;
}

构建时可能会提示有的头文件找不到,这需要在pro文件内添加上路径了:

INCLUDEPATH += ./snap7-full-1.4.1/release/Wrappers/c-cpp/ \
               ./snap7-full-1.4.1/src/lib/ \
               ./snap7-full-1.4.1/src/core/ \
               ./snap7-full-1.4.1/src/sys/

运行后,获取数据正常,发送更改plc内数据正常
QT mingw编译器下使用snap7库与西门子200smart-PLC(网口)通信实现代码_第6张图片
有什么不懂的可以评论区问我,写浮点数和字符串都已实现(仅限于200smart)

你可能感兴趣的:(QT,西门子200smart,qt,开发语言,c++)