一、概述说明
工控编程是面向设备的编程,一般很多工程师在编程过程中没有程序架构的意识,所以对于一些CPU的系统功能,一般都是要用的时候才会临时添加一个,比如下图程序,添加了当前程序循环时间以及特定设备的基本信息。
随着工业4.0或者说数字化的时代,工控编程面临着越来越多的信息传递的功能,甚至还能做一些边缘设备用于数据的传递,这对PLC编程来说,需要处理的信息就会越来越复杂。
但PLC不像计算机系统,有很多开放式的库可以用,并且windows系统的万年历等基础功能,在PLC中都不是普遍具备的,这就需要工控编程人员能具备这种意识,在自己程序中创建自己需要的系统数据。
例如在一个大型系统中,MES需要每一个设备都向MES系统表明自己身份,将设备系统的PLC名称、IP、MAC地址等信息发送到MES系统。
若PLC程序中没有这些功能,则需要工程师每一个设备的PLC都要重新编程,或者通过手动方式填写并发送给MES系统,这样效率和代码质量都比较低下。
所以,随着数字化时代的来临,不管工程师具备不具备程序架构的意识,大家都可以在你的程序中实例化一个读取CPU的系统信息的程序块。
借鉴于计算机系统以及PLC系统本身的特点,读取CPU系统信息的功能块至少能达到以下功能:
1. 读取CPU的时钟系统并处理
2. 读取当前CPU的日期信息
3. 读取CPU的运行信息
4. 读取CPU的模块信息
西门子系列PLC的编程中,可以将类信息模块化,做成一个标准程序,其完成的内容和上述描述相同,所以在PLC中建立了数据类型typeSystemInfo用于存储系统信息。
PLC中建立一个全局数据块SystemInfo,该数据块为源自数据类型typeSystemInfo的数据块,用于实例化上述自定义的数据类型。
二、程序块说明
程序块名称
程序中实现上述功能的功能块为FB_SystemInfo,功能块图如下所示
2.2输入接口
i_HwId:CPU系统变量,西门子系列CPU的变量一般为“本地PN接口”。
i_ManualReadInfo:当CPU的***个周期读取CPU的设备信息有故障的情况下,可以通过触发该变量手动读取CPU的设备信息。
i_SystemClockByte:CPU的系统时钟字节,在CPU的设置中设置。
i_SystemClockEnable:默认值为TRUE,当为TRUE的时候,读取CPU的系统时钟信号并处理。
上述两个系统时钟字节的应用需要在CPU的系统和时钟存储器中启用时钟存储器字节,并在时钟存储器字节地址中填上M寄存器的地址,一般默认为0;
由于西门子系列PLC提供了上述的字节,所以程序中也默认启用时钟字节功能。但若在调用功能块的时候,若输入引脚
i_SystemClockByte为空的时候(如下图),即使引脚i_SystemClockEnable为TRUE,程序也不会使用系统时钟,而是使用引脚i_ClockEnable配置的频率生成时钟变量。
i_ClockEnable:数据类型为32个浮点型数组,可以设置***多32个Hz频率。基于西门子CPU的系统时钟提供了8个系统时钟,所以该输入也设置了默认的8个频率,其频率值和西门子PLC自带的一致,如下图Hz频率从0.5-10.0Hz。
2.3输出接口
程序块没有输出接口,所有的逻辑结果都直接在程序中赋值到全局数据块SystemInfo中,所以全局数据块SystemInfo是被绑定在一起,作为程序块的逻辑结果的输出。
三、程序功能说明
模块信息
CPU模块信息主要包括CPU的名字、Mac地址、Ip地址、子网掩码以及网关地址等等,在数据类型中的名字为CPUInfo。
由于CPU的相关信息配置好后,这些数据就不会改变,所以这些信息只会在CPU启动的***个循环周期读取。
当设备信息读取成功或读取出现故障,CPU启动后的***个循环的标志位FirstScan(默认值为TRUE)会被复位。若读取出现故障,设备信息的读取需通过引脚i_ManualReadInfo手动读取。
3.2日期信息
CPU日期信息主要包括各种格式的日期和时间,以及基于日期时间变化的对应的脉冲信号,在数据类型中的名字为Date&TimeInfo和NewDate&TimeInfo。
Date&TimeInfo是各种格式的日期信息;
NewDate&TimeInfo是年、月、日、小时、分钟、秒的脉冲信号,即对应的每一个新的日期或时间发生时候,这些变量会保持一个周期,即对应的脉冲信号。
日期和时间以及对应的脉冲信号,都是基于CPU提供的系统指令RD_LOC_T读取并处理而来。
3.3时钟信息
CPU时钟信息主要包括0.5Hz到10Hz的波形信号以及对应的时间脉冲信号,0.5Hz到10Hz信号对应的脉冲时间基数分别为0.05到1.0秒,在数据类型中的名字为ClockInfo和OnePulse。
时钟信息的处理在程序块的输入引脚中已经有对应的说明,详细请见程序块的说明。
3.4运行信息
CPU运行信息主要包括常开信号、常闭信号、CPU启动后的***个循环以及当前周期的运行时间,在数据类型中的名字为RunInfo。
常开(AlwaysTrue)/常闭信号(AlwaysFalse)在程序中没有处理,保持变量的默认值即可。
CPU启动***个循环周期信号(FirstScan)在CPU设备信息读取中也有说明,就是在程序的***后将firstScan的默认值(TRUE)复位为FALSE,这样改变量为TRUE的时候即CPU启动的***个循环周期。
当前循环周期分为Int和Real两种数据类型,通过PLC提供的系统指令RUNTIME读取当前循环周期时间,并将其转换为不同的数据类型。
四、功能块的使用
由于数据类型中有CPU的***个扫描周期信号(FirstScan),所以该功能块建议放在主循环程序(OB1)末端调用。
放置在***后调用,其他程序中必须在***个启动周期调用的程序就可以通过全局数据块SystemInfo中的变量"SystemInfo".RunInfo.FirstScan来处置。
当然,对于设备程序,也可以在功能块中建立一个静态变量FisrtScan处理,程序和上述类似,将该变量默认值设置为TRUE,在功能块的末端之处将其复位为FLASE,这样就可以通过FirstScan变量处理。
五、功能块的意义
该程序块处理的信息的用处是十分丰富的,这些信息作为整个CPU系统的基本信息,为工控程序中的各种需要提供了便利的处理方式。
CPU模块信息可以直接跟MES系统交换,用于自动表明当前设备系统的身份。当HMI连接多个PLC系统的时候,也可以通过该信息选择对应的PLC操作。
时钟信息可以用于对应的延时处理,默认提供了8种时钟信息及脉冲信号,也可以在输入引脚中设置***多32种时钟信息及脉冲信号。
时钟信息还可以用于不同频率的指示需求,现场指示灯以及HMI上人机交互的状态指示。
日期信息和运行信息,只要在程序中有需求,只要将该类信息赋值给对应的变量即可,不需要再行处理。
对于工控编程,不管是否需要上述信息,都可以把FB_SystemInfo当成一个标准功能块放置在主程序末端,结构化、模块化、标准化,便于程序的使用及效率的提高。
六、后续拓展
上述内容在Sicar的标准架构程序中是初始化程序中实现的功能,但由于汽车行业的特殊性,Sicar中的信息繁多且不便于使用。
上述内容既是Sicar中内容的总结,也是面向对象的架构程序中的基础程序块。对公众号中以往内容有过阅读的话,可以发现基于CPG的面向对象的标准架构程序中一直有FB_SystemInfo的程序块。但该程序块当时只对系统时钟和日期处理过,基于Sicar中的内容,现基本形成了一个新版本的可以实用的FB_SystemInfo的程序内容。
以上只是一个基本信息处理,但由于各个行业的特殊性,西门子PLC还提供了更多的诊断信息用于系统信息的读取。
比如如下的GetClockStatus读取CPU时钟状态,可以读取时钟同步等信息。
比如如下的RT_INFO读取运行系统统计,可以指定不同OB的运行时间、读取OB的当前运行时间、***长***短运行时间等信息。
所以,基于各个行业的特殊性及需要,FB_SystemInfo的内容可以自我定义并形成行业的标准功能块