剖析MELD报警信息提示/存储-解读FB651

描述

FB651 用于 多语言转换

数据库

用于在三种语言之间切换消息视图(数据库视图)和消息归档(数据库归档)中的消息文本。在数据库视图和数据库归档中仅交换包含该字符串的两个长度信息的消息文本(字符串[54])。数据库视图中的所有其他数据和

数据库存档保持不变。

通过相应国家/地区标志中的按钮在HMI上切换语言。

控制器的CPU中每种语言都有八个数据块(TextLib)。每个数据块包含最大1024条消息,长度为54个字符(STRING [54])。

数据块包(每个语言变体1个包,每个DB 8个DB)仅在消息文本的语言上有所不同。结构,结构和消息号/ MsgID相同。

FB802可以最大实现3种语言变体。语言变体最初设置为:

-1:德语

-2:通用语言,例如英语

-3:简体中文

语言变体“ 1:德语”和“ 2:通用”对应于单字节字符(SBC)。简体中文的语言变体需要几(3)个字节来表示一个中文字符。

TextLib的DB号在关联的背景数据块(FB650的STAT区域)中指定为初始值。定义了以下数据库编号:

第一语言   第二语言   第三语言

TextLib:德语,   英文         中文

TextLib0 DB804    DB814      DB824

TextLib1 DB805    DB815      DB825

TextLib2 DB806    DB816      DB826

TextLib3 DB807    DB817      DB827

TextLib4 DB808    DB818      DB828

TextLib5 DB809    DB819      DB829

TextLib6 DB810    DB820      DB830

TextLib7 DB811    DB821      DB831  

Notes DB文本库:

为了避免有关CPU上内存空间的可能瓶颈,“属性->通用部分2”中的DB文本库应具有“非保留”属性/复选标记。DB文本库不必存储在“数据保持存储器”中。

定义FB651,DB:

-----------------------------------------

-与所使用的(目标)语言无关(对于每个中文字符为3Byte的中文),消息文本长度也与字符串40相同。

-TextLib结构保持不变。

因此,对于每种(目标)语言,总是有8个DB TextLib,每个DB TextLib具有1024条消息,消息长度为字符串40。

-DB视图(DB802)包含20条消息。

-DB归档文件(DB803)包含250条消息。

数据库   一直使用的WINCC信息语言

数据库

数据库

FB651 用于信息语言的DB块切换

L     'LMsg'                        

T     #Packet_ID.ID_1            传送字符串'LMsg'到#Packet_ID.ID_1里

U     #Freigabe                  如果有允许条件跳转到 IDOn处

SPB   IDOn

L     'Libs'                     

SPA   IDEn

IDOn: L     '-On-'                       将ON字符串传送到#Packet_ID.ID_2里

IDEn: T     #Packet_ID.ID_2

16#850008a0  =  P#DBX 276.0                  使用的当前地址

L     P##AktGewaehlteSprache

TAR2                             

UD    DW#16#FFFFFF               

+D   

T     #AnfangsAdresse.AktGewaehlteSprache          保存DB651的DBX276.0地址

16#85000920 =  P#DBX 292.0  

L     P##SprachTextLibs

TAR2                             

UD    DW#16#FFFFFF               

+D   

T     #AnfangsAdresse.TextLibs_1_SBC_Deutsch    德语地址

L     P#16.0                           P#DBX308.0

+D   

T     #AnfangsAdresse.TextLibs_2_SBC_Weitere     英语地址

L     P#16.0                         P#DBX324.0

+D   

T     #AnfangsAdresse.TextLibs_3_xBC_ChinaVRC  中文地址

XBC1: LAR1  P##Temp_ANYPOINTER_1        

L     #Konstanten.AnzahlDBsXBC     长度8

