近期想要试一下QT与plc通信,正好朋友有个西门子200smart,于是乎~开整!
百度了会,发现有个博主写的qt通过snap7来与200smart通信的,那么就来配置snap7吧
首先去官网下载:https://sourceforge.net/projects/snap7/files/1.4.1/
我下载的是:snap7-full-1.4.1.zip
下载完后解压得到:
将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文件复制到项目文件内,添加现有文件
添加完成后如下图:
继续添加现有文件,如下:
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
下面我们来写代码和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内数据正常
有什么不懂的可以评论区问我,写浮点数和字符串都已实现(仅限于200smart)