不知道各位工控行业中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类来实现。具体说来:

实际的CLASS示例如下:
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++语言:
// 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// 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;
}// 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编程人员,不再为了基础代码发愁,把更多时间投入到架构、工艺等更有价值的工作中去。
最后,大家可以留言区畅所欲言,谈谈自己的感受以及分享使用更高级的编程经验哦!