T     W [AR1,P#2.0]

L     #AnfangsAdresse.TextLibs_3_xBC_ChinaVRC    存储中文的地址P#DBX324.0

T     D [AR1,P#6.0]     都存在这个ANY类型的变量里

Cop1: L     B#16#10                    

T     B [AR1,P#0.0]

L     B#16#5                 INT    

T     B [AR1,P#1.0]

L     #IDB_Nummer           DB651      

T     W [AR1,P#4.0]

P# DB651 .DBX324.0 INT 8

CALL  "BLKMOV"    SFC20 数据传输

SRCBLK :=#Temp_ANYPOINTER_1     将 P# DB651 .DBX324.0 INT 8 的数据发出

RET_VAL:=#SFCParameter.SFC20View_BLKMOV

DSTBLK :=#AktGewaehlteSprache   传到P# DB651 .DBX292.0 INT 8

CALL  "BLKMOV"

SRCBLK :=#AktGewaehlteSprache         发送P# DB651 .DBX292.0 INT 8 的数据

RET_VAL:=#SFCParameter.SFC20View_BLKMOV

DSTBLK :=#Temp_ANYPOINTER_2   传到P# DB650 .DBX2.0 INT 8 用来改变语言

FB650:  语言转换MeldeFB

使用此功能块,将在中央消息归档和中央报告角度中输入块功能块的消息。

该块通常是称为DB650的单独的实例数据块。

数据库

该块针对用户程序集中执行一次,FB“ MeldeFB”不具有多实例功能,因此需要一个背景数据块。该功能块用于在中央消息归档和中央消息视图中输入来自模块FB的消息。

输入参数:

COM_RST:该信号是重启信号,并与注释“ restart”相连。

文本Lib0到文本Lib3:在此指定生成的文本库。库DB的符号名称应作为参数值(例如“ TextLib0”)。必须互连所有四个参数。

画面Meldeanzeige  是显示DB802里的内容

数据库

画面Meldearchiv_250  是显示DB803里的内容

数据库

通道参数:

MsgV:此参数绝对必要,因为所有当前打开的消息都在此输入,并且可以由可视化系统显示。

MsgQ:用于建立与实际消息通道的连接,通过指定UDT类型为“ MsgQueue”的DB,可以评估ModulFB提供的缓冲区。

MsgA:如果需要归档,则必须提供类型为“ MsgArchive”的消息归档DB。该归档文件包含一个1000元素的纯文本消息环形缓冲区。

DB801 信息缓冲

DB802 信息观看

DB803 信息档案

FC650 信息传输MeldSend

DB804-DB811 德语报警数据库由SiVArc 生成

DB814-DB821中文报警数据库由SiVArc 生成

LAR1  P##TextLib0                 // TextLib0地址 例如: DB814

L     DIW [AR1,P#0.0]             // TextLib0 保存DB814

T     #DBNr  保存DB块号

SPA   FLiS  跳转到FliS   -----找到的TextLib的DB号

FLiS: L     #DBNr                    814

L     0                           //判断DB块是否是0

<>I  

SPBN  DTX4

如果DB块是0 去这步DTX4: LAR1  P##UnDef 保存没有报警信息号

数据库

AUF   DB [#DBNr]                  //打开DB块DB814    

L     1

BIS6: T     #Index_S                   //搜索二进制文件的索引

L     DBW    8                    //最大消息数1024

数据库

<=i  

SPBN  EBS6

L     #Index_S

+     -1

L     #Konstanten.GroesseFeldInTextLib    // TextLib中字段元素的大小(以字节为单位)初始值是62   

+     L#10

SLD   3

LAR1                              //消息条目上的AR1

L     DBD [AR1,P#0.0]             // TextLib的field元素中消息的ID

L     #MSG_ID                     //要搜索的消息ID

数据库

<>D  

U(   

L     DBD [AR1,P#0.0]             // TextLib的field元素中消息的ID

L     0

<>D  

)    

SPBN  EBS6                        //结束搜寻

L     #MSG_ID

L     DBD [AR1,P#0.0]             // extLib的field元素中消息的ID

>D                                //搜索的元素大于当前元素

L     #Index_S

SLD   1                           //Index_S := 2 * Index_S

SPBN  BIS6                        //左移

+     1                           //Index_S := 2 * Index_S + 1

SPA   BIS6                       //右移

------伤脑筋的一集,德国大众的标准程序总是喜欢跳来跳去.但是逻辑性的稳定性很好,这个块我接触了7年,还没出过漏洞.

编辑:jq

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分