西门子plc S7-1200 由以下几类基本元素组成:
OB:组织块,英文名Organization block。组织块是CPU系统和用户程序之间的接口,可以在CPU上电启动时调用,也可以循环调用,也可以在PLC发生错误时候调用。
DB:数据块,英文名Data block。从字面含义便知主要用于储存用户数据,比如模拟量转换数据,相当于200里面的V区,欧姆龙PLC的W区。
FC:函数,英文名Function。我们常常在FC函数中写一些需要重复执行的代码,可以在程序不同地方调用,可以被OB调用,也可以被FC调用。使用FC可以简化我们需要重复执行的任务,提高代码的运行效率。FC类似于200的子程序。
FB:FC+DB组合,意思是含有DB块的FC函数,与FC的区别是当函数调用结束后,通过Static变量仍然可以保留数值,经常用于调用间的数据共享。
OB组织块
当我们新建一个程序时,系统会自动建立一个Main[OB1]程序,该程序会在PLC的每个扫描周期被调用。Main程序和200里面的主程序,是一个同样的概念。也类似于C里面的Main ,即为函数入口点,我们可以在Main程序里面调用各种函数和块。下面的图是在程序中调用一个FC和FB,然后在FC中调用另外一个FC,形成嵌套调用。
注:<调用fc>、<调用fb>是别名,方便我们记忆和理解,真正的地址在[.....]中,如OB1,FC2,FC1,FB1等等。
Mian程序包含程序段1(NW1)和程序段2(NW2),在Main的调用结构中包含了3个元素test、调用FB和调用FC。其实应该是4个,还有一个嵌套在<调用fc>中,点击<调用fc>左侧箭头,出现如下图所示:
图1 FC嵌套调用
图2 OB分类
分析上图中的OB类型。OB块主要用于程序循环、启动、延时中断、循环中断、硬件中断、HSC中断、诊断错误和时间错误八大事件。OB块还有两个属性是编号和优先级,优先级越高,中断级别越高。在同样的优先级别,OB编号越小,越优先执行。Main程序的地址在OB1,是一个循环运行程序,优先级为1较低。时间错误事件的优先级最高,当发生该事件时,会暂停执行Main程序,优先执行时间错误事件OB块。程序循环OB类块的编号属性为'1;>=123',意为可以创建多个类似OB块。因为新建程序默认OB编号为1,假设创立该事件类型OB块,那么默认编号为123起,同时OB1的执行要优先于OB123。诊断错误事件OB块和时间错误OB块只有一个。
图3 添加OB新块
图4 手动选择创建编号
图4 添加OB新块界面,可以看到,在红色矩形框处,OB编号数值为123,选择的创建方式为自动。如果你想起用别的编号,可以选择手动方式,同时可以选择创建OB块采用的语言。不妨试一试。
这里讲解几个常用的OB类型块使用,其他类型OB块使用,大家可以翻阅系统编程手册。
程序循环事件OB块(program cycle):该块主要用于执行循环运行的程序,一般一个程序中创建一个便可以,就是默认的Main程序(OB1),可以通过调用FC和FB来实现其他功能。系统CPU每个扫描周期都会执行该类型OB块。
启动事件OB块(Startup):该块主要用于初始化变量,当PLC断电重启或者CPU从STOP切换为RUN时候执行,往后不再运行,也就是只运行一次。新建一个DB1块,添加两个,设置初始值。
然后新建一个Startup事件OB块,写如下程序(SCL语言)。
可以看到该类型OB块编号为100,如果再建一个该类型OB块,编号必须>=123。然后下载程序,这里顺便提一下下载选项。
如果是初次下载,选择'硬件和软件(仅更改)'。如果不是初次,可以选择你修改的部分,这样会提高下载速度。
循环中断事件OB块(Cyclic interrupt):常常用于需要定时执行的任务,比如需要1秒钟采样50个模拟值,我们可以把循环时间设置为20毫秒。可能会有人问,为什么不采用普通定时器每隔20毫秒采样一次呢?因为普通定时器会受到CPU扫描周期的影响。在PID程序中,我们需要采用循环中断事件来调整计算PID输出。
在实验程序里,通过INC指令把DB1块里面的变量,每隔1秒加1,运行效果如下:
图5 循环中断事件OB
可以看到在OB30这个程序块里面,'Data'.Var2的值会每隔1秒变化,如果把INC指令放在Main[OB1]里面会是什么情况呢?
诊断错误事件OB块(Diagnostic error interrupt):当PLC发生故障时,会触发该事件;解除故障时,也会触发该事件,在该模块里面,我们可以读到故障信息。
图6 添加诊断错误事件OB块
在实验程序里,我们需要捕捉模拟量输入的溢出错误,所以需要对模拟量输入进行配置,添加溢出诊断功能,AI通道硬件标识符。
在配置硬件组态时,TIA PORTAL 将为每个硬件对象(如模块、接口或模块端口,甚至是智能设备的传输区)自动分配硬件标识符,相当于我们的身份证号码,独一无二。
在诊断程序中,可以获取错误IO状态,硬件标识符和通道,并添加了STP指令。当错误发生时候,使PLC处于STOP状态,若不添加STP指令,PLC仍以RUN状态运行。
通过读取IO_State,LADDR和Channel三个变量,IO状态以二进制格式显示,第4位为1,所以会出现错误。