马上注册,享受更多特权
您需要 登录 才可以下载或查看,没有帐号?立即注册 ![](source/plugin/zhanmishu_wechat/template/static/img/wechat_login.png)
x
以下文章来源于壶琰棠 ,作者壶琰棠主。
在您开启阅读前,当然希望您已经阅读了以下内容: 【重磅】标准程序架构的发布(基于ISA88的CPG库) 标准程序架构说明1:主程序及程序分类 标准程序架构说明2:控制对象说明 对于整个程序架构,希望能用文字真正让大家熟悉并能理解。
图3‑1 :控制对象程序模型图 上图是前文中描述的设备程序模型,该模型是基于西门子的CPG库(基于ISA88)的程序整理而来,也是我们整个标准程序架构中EM层级设备的标准程序模型。
从本内容开始,将会对上述程序模型中的各个部分做详细说明,包括各个部分的内容定义、程序中的数据类型、程序中的实际数据块、设备程序中该部分内容的详细程序说明等。
3.1. identity说明
Identity即为设备的ID或者说设备的编码,用于表面设备的身份或位置,一般用于设备属性和信息的前缀。比如某个设备的电机出现故障,你不能只说电机有故障,必须在电机前表明该电机属于哪一台设备,这样的信息才有意义。
Identity的定义需要有一个原则,而基于这个原则定义的Identity必须是唯一的,唯一的Identity让信息和实际设备捆绑在一起,这样的信息才是有意义的,且也便于精准定位到设备以及设备的相关信息。
此时,就会有人说,只是要唯一的话,那无所谓规则,我将设备的Identity自动加一即可,比如A0001一直到A9999,一个设备或者项目中的对象肯定不会超过一万个吧。
所以,Identity除了唯一性以外,还需要有一定的实际意义,比如Identity可以表明设备的用途,或者可以表明设备的位置区域,这样定义的Identity才是有规律且唯一的。
标准程序架构是基于西门子的CPG程序库,该程序库是基于ISA88的PackML的标准,所以标准程序架构中的设备名称是按照设备分层原则取名,比如UN01_EM01设备的Identity即为UN01_EM01,再加上ProcessCell的编码,这样可以保证所有设备的Identity都是唯一的,也能通过名称可以得知设备的位置区域(ProcessCell是指某个设备或者项目,UN就是不同的功能区域,EM是功能区域中不同的设备),这也是OMAC设备分层原理的意义之一。
OMAC设备分层的原理请参考如下两个文章: 基于OMAC的设备标准化(PLC)应用(1) OMAC设备分层原理说明
一般的设备类型类似的流水线(比如全是输送机),将设备分层编码作为设备的Identity是可行的,因为都是一样的设备只能通过编码识别。
其他带有工艺功能的设备就无法如此,设备的Identity必须带上一些表达工艺功能的字符,这样才能理解。
所以,程序中Identity是设备的编码定义,设备的实际名称或者信息的前缀则是Identity变量的实际值。
3.2. Identity的数据类型
为正确表示设备的Identity,标准程序架构中建立了名称为typeIdentity的自定义数据类型,其数据结构如下:
图3‑2 :typeIdentity数据结构示意图
typeIdentity数据结构里面包括两个长度为10的字符串,下标0为中文字符,下标1为英文字符,用于程序中信息前缀。
CPG程序中是预定了三种语言,但结合国内的实际,一般只需要用到中文和英文就足够了,所以标准程序架构中所有信息的表达,包括Identity的字符串都只有英文和中文可选。
3.3. Identity的全局数据块
程序中定义了一个名称为Identity的全局的数据块(Data Block),用于存储所有设备的Identity,每一个设备Identity的数据类型都是typeIdentity。 图3‑3 : Identity数据块示意图 数据类型typeIdentity中变量的默认值为空,全局数据块中的起始值可以自己依据实际设备的编码(英文)或者名称(中文)手动填写在全局数据块Identity中对应的位置上,比如上图中下标为0中的起始值“211原纸架”和下标为1中的起始值“PF211”。
若设备的英文名称不需要实际意义的英文字符,那标准架构程序中编写了自动赋值下标1的英文字符的起始值的程序。
3.4. FC_MesPrefixGenerate
功能: 自动生成Identity的英文字符串,并赋值到全局数据块Identity中对应设备下标为1的起始值。
标准程序中建立一个名字为FC_MesPrefixGenerate的函数,MesPrefixGenerate即Message Prefix Generate,其中Mes是英文Message的惯用缩写方式,该函数的位置在Function文件夹的子文件夹Event中。
注:中文字符串没有规律,所以程序无法自动生成,需要手动填写。 图3‑4: 函数块位置示意图
FC_MesPrefixGenerate的返回类型为String,输入引脚只有一个数据类型为Variant的名称为i_SymbolName,没有其他的形参(形式参数,一般指FC或FB的输入、输出、输入输出三种引脚)。
FC_MesPrefixGenerate的程序中使用Portal提供的指令GetSymbolName读取输入形参的名字,然后将读取到的字符串中的DB块的信息去除,即可得到该形参的实际字符名称,并将该名称赋值给函数的返回值。
图3‑5: Identity自动赋值程序示意图
对于任意设备的英文字符串,只需要调用一次函数FC_MesPrefixGenerate即可将其英文字符自动赋值到全局数据块中。
3.5. FC_MesPrefixInitialize
标准程序架构中定义了函数FC_MesPrefixInitialize,用于收集所有设备的Identity编码的英文字符串自动赋值程序的程序。FC_MesPrefixInitialize没有返回值,也没有任何形参。
由于设备的名称一旦确定则不会改变,所以所有设备英文字符串的程序只需要在CPU启动的第一个循环周期执行,其他循环周期不需要执行,提高了CPU的使用效率。
图3‑6: 所有设备Identity自动赋值程序示意图
如上图显示,FC_MesPrefixInitialize有一个示例程序,设备名称为UN01_EM01,程序执行后,全局数据块Identity中UN01_EM01的下标1的初始值为“UN01_EM01”,其他更多设备的程序则按照示例依次调用并填写好实参即可。
观察上图可以看到,其他设备的程序只有UNXX_EMXX不一样,而一台设备或者项目的设计定型后,设备或者项目中的UN的数量以及UN中的EM数量即是确定的,所以对于所有设备的程序可以借助其他软件,通过改变UNXX_EMXX中的数字即可快速实现,且不会遗漏设备。
3.6. FB_EM_Model中的Identity
FB_EM_Model有一个数据类型为typeIdentity名称为i_Identity的输入引脚,用于将实际设备的Identity传递到设备程序内部。
图3‑7: FB_EM_Model的Identity引脚示意图
设备编码一旦确定(设计阶段就确定)基本不会改变,所以Identity的程序只在首次扫描的时候执行,不占用正常运行时候的CPU资源。
FB_EM_Model程序中建立一个s_ EMNames的静态变量,用于存储当前设备的Identity的信息,后续需要设备信息前缀的或者名称的,只要将该变量和信息连接起来即可。
图3‑8 : s_EMNames变量示意图
在“初始化数据”Region(区间)中首先判断当前的语言选择,然后再将数据块(DB)中相对应的字符复制给静态变量s_EMNames,后续程序中该变量就能获取设备Identity。
图3‑9 : s_EMNames程序示意图
备注:在判断当前语言的程序里可以看到,语言的选择是在全局数据块-Parameters中的变量System.Language来选择的,该变量默认为FALSE是中文字符,TRUE则为英文字符。
图3‑10 :系统语言选择配置示意图
3.7. Identity总结图3‑11:Identity程序实现示意图
标准程序架构中的Identity的结构如上图,定义Identity的数据类型typeIdentity,通过全局数据块Identity管理所有设备的Identity,再将该变量填在实际设备程序的形参引脚(引脚名称为:i_Identity)实现整个标准程序架构中Identity的数据管理、程序实现。
若设备的英文名称字符不需要实际含义,那可以通过FC_MesPrefixGenerate函数自动将设备分层的代码赋值到全局数据块中的起始值。
|