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的屏幕上查看效果
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 D-Space!