# NEXT2 - Multi-Line Search Implementation ## 1. New Support DB ```pascal DATA_BLOCK "10_NEXT2_Support_D" { S7_Optimized_Access := 'FALSE' } VERSION : 0.1 NON_RETAIN STRUCT LineN : Array[0..5] of Struct // Same array size as 10_SkuManage_D i : Int; // Search index (synchronized with 10_SkuManage_D) ReqNext2CustomProdNum : String[12]; // Requested NEXT2 product number (from IDH_BTL_NEXT2) OldNext2CustomProdNum : String[12]; // Previous number to detect changes SearchNext2Sku : Bool; // Active search flag SkuNext2NotFound : Bool; // SKU not found flag SkuNext2Req { S7_SetPoint := 'False'} : "StSku_U"; END_STRUCT; END_STRUCT; BEGIN END_DATA_BLOCK ``` ## 2. Changes to FC11 (10.01_SkuManage_G) ```pascal // Modify first FOR loop where search is triggered FOR #i := 0 TO 5 DO REGION // index search // Existing conditions for Actual and Next remain unchanged // Add Next2 search trigger based on IDH_BTL_NEXT2 change IF "10_NEXT2_Support_D".LineN[#i].OldNext2CustomProdNum <> "10_NEXT2_Support_D".LineN[#i].ReqNext2CustomProdNum THEN "10_NEXT2_Support_D".LineN[#i].SearchNext2Sku := TRUE; "10_SkuManage_D".LineN[#i].SearchEnd := TRUE; END_IF; END_REGION REGION // Next2 index management IF "10_NEXT2_Support_D".LineN[#i].OldNext2CustomProdNum <> "10_NEXT2_Support_D".LineN[#i].ReqNext2CustomProdNum THEN "10_NEXT2_Support_D".LineN[#i].SearchNext2Sku := TRUE; END_IF; IF "10_NEXT2_Support_D".LineN[#i].SearchNext2Sku THEN IF "10_NEXT2_Support_D".LineN[#i].i < 0 OR "10_NEXT2_Support_D".LineN[#i].i >= 249 THEN "10_NEXT2_Support_D".LineN[#i].i := 0; ELSE "10_NEXT2_Support_D".LineN[#i].i += 1; END_IF; END_IF; END_REGION REGION //search next2 IF "10_NEXT2_Support_D".LineN[#i].SearchNext2Sku THEN IF "10_NEXT2_Support_D".LineN[#i].ReqNext2CustomProdNum = "10_FromAlplaSkuList_D".AlplaSkuList["10_NEXT2_Support_D".LineN[#i].i].CustomArticleNum AND ("10_FromAlplaSkuList_D".AlplaSkuList["10_NEXT2_Support_D".LineN[#i].i].CustomArticleNum <> '') THEN "10_NEXT2_Support_D".LineN[#i].SkuNext2Req := "10_FromAlplaSkuList_D".AlplaSkuList["10_NEXT2_Support_D".LineN[#i].i]; "10_NEXT2_Support_D".LineN[#i].OldNext2CustomProdNum := "10_FromAlplaSkuList_D".AlplaSkuList["10_NEXT2_Support_D".LineN[#i].i].CustomArticleNum; "10_NEXT2_Support_D".LineN[#i].SearchNext2Sku := FALSE; "10_NEXT2_Support_D".LineN[#i].SkuNext2NotFound := FALSE; END_IF; IF "10_NEXT2_Support_D".LineN[#i].i >= 249 AND "10_NEXT2_Support_D".LineN[#i].SearchNext2Sku THEN "10_NEXT2_Support_D".LineN[#i].SkuNext2NotFound := TRUE; "10_NEXT2_Support_D".LineN[#i].SkuNext2Req.Av := 0; "10_NEXT2_Support_D".LineN[#i].SkuNext2Req.AvDesc := ''; "10_NEXT2_Support_D".LineN[#i].SkuNext2Req.ProdFamily := 0; "10_NEXT2_Support_D".LineN[#i].SkuNext2Req.CustomArticleNum := ''; "10_NEXT2_Support_D".LineN[#i].OldNext2CustomProdNum := ''; END_IF; END_IF; END_REGION END_FOR ``` ## 3. Changes for TG10 Telegram #### TL21 - FB2014 / FB2024 / FB2034 / FB2044 / FB2054 / FB2064 ```pascal REGION //next batch +1 "DB2029_COM_VETRO_global_data_L25".TG10_send.DATA."Next_Batch_+1_Article_Variant_ID" := "10_NEXT2_Support_D".LineN[1].SkuNext2Req.Av; "DB2029_COM_VETRO_global_data_L25".TG10_send.DATA."Next_Batch_+1_Target_1000" := 0; "DB2029_COM_VETRO_global_data_L25".TG10_send.DATA."Next_Batch_+1_Target_Units" := 0; END_REGION // Add Next2 to trigger condition #tg10_Line_send := (... existing conditions ... OR "DB2029_COM_VETRO_global_data_L25".TG10_send.DATA."Next_Batch_+1_Article_Variant_ID" <> "DB2029_COM_VETRO_global_data_L25".TG10_Bk_send.DATA."Next_Batch_+1_Article_Variant_ID" ...) AND NOT "99_HMI_Manage_D".AlarmsGen[0].x[11]; ``` ### Line index: | 0 | Fill_TL21_L23 | | --- | ------------- | | 1 | Fill_TL22_L25 | | 2 | Fill_TL23_L43 | | 3 | Fill_TL25_L41 | | 4 | Fill_TL26_L42 | | 5 | Fill_TL27_L40 | ## 4. Changes on FC20 - 10.00_ComAlpla_G ```pascal REGION //Next+1 batch article number FOR #i := 0 TO 5 DO CASE #i OF 0: "10.02_D7-D9 Next2 Copy"(Line:=#i, di7:="TL21_ReadData_D".FromQ1.FromHenkel.STW.di7, di8:="TL21_ReadData_D".FromQ1.FromHenkel.STW.di8, di9:="TL21_ReadData_D".FromQ1.FromHenkel.STW.di9, Next2BatchArticleNumber:=#Next2BatchArticleNumber); 1: "10.02_D7-D9 Next2 Copy"(Line:=#i, di7:="TL22_ReadData_D".FromQ1.FromHenkel.STW.di7, di8:="TL22_ReadData_D".FromQ1.FromHenkel.STW.di8, di9:="TL22_ReadData_D".FromQ1.FromHenkel.STW.di9, Next2BatchArticleNumber:=#Next2BatchArticleNumber); 2: "10.02_D7-D9 Next2 Copy"(Line:=#i, di7:="TL23_ReadData_D".FromQ1.FromHenkel.STW.di7, di8:="TL23_ReadData_D".FromQ1.FromHenkel.STW.di8, di9:="TL23_ReadData_D".FromQ1.FromHenkel.STW.di9, Next2BatchArticleNumber:=#Next2BatchArticleNumber); 3: "10.02_D7-D9 Next2 Copy"(Line:=#i, di7:="TL25_ReadData_D".FromQ1.FromHenkel.STW.di7, di8:="TL25_ReadData_D".FromQ1.FromHenkel.STW.di8, di9:="TL25_ReadData_D".FromQ1.FromHenkel.STW.di9, Next2BatchArticleNumber:=#Next2BatchArticleNumber); 4: "10.02_D7-D9 Next2 Copy"(Line:=#i, di7:="TL26_ReadData_D".FromQ1.FromHenkel.STW.di7, di8:="TL26_ReadData_D".FromQ1.FromHenkel.STW.di8, di9:="TL26_ReadData_D".FromQ1.FromHenkel.STW.di9, Next2BatchArticleNumber:=#Next2BatchArticleNumber); 5: "10.02_D7-D9 Next2 Copy"(Line:=#i, di7:="TL27_ReadData_D".FromQ1.FromHenkel.STW.di7, di8:="TL27_ReadData_D".FromQ1.FromHenkel.STW.di8, di9:="TL27_ReadData_D".FromQ1.FromHenkel.STW.di9, Next2BatchArticleNumber:=#Next2BatchArticleNumber); END_CASE; END_FOR; END_REGION ; ``` ### Create FC27 - 10.02_D7-D9 Next2 Copy: ```pascal #Next2BatchArticleNumber[#Line] := ''; FOR #ich := 0 TO 11 DO #locChar[#ich] := '$00'; END_FOR; // Procesar di7 #locChar[0] := DINT_TO_CHAR(#di7.%B0); #locChar[1] := DINT_TO_CHAR(#di7.%B1); #locChar[2] := DINT_TO_CHAR(#di7.%B2); #locChar[3] := DINT_TO_CHAR(#di7.%B3); // Procesar di8 #locChar[4] := DINT_TO_CHAR(#di8.%B0); #locChar[5] := DINT_TO_CHAR(#di8.%B1); #locChar[6] := DINT_TO_CHAR(#di8.%B2); #locChar[7] := DINT_TO_CHAR(#di8.%B3); // Procesar di9 #locChar[8] := DINT_TO_CHAR(#di9.%B0); #locChar[9] := DINT_TO_CHAR(#di9.%B1); #locChar[10] := DINT_TO_CHAR(#di9.%B2); #locChar[11] := DINT_TO_CHAR(#di9.%B3); Chars_TO_Strg(Chars := #locChar, pChars := 0, Cnt := 12, Strg => #Next2BatchArticleNumber[#Line]); ``` ```pascal REGION //Next+1 batch article number FOR #i := 0 TO 5 DO CASE #i OF 0: "10.02_DINT To String"( di_1:="TL21_ReadData_D".FromQ1.FromHenkel.STW.di7, di_2:="TL21_ReadData_D".FromQ1.FromHenkel.STW.di8, di_3:="TL21_ReadData_D".FromQ1.FromHenkel.STW.di9, Converted_String:="10_NEXT2_Support_D".LineN[#i].ReqNext2CustomProdNum); "10.02_DINT To String"( di_1:="TL21_ReadData_D".FromQ1.FromHenkel.STW.di1, di_2:="TL21_ReadData_D".FromQ1.FromHenkel.STW.di2, di_3:="TL21_ReadData_D".FromQ1.FromHenkel.STW.di3, Converted_String:="10_NEXT2_Support_D".LineN[#i].Next2_Batch_Batch_ID); 1: "10.02_DINT To String"( di_1:="TL22_ReadData_D".FromQ1.FromHenkel.STW.di7, di_2:="TL22_ReadData_D".FromQ1.FromHenkel.STW.di8, di_3:="TL22_ReadData_D".FromQ1.FromHenkel.STW.di9, Converted_String:="10_NEXT2_Support_D".LineN[#i].ReqNext2CustomProdNum); "10.02_DINT To String"( di_1:="TL22_ReadData_D".FromQ1.FromHenkel.STW.di1, di_2:="TL22_ReadData_D".FromQ1.FromHenkel.STW.di2, di_3:="TL22_ReadData_D".FromQ1.FromHenkel.STW.di3, Converted_String:="10_NEXT2_Support_D".LineN[#i].Next2_Batch_Batch_ID); 2: "10.02_DINT To String"( di_1:="TL22_ReadData_D".FromQ1.FromHenkel.STW.di7, di_2:="TL22_ReadData_D".FromQ1.FromHenkel.STW.di8, di_3:="TL22_ReadData_D".FromQ1.FromHenkel.STW.di9, Converted_String:="10_NEXT2_Support_D".LineN[#i].ReqNext2CustomProdNum); "10.02_DINT To String"( di_1:="TL22_ReadData_D".FromQ1.FromHenkel.STW.di1, di_2:="TL22_ReadData_D".FromQ1.FromHenkel.STW.di2, di_3:="TL22_ReadData_D".FromQ1.FromHenkel.STW.di3, Converted_String:="10_NEXT2_Support_D".LineN[#i].Next2_Batch_Batch_ID); 3: "10.02_DINT To String"(Line:=#i, di_1:="TL25_ReadData_D".FromQ1.FromHenkel.STW.di7, di_2:="TL25_ReadData_D".FromQ1.FromHenkel.STW.di8, di_3:="TL25_ReadData_D".FromQ1.FromHenkel.STW.di9, Next2BatchArticleNumber:=#Next2BatchArticleNumber, Converted_String:=_string_inout_); 4: "10.02_DINT To String"(Line:=#i, di_1:="TL26_ReadData_D".FromQ1.FromHenkel.STW.di7, di_2:="TL26_ReadData_D".FromQ1.FromHenkel.STW.di8, di_3:="TL26_ReadData_D".FromQ1.FromHenkel.STW.di9, Next2BatchArticleNumber:=#Next2BatchArticleNumber, Converted_String:=_string_inout_); 5: "10.02_DINT To String"(Line:=#i, di_1:="TL27_ReadData_D".FromQ1.FromHenkel.STW.di7, di_2:="TL27_ReadData_D".FromQ1.FromHenkel.STW.di8, di_3:="TL27_ReadData_D".FromQ1.FromHenkel.STW.di9, Next2BatchArticleNumber:=#Next2BatchArticleNumber, Converted_String:=_string_inout_); END_CASE; END_FOR; END_REGION ; ```