S7环境下PLC通讯编程方法

一、设置PLC并启动PLC

// 设置PLC连接
MinthPlc::getInstance ()->setDB (15);             /*!< 修改了mDBNumber成员变量的值 */
MinthPlc::getInstance ()->setPlc ("192.168.10.2", "0", "0");

// 开启PLC线程,开始读写周期
MinthPlc::getInstance ()->start ();

二、读取PLC中的变量

步骤:

  • 1、在handleReadWrite函数中获取对应的PLC变量值
  • 2、通过转换大端序到小端序得到正确的值
  • 3、存入全局成员变量

例子:

1.在MinthPlc 中定义成员变量

以下代码在MinthPlc.h中的MinthPlc类中定义:

private:
    float mCurSpeed;                            /*!< 读取到的PLC中的速度值 */

    int mDBNumber;                              /*!< DB号,就是DB15.D174 中的DB15 D174代表首地址在174,大小为4字节*/

    QString mRack;                              /*!< PLC Rack号 一般填0即可 */

    QString mSlot;                              /*!< PLC Slot号 一般填0即可 */

    QString mIp;                                /*!< PLC所在的网络IP地址 */    

public:
    float getSpeed () const
    {
        return mCurSpeed;
    }

2.读取PLC的值,这里以读取首地址174,大小为4字节的数据为例

以下代码在handleReadWrite中编写:

mDBNumber = 15;                                 /*!< 指定读取DB15 */

void *data = malloc (sizeof (float));           /*!< 浮点数占4个字节 */
mClient->DBRead (mDBNumber, 174, 4,data);

float targetData = 0.0;
memcpy(&targetData, data, sizeof(float));       /*!< 将读到的数据转换为float类型 */

mSpeedRecv = qToBigEndian(targetData);          /*!< 读取数据,将读到的数据从大端序转成小端序,才可以正常读取 */

free (data);                                    /*!< 使用完申请内存之后需要及时释放 */

3.在业务中读取值

float speed = MinthPlc::getInstance ()->getSpeed ();

可以打印出来查看效果。

三、写入PLC变量值

步骤:

  • 1.先到MinthPlc这个类的定义中增加两个私密成员变量,分别是:
    1、控制写入变量的信号 
    2、要设置的值
    
  • 2.编写写入PLC变量的方法
  • 3.在业务中调取写入PLC变量

1.增加写入变量使用定义

以下代码在MinthPlc.h中的MinthPlc类中定义:

private:
    bool mChangeSpeed;                          /*!< 控制写入变量的开关 */
    float mSpeed;                               /*!< 要写入的值 */

public:
    void setSpeed (float value)
    {
        mSpeed = value;                         /*!< 设置写入值 */
        mChangeSpeed = true;                    /*!< 打开该变量的写入开关 */
    }

2.写入PLC变量,这里以写入 DB15.DBD138为例(即DB号15,首地址138,大小4个字节)

以下代码在handleReadWrite中编写:

if (mChangeSpeed) {
    void * data = malloc (sizeof(float));       /*!< 分配一个4字节的内存空间 */
    qToBigEndian(mSpeedSend, data);             /*!< 将本地值转换为大端值写入 */ 

    mDBNumber = 15;
    mClient->DBWrite (mDBNumber, 138, 4, data); /*!< 写入首地址138,大小为4字节的区域 */
    
    mChangeSpeed = false;                       /*!< 写入开关置0,防止重复写入 */
    free (data);                                /*!< 释放临时申请的内存 */
}

3.在业务中调用写入速度

MinthPlc::getInstance ()->setSpeed (6.32);

调用之后,在当前读取周期到下一个周期内会生效,可以去PLC的屏幕上查看效果