C++[QT] 环境下使用Snap7与PLC通讯

                                   **C++[QT] 环境下使用Snap7与PLC通讯**

1、稳定版本snap7源码下载
snap7-full-1.4.2.7z:https://sourceforge.net/projects/snap7/files/1.4.2/snap7-full-1.4.2.7z/download
在这里插入图片描述
2 整合到QT项目中
2.1 解压下载的文件得到snap7-full-1.4.2
在这里插入图片描述
2.2 从snap7-full-1.4.2目录下找到snap7.cpp、 snap7.dll、 snap7.h、 snap7.lib四个文件并放到qt项目目录下
在这里插入图片描述
在这里插入图片描述
2.3 将snap7.cpp添加到qt项目的源文件下、snap7.h添加到项目头文件下
右键头文件,添加现有文件,选择snap7.h;
右键源文件,添加现有文件,选择snap7.cpp;
在这里插入图片描述
2.4 将snap7.lib添加到项目的外部链接中
在这里插入图片描述
3 连接测试
3.1 头文件中引入snap7.h文件,并申明TS7Client客户端对象client
在这里插入图片描述
3.2 xxx.cpp文件中初始化client对象,使用ip、rack、slot进行连接
在这里插入图片描述
【PLC连接】

void MainWindow::on_pushButton_clicked()
{
    int reg = client->ConnectTo("192.168.0.1",0,1);
    if(reg == 0)
    {
        QMessageBox::information(this,"提示","连接成功!");
    }
    else
    {
        QMessageBox::information(this,"提示","连接失败");
    }
}

【断开连接】

void MainWindow::on_pushButton_6_clicked()
{
    if(!client->Connected()){ //未连接则不执行
        QMessageBox::information(this,"tips","PLC未连接!");
        return;
    }
    client->Disconnect();
    if(!client->Connected()){
        QMessageBox::information(this,"tips","已断开连接!");
    }
}

3.3 PLC设置
rack号和slot号确认
在这里插入图片描述
PLC的连接机制设置允许外部访问
在这里插入图片描述
创建需要读写的DB数据块,并取消数据块属性中的优化的块访问的勾选
在这里插入图片描述
3.4 上位机连接PLC,运行qt程序,连接成功
在这里插入图片描述
4 读取DB数据
4.1 DBRead函数介绍
DBRead(DB号, 起始地址, 字节数, 返回的字节数组);

4.2 例程参考
snap7读取的plc数据都是字节数组,且为大小端;需要根据不同的目标类型进行相应的转换;
本例程提供了 byte[]转int和byte[]转bool两种转换方式,仅供参考;

void MainWindow::on_pushButton_4_clicked()
{
    if(!client->Connected()){ //未连接则不执行
        QMessageBox::information(this,"tips","PLC未连接!");
        return;
    }
    byte res[256]= {0};
    client->DBRead(1,0,3,&res);
    //读取的数据都是字节数组,且为大小端
    //byte[]转int
    uint value = res[1] & 0xFF;  //PLC中int数据占2字节长度
    value |= ((res[0] << 8) & 0xFF00);
    //byte[]转bool
    bool isOK = res[2] & 0xFF;
    ui->value_3->setText(isOK?"TRUE":"FALSE");
    ui->value_2->setText(QString::number(value));
}

5 向DB块写数据
主要使用DBWrite()函数向DB块写入各种数据;

5.1 DBWrite函数介绍
DBWrite(DB块号,起始地址,字节大小,写入的字节数组);

5.2 例程参考
与读取数据类似,数据写入DB块之前需要先转换为字节数组;
本例程提供了 int转byte[]和bool转byte[]两种转换方式,仅供参考;
【写入int数据】

void MainWindow::on_pushButton_3_clicked()
{
    if(!client->Connected()){ //未连接则不执行
        QMessageBox::information(this,"tips","PLC未连接!");
        return;
    }
    int value     = ui->value->text().toInt();
    int start = ui->byteNum->text().toInt();
    //int 转byte数组
    byte data[2]={0};[]
    //大小端调换
    data[1] = (unsigned char)(0xff & value);
    data[0] = (unsigned char)((0xff00 & value) >> 8);
    client->DBWrite(1,start,2,&data); //  DBWrite(int DBNumber, int Start, int Size, void *pUsrData)
}

【写入bool数据】

void MainWindow::on_toolButton_clicked()
{
    if(!client->Connected()){ //未连接则不执行
        QMessageBox::information(this,"tips","PLC未连接!");
        return;
    }
    byte data;
    if(isOK){
        isOK = !isOK;
        data = 0x01;
        client->DBWrite(1,2,1,&data);
        ui->toolButton->setStyleSheet("QToolButton {background-color: green; border: 2px solid black; color: white;}");
        ui->toolButton->setText("关 闭");
    }
    else{
        isOK = !isOK;
        data = 0x00;
        client->DBWrite(1,2,1,&data);
        ui->toolButton->setStyleSheet("QToolButton {background-color: gray; border: 2px solid black; color: white;}");
        ui->toolButton->setText("打 开");
    }
}

6 注意事项:当执行打包完成后的文件后可能出现 找不到snap7.dll错误,只需将项目目录下的snap7.dll文件复制到目录下即可。
在这里插入图片描述
在这里插入图片描述
至此,完成项目打包,打包文件可以通过微信等方式发到其他Windows电脑上直接运行。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MK-ZHENG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值