首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >有没有感觉PLC编程和计算机IT编程越来越接近了?

有没有感觉PLC编程和计算机IT编程越来越接近了?

作者头像
Hello工控
发布2026-01-22 14:10:34
发布2026-01-22 14:10:34
1000
举报
文章被收录于专栏:Hello工控Hello工控

不知道各位工控行业中PLC编程的工程师体会到没有,PLC编程不再是简单的逻辑运算了。

有很多朋友都去搞上位机,殊不知,最开始的PLC编程里面也慢慢融合C++等高级语言里面的编程技术了。

在这次深刻研读IEC 61131-3标准第4版本里面,有更深刻的体会。我们本以为搞搞梯形图、简单的图表式编程就够了,如果想继续发展,有一部分确实是全能型人才,C#、C++、Python等等语言都学习了,并独立开发项目。

目前,看来是一个非常明显的趋势。PLC不仅没有停滞,反而奔着AI化、虚拟化、云端化、边缘化等方向发展。

一文搞懂Hard PLC、Soft PLC和Virtual PLC(vPLC)!

我们详细的和大家分享下最新标准里面的更新的部分内容,看看大家如何感想?

我们在PLC里面的Fuction Block在第4版本里面可以用Class类来实现。具体说来:

  • FUNCTION BLOCK ... END_FUCTION_BLOK 被CLASS...END_CLASS关键字进行代替。
  • 面向对象的编程技术更加逼近IT。毕竟方法、属性、继承、重载等术语都是IT最开始应用,目前趋势完全搬到PLC的编程语言中。
  • ST语言是一门必须要学习的语言了,毕竟梯形图做不了下表这里面的细节。

实际的CLASS示例如下:

代码语言:javascript
复制
CLASS CCounter
VAR
  m_iCurrentValue: INT; (* Default = 0 *)
  m_bCountUp: BOOL:= TRUE;
END_VAR

VAR PUBLIC
 m_iUpperLimit: INT:= +10000;
 m_iLowerLimit: INT:= -10000;
END_VAR
METHOD Count (* Only body *)
 IF (m_bCountUp AND m_iCurrentValue < m_iUpperLimit) THEN
   m_iCurrentValue:= m_iCurrentValue+1;
 END_IF;
 IF (NOT m_bCountUp AND m_iCurrentValue > m_iLowerLimit) THEN
   m_iCurrentValue:= m_iCurrentValue-1;
 END_IF;
END_METHOD

METHOD SetDirection
VAR_INPUT 
  bCountUp: BOOL;
END_VAR
  m_bCountUp:= bCountUp;
END_METHOD

END_CLASS

怎么样?我们看看C++语言:

代码语言:javascript
复制
// CCounter.hpp - C++头文件
#ifndef CCOUNTER_HPP
#define CCOUNTER_HPP

class CCounter {
private:
    // 私有成员变量(对应VAR区域)
    int m_iCurrentValue;
    bool m_bCountUp;

public:
    // 公共成员变量(对应VAR PUBLIC区域)
    int m_iUpperLimit;
    int m_iLowerLimit;

    // 构造函数(带默认参数)
    CCounter(int initialValue = 0, bool countUp = true, 
             int upperLimit = 10000, int lowerLimit = -10000);

    // 公共方法
    void Count();                           // 计数操作
    void SetDirection(bool bCountUp);       // 设置计数方向

    // Getter方法(提供私有成员的受控访问)
    int GetCurrentValue() const;
    bool GetDirection() const;

    // 显示当前状态
    void DisplayStatus() const;
};

#endif // CCOUNTER_HPP
代码语言:javascript
复制
// CCounter.cpp - C++实现文件
#include "CCounter.hpp"
#include <iostream>

// 构造函数实现
CCounter::CCounter(int initialValue, bool countUp, int upperLimit, int lowerLimit)
    : m_iCurrentValue(initialValue),
      m_bCountUp(countUp),
      m_iUpperLimit(upperLimit),
      m_iLowerLimit(lowerLimit) {
    std::cout << "CCounter对象已创建,初始值: " << m_iCurrentValue << std::endl;
}

