前几天我们对大众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 170
TITLE ? =?'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; ??// 配置位7
END_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;?// 配置位5
xCfg_6 ? ?:= Cfg.X6;?// 配置位6
xCfg_7 ? ?:= Cfg.X7;?// 配置位7
xCfg_8 ? ?:= Cfg.X8;?// 配置位8
(*----------------------------------------------------------------------------------*)
(* Tasten von Visu pruefen *)
(*检查来自可视化界面的按键*)
// 如果PC未激活,则将可视化按键设为0
IF 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; ?// 校验位的十六进制表示设为0
END_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' 校验数据长度为0
MSys.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开发、人工智能教程等)。