• 正文
  • 相关推荐
申请入驻 产业图谱

大众VASS标准:FB_Pruefziffer(FB170)校验数据功能块深度解读

09/08 10:50
85
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

前几天我们对大众VASS标准:FB_Sick_RFU(FB520_RFID数据读取)功能块进行了深度解读,读出来的数据需要使用FB_Pruefziffer(FB170)对数据进行校验是否正确。

大众VASS标准:FB_Sick_RFU(FB520_RFID数据读取)功能块深度解读

FB_Pruefziffer(FB170)是西门子 SCL 编写的校验位功能块,支持 Code 2/5、Code 39 和 CRC16 三种校验算法。通过配置字_Cfg 选择校验方式及模式,可实现校验位计算、输入校验位验证,或仅验证数据有效性。

功能块接收待校验数据指针、输入校验位、数据起始地址与长度等参数,经算法处理后输出计算的校验位、校验结果(通过 / 不通过)及选中的校验方式。包含可视化交互逻辑,可显示数据、校验位及状态,并通过消息系统报告故障(如数据长度为 0、无效数据等),支持链式故障传递。

功能块:

HMI界面:

功能块程序结构大纲:

1.?**功能块基本信息**

-?名称、版本、用途(校验位计算与校验)、适用标准(VASS)。

2.?**变量声明**

-?输入变量:控制信号(Start)、配置(_Cfg)、数据参数(Pruefdaten等)。

-?输出变量:校验结果(Pruef_IO)、计算的校验位(PruefZiff_Out)、状态指示(Anwahl_*)。

-?输入输出变量:消息缓冲区(ST_Meld)。

-?临时变量:数据处理(Buffer)、校验计算(iCheckSum2of5等)、可视化(strVisutext_*)。

3.?**核心逻辑**

-?配置解析:_Cfg位映射为校验方式。

-?输入控制:可视化按键检测与无过程模式切换。

-?初始化:可视化文本与校验结果清空。

-?校验处理:

-?Code?2/5:数据校验→加权求和→模10计算→对比。

-?Code?39:数据校验→求和→模43计算→对比。

-?CRC16:查表法计算→高低位拆分→对比。

-?结果输出:校验通过/不通过(Pruef_IO/NIO)、无效数据指示。

4.?**辅助功能**

-?故障处理:本地故障与链式故障汇总。

-?消息系统:故障信息发送至消息缓冲区。

-?可视化:文本显示与按钮/指示灯状态控制。

下面是对FB_Pruefziffer功能块的逐行详细解读,包含代码和对应的解释:

(******************************************************************************************* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?**** ?Copyright ?2011? ? ? ? ? ? SIEMENS AG I IA&DT, D-90475?Nuernberg ? ? ? ? ? ? ? ? ? **** ?All Rights Reserved ? ? ? ? VOLKSWAGEN AG,?38436?Wolfsburg ? ? ? ? ? ? ? ? ? ? ? ? ?**** ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?AUDI AG, D-85045?Ingolstadt ? ? ? ? ? ? ? ? ? ? ? ? ? ? **** ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?********************************************************************************************** ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?**** Aenderungsjournal ?: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?********************************************************************************************** Datum ? ?Version ? ? ? ?Autor ? ? ? ?Beschreibung ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?**------------------------------------------------------------------------------------------?24.02.17? ??3.0.00? ? ? ? Schulz ? ? ? Uebernahme in VASS_Standard*****************************************************************************************)// 定义功能块FB_Pruefziffer,编号为170,用于校验位计算与验证FUNCTION_BLOCK FB_Pruefziffer ? ?//FB 170TITLE ? =?'Version 3.0.00'? ? ??// 功能块标题,显示版本信息VERSION :?'3.0'? ? ? ? ? ? ? ? ?// 功能块版本号AUTHOR ?: VASS_V05 ? ? ? ? ? ? ?// 作者信息NAME ? ?: PRUEFZIF ? ? ? ? ? ? ?// 功能块名称FAMILY ?: PRUEFZIF ? ? ? ? ? ? ?// 功能块所属家族// 输入变量声明区VAR_INPUT? ? Start ? ? ? : BOOL;?// Pruefziffern Berechnung durchfuehren?? ? ? ? ? ? ? ? ? ? ? ?// 启动信号:触发校验位计算? ??? ? Frg_Start ? : BOOL;?// Freigabe Vorwahl Start auf VISU? ? ? ? ? ? ? ? ? ? ? ?// 可视化界面启动许可:允许从可视化界面启动校验? ??? ? Frg_oProz ? : BOOL;?// Freigabe Vorwahl ohne Prozess? ? ? ? ? ? ? ? ? ? ? ?// 无过程模式许可:允许切换到无过程模式? ??? ? Pruefdaten ?: ANY; ?// Pruefdaten Pointer ? ?? ? ? ? ? ? ? ? ? ? ? ?// 校验数据:指向待校验数据的指针? ??? ? PruefZiff1_In : BYTE;?// Eingabe zu pruefende Pruefziffer 1 (Hoeheres Byte)? ? ? ? ? ? ? ? ? ? ? ?// 输入校验位1:待验证的高位校验字节? ??? ? PruefZiff2_In : BYTE;?// Eingabe zu pruefende Pruefziffer 2 (niedrigeres Byte)? ? ? ? ? ? ? ? ? ? ? ?// 输入校验位2:待验证的低位校验字节? ??? ? DatenAnfang : INT; ?// Startadresse? ? ? ? ? ? ? ? ? ? ? ?// 数据起始地址:校验数据的起始位置? ??? ? DatenLaenge : INT; ?// Anzahl zu pruefender Daten? ? ? ? ? ? ? ? ? ? ? ?// 数据长度:待校验数据的字节数? ??? ? _Cfg ? ? ? ?: WORD;?//x0: C2/5 x1: C39 x2: nur Pruefziffer x3: CRC16 x4: CRC16 nur Pruefziffer?? ? ? ? ? ? ? ? ? ? ? ?// 配置字:用于选择校验算法和工作模式? ??(**SIEMENS********************Anfang Variablendeklaration*************************************)(***********fuer bit-,?byte-, wordgranulare Sicht von Variablen mit dem AT-Befehl**************) ? ?// 使用AT关键字将配置字_Cfg映射为结构体,便于按位访问Cfg AT _Cfg: STRUCT ? ? ? ?// WORD -> BOOL? ? X8 ? ? ? ? : BOOL; ? ?// 配置位8? ? X9 ? ? ? ? : BOOL; ? ?// 配置位9? ? X10 ? ? ? ?: BOOL; ? ?// 配置位10? ? X11 ? ? ? ?: BOOL; ? ?// 配置位11? ? X12 ? ? ? ?: BOOL; ? ?// 配置位12? ? X13 ? ? ? ?: BOOL; ? ?// 配置位13? ? X14 ? ? ? ?: BOOL; ? ?// 配置位14? ? X15 ? ? ? ?: BOOL; ? ?// 配置位15? ? X0 ? ? ? ? : BOOL; ?//Code 2/5 Modulo10?? ? ? ? ? ? ? ? ? ? ? ? ?// 配置位0:启用Code 2/5(模10)校验? ? X1 ? ? ? ? : BOOL; ?//Code 39 Modulo43? ? ? ? ? ? ? ? ? ? ? ? ?// 配置位1:启用Code 39(模43)校验? ? X2 ? ? ? ? : BOOL; ?//fuer Code 2/5 und Code 39 0:kontrollieren und berechnete Pruefziffer ausgeben,? ? ? ? ? ? ? ? ? ? ? ? ?//1: nur kontrollieren ob gueltige Pruefdaten vorliegen und berechnete Pruefziffer ausgeben? ? ? ? ? ? ? ? ? ? ? ? ?// 配置位2:对于Code 2/5和Code 39,0=验证并输出计算的校验位,1=仅验证数据有效性并输出校验位? ? X3 ? ? ? ? : BOOL; ?//Code CRC16 Genibus (Ausgabe 2x8Bit)kontrollieren und berechnete Pruefziffer ausgeben? ? ? ? ? ? ? ? ? ? ? ? ?// 配置位3:启用CRC16 Genibus校验(输出2个8位字节)? ? X4 ? ? ? ? : BOOL; ?//fuer Code CRC16 ?0:kontrollieren und berechnete Pruefziffer ausgeben,1: nur berechnete Pruefziffer ausgeben ? ?? ? ? ? ? ? ? ? ? ? ? ? ?// 配置位4:对于CRC16,0=验证并输出计算的校验位,1=仅输出计算的校验位? ? X5 ? ? ? ? : BOOL; ??// 配置位5 ? ? ??? ? X6 ? ? ? ? : BOOL; ??// 配置位6? ? X7 ? ? ? ? : BOOL; ??// 配置位7END_STRUCT;VkStoe_In ? ? ? : BOOL; ? ? ? ? ? ??// Sammelstoerung verkettet mit VkStoe_Out ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 链式故障输入:与链式故障输出级联(**SIEMENS**********************Ende Variablendeklaration*************************************)(***********fuer bit-,?byte-, wordgranulare Sicht von Variablen mit dem AT-Befehl**************)END_VAR// 输出变量声明区VAR_OUTPUT? ? PruefZiff1_Out ? ? ?: BYTE;?// berechnete Pruefziffer1 ausgeben (Hoeheres Byte)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 输出校验位1:计算得到的高位校验字节? ??? ? PruefZiff2_Out ? ? ?: BYTE;?// berechnete Pruefziffer2 ausgeben (niedrigeres Byte)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 输出校验位2:计算得到的低位校验字节? ??? ? oProz ? ? ? ? ? ? ? : BOOL;?// Vorwahl ohne Prozess/Ohne Berechnung? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 无过程模式:预选无过程/无计算模式? ??? ? Pruef_IO ? ? ? ? ? ?: BOOL;?// Pruefziffer PruefZiff_In passt zu Pruefdaten ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 校验通过:输入校验位与校验数据匹配? ??? ? Pruef_NIO ? ? ? ? ? : BOOL;?// Pruefziffer PruefZiff_In passt nicht zu Pruefdaten?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 校验不通过:输入校验位与校验数据不匹配? ??? ? Anwahl_Pruef_Code2_5: BOOL;?// Pruefung Code 2/5 Modulo10 parametriert? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// Code 2/5选中:已配置Code 2/5模10校验? ??? ? Anwahl_Pruef_C39 ? ?: BOOL;?// Pruefung Code 39 Modulo43 parametriert ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// Code 39选中:已配置Code 39模43校验? ??? ? Anwahl_Pruef_CRC16 ?: BOOL;?// Pruefung Code CRC16 Genibus parametriert? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// CRC16选中:已配置CRC16 Genibus校验? ??? ? Pruef_Auswahl_IO ? ?: BOOL;?// (Nur) eine Pruefung ausgewaehlt? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 校验选择有效:(仅)选中一种校验方式? ??? ? Invalide_Pruefdaten : BOOL;?// Pruefdaten enthalten ungueltige Werte-->Pruefziffer nicht berechenbar? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 无效校验数据:校验数据包含无效值,无法计算校验位? ??? ? Stoexx ? ? ?: BOOL;?// Sammelstoerung?? ? ? ? ? ? ? ? ? ? ? ?// 汇总故障:本地故障信号? ??? ? VkStoe_Out ?: BOOL;?// Verkettete Stoerung?? ? ? ? ? ? ? ? ? ? ? ?// 链式故障输出:级联后的故障信号END_VAR// 输入输出变量声明区(可读写)VAR_IN_OUT? ? ST_Meld ? ? : Meldungspuffer; ??// Meldestruktur?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 消息缓冲区:用于存储和传递消息结构END_VAR(**SIEMENS****************************************************************************)// 临时变量声明区(仅在功能块内部使用,不保留状态)VAR_Temp? ? erg_SFC20 ? ? ? :INT;// Rueckgabewert SFC20? ? ? ? ? ? ? ? ? ? ? ? ?// SFC20返回值:块移动指令的返回值? ??? ? _pMeldFeld ? ? ?:ANY;?// Hilfsvariable? ? ? ? ? ? ? ? ? ? ? ? ?// 消息字段指针:辅助变量? ??? ? pMeldFeld AT _pMeldFeld: STRUCT?? ? ? ? BYTE0 ? ? ? :BYTE; ?// Byte 0?? ? ? ? TYP ? ? ? ? :BYTE; ?// Byte 1 ? ? ? ?Daten/Parametertyp?? ? ? ? ANZ ? ? ? ? :WORD; ?// Byte 2+3 ? ? ?Laenge der Variablen?? ? ? ? DBNR ? ? ? ?:WORD; ?// Byte 4+5 ? ? ?DB-Nummer?? ? ? ? BZ ? ? ? ? ?:DWORD;?// Byte 6 bis 10 Bereichszeiger?? ? END_STRUCT;?? ? ? ? ? ? ? ? ? ? ? ? ?// 使用AT关键字将_pMeldFeld映射为结构体,便于访问消息字段的各个部分? ? _pMeldAbb ? ? ?:ANY;?// Hilfsvariable? ? ? ? ? ? ? ? ? ? ? ? ?// 消息确认指针:辅助变量? ??? ? pMeldAbb AT _pMeldAbb: STRUCT?? ? ? ? BYTE0 ? ? ? :BYTE; ?// Byte 0?? ? ? ? TYP ? ? ? ? :BYTE; ?// Byte 1 ? ? ? ?Daten/Parametertyp?? ? ? ? ANZ ? ? ? ? :WORD; ?// Byte 2+3 ? ? ?Laenge der Variablen?? ? ? ? DBNR ? ? ? ?:WORD; ?// Byte 4+5 ? ? ?DB-Nummer?? ? ? ? BZ ? ? ? ? ?:DWORD;?// Byte 6 bis 10 Bereichszeiger?? ? END_STRUCT;? ? ? ? ? ? ? ? ? ? ? ? ?// 使用AT关键字将_pMeldAbb映射为结构体,便于访问消息确认的各个部分? ? _pMeld :ANY;?// Hilfsvariable? ? ? ? ? ? ? ? ?// 消息指针:辅助变量? ??? ? pMeld AT _pMeld: STRUCT?? ? ? ? BYTE0 ? ? ? :BYTE; ?// Byte 0?? ? ? ? TYP ? ? ? ? :BYTE; ?// Byte 1 ? ? ? ?Daten/Parametertyp?? ? ? ? ANZ ? ? ? ? :WORD; ?// Byte 2+3 ? ? ?Laenge der Variablen?? ? ? ? DBNR ? ? ? ?:WORD; ?// Byte 4+5 ? ? ?DB-Nummer?? ? ? ? BZ ? ? ? ? ?:DWORD;?// Byte 6 bis 10 Bereichszeiger?? ? END_STRUCT;? ? ? ? ? ? ? ? ?// 使用AT关键字将_pMeld映射为结构体,便于访问消息的各个部分? ??? ? DATA_IN_T ? ? ? ? ? ? ? : ANY;?//Kopie von DATA_IN?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 数据输入副本:DATA_IN的副本? ??? ? p_DATA_IN AT DATA_IN_T: STRUCT?? ? ? ? ? ? ? ? SyntaxId ? ?: BYTE; ? ? ? ??//Byte 0?? ? ? ? ? ? ? ? DataType ? ?: BYTE; ? ? ? ??//Byte 1 ? ? ? ?Daten/Parametertyp?? ? ? ? ? ? ? ? DataCount ? : WORD; ? ? ? ??//Byte 2+3 ? ? ?Laenge der Variablen?? ? ? ? ? ? ? ? DBNR ? ? ? ?: WORD; ? ? ? ??//Byte 4+5 ? ? ?DB-Nummer?? ? ? ? ? ? ? ? BZ ? ? ? ? ?: DWORD; ? ? ? ?//Byte 6 bis 10 Bereichszeiger?? ? ? ? END_STRUCT;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 使用AT关键字将DATA_IN_T映射为结构体,解析数据输入的信息?END_VAR(************************************************************************************)// 变量声明区(保留状态)VAR? ? _dwVisuWerte1 ? : DWORD;?// Statusdoppelword 1 an VISU?? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 可视化状态双字1:发送到可视化界面的状态信息? ??? ? strVisutext_1_32 ? ? ? ? : ARRAY [1..34] OF BYTE ?;//STRING Visu Pruefdaten Zeichen ?1 bis 32? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 可视化文本1-32:可视化界面显示的校验数据字符1到32? ??? ? strVisutext_33_64 ? ? ? ?: ARRAY [1..34] OF BYTE ?;//STRING Visu Pruefdaten Zeichen 33 bis 64? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 可视化文本33-64:可视化界面显示的校验数据字符33到64? ??? ? strVisutext_Ziffer ? ? ? : ARRAY [1..4] OF BYTE ? ;//STRING Visu Pruefziffern? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 可视化校验位文本:可视化界面显示的校验位? ??? ? _Visutext_Ziffer_Hex ? ? : WORD; ? ? ? ? ? ? ? ? ??//strVisutext_Ziffer als Hex? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 可视化校验位十六进制:校验位的十六进制表示? ??? ? bVisuTasten ? ? : BYTE; ?// Softkeys von VISU?? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 可视化按键:来自可视化界面的软键输入? ??(**SIEMENS************************************************************************************)(*****************************Anfang Variablendeklaration*************************************)(*********************************fuers Meldesystem********************************************)(*********************************************************************************************)? ? MeldFeld : STRUCT?? ? ? ? b0 : Byte;? ? ? ? b1 : Byte;? ? ? ? b2 : Byte;? ? ? ? b3 : Byte;? ? END_STRUCT;? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 消息字段:存储消息相关信息? ??? ? MSYS AT MeldFeld: STRUCT?? ? ? ? xF_1 ? : BOOL;? ? ? ? xF_2 ? : BOOL;?? ? ? ? xF_3 ? : BOOL;?? ? ? ? xF_4 ? : BOOL;?? ? ? ? xF_5 ? : BOOL;? ? ? ? xF_6 ? : BOOL;? ? ? ? xF_7 ? : BOOL;?? ? ? ? xF_8 ? : BOOL;? ? ? ? xF_9 ? : BOOL;? ? ? ? xF_10 ?: BOOL;? ? ? ? xF_11 ?: BOOL;? ? ? ? xF_12 ?: BOOL;? ? ? ? xF_13 ?: BOOL;? ? ? ? xF_14 ?: BOOL;?? ? ? ? xF_15 ?: BOOL;?? ? ? ? xF_16 ?: BOOL;? ? ? ? xF_17 ?: BOOL;?? ? ? ? xF_18 ?: BOOL;?? ? ? ? xF_19 ?: BOOL;?? ? ? ? xF_20 ?: BOOL;?? ? ? ? xF_21 ?: BOOL;?? ? ? ? xF_22 ?: BOOL;?? ? ? ? xF_23 ?: BOOL;?? ? ? ? xF_24 ?: BOOL;?? ? ? ? xF_25 ?: BOOL;?? ? ? ? xF_26 ?: BOOL;?? ? ? ? xF_27 ?: BOOL;?? ? ? ? xF_28 ?: BOOL;?? ? ? ? xF_29 ?: BOOL;?? ? ? ? xF_30 ?: BOOL;?? ? ? ? xF_31 ?: BOOL;?? ? ? ? xF_32 ?: BOOL;?? ? END_STRUCT;? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 使用AT关键字将MeldFeld映射为结构体,每个位表示一种故障状态? ??? ? MeldAbb : STRUCT ? ? ? ?? ? ? ? b0 : Byte;? ? ? ? b1 : Byte;? ? ? ? b2 : Byte;? ? ? ? b3 : Byte;? ? END_STRUCT;? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 消息确认:存储消息确认相关信息? ??? ? AenderungsID : STRUCT? ? ? ? SNr ? ?: WORD;? ? ? ? ANr ? ?: BYTE;? ? ? ? Detail : BYTE;? ? END_STRUCT;? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 变更ID:用于标识消息的变更信息? ??? ? Integritaet : BOOL;? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 完整性:消息完整性标志(**SIEMENS************************************************************************************)(*****************************Ende Variablendeklaration***************************************)(*********************************fuers Meldesystem********************************************)(*********************************************************************************************)(**SIEMENS********************Anfang Variablendeklaration*************************************)(***********fuer bit-,?byte-, wordgranulare Sicht von Variablen mit dem AT-Befehl**************)// 使用AT关键字将_dwVisuWerte1映射为结构体,便于访问可视化状态的各个位dwVisuWerte1 AT _dwVisuWerte1: STRUCT ? ? ? ? ? ? ? ?// DWORD -> BOOL? ? B3 ? ? ?: BYTE ;//VISU Button Start ?? ? ? ? ? ? ? ? ? ?// 可视化按钮Start:控制Start按钮的显示? ? B2 ? ? ?: BYTE ;//VISU Button Ohne? ? ? ? ? ? ? ? ? ?// 可视化按钮Ohne:控制Ohne按钮的显示? ? X8 ? ? ?: BOOL ;//? ? X9 ? ? ?: BOOL ;//? ? X10 ? ? : BOOL ;//? ? X11 ? ? : BOOL ;//? ? X12 ? ? : BOOL ;//? ? X13 ? ? : BOOL ;//? ? X14 ? ? : BOOL ;//? ? X15 ? ? : BOOL ;//? ? X0 ? ? ?: BOOL ;//? ? X1 ? ? ?: BOOL ;//? ? X2 ? ? ?: BOOL ;//? ? X3 ? ? ?: BOOL ;//? ? X4 ? ? ?: BOOL ;// ? ??? ? X5 ? ? ?: BOOL ;//? ? X6 ? ? ?: BOOL ;//? ? X7 ? ? ?: BOOL ;//END_STRUCT;// 使用AT关键字将_Visutext_Ziffer_Hex映射为结构体,拆分为两个字节Visutext_Ziffer_Hex AT _Visutext_Ziffer_Hex: STRUCT ?//strVisutext_Ziffer als Hex? ? B1 : BYTE;? ? B2 : BYTE;END_STRUCT;(**SIEMENS**********************Ende Variablendeklaration*************************************)(***********fuer bit-,?byte-, wordgranulare Sicht von Variablen mit dem AT-Befehl**************)? ? xCfg_0 ? ? ?: BOOL;?// 配置位0的副本 ?? ? xCfg_1 ? ? ?: BOOL;?// 配置位1的副本 ?? ? xCfg_2 ? ? ?: BOOL;?// 配置位2的副本 ?? ? xCfg_3 ? ? ?: BOOL;?// 配置位3的副本?? ? xCfg_4 ? ? ?: BOOL;?// 配置位4的副本?? ? xCfg_5 ? ? ?: BOOL;?// 配置位5的副本?? ? xCfg_6 ? ? ?: BOOL;?// 配置位6的副本?? ? xCfg_7 ? ? ?: BOOL;?// 配置位7的副本 ?? ? xCfg_8 ? ? ?: BOOL;?// 配置位8的副本?? ? iHM_Zaehler1 ? ? ? ? ? ?: INT; ? ? ? ? ? ? ? ? ?//Laufvariable? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 循环变量1:用于循环计数? ? iHM_Zaehler2 ? ? ? ? ? ?: INT; ? ? ? ? ? ? ? ? ?//Laufvariable? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 循环变量2:用于循环计数? ? iLaenge ? ? ? ? ? ? ? ? : INT; ? ? ? ? ? ? ? ? ?//Codelaenge? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 代码长度:存储代码长度信息? ? Buffer ? ? ? ? ? ? ? ? ?: ARRAY [0..68] OF BYTE;//Buffer + Pruefziffer? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 缓冲区:存储数据和校验位? ? arrCode_pos ? ? ? ? ? ? : ARRAY [0..68] OF INT;?//Codedatensatz + Pruefziffer? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 代码位置数组:存储转换后的代码数据和校验位? ? iCheckSum2of5 ? ? ? ? ? : INT; ? ? ? ? ? ? ? ? ?//Checksumme Code 2of5? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// Code 2/5校验和:用于Code 2/5算法? ? iMOD_39 ? ? ? ? ? ? ? ? : INT; ? ? ? ? ? ? ? ? ?//Modulofunktion Code 39? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// Code 39模运算结果:用于Code 39算法? ? iCharCode39 ? ? ? ? ? ? : INT; ? ? ? ? ? ? ? ? ?//CharCode39? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// Code 39字符代码:用于Code 39算法? ? xF_Invalide_Daten_C2x5 ?: BOOL; ? ? ? ? ? ? ? ??//Fehler Falsche Daten? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// Code 2/5无效数据:标记Code 2/5的无效数据? ? xF_Invalide_Daten_C39 ? : BOOL; ? ? ? ? ? ? ? ??//Fehler Falsche Daten? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// Code 39无效数据:标记Code 39的无效数据? ? xF_Invalide_Daten_CRC16 : BOOL; ? ? ? ? ? ? ? ??//Fehler Falsche Daten? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// CRC16无效数据:标记CRC16的无效数据? ? xF_PruefdatenKopie ? ? ?: BOOL; ? ? ? ? ? ? ? ??//Pruefdaten nicht einlesbar? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 校验数据复制错误:标记校验数据无法读取? ? Pruefende ? ? ? ? ? ? ? : INT; ? ? ? ? ? ? ? ? ?//Letztes Zeichen, das geprueft werden soll? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 校验结束位置:需要校验的最后一个字符位置? ? iPaFe_Pruefdaten ? ? ? ?: INT; ? ? ? ? ? ? ? ? ?//parametrierfehler beim Kopieren der Pruefdaten ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 校验数据复制参数错误:复制校验数据时的参数错误? ? iFM ? ? ? ? ? ? ? ? ? ? : BOOL; ? ? ? ? ? ? ? ??//FM? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 功能标志:用于标记某些功能状态? ? xS_Start ? ? ? ? ? ? ? ?: BOOL; ? ? ? ? ? ? ? ??//Visu Tasten Lesen? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// Start信号:读取可视化按钮的Start信号? ? xS_OProz ? ? ? ? ? ? ? ?: BOOL; ? ? ? ? ? ? ? ??//Visu Tasten Ohne Prozess? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 无过程信号:读取可视化按钮的无过程信号? ? R_TRIG_oProz ? ? ? ? ? ?: STRUCT ? ? ? ? ? ? ? ?//Positive Flanke ohne Prozess? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 无过程上升沿触发器:检测无过程信号的上升沿? ? ? ? Edge : BOOL; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??// 边沿:存储上一周期的状态? ? ? ? Q ? ?: BOOL; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??// 输出:上升沿检测输出? ? END_STRUCT;? ? R_TRIG_Start ? ? ? ? ? ?: STRUCT ? ? ? ? ? ? ? ?//Positive Flanke Start? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// Start上升沿触发器:检测Start信号的上升沿? ? ? ? Edge : BOOL; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??// 边沿:存储上一周期的状态? ? ? ? Q ? ?: BOOL; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??// 输出:上升沿检测输出? ? END_STRUCT;? ? chrPZ ? ? ? ? ? ? ? ? ? : CHAR; ? ? ? ??//Berechnete Pruefziffer? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 校验位字符:计算得到的校验位字符? ? iDatenLaenge_max32 ? ? ?: INT; ? ? ? ? ?//Datenlaenge auf maximal 32 gesetzt, wenn > 32? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 最大32的数据长度:当数据长度>32时设为32? ??// CRC16查找表1:用于CRC16算法计算? ? CRCTable1 : ARRAY [0..127] OF WORD :=?? ??16#0000,16#1021,16#2042,16#3063,16#4084,16#50a5,16#60c6,16#70e7,? ??16#8108,16#9129,16#a14a,16#b16b,16#c18c,16#d1ad,16#e1ce,16#f1ef,? ??16#1231,16#0210,16#3273,16#2252,16#52b5,16#4294,16#72f7,16#62d6,? ??16#9339,16#8318,16#b37b,16#a35a,16#d3bd,16#c39c,16#f3ff,16#e3de,? ??16#2462,16#3443,16#0420,16#1401,16#64e6,16#74c7,16#44a4,16#5485,? ??16#a56a,16#b54b,16#8528,16#9509,16#e5ee,16#f5cf,16#c5ac,16#d58d,? ??16#3653,16#2672,16#1611,16#0630,16#76d7,16#66f6,16#5695,16#46b4,? ??16#b75b,16#a77a,16#9719,16#8738,16#f7df,16#e7fe,16#d79d,16#c7bc,? ??16#48c4,16#58e5,16#6886,16#78a7,16#0840,16#1861,16#2802,16#3823,? ??16#c9cc,16#d9ed,16#e98e,16#f9af,16#8948,16#9969,16#a90a,16#b92b,? ??16#5af5,16#4ad4,16#7ab7,16#6a96,16#1a71,16#0a50,16#3a33,16#2a12,? ??16#dbfd,16#cbdc,16#fbbf,16#eb9e,16#9b79,16#8b58,16#bb3b,16#ab1a,? ??16#6ca6,16#7c87,16#4ce4,16#5cc5,16#2c22,16#3c03,16#0c60,16#1c41,? ??16#edae,16#fd8f,16#cdec,16#ddcd,16#ad2a,16#bd0b,16#8d68,16#9d49,? ??16#7e97,16#6eb6,16#5ed5,16#4ef4,16#3e13,16#2e32,16#1e51,16#0e70,? ??16#ff9f,16#efbe,16#dfdd,16#cffc,16#bf1b,16#af3a,16#9f59,16#8f78;? ??? ??// CRC16查找表2:用于CRC16算法计算? ? CRCTable2 : ARRAY [0..127] OF WORD :=?? ??16#9188,16#81a9,16#b1ca,16#a1eb,16#d10c,16#c12d,16#f14e,16#e16f,? ??16#1080,16#00a1,16#30c2,16#20e3,16#5004,16#4025,16#7046,16#6067,? ??16#83b9,16#9398,16#a3fb,16#b3da,16#c33d,16#d31c,16#e37f,16#f35e,? ??16#02b1,16#1290,16#22f3,16#32d2,16#4235,16#5214,16#6277,16#7256,? ??16#b5ea,16#a5cb,16#95a8,16#8589,16#f56e,16#e54f,16#d52c,16#c50d,? ??16#34e2,16#24c3,16#14a0,16#0481,16#7466,16#6447,16#5424,16#4405,? ??16#a7db,16#b7fa,16#8799,16#97b8,16#e75f,16#f77e,16#c71d,16#d73c,? ??16#26d3,16#36f2,16#0691,16#16b0,16#6657,16#7676,16#4615,16#5634,? ??16#d94c,16#c96d,16#f90e,16#e92f,16#99c8,16#89e9,16#b98a,16#a9ab,? ??16#5844,16#4865,16#7806,16#6827,16#18c0,16#08e1,16#3882,16#28a3,? ??16#cb7d,16#db5c,16#eb3f,16#fb1e,16#8bf9,16#9bd8,16#abbb,16#bb9a,? ??16#4a75,16#5a54,16#6a37,16#7a16,16#0af1,16#1ad0,16#2ab3,16#3a92,? ??16#fd2e,16#ed0f,16#dd6c,16#cd4d,16#bdaa,16#ad8b,16#9de8,16#8dc9,? ??16#7c26,16#6c07,16#5c64,16#4c45,16#3ca2,16#2c83,16#1ce0,16#0cc1,? ??16#ef1f,16#ff3e,16#cf5d,16#df7c,16#af9b,16#bfba,16#8fd9,16#9ff8,? ??16#6e17,16#7e36,16#4e55,16#5e74,16#2e93,16#3eb2,16#0ed1,16#1ef0;? ??? ? EndAddr : DWORD; ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 结束地址:存储数据结束地址? ??? ? iCRCIndex : INT;?// Calculated CRC index into CRC lookup tables? ? ? ? ? ? ? ? ? ? ?// CRC索引:计算得到的CRC查找表索引? ? wCRCTemp : WORD;?// CRC临时变量:用于CRC计算的临时变量? ? _wCRC : WORD; ? ?// CRC结果:存储最终的CRC结果? ??? ??// 使用AT关键字将_wCRC映射为结构体,拆分为两个字节? ? wCRC AT _wCRC : STRUCT? ? ? ? B1 : BYTE; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 字节1:CRC结果的高位字节? ? ? ? B2 : BYTE; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 字节2:CRC结果的低位字节? ? END_STRUCT; ?? ? ? ??END_VAR(*----------------------------------------------------------------------------------*)(*Dieser Baustein berechnet Pruefn anhand der Eingabedaten. Die Auswahl des Pruefverfahrens?wird ueber cfg. Bits eingestellt*)(*此功能块根据输入数据计算校验位。校验方法的选择通过配置位设置*)(*----------------------------------------------------------------------------------*)(*Konfiguration auswerten*)(*解析配置*)xCfg_0 ? ?:= Cfg.X0;?// 配置位0:Code 2/5使能xCfg_1 ? ?:= Cfg.X1;?// 配置位1:Code 39使能xCfg_2 ? ?:= Cfg.X2;?// 配置位2:校验位验证模式xCfg_3 ? ?:= Cfg.X3;?// 配置位3:CRC16使能xCfg_4 ? ?:= Cfg.X4;?// 配置位4:CRC16验证模式xCfg_5 ? ?:= Cfg.X5;?// 配置位5xCfg_6 ? ?:= Cfg.X6;?// 配置位6xCfg_7 ? ?:= Cfg.X7;?// 配置位7xCfg_8 ? ?:= Cfg.X8;?// 配置位8(*----------------------------------------------------------------------------------*)(* Tasten von Visu pruefen *)(*检查来自可视化界面的按键*)// 如果PC未激活,则将可视化按键设为0IF PC_AKTIV=DWORD#16#00000000?THEN bVisuTasten := Byte#0;?END_IF;// 定义Start信号:当可视化按键为1,且启动许可有效,且不在无过程模式xS_Start:=(bVisutasten = Byte#1) AND Frg_Start AND NOT oProz;// 定义无过程信号:当可视化按键为2,且无过程许可有效xS_oProz:=(bVisutasten = Byte#2) AND Frg_oProz;(* Pruefung starten *)(*启动校验*)// 检测Start信号的上升沿R_TRIG_Start.Q ? ?:= xS_Start AND NOT R_TRIG_Start.Edge;R_TRIG_Start.Edge := xS_Start;?(* An-/Abwahl ohne Prozess *)(*切换无过程模式*)// 检测无过程信号的上升沿R_TRIG_oProz.Q ? ? ?:= xS_OProz AND NOT R_TRIG_oProz.Edge;R_TRIG_oProz.Edge ? := xS_OProz;// 当检测到无过程信号的上升沿且无过程许可有效时,切换无过程模式状态IF R_TRIG_oProz.Q AND Frg_OProz THEN? ? oProz := NOT oProz;END_IF;// 暂时注释掉的代码:将输入校验位直接输出//PruefZiff1_Out := PruefZiff1_In;//PruefZiff2_Out := PruefZiff2_In;// 输出选中的校验方式Anwahl_Pruef_Code2_5 := xCfg_0; ??// Code 2/5选中标志Anwahl_Pruef_C39 ? ? := xCfg_1; ??// Code 39选中标志Anwahl_Pruef_CRC16 ? := xCfg_3; ??// CRC16选中标志// 检查是否只选择了一种校验方式(通过异或运算)Pruef_Auswahl_IO := (xCfg_0 XOR xCfg_1 XOR xCfg_3);// 初始化Buffer[0] :=?66; ?// 缓冲区初始化// 设置可视化文本的最大长度strVisutext_1_32[1] ? ? :=?32;?// 前32个字符的最大长度strVisutext_33_64[1] ? ?:=?32;?// 33-64个字符的最大长度strVisutext_Ziffer[1] ? :=?2; ?// 校验位的最大长度// 当没有Start按钮按下且没有Start信号时,清空可视化文本和校验结果IF NOT xS_Start AND NOT Start THEN ? ? ?? ? strVisutext_1_32[2] ? ? :=?0; ?// 前32个字符的实际长度设为0? ? strVisutext_33_64[2] ? ?:=?0; ?// 33-64个字符的实际长度设为0? ? strVisutext_Ziffer[2] ? :=?0; ?// 校验位的实际长度设为0? ? Pruef_IO ? ? ? ? ? ? ? ?:= FALSE;?// 校验通过标志设为FALSE? ? Pruef_NIO ? ? ? ? ? ? ? := FALSE;?// 校验不通过标志设为FALSE? ? xF_Invalide_Daten_C2x5 ?:= FALSE;?// Code 2/5无效数据标志设为FALSE? ? xF_Invalide_Daten_C39 ? := FALSE;?// Code 39无效数据标志设为FALSE? ? _Visutext_Ziffer_Hex ? ? :=?0; ?// 校验位的十六进制表示设为0END_IF;// 如果处于无过程模式,则直接设置校验通过IF oProz THEN? ? Pruef_IO := TRUE; ? ?// 如果数据长度大于0,且有Start上升沿或Start信号,且不在无过程模式,且校验方式选择有效ELSIF DatenLaenge >?0?AND (R_TRIG_Start.Q OR Start) AND NOT oProz AND Pruef_Auswahl_IO THEN? ??// 初始化可视化校验位文本? ? strVisutext_Ziffer[3] ? :=?20;?// 空格? ? strVisutext_Ziffer[4] ? :=?20;?// 空格? ? Pruef_IO := FALSE; ? ? ? ? ? ?// 校验通过标志设为FALSE? ? Pruef_NIO := FALSE; ? ? ? ? ??// 校验不通过标志设为FALSE? ??? ??// 读取校验数据到缓冲区? ? Byte_String(Start ? ? ? := DatenAnfang,?? ? ? ? ? ? ? ? Ende ? ? ? ?:= ( DatenAnfang + DatenLaenge -?1?),?? ? ? ? ? ? ? ? DATA_IN ? ? := Pruefdaten ,?? ? ? ? ? ? ? ? DATA_OUT ? ?:= Buffer,?? ? ? ? ? ? ? ? PaFE ? ? ? ?:= iPaFe_Pruefdaten,?? ? ? ? ? ? ? ? FM ? ? ? ? ?:= iFM);? ??// 如果复制过程有参数错误,则设置校验数据复制错误标志? ? xF_PruefdatenKopie := iPaFe_Pruefdaten >?0;? ? ? ??? ??// 将输入的校验位添加到缓冲区? ? Buffer[2?+ DatenLaenge] := PruefZiff1_In;? ? Buffer[2?+ DatenLaenge +?1] := PruefZiff2_In;? ??? ??// 设置可视化校验位文本的长度? ? strVisutext_Ziffer[2] :=?1;?// 实际长度设为1? ??// strVisutext_Ziffer[3] := Buffer[2 + DatenLaenge];? ??? ??// 初始化可视化文本的实际长度? ? strVisutext_1_32[2] :=?0;? ? strVisutext_33_64[2] :=?0;? ??? ??// 处理前32个字符的可视化文本? ? IF DatenLaenge >?0?AND DatenLaenge <?65?THEN? ? ? ??// 如果数据长度大于32,则最大显示32个字符? ? ? ? IF DatenLaenge >?32?THEN ? ?? ? ? ? ? ? iDatenLaenge_max32 :=?32;? ? ? ? ELSE? ? ? ? ? ? iDatenLaenge_max32 := DatenLaenge;? ? ? ? END_IF;? ? ?? ? ? ??// 复制数据到可视化文本缓冲区? ? ? ? Byte_String(Start ? ? ? := DatenAnfang, ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? Ende ? ? ? ?:= ( DatenAnfang + iDatenLaenge_max32 -?1),?? ? ? ? ? ? ? ? ? ? DATA_IN ? ? := Pruefdaten ,?? ? ? ? ? ? ? ? ? ? DATA_OUT ? ?:= strVisutext_1_32,?? ? ? ? ? ? ? ? ? ? PaFE ? ? ? ?:= iPaFe_Pruefdaten,?? ? ? ? ? ? ? ? ? ? FM ? ? ? ? ?:= iFM);? ? ? ??// 如果复制过程有参数错误,则设置校验数据复制错误标志? ? ? ? xF_PruefdatenKopie := xF_PruefdatenKopie OR iPaFe_Pruefdaten >?0; ? ?? ? END_IF;? ??// 处理33-64个字符的可视化文本? ? IF DatenLaenge >?32?AND DatenLaenge <?65?THEN? ? ? ??// 复制数据到可视化文本缓冲区? ? ? ? Byte_String(Start ? ? ? := DatenAnfang +?32,?? ? ? ? ? ? ? ? ? ? Ende ? ? ? ?:= ( DatenAnfang + DatenLaenge -?1),?? ? ? ? ? ? ? ? ? ? DATA_IN ? ? := Pruefdaten ,?? ? ? ? ? ? ? ? ? ? DATA_OUT ? ?:= strVisutext_33_64,?? ? ? ? ? ? ? ? ? ? PaFE ? ? ? ?:= iPaFe_Pruefdaten,?? ? ? ? ? ? ? ? ? ? FM ? ? ? ? ?:= iFM);? ? ? ??// 如果复制过程有参数错误,则设置校验数据复制错误标志? ? ? ? xF_PruefdatenKopie := xF_PruefdatenKopie OR iPaFe_Pruefdaten >?0;?? ? ELSE? ? ? ? strVisutext_33_64[2] :=?0;?// 实际长度设为0? ? END_IF;? ?// 根据配置选择校验方法? ? IF xCfg_0 THEN ?// Code 2/5校验? ? ? ? strVisutext_Ziffer[3] := Buffer[2?+ DatenLaenge];? ? ? ??? ? ? ??// 初始化Code 2/5校验相关变量? ? ? ? xF_Invalide_Daten_C2x5 := FALSE; ? ? ??? ? ? ? iCheckSum2of5 :=?0;? ? ? ??? ? ? ??// 处理校验数据(不包括校验位)? ? ? ? FOR iHM_Zaehler2 :=?2?TO (2?+ DatenLaenge -?1) DO?? ? ? ? ? ? (* 将CODE128字符集中的A-Z转换为数字以便计算校验和 *)? ? ? ? ? ? CASE BYTE_TO_INT(Buffer[iHM_Zaehler2]) OF?? ? ? ? ? ? ? ??48: arrCode_pos[iHM_Zaehler2] :=?0? ? ? ;// '0'? ? ? ? ? ? ? ??49: arrCode_pos[iHM_Zaehler2] :=?1? ? ? ;// '1'? ? ? ? ? ? ? ??50: arrCode_pos[iHM_Zaehler2] :=?2? ? ? ;// '2'? ? ? ? ? ? ? ??51: arrCode_pos[iHM_Zaehler2] :=?3? ? ? ;// '3'? ? ? ? ? ? ? ??52: arrCode_pos[iHM_Zaehler2] :=?4? ? ? ;// '4'? ? ? ? ? ? ? ??53: arrCode_pos[iHM_Zaehler2] :=?5? ? ? ;// '5'? ? ? ? ? ? ? ??54: arrCode_pos[iHM_Zaehler2] :=?6? ? ? ;// '6'? ? ? ? ? ? ? ??55: arrCode_pos[iHM_Zaehler2] :=?7? ? ? ;// '7'? ? ? ? ? ? ? ??56: arrCode_pos[iHM_Zaehler2] :=?8? ? ? ;// '8'? ? ? ? ? ? ? ??57: arrCode_pos[iHM_Zaehler2] :=?9? ? ? ;// '9'? ? ? ? ? ? ? ??65: arrCode_pos[iHM_Zaehler2] :=?1? ? ? ;// 'A'? ? ? ? ? ? ? ??66: arrCode_pos[iHM_Zaehler2] :=?2? ? ? ;// 'B'? ? ? ? ? ? ? ??67: arrCode_pos[iHM_Zaehler2] :=?3? ? ? ;// 'C'? ? ? ? ? ? ? ??68: arrCode_pos[iHM_Zaehler2] :=?4? ? ? ;// 'D'? ? ? ? ? ? ? ??69: arrCode_pos[iHM_Zaehler2] :=?5? ? ? ;// 'E'? ? ? ? ? ? ? ??70: arrCode_pos[iHM_Zaehler2] :=?6? ? ? ;// 'F'? ? ? ? ? ? ? ??71: arrCode_pos[iHM_Zaehler2] :=?7? ? ? ;// 'G'? ? ? ? ? ? ? ??72: arrCode_pos[iHM_Zaehler2] :=?8? ? ? ;// 'H'? ? ? ? ? ? ? ??73: arrCode_pos[iHM_Zaehler2] :=?9? ? ? ;// 'I'? ? ? ? ? ? ? ??74: arrCode_pos[iHM_Zaehler2] :=?1? ? ? ;// 'J'? ? ? ? ? ? ? ??75: arrCode_pos[iHM_Zaehler2] :=?2? ? ? ;// 'K'? ? ? ? ? ? ? ??76: arrCode_pos[iHM_Zaehler2] :=?3? ? ? ;// 'L'? ? ? ? ? ? ? ??77: arrCode_pos[iHM_Zaehler2] :=?4? ? ? ;// 'M'? ? ? ? ? ? ? ??78: arrCode_pos[iHM_Zaehler2] :=?5? ? ? ;// 'N'? ? ? ? ? ? ? ??79: arrCode_pos[iHM_Zaehler2] :=?6? ? ? ;// 'O'? ? ? ? ? ? ? ??80: arrCode_pos[iHM_Zaehler2] :=?7? ? ? ;// 'P'? ? ? ? ? ? ? ??81: arrCode_pos[iHM_Zaehler2] :=?8? ? ? ;// 'Q'? ? ? ? ? ? ? ??82: arrCode_pos[iHM_Zaehler2] :=?9? ? ? ;// 'R'? ? ? ? ? ? ? ??83: arrCode_pos[iHM_Zaehler2] :=?1? ? ? ;// 'S'? ? ? ? ? ? ? ??84: arrCode_pos[iHM_Zaehler2] :=?2? ? ? ;// 'T'? ? ? ? ? ? ? ??85: arrCode_pos[iHM_Zaehler2] :=?3? ? ? ;// 'U'? ? ? ? ? ? ? ??86: arrCode_pos[iHM_Zaehler2] :=?4? ? ? ;// 'V'? ? ? ? ? ? ? ??87: arrCode_pos[iHM_Zaehler2] :=?5? ? ? ;// 'W'? ? ? ? ? ? ? ??88: arrCode_pos[iHM_Zaehler2] :=?6? ? ? ;// 'X'? ? ? ? ? ? ? ??89: arrCode_pos[iHM_Zaehler2] :=?7? ? ? ;// 'Y'? ? ? ? ? ? ? ??90: arrCode_pos[iHM_Zaehler2] :=?8? ? ? ;// 'Z'? ? ? ? ? ? ELSE: (* 如果找到不匹配的字符,则设置无效数据标志并退出循环 *)? ? ? ? ? ? ? ? xF_Invalide_Daten_C2x5 := TRUE;? ? ? ? ? ? ? ? Pruef_IO := FALSE;? ? ? ? ? ? ? ? EXIT;? ? ? ? ? ? END_CASE;?? ? ? ? ? ??? ? ? ? ? ? (* 计算校验和 *)? ? ? ? ? ??// +1是为了进行奇偶位的判断? ? ? ? ? ? IF ((iHM_Zaehler2 +?1) MOD?2) =?0?THEN ?? ? ? ? ? ? ? ? iCheckSum2of5 := iCheckSum2of5 +?1?* arrCode_pos[iHM_Zaehler2];// 偶数位乘1? ? ? ? ? ? ELSE? ? ? ? ? ? ? ? iCheckSum2of5 := iCheckSum2of5 +?3?* arrCode_pos[iHM_Zaehler2];// 奇数位乘3? ? ? ? ? ? END_IF;? ? ? ?? ? ? ? END_FOR;? ??? ? ? ? (* 从总和计算模10,10减去该值得到校验位 *)? ? ? ? IF (iCheckSum2of5 MOD?10) >?0?THEN? ? ? ? ? ? iCheckSum2of5 :=?10?- (iCheckSum2of5 MOD?10);? ? ? ? ELSE? ? ? ? ? ? iCheckSum2of5 :=?0;? ? ? ? END_IF;? ??? ? ? ??// 如果数据有效,则计算校验位? ? ? ? IF NOT xF_Invalide_Daten_C2x5 THEN? ? ? ??? ? ? ? ? ??// 将校验位转换为字符? ? ? ? ? ? CASE iCheckSum2of5 OF? ? ? ? ? ? ? ??0: chrPZ :=?'0'? ? ;// '0'? ? ? ? ? ? ? ??1: chrPZ :=?'1'? ? ;// '1'? ? ? ? ? ? ? ??2: chrPZ :=?'2'? ? ;// '2'? ? ? ? ? ? ? ??3: chrPZ :=?'3'? ? ;// '3'? ? ? ? ? ? ? ??4: chrPZ :=?'4'? ? ;// '4'? ? ? ? ? ? ? ??5: chrPZ :=?'5'? ? ;// '5'? ? ? ? ? ? ? ??6: chrPZ :=?'6'? ? ;// '6'? ? ? ? ? ? ? ??7: chrPZ :=?'7'? ? ;// '7'? ? ? ? ? ? ? ??8: chrPZ :=?'8'? ? ;// '8'? ? ? ? ? ? ? ??9: chrPZ :=?'9'? ? ;// '9' ? ? ? ? ? ?? ? ? ? ? ? END_CASE; ? ?? ? ? ? ? ? ??? ? ? ? ? ? (************************************************************? ? ? ? ? ? 检查输入值,如果功能块外部的PruefZiff_OUT与PruefZiff_IN指向相同的存储位置,? ? ? ? ? ? 则存储计算得到的校验位。*)? ? ? ? ? ??// 将字符转换为字节存储到输出校验位1? ? ? ? ? ? PruefZiff1_Out := INT_TO_BYTE(CHAR_TO_INT(chrPZ));? ? ? ? ? ? PruefZiff2_Out :=?0;?// 输出校验位2设为0? ? ? ? ? ??? ? ? ? ? ??// 如果不是仅验证数据有效性模式? ? ? ? ? ? IF NOT xCfg_2 THEN ?? ? ? ? ? ? ? ??// 将计算得到的校验位与输入校验位比较? ? ? ? ? ? ? ? Pruef_IO := PruefZiff1_Out = PruefZiff1_In;? ? ? ? ? ? ELSE ? ?// 仅验证数据有效性,不验证校验位? ? ? ? ? ? ? ? strVisutext_Ziffer[3] := PruefZiff1_Out;? ? ? ? ? ? ? ? Pruef_IO := TRUE; ? ? ? ? ? ? ? ? ??? ? ? ? ? ? END_IF;?? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? END_IF; ? ? ? ?? ? ELSIF xCfg_1 THEN ?// Code 39校验? ? ? ? strVisutext_Ziffer[3] := Buffer[2?+ DatenLaenge];? ? ? ??// 初始化Code 39校验相关变量? ? ? ? xF_Invalide_Daten_C39 := FALSE;? ? ? ? iCharCode39 :=?0; ??? ? ? ??? ? ? ??// 处理校验数据(不包括校验位)? ? ? ? FOR iHM_Zaehler2 :=?2?TO (2?+ DatenLaenge -?1) DO ?? ? ? ? ? ??// 将字符转换为对应的Code 39值? ? ? ? ? ? CASE BYTE_TO_INT(Buffer[iHM_Zaehler2]) OF?? ? ? ? ? ? ? ??48: arrCode_pos[iHM_Zaehler2] :=?0? ? ? ;// '0'? ? ? ? ? ? ? ??49: arrCode_pos[iHM_Zaehler2] :=?1? ? ? ;// '1'? ? ? ? ? ? ? ??50: arrCode_pos[iHM_Zaehler2] :=?2? ? ? ;// '2'? ? ? ? ? ? ? ??51: arrCode_pos[iHM_Zaehler2] :=?3? ? ? ;// '3'? ? ? ? ? ? ? ??52: arrCode_pos[iHM_Zaehler2] :=?4? ? ? ;// '4'? ? ? ? ? ? ? ??53: arrCode_pos[iHM_Zaehler2] :=?5? ? ? ;// '5'? ? ? ? ? ? ? ??54: arrCode_pos[iHM_Zaehler2] :=?6? ? ? ;// '6'? ? ? ? ? ? ? ??55: arrCode_pos[iHM_Zaehler2] :=?7? ? ? ;// '7'? ? ? ? ? ? ? ??56: arrCode_pos[iHM_Zaehler2] :=?8? ? ? ;// '8'? ? ? ? ? ? ? ??57: arrCode_pos[iHM_Zaehler2] :=?9? ? ? ;// '9'? ? ? ? ? ? ? ??65: arrCode_pos[iHM_Zaehler2] :=?10? ? ?;// 'A'? ? ? ? ? ? ? ??66: arrCode_pos[iHM_Zaehler2] :=?11? ? ?;// 'B'? ? ? ? ? ? ? ??67: arrCode_pos[iHM_Zaehler2] :=?12? ? ?;// 'C'? ? ? ? ? ? ? ??68: arrCode_pos[iHM_Zaehler2] :=?13? ? ?;// 'D'? ? ? ? ? ? ? ??69: arrCode_pos[iHM_Zaehler2] :=?14? ? ?;// 'E'? ? ? ? ? ? ? ??70: arrCode_pos[iHM_Zaehler2] :=?15? ? ?;// 'F'? ? ? ? ? ? ? ??71: arrCode_pos[iHM_Zaehler2] :=?16? ? ?;// 'G'? ? ? ? ? ? ? ??72: arrCode_pos[iHM_Zaehler2] :=?17? ? ?;// 'H'? ? ? ? ? ? ? ??73: arrCode_pos[iHM_Zaehler2] :=?18? ? ?;// 'I'? ? ? ? ? ? ? ??74: arrCode_pos[iHM_Zaehler2] :=?19? ? ?;// 'J'? ? ? ? ? ? ? ??75: arrCode_pos[iHM_Zaehler2] :=?20? ? ?;// 'K'? ? ? ? ? ? ? ??76: arrCode_pos[iHM_Zaehler2] :=?21? ? ?;// 'L'? ? ? ? ? ? ? ??77: arrCode_pos[iHM_Zaehler2] :=?22? ? ?;// 'M'? ? ? ? ? ? ? ??78: arrCode_pos[iHM_Zaehler2] :=?23? ? ?;// 'N'? ? ? ? ? ? ? ??79: arrCode_pos[iHM_Zaehler2] :=?24? ? ?;// 'O'? ? ? ? ? ? ? ??80: arrCode_pos[iHM_Zaehler2] :=?25? ? ?;// 'P'? ? ? ? ? ? ? ??81: arrCode_pos[iHM_Zaehler2] :=?26? ? ?;// 'Q'? ? ? ? ? ? ? ??82: arrCode_pos[iHM_Zaehler2] :=?27? ? ?;// 'R'? ? ? ? ? ? ? ??83: arrCode_pos[iHM_Zaehler2] :=?28? ? ?;// 'S'? ? ? ? ? ? ? ??84: arrCode_pos[iHM_Zaehler2] :=?29? ? ?;// 'T? ? ? ? ? ? ? ??85: arrCode_pos[iHM_Zaehler2] :=?30? ? ?;// 'U'? ? ? ? ? ? ? ??86: arrCode_pos[iHM_Zaehler2] :=?31? ? ?;// 'V'? ? ? ? ? ? ? ??87: arrCode_pos[iHM_Zaehler2] :=?32? ? ?;// 'W'? ? ? ? ? ? ? ??88: arrCode_pos[iHM_Zaehler2] :=?33? ? ?;// 'X'? ? ? ? ? ? ? ??89: arrCode_pos[iHM_Zaehler2] :=?34? ? ?;// 'Y'? ? ? ? ? ? ? ??90: arrCode_pos[iHM_Zaehler2] :=?35? ? ?;// 'Z'? ? ? ? ? ? ? ??45: arrCode_pos[iHM_Zaehler2] :=?36? ? ?;// '-'? ? ? ? ? ? ? ??46: arrCode_pos[iHM_Zaehler2] :=?37? ? ?;// '.'? ? ? ? ? ? ? ??32: arrCode_pos[iHM_Zaehler2] :=?38? ? ?;// ' '? ? ? ? ? ? ? ??36: arrCode_pos[iHM_Zaehler2] :=?39? ? ?;// '$'? ? ? ? ? ? ? ??47: arrCode_pos[iHM_Zaehler2] :=?40? ? ?;// '/'? ? ? ? ? ? ? ??43: arrCode_pos[iHM_Zaehler2] :=?41? ? ?;// '+'? ? ? ? ? ? ? ??37: arrCode_pos[iHM_Zaehler2] :=?42? ? ?;// '%'?? ? ? ? ? ? ELSE: (* 如果找到不匹配的字符,则设置无效数据标志并退出循环 *)? ? ? ? ? ? ? ? xF_Invalide_Daten_C39 := TRUE; ?? ? ? ? ? ? ? ? Pruef_IO := FALSE;?? ? ? ? ? ? ? ? EXIT;? ? ? ? ? ? END_CASE; ? ?? ??? ? ? ? ? ??// 累加所有字符的Code 39值? ? ? ? ? ? iCharCode39 := iCharCode39 + arrCode_pos[iHM_Zaehler2]; ? ? ? ? ? ? ? ? ? ? 此时将刚转换的四个数值加起来4+2+5+10=21??? ? ? ? END_FOR;? ? ? ?? ? ? ??// 如果数据有效,则计算校验位? ? ? ? IF NOT xF_Invalide_Daten_C39 THEN? ? ? ? ? ??// 计算模43结果? ? ? ? ? ? iMOD_39 := iCharCode39 MOD?43?;? ? ? ? ? ??? ? ? ? ? ??// 将模43结果转换为对应的字符? ? ? ? ? ? CASE iMOD_39 OF? ? ? ? ? ? ? ??0? : chrPZ :=?'0';? ? ? ? ? ? ? ??1? : chrPZ :=?'1';? ? ? ? ? ? ? ??2? : chrPZ :=?'2';? ? ? ? ? ? ? ??3? : chrPZ :=?'3';? ? ? ? ? ? ? ??4? : chrPZ :=?'4';? ? ? ? ? ? ? ??5? : chrPZ :=?'5';? ? ? ? ? ? ? ??6? : chrPZ :=?'6';? ? ? ? ? ? ? ??7? : chrPZ :=?'7';? ? ? ? ? ? ? ??8? : chrPZ :=?'8';? ? ? ? ? ? ? ??9? : chrPZ :=?'9';? ? ? ? ? ? ? ??10?: chrPZ :=?'A';? ? ? ? ? ? ? ??11?: chrPZ :=?'B';? ? ? ? ? ? ? ??12?: chrPZ :=?'C';? ? ? ? ? ? ? ??13?: chrPZ :=?'D';? ? ? ? ? ? ? ??14?: chrPZ :=?'E';? ? ? ? ? ? ? ??15?: chrPZ :=?'F';? ? ? ? ? ? ? ??16?: chrPZ :=?'G';? ? ? ? ? ? ? ??17?: chrPZ :=?'H';? ? ? ? ? ? ? ??18?: chrPZ :=?'I';? ? ? ? ? ? ? ??19?: chrPZ :=?'J';? ? ? ? ? ? ? ??20?: chrPZ :=?'K';? ? ? ? ? ? ? ??21?: chrPZ :=?'L';? ? ? ? ? ? ? ??22?: chrPZ :=?'M';? ? ? ? ? ? ? ??23?: chrPZ :=?'N';? ? ? ? ? ? ? ??24?: chrPZ :=?'O';? ? ? ? ? ? ? ??25?: chrPZ :=?'P';? ? ? ? ? ? ? ??26?: chrPZ :=?'Q';? ? ? ? ? ? ? ??27?: chrPZ :=?'R';? ? ? ? ? ? ? ??28?: chrPZ :=?'S';? ? ? ? ? ? ? ??29?: chrPZ :=?'T';? ? ? ? ? ? ? ??30?: chrPZ :=?'U';? ? ? ? ? ? ? ??31?: chrPZ :=?'V';? ? ? ? ? ? ? ??32?: chrPZ :=?'W';? ? ? ? ? ? ? ??33?: chrPZ :=?'X';? ? ? ? ? ? ? ??34?: chrPZ :=?'Y';? ? ? ? ? ? ? ??35?: chrPZ :=?'Z';? ? ? ? ? ? ? ??36?: chrPZ :=?'-';? ? ? ? ? ? ? ??37?: chrPZ :=?'.';? ? ? ? ? ? ? ??38?: chrPZ :=?' ';? ? ? ? ? ? ? ??39?: chrPZ :=?'$24';? ? ? ? ? ? ? ??40?: chrPZ :=?'/';? ? ? ? ? ? ? ??41?: chrPZ :=?'+';? ? ? ? ? ? ? ??42?: chrPZ :=?'%';? ? ? ? ? ? END_CASE;? ? ? ? ? ??? ? ? ? ? ??// 将字符转换为字节存储到输出校验位1? ? ? ? ? ? PruefZiff1_Out := INT_TO_BYTE(CHAR_TO_INT(chrPZ));? ? ? ? ? ? PruefZiff2_Out :=?0;?// 输出校验位2设为0? ? ? ? ? ??// 如果不是仅验证数据有效性模式? ? ? ? ? ? IF NOT xCfg_2 THEN ? ? ? ? ? ? ?? ? ? ? ? ? ? ??// 将计算得到的校验位与输入校验位比较? ? ? ? ? ? ? ? Pruef_IO := PruefZiff1_Out = PruefZiff1_In;? ? ? ? ? ? ELSE ? ?// 仅验证数据有效性,不验证校验位? ? ? ? ? ? ? ? strVisutext_Ziffer[3] := PruefZiff1_Out;? ? ? ? ? ? ? ? Pruef_IO := TRUE; ? ?? ? ? ? ? ? END_IF; ? ?? ? ? ??? ? ? ? END_IF;? ? ELSIF xCfg_3 THEN ??// CRC16 Genibus校验? ? ? ? wCRCTemp :=?16#FFFF;// CRC初始值? ? ? ??? ? ? ??// 对每个数据字节进行CRC计算? ? ? ? FOR iHM_Zaehler2 :=?2?TO (2?+ DatenLaenge -?1) DO? ? ? ? ? ??? ? ? ? ? ??// 计算CRC表索引? ? ? ? ? ? iCRCIndex := WORD_TO_INT(SHR(IN := wCRCTemp, N :=?8) XOR Buffer[iHM_Zaehler2]);?? ? ? ? ? ??? ? ? ? ? ??// 根据索引选择对应的CRC表进行计算? ? ? ? ? ? IF iCRCIndex <=?127?THEN? ? ? ? ? ? ? ? wCRCTemp := SHL(IN := wCRCTemp, N :=?8) XOR CRCTable1[iCRCIndex];?? ? ? ? ? ? ELSE? ? ? ? ? ? ? ? wCRCTemp := SHL(IN := wCRCTemp, N :=?8) XOR CRCTable2[iCRCIndex -?128];?? ? ? ? ? ? END_IF;? ? ? ??? ? ? ? END_FOR;? ? ? ??? ? ? ??// 计算最终的CRC值? ? ? ? _wCRC := wCRCTemp XOR?16#FFFF;? ? ? ??? ? ? ??// 输出CRC的高低位字节? ? ? ? PruefZiff1_Out := wCRC.B1; ??// 高位字节? ? ? ? PruefZiff2_Out := wCRC.B2; ??// 低位字节? ? ? ??? ? ? ??// 如果不是仅输出校验位模式? ? ? ? IF NOT xCfg_4 THEN? ? ? ? ? ??// 显示输入的校验位? ? ? ? ? ? Visutext_Ziffer_Hex.B1 := PruefZiff1_In;? ? ? ? ? ? Visutext_Ziffer_Hex.B2 := PruefZiff2_In;? ? ? ? ? ??? ? ? ? ? ??// 比较计算得到的校验位与输入校验位? ? ? ? ? ? Pruef_IO := PruefZiff1_Out = PruefZiff1_In?? ? ? ? ? ? ? ? ? ? AND PruefZiff2_Out = PruefZiff2_In; ? ??? ? ? ? ELSE? ? ? ? ? ??// 显示计算得到的校验位? ? ? ? ? ? Visutext_Ziffer_Hex.B1 := PruefZiff1_Out;? ? ? ? ? ? Visutext_Ziffer_Hex.B2 := PruefZiff2_Out;? ? ? ? ? ??? ? ? ? ? ? Pruef_IO := TRUE;? ? ? ? END_IF; ? ?? ? ? ? ? ??? ? END_IF; ? ?? ??? ??// 校验不通过 = 校验通过的非? ? Pruef_NIO := NOT Pruef_IO;END_IF;// 无效校验数据 = Code 39无效数据 或 Code 2/5无效数据Invalide_Pruefdaten := xF_Invalide_Daten_C39 OR xF_Invalide_Daten_C2x5;(*----------------------------------------------------------------------------------*)(* 汇总故障 *)Stoexx := False; ?// 初始化为无故障(*----------------------------------------------------------------------------------*)(* 链式故障输出 = 链式故障输入 或 汇总故障 *)VkStoe_Out:= VkStoe_In OR Stoexx;(*----------------------------------------------------------------------------------*)// 可视化相关设置dwVisuWerte1.X0 ? ? := FALSE; ? ? ? ? ? ? ?dwVisuWerte1.X1 ? ? := FALSE; ? ? ? ? ? ? ?dwVisuWerte1.X2 ? ? := xCfg_3; ? ? ? ? ? ? ?(* 显示CRC16是否选中 *)dwVisuWerte1.X3 ? ? := Pruef_IO; ? ? ? ? ? ?(* 显示校验是否通过 *)dwVisuWerte1.X4 ? ? := NOT Invalide_Pruefdaten AND (Pruef_NIO OR Pruef_IO); (* 显示数据是否有效 *)?dwVisuWerte1.X5 ? ? := Frg_Start AND NOT oProz AND Pruef_Auswahl_IO; ? ? ? ? ? (* 控制Start按钮是否可点击 *) ? ? ? ?dwVisuWerte1.X6 ? ? := Frg_oProz; ? ? ? ? ? (* 控制Ohne按钮是否可点击 *)dwVisuWerte1.X7 ? ? := Pruef_NIO?? ? ? ? ? ? ? ? ? ? OR DatenLaenge <?1? ? ? ? ? ? ? ? ? ? OR xF_PruefdatenKopie? ? ? ? ? ? ? ? ? ? OR xF_Invalide_Daten_C2x5? ? ? ? ? ? ? ? ? ? OR xF_Invalide_Daten_C39; ?(* 控制是否显示红色边框 *)dwVisuWerte1.X8 ? ? := FALSE; ? ? ? ? ? ? ? (* 不显示黄色边框 *)// 可视化Start按钮设置dwVisuWerte1.B3 := BYTE#64;?// 显示Start按钮// 根据Start信号状态设置按钮颜色IF xS_Start THEN?? ? dwVisuWerte1.B3 ? ? ? ? := ?dwVisuWerte1.B3 OR BYTE#16#01?; (*01: 绿色背景 黑色文本*)ELSE? ? dwVisuWerte1.B3 ? ? ? ? := ?dwVisuWerte1.B3 OR BYTE#16#00?; (*00: 灰色背景 黑色文本*)END_IF;// 可视化Ohne按钮设置dwVisuWerte1.B2 := BYTE#64;?// 显示Ohne按钮// 根据无过程模式状态设置按钮颜色IF oProz THEN ?? ? dwVisuWerte1.B2 ? ? ? ? := dwVisuWerte1.B2 OR BYTE#16#06?; (*06: 黄色背景 黑色文本*)ELSE? ? dwVisuWerte1.B2 ? ? ? ? := dwVisuWerte1.B2 OR BYTE#16#00?; (*00: 灰色背景 黑色文本*)END_IF;(************************************************************************************)(**SIEMENS***************************************************************************)(************Anfang Signalaufbereitung Meldesystem fuer den Siemensteil**************)(***********************AUFRUF am Ende im SCL-BAUSTEINS******************************)// 初始化消息指针_pMeldFeld ?:= MeldFeld;_pMeldAbb ? := MeldAbb;_pMeld ? ? ?:= ST_Meld;// 修改消息指针的存储区域(从DB到DI)pMeldFeld.BZ := pMeldFeld.BZ OR?16#1000000;?pMeldAbb.BZ ?:= pMeldAbb.BZ ?OR?16#1000000;?// 设置消息系统的故障标志MSys.xF_1 ? := DatenLaenge <?1; ? ? ? ? ? ??//'STE/Pruefdatenlaenge = 0' 校验数据长度为0MSys.xF_2 ? := xF_Invalide_Daten_C2x5; ? ? ?//'STE/Code2x5 Invalide Daten' Code 2/5无效数据MSys.xF_3 ? := xF_Invalide_Daten_C39; ? ? ??//'STE/Code39 Invalide Daten' Code 39无效数据MSys.xF_4 ? := xF_PruefdatenKopie; ? ? ? ? ?//'STE/Pruefdaten nicht einlesbar 校验数据无法读取? ? ?// 发送消息MeldSend(AufrufNr ? ? ? :=?1? ? ? ? ?,Anz_Meld ? ? ?:=?4?? ? ? ? ?,pMeldFeld ? ? := pMeldFeld.BZ? ? ? ? ?,pMeldAbb ? ? ?:= pMeldAbb.BZ? ? ? ? ?,MeldDB ? ? ? ?:= WORD_TO_INT(pMeld.DBNR)? ? ? ? ?,AenderungsID ?:= AenderungsID? ? ? ? ?,Integritaet ? := Integritaet? ? ? ? ?,Neustart ? ? ?:=?"Neustart"? ? ? ? ?);// 站点相关的故障汇总DB_ARG.VisuSS.Station_Stoer:= DB_ARG.VisuSS.Station_Stoer?? ? ? ? ? ? ? ? ? ? ? ? ? ? OR Msys.xF_1? ? ? ? ? ? ? ? ? ? ? ? ? ? OR Msys.xF_2? ? ? ? ? ? ? ? ? ? ? ? ? ? OR Msys.xF_3? ? ? ? ? ? ? ? ? ? ? ? ? ? OR Msys.xF_4;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 站点相关的警告汇总(此处未使用,设为FALSE)DB_ARG.VisuSS.Station_Warn := DB_ARG.VisuSS.Station_Warn?? ? ? ? ? ? ? ? ? ? ? ? ? ?OR FALSE ;? ? ? ? ? ? ? ? ? ? ? ? ? ?// 站点相关的维护提示汇总(此处未使用,设为FALSE)DB_ARG.VisuSS.Station_Wart := DB_ARG.VisuSS.Station_Wart?? ? ? ? ? ? ? ? ? ? ? ? ? ?OR FALSE ;(**SIEMENS***************************************************************************)(*************Ende Signalaufbereitung Meldesystem fuer den Siemensteil****************)(************************************************************************************)// 注释掉的代码:块移动操作(用于优化循环时间)//erg_SFC20:= BLKMOV(srcblk:= _ST_BA, dstblk:= ST_BA); ? ?//Zykluszeitoptimierung(*----------------------------------------Ende--------------------------------------*)END_FUNCTION_BLOCK```以上是对FB_Pruefziffer功能块的逐行详细解读。这个功能块主要实现了三种校验算法(Code 2/5、Code 39和CRC16),用于计算和验证数据的校验位。功能块还包含了与可视化界面交互的逻辑,能够显示数据和校验结果,并通过消息系统报告故障状态。整个功能块设计严谨,考虑了各种边界情况和错误处理,适用于工业自动化环境中的数据校验场景。

加入知识星球智能制造与自动化,加入会员可下载此公众号发布文章中的相关资料(行业报告、MES、数字化技术方案、自动化教程、自动化行业标准化资料VASSSICAR戴姆勒等、C#上位机开发、node-red开发、人工智能教程等)。

大众汽车

大众汽车

大众汽车集团是中国汽车工业最早、最成功的国际合作伙伴之一,伴随中国汽车工业成长近四十年。大众汽车集团(中国)始终致力于成为中国社会最值得信赖的合作伙伴,在为消费者提供可靠、高质量产品与服务的同时,更以支持中国社会的可持续发展作为重要己任。

大众汽车集团是中国汽车工业最早、最成功的国际合作伙伴之一,伴随中国汽车工业成长近四十年。大众汽车集团(中国)始终致力于成为中国社会最值得信赖的合作伙伴,在为消费者提供可靠、高质量产品与服务的同时,更以支持中国社会的可持续发展作为重要己任。收起

查看更多

相关推荐