// 计数方法实现
void CCounter::Count() {
    if (m_bCountUp && m_iCurrentValue < m_iUpperLimit) {
        m_iCurrentValue = m_iCurrentValue + 1;
    }
    if (!m_bCountUp && m_iCurrentValue > m_iLowerLimit) {
        m_iCurrentValue = m_iCurrentValue - 1;
    }
}

// 设置方向方法
void CCounter::SetDirection(bool bCountUp) {
    m_bCountUp = bCountUp;
}

// Getter方法实现
int CCounter::GetCurrentValue() const {
    return m_iCurrentValue;
}

bool CCounter::GetDirection() const {
    return m_bCountUp;
}

// 显示状态
void CCounter::DisplayStatus() const {
    std::cout << "当前值: " << m_iCurrentValue 
              << " | 方向: " << (m_bCountUp ? "向上" : "向下")
              << " | 范围: [" << m_iLowerLimit << ", " << m_iUpperLimit << "]"
              << std::endl;
}
代码语言:javascript
复制
// main.cpp - 使用示例
#include <iostream>
#include "CCounter.hpp"

int main() {
    std::cout << "=== PLC CCounter类C++实现示例 ===" << std::endl;

    // 1. 使用默认构造函数
    std::cout << "\n1. 创建默认计数器:" << std::endl;
    CCounter counter1;
    counter1.DisplayStatus();

    // 执行计数
    for (int i = 0; i < 5; i++) {
        counter1.Count();
    }
    std::cout << "计数5次后: ";
    counter1.DisplayStatus();

    // 2. 使用带参数的构造函数
    std::cout << "\n2. 创建自定义计数器:" << std::endl;
    CCounter counter2(50, false, 100, 0); // 初始值50,向下计数,上限100,下限0
    counter2.DisplayStatus();

    // 3. 改变方向并计数
    std::cout << "\n3. 改变计数方向并操作:" << std::endl;
    counter2.SetDirection(true); // 改为向上计数
    counter2.Count();
    std::cout << "改变方向后计数1次: ";
    counter2.DisplayStatus();

    // 4. 直接访问公共成员(对应VAR PUBLIC)
    std::cout << "\n4. 修改公共成员变量:" << std::endl;
    std::cout << "原上限: " << counter2.m_iUpperLimit << std::endl;
    counter2.m_iUpperLimit = 80; // 直接修改公共变量
    std::cout << "新上限: " << counter2.m_iUpperLimit << std::endl;

    // 5. 通过Getter访问私有成员
    std::cout << "\n5. 通过Getter访问私有成员:" << std::endl;
    std::cout << "当前值(通过Getter): " << counter2.GetCurrentValue() << std::endl;
    std::cout << "方向(通过Getter): " << (counter2.GetDirection() ? "向上" : "向下") << std::endl;

    // 6. 测试边界条件
    std::cout << "\n6. 测试边界条件:" << std::endl;
    CCounter counter3(99, true, 100, 0);
    counter3.DisplayStatus();
    counter3.Count(); // 应该增加到100
    std::cout << "计数到上限后: ";
    counter3.DisplayStatus();
    counter3.Count(); // 应该保持100(已达上限)
    std::cout << "再次尝试计数: ";
    counter3.DisplayStatus();

    return 0;
}

从这两个代码来看,PLC编程的ST代码相对来说更为简易些,也符合我们编程的原则,毕竟越简单越易读。

基本上这种面向对象的编程方式,肯定是下一代PLC要更新的内容,毕竟最新的IEC标准都已经颁布了。就看哪一个PLC厂商最先基于第4版标准出来的产品。

从工业控制来看,我们追求的还是确定性、实时性、可靠性和对物理世界的直接控制。这是我们编程的核心。

所以,既然是趋势,我们可以学习下这个精髓,慢慢融入到实际项目中。特别是在AI时代,这种趋势更加明显,且真正解放我们PLC编程人员,不再为了基础代码发愁,把更多时间投入到架构、工艺等更有价值的工作中去。

最后,大家可以留言区畅所欲言,谈谈自己的感受以及分享使用更高级的编程经验哦!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hello工控 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档