Qt/C++ 西门子S7通讯

记录一下在用Qt封装snap7.h。实际运行中遇到的问题及解决方法。

问题

1.在ubuntu20.04中运行遇到了通讯突然断线问题,并且无法重新连接。网卡崩溃。经排查是网卡驱动不兼容导致的。可以先查看自己的硬件配置。

sudo apt update

sudo lshw -C network

sudo rmmod r8169

apt search 8168

sudo apt-get install r8168-dkms

reboot

#ifndef CONNECTSNAP7_H
#define CONNECTSNAP7_H

#include <QObject>
#include <QDebug>
#include <QTimer>
#include <QThread>
#include <QtEndian>
#include "snap7.h"
#include <math.h>
#include <QQueue>


#define CN7 ConnectSnap7::returnCN7()

class ConnectSnap7 : public QObject
{
    Q_OBJECT

signals:

    void updateUI();

    void Start();

public slots:
    void set_gain_data();   //批量获取数据

    void RcvMsg();

public:
    explicit ConnectSnap7(QObject *parent = nullptr);

    static ConnectSnap7 *returnCN7();

    bool connectS7();

    void disConnectS7();

    bool Get_Stauts();


public:  // Read
    QByteArray DBReadNew(int piece, int beginbyte, int endbyte);
    void Read(int DBNumber, int Start, int Amount,void *pUsrData);

    float floatFromBigEndian(QByteArray data);
    short charFromBigEndian(QByteArray data);
    short toShort(QByteArray ary);
    int toInt(QByteArray ary);


public:  // Write
    void DBWriteNew(QByteArray data, int address, int piece);
    void Write(int DBNumber, int Start, int Size, QByteArray ary);

    QByteArray floatBigendian(float input);
    QByteArray intBigendian(int input);
    QByteArray charBigendian(short input);

    void set_s7_value(QString DBNumber, bool data);
    QByteArray get_s7_value_core(QString DBNumber, int wordlen = 1);
    void set_s7_value_core(QString DBNumber, int wordlen = 1, QByteArray data = {});

    void Set_DB46(QByteArray data);


public:
    TS7Client *_client;

    QString ipaddr;

    int reg;
};

#endif // CONNECTSNAP7_H

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值