Thanks everyone for useful suggestions!
I ended up using module with ArcX instruction aliases. It calculates seam length during program execution. Following is a simplified example of implementation:
MODULE ArcEx(NOSTEPIN)
CONST robtarget ArcEx_pNonePoint := [[0,0,0],[0,0,0,0],[0,0,0,0],[9E9,9E9,9E9,9E9,9E9,9E9]];
TASK VAR robtarget ArcEx_pRefPoint := ArcEx_pNonePoint; ! Variable for storing previous point
TASK VAR num ArcEx_nWeldDistance := 0; ! Calculated weld distance
PROC ArcLStartEx(robtarget ToPoint) ! Arguments ommited for readibility (same as original ArcLStart)
ArcEx_nWeldDistance := 0;
ArcEx_pRefPoint := ToPoint;
ArcLStart ToPoint, \ID?ID, Speed, Seam, \AdvData?AdvData, Weld, \Weave?Weave, Zone, Tool, \WObj?WObj, \Corr?Corr, \Track?Track, \SeamName?SeamName, \T1?T1, \T2?T2, \T3?T3, \T4?T4, \T5?T5, \T6?T6, \T7?T7, \TLoad?TLoad;
ENDPROC
PROC ArcLEx() ! Arguments ommited for readibility (same as original ArcL)
ArcEx_nWeldDistance := ArcEx_nWeldDistance + Distance(ArcEx_pRefPoint.trans, ToPoint.trans);
ArcEx_pRefPoint := ToPoint;
ArcL ToPoint, \ID?ID, Speed, Seam, Weld, \Weave?Weave, Zone, Tool, \WObj?WObj, \Corr?Corr, \Track?Track, \Time?Time, \T1?T1, \T2?T2, \T3?T3, \T4?T4, \T5?T5, \T6?T6, \T7?T7, \TLoad?TLoad;
ENDPROC
PROC ArcLEndEx() ! Arguments ommited for readibility (same as original ArcLEnd)
ArcEx_nWeldDistance := ArcEx_nWeldDistance + Distance(ArcEx_pRefPoint.trans, ToPoint.trans);
ArcEx_pRefPoint := ArcEx_pNonePoint;
TPWrite "Seam length: "\num:=ArcEx_nWeldDistance
ArcLEnd ToPoint, \ID?ID, Speed, Seam, Weld, \Weave?Weave, Zone, Tool, \WObj?WObj, \Corr?Corr, \Track?Track, \Time?Time, \T1?T1, \T2?T2, \T3?T3, \T4?T4, \T5?T5, \T6?T6, \T7?T7, \TLoad?TLoad;
ENDPROC
ENDMODULE
Example usage:
ArcLStartEx W007_On, vtoArc, sm01, s_12, fine, R1_tWeld\WObj:=R1_wFix\SeamName:="W007";
ArcLEx W007_1, vWeld, sm01, s_8, z1, R1_tWeld\WObj:=R1_wFix;
ArcCEx W007_2, W007_3, Vweld, sm01, s_8, z1, R1_tWeld\WObj:=R1_wFix;
ArcLEx W007_4, vWeld, sm01, s_8, z10, R1_tWeld\WObj:=R1_wFix;
ArcLEx W007_5, vWeld, sm01, s_8, z5, R1_tWeld\WObj:=R1_wFix;
ArcLEndEx W007_Off, vWeld, sm01, s_8, z1, R1_tWeld\WObj:=R1_wFix;
This obviously needs a lot of work for handling circular movements, zones etc. That's why I'm not marking this question answered yet.