一、 核心原理:循环扫描与信号流
西门子PLC的数据运算并非像通用计算机那样“随时响应”,而是建立在循环扫描(Scan Cycle) 的严格逻辑之上。这是理解其一切运算行为的基石。
工作原理简述:
1. 输入采样阶段:PLC在扫描周期的起点,一次性、同步地读取所有物理输入模块的状态(如按钮、传感器信号),并将其锁存到内存中一个特定的区域——过程映像输入区(PII)。在此周期内,即使外部输入信号变化,PII内的数据也保持不变,保证了本周期运算基础的一致性。
2. 程序执行阶段:这是数据运算的核心阶段。CPU从用户程序的第一条指令开始,至上而下、从左至右逐条执行。程序指令(如触点、线圈、数学指令)的运算,其读取的输入数据来源于PII,产生的输出和中间结果则写入到过程映像输出区(PIQ)或内部存储区(M、DB等)。运算严格按照程序顺序执行,形成确定的信号流。
3. 输出刷新阶段:当所有用户程序执行完毕后,CPU将过程映像输出区(PIQ) 中的数据一次性、同步地传送至物理输出模块,驱动继电器、指示灯、阀门等实际设备。
关键点:这种“批处理”模式隔离了外部信号的不稳定波动,确保了程序逻辑执行的确定性和稳定性。所有数据运算都发生在这个受控的、循环的软件环境中。
二、 数据存储方式:地址与类型化存储
西门子PLC采用绝对地址与符号地址结合,以及强类型化的存储管理方式。
1. 存储区分类:
· 过程映像区(I/Q):
· 输入映像区(I):对应物理输入。在程序中使用I0.0(位)、IW2(字)、ID4(双字)等地址访问。运算时主要从此区读取外部信号状态。
· 输出映像区(Q):对应物理输出。使用Q0.0、QW10等地址访问。运算的最终结果写入此区,等待输出刷新。
· 位存储区(M):内部标志位存储器,相当于中间继电器。用于存储程序运算中的中间状态、标志位。地址如M0.0, MB10。
· 数据块(DB):最重要的数据存储区域。分为全局数据块(所有逻辑块可访问)和背景数据块(关联特定功能块FB)。
· 结构化存储:在数据块中,可以预先定义变量,包括变量名(符号)、数据类型(如Bool, Int, Real, Array, Struct等)、初始值和注释。例如,在DB1中定义一个名为Setpoint_Temperature的Real型变量。
· 访问方式:DB1.DBX0.0(绝对地址访问位), DB1.Setpoint_Temperature(符号名访问,推荐),或使用指针/间接寻址进行动态访问。
· 临时存储区(L):存在于局部数据堆栈(L Stack)中,仅在所属的逻辑块(FC, FB, OB)执行期间有效,用于存储块内运算的中间临时变量。块执行结束后,其内容可能被覆盖。
· 外设地址(P)与位存储区(P):允许直接访问物理I/O模块,绕过过程映像区,用于高速或立即读写,但一般编程中较少直接使用。
2. 数据类型化存储:
每个存储单元都关联着特定的数据类型(Data Type)。这是运算正确性的关键。
· 基本数据类型:位(Bool)、字节(Byte)、字(Word)、双字(DWord)、整数(Int,16位)、双整数(DInt,32位)、实数(Real,32位浮点数)等。不同的数据类型占用不同长度(如一个Real占4个字节)和具有不同的值域。
· 复合数据类型:数组(Array)、结构(Struct)、字符串(String)等,用于组织复杂数据。
· 重要性:运算指令对操作数的数据类型有严格规定。例如,整数加法指令(ADD_I)要求两个输入和一个输出都是Int类型。若将Word类型数据直接送入,虽然位模式相同,但解释规则不同(无符号 vs 有符号),可能导致不一样的运算结果。因此,数据类型转换(如Word_to_Int)是编程中的常见操作。
三、 数据运算方法:指令与程序执行
运算通过用户程序中的指令实现,这些指令在扫描周期的程序执行阶段被顺序处理。
1. 运算指令的层级与分类:
· 基本逻辑运算:基于位(BOOL)的与(AND)、或(OR)、非(NOT)、异或(XOR)等,通过梯形图的触点串并联或语句表的逻辑指令实现。操作数多为I, Q, M, DBX的位地址。
· 比较运算:用于整数、浮点数等的等于(==)、不等于(<>)、大于(>)、小于(<)等。结果为布尔值(TRUE/FALSE),用于控制程序流。
· 算术运算:
· 整数运算:加(ADD)、减(SUB)、乘(MUL)、除(DIV)、取模(MOD)等,有Int和DInt版本。
· 浮点数运算:用于Real类型数据,实现更精确的数学计算。在TIA Portal中,通常使用“计算指令”(CALCULATE)或函数(FC)进行包含Real的复杂公式计算。
· 递增/递减:对整数进行加1/减1操作。
· 移动与转换运算:
· 移动(MOVE):在不同存储地址间复制数据。MOVE指令会根据目标变量的数据类型自动进行长度适配和部分类型转换。
· 转换(CONVERT):显式地在不同类型间转换,如Int_to_Real、Real_to_Int(舍入)。这是保证运算精度和正确性的关键步骤,尤其在整数与浮点数混合运算时。
· 函数与函数块运算:
· 函数(FC):无静态存储区的子程序,通常用于执行通用的计算任务(如计算一个圆的面积)。输入输出参数通过接口传递,运算结果通过输出参数或返回值给出。内部使用临时变量(L区)。
· 函数块(FB):有关联背景数据块(Instance DB)的子程序,具有记忆功能。用于封装具有特定状态或模式的复杂运算(如PID控制器、电机驱动器)。每次调用指定一个独有的背景DB,用于保存其内部状态(静态变量)。这是实现模块化、可重用运算逻辑的核心。
· 高级运算:通过调用系统函数(SFC/SFB)或库指令,实现移位、循环、定时、计数、寻址、通信等更复杂的运算和控制功能。
2. 运算流程示例(以温度控制为例):
1. 信号输入:模拟量输入模块将温度传感器的4-20mA信号转换为一个数字量(例如,0-27648),在输入采样阶段被存入IW100(假设地址)。
2. 数据转换与规格化:在程序执行阶段,指令首先将IW100中的Word值通过Word_to_Int和DI_I(或直接使用Word_to_Real)转换为Real型工程量值(如 0.0 - 100.0 °C),存入DB10.Actual_Temp。
3. 设定值比较:从DB10.Setpoint_Temp读取设定值(Real),与DB10.Actual_Temp进行浮点数比较(CMP >R),结果(Bool)存入M10.0(过热标志)。
4. PID运算:调用一个PID控制函数块(如FB41),指定其背景数据块为DB41。将DB10.Actual_Temp和DB10.Setpoint_Temp作为输入传递给FB41。FB41在其背景DBDB41中保存积分、微分等历史数据,执行PID算法,运算出一个Real型的输出量,写入DB41.Output。
5. 输出处理:将DB41.Output(0.0 - 100.0%)通过Real_to_Word转换,并缩放到QW200(对应模拟量输出模块的地址)。
6. 输出刷新:在输出刷新阶段,将QW200中的值发送到模拟量输出模块,驱动调节阀。
总结
西门子PLC的数据运算是一个在确定性循环扫描框架下,通过类型化、地址化的存储系统,由CPU顺序执行用户程序指令来实现的完整过程。其核心特点是:
· 确定性:循环扫描保证了程序行为的可预测。
· 模块化:通过FC、FB和DB,将复杂运算封装成可重用的功能单元。
· 安全性:严格的数据类型和存储区隔离,防止了非法访问和误操作。
· 工程友好:符号寻址和数据类型化,使得程序更易于编写、阅读和维护。
理解存储(在哪里、以何种形式)、指令(做什么、有何要求)和扫描周期(何时做)这三者的关系,就掌握了西门子PLC数据运算的精髓。