adding new files, have no idea what changes i have
This commit is contained in:
parent
65d98d3001
commit
e8d3b0ff39
@ -1,257 +0,0 @@
|
|||||||
HANDLE BLOCKNAME TAG INST P_TAG1 IP CAT FAMILY CP LOC TAG1 RATING PDP SPEED DPM INPUT1 INPUT2 MANUFACTURER OUTPUT1
|
|
||||||
'3B760 DPM MCM01 <> <> <> <> <> <> <> <> <> <> <> <> <> <> <>
|
|
||||||
'3B791 *U3059 <> <> PDP1_FIO1 11.200.1.97 5032-8IOLM12DR FIO MCM01 <> <> <> <> <> <> <> <> <>
|
|
||||||
'3B7A4 *U3058 <> <> PDP2_FIO1 11.200.1.97 5032-8IOLM12DR FIO MCM01 <> <> <> <> <> <> <> <> <>
|
|
||||||
'3B7CF *U3057 <> <> <> <> <> <> PDP1_PMM1 <> <> <> <> <> <> <> <>
|
|
||||||
'3B7E2 *U3057 <> <> <> <> <> <> PDP2_PMM1 <> <> <> <> <> <> <> <>
|
|
||||||
'464A5 *U3271 <> <> UL1_3_VFD1 11.200.1.31 35S-6D3-P101 VFD MCM01 <> <> 3HP PDP01 280 FPM DPM1_UL1_4_P2 <> <> <> <>
|
|
||||||
'464BA *U3277 <> <> UL1_4_VFD1 11.200.1.32 35S-6D4-P101 VFD MCM01 <> <> 5HP PDP01 280 FPM DPM1_UL1_4_P3 <> <> <> <>
|
|
||||||
'464CF *U3278 <> <> UL1_5_VFD1 11.200.1.33 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM1_UL1_4_P4 <> <> <> <>
|
|
||||||
'464E4 *U3280 <> <> UL1_6_VFD1 11.200.1.34 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 300 FPM DPM1_UL1_4_P5 <> <> <> <>
|
|
||||||
'464F9 *U3281 <> <> UL1_7_VFD1 11.200.1.35 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 300 FPM DPM1_UL1_4_P6 <> <> <> <>
|
|
||||||
'4650E *U3282 <> <> UL1_8_VFD1 11.200.1.36 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 300 FPM DPM1_UL1_4_P7 <> <> <> <>
|
|
||||||
'46523 *U3283 <> <> UL1_10_VFD1 11.200.1.37 35S-6D4-L001 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM1_UL1_4_P8 <> <> <> <>
|
|
||||||
'46538 *U3284 <> <> UL1_11A_VFD1 11.200.1.38 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM1_UL1_4_P9 <> <> <> <>
|
|
||||||
'4654D *U3285 <> <> UL1_11B_VFD1 11.200.1.39 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM1_UL1_4_P10 <> <> <> <>
|
|
||||||
'46562 *U3286 <> <> UL1_12_VFD1 11.200.1.40 35S-6D2-L001 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM1_UL1_4_P11 <> <> <> <>
|
|
||||||
'46577 *U3287 <> <> UL1_13_VFD1 11.200.1.41 35S-6D4-L001 VFD MCM01 <> <> 5HP PDP01 280 FPM DPM1_UL1_4_P12 <> <> <> <>
|
|
||||||
'4658C *U3288 <> <> UL1_14_VFD1 11.200.1.42 35S-6D2-L001 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM1_UL1_4_P13 <> <> <> <>
|
|
||||||
'465A1 *U3294 <> <> UL2_3_VFD1 11.200.1.45 35S-6D3-P101 VFD MCM01 <> <> 3HP PDP01 280 FPM DPM2_UL2_4_P2 <> <> <> <>
|
|
||||||
'465B6 *U3295 <> <> UL2_4_VFD1 11.200.1.46 35S-6D2-L001 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM2_UL2_4_P3 <> <> <> <>
|
|
||||||
'465CB *U3297 <> <> UL2_5_VFD1 11.200.1.47 35S-6D3-P101 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM2_UL2_4_P4 <> <> <> <>
|
|
||||||
'465E0 *U3298 <> <> UL2_6_VFD1 11.200.1.48 35S-6D4-P101 VFD MCM01 <> <> 5HP PDP01 280 FPM DPM2_UL2_4_P5 <> <> <> <>
|
|
||||||
'465F5 *U3300 <> <> UL2_7_VFD1 11.200.1.49 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM2_UL2_4_P6 <> <> <> <>
|
|
||||||
'4660A *U3301 <> <> UL2_8_VFD1 11.200.1.50 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM2_UL2_4_P7 <> <> <> <>
|
|
||||||
'4661F *U3303 <> <> UL2_9_VFD1 11.200.1.51 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM2_UL2_4_P8 <> <> <> <>
|
|
||||||
'46634 *U3305 <> <> UL2_10_VFD1 11.200.1.52 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM2_UL2_4_P9 <> <> <> <>
|
|
||||||
'46649 *U3306 <> <> UL3_1_VFD1 11.200.1.53 35S-6D2-L001 VFD MCM01 <> <> 2HP PDP01 120 FPM DPM2_UL2_4_P10 <> <> <> <>
|
|
||||||
'4665E *U3308 <> <> UL3_2_VFD1 11.200.1.54 35S-6D4-P101 VFD MCM01 <> <> 5HP PDP01 280 FPM DPM2_UL2_4_P11 <> <> <> <>
|
|
||||||
'46673 *U3311 <> <> UL3_3_VFD1 11.200.1.55 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM2_UL2_4_P12 <> <> <> <>
|
|
||||||
'46688 *U3313 <> <> UL3_4_VFD1 11.200.1.56 35S-6D4-L001 VFD MCM01 <> <> 5HP PDP01 280 FPM DPM2_UL2_4_P13 <> <> <> <>
|
|
||||||
'4669D *U3315 <> <> UL3_5_VFD1 11.200.1.57 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM2_UL2_4_P14 <> <> <> <>
|
|
||||||
'466B2 *U3316 <> <> UL3_6_VFD1 11.200.1.58 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM2_UL2_4_P15 <> <> <> <>
|
|
||||||
'466C7 *U3317 <> <> UL3_7_VFD1 11.200.1.59 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM2_UL2_4_P16 <> <> <> <>
|
|
||||||
'466DC *U3321 <> <> UL3_8_VFD1 11.200.1.60 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM2_UL2_4_P17 <> <> <> <>
|
|
||||||
'466F1 *U3322 <> <> UL3_9_VFD1 11.200.1.61 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM2_UL2_4_P18 <> <> <> <>
|
|
||||||
'46706 *U3323 <> <> UL4_3_VFD1 11.200.1.65 35S-6D5-P101 VFD MCM01 <> <> 7.5HP PDP01 280 FPM DPM3_UL4_4_P2 <> <> <> <>
|
|
||||||
'4671B *U3325 <> <> UL4_4_VFD1 11.200.1.66 35S-6D4-P101 VFD MCM01 <> <> 7.5HP PDP01 280 FPM DPM3_UL4_4_P3 <> <> <> <>
|
|
||||||
'46730 *U3334 <> <> UL4_10_VFD1 11.200.1.71 35S-6D4-P101 VFD MCM01 <> <> 5HP PDP01 280 FPM DPM3_UL4_4_P8 <> <> <> <>
|
|
||||||
'46745 *U3348 <> <> UL5_3_VFD1 11.200.1.79 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM4_UL5_4_P2 <> <> <> <>
|
|
||||||
'4675A *U3350 <> <> UL5_4_VFD1 11.200.1.80 35S-6D4-P101 VFD MCM01 <> <> 5HP PDP01 280 FPM DPM4_UL5_4_P3 <> <> <> <>
|
|
||||||
'468EF *U3279 <> <> UL1_6_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL1_6_VFD1 <> <> <> <> <> UL1_6_VFD1_I2 <> <> <>
|
|
||||||
'46906 *U3124 <> <> UL1_7_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL1_7_VFD1 <> <> <> <> <> UL1_7_VFD1_I2 <> <> <>
|
|
||||||
'4691D *U3127 <> <> UL1_10_TPE3 <> B25-K6LP-Q5 TPE MCM01 <> <> <> <> <> <> <> <>
|
|
||||||
'46934 *U3125 <> <> UL1_9_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL1_9_VFD1 <> <> <> <> <> UL1_9_VFD1_I2 <> <> <>
|
|
||||||
'4694B *U3126 <> <> UL1_10_TPE2 <> B25-K6LP-Q5 TPE MCM01 <> <> <> <> <> UL1-10 <> <> <>
|
|
||||||
'46962 *U3128 <> <> UL1_10_TPE4 <> B25-K6LP-Q5 TPE MCM01 UL1_10_FIO1 <> <> <> <> <> UL1_10_FIO1_P1_C2 <> <> <>
|
|
||||||
'46979 *U3129 <> <> UL1_10_TPE5 <> B25-K6LP-Q5 TPE MCM01 UL1_10_FIO1 <> <> <> <> <> UL1_10_FIO1_P2_C4 <> <> <>
|
|
||||||
'46990 *U3130 <> <> UL1_12_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL1_12_VFD1 <> <> <> <> <> UL1_12_VFD1_I2 <> <> <>
|
|
||||||
'469A7 *U3180 <> <> UL1_12_TPE2 <> B25-K6LP-Q5 TPE MCM01 UL1_12_VFD1 <> <> <> <> <> UL1_12_VFD1_I3 <> <> <>
|
|
||||||
'469BE *U3179 <> <> UL1_13_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL1_13_VFD1 <> <> <> <> <> UL1_13_VFD1_I2 <> <> <>
|
|
||||||
'469D5 *U3149 <> <> UL4_10_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL4_9_VFD1 <> <> <> <> <> UL4_9_VFD1_I3 <> <> <>
|
|
||||||
'469EC *U3150 <> <> UL4_10_TPE2 <> B25-K6LP-Q5 TPE MCM01 UL4_10_VFD1 <> <> <> <> <> UL4_10_VFD1_I2 <> <> <>
|
|
||||||
'46A03 *U3151 <> <> UL4_10_TPE3 <> B25-K6LP-Q5 TPE MCM01 UL4_10_VFD1 <> <> <> <> <> UL4_10_VFD1_I3 <> <> <>
|
|
||||||
'46A1A *U3152 <> <> UL4_10_TPE4 <> B25-K6LP-Q5 TPE MCM01 UL4_10_FIO1 <> <> <> <> <> UL4_10_FIO1_P1_C2 <> <> <>
|
|
||||||
'46A31 *U3153 <> <> UL4_10_TPE5 <> B25-K6LP-Q5 TPE MCM01 UL4_10_FIO1 <> <> <> <> <> UL4_10_FIO1_P2_C4 <> <> <>
|
|
||||||
'46A48 *U3156 <> <> UL5_3_TPE2 <> B25-K6LP-Q5 TPE MCM01 UL5_3_VFD1 <> <> <> <> <> UL5_3_VFD1_I2 <> <> <>
|
|
||||||
'46A5F *U3148 <> <> UL4_3_TPE2 <> B25-K6LP-Q5 TPE MCM01 UL4_3_VFD1 <> <> <> <> <> UL4_3_VFD1_I3 <> <> <>
|
|
||||||
'46A76 *U3181 <> <> UL3_1_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL3_1_VFD1 <> <> <> <> <> UL3_1_VFD1_I2 <> <> <>
|
|
||||||
'46A8D *U3133 <> <> UL2_3_TPE2 <> B25-K6LP-Q5 TPE MCM01 UL2_3_VFD1 <> <> <> <> <> UL2_3_VFD1_I3 <> <> <>
|
|
||||||
'46AA4 *U3132 <> <> UL1_3_TPE2 <> B25-K6LP-Q5 TPE MCM01 UL1_3_VFD1 <> <> <> <> <> UL1_3_VFD1_I3 <> <> <>
|
|
||||||
'46ABB *U3122 <> <> UL1_4_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL1-4_VFD1 <> <> <> <> <> UL1_4_VFD1_I2 <> <> <>
|
|
||||||
'46AD2 *U3134 <> <> UL2_4_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL2_4_VFD1 <> <> <> <> <> UL2_4_VFD1_I2 <> <> <>
|
|
||||||
'46AE9 *U3349 <> <> UL5_4_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL5_4_VFD1 <> <> <> <> <> UL5_4_VFD1_I2 <> <> <>
|
|
||||||
'46B00 *U3142 <> <> UL3_5_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL3_5_VFD1 <> <> <> <> <> UL3_5_VFD1_I2 <> <> <>
|
|
||||||
'46B17 *U3143 <> <> UL3_5_TPE2 <> B25-K6LP-Q5 TPE MCM01 UL3_5_VFD1 <> <> <> <> <> UL3_5_VFD1_I3 <> <> <>
|
|
||||||
'46B2E *U3318 <> <> UL3_6_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL3_6_VFD1 <> <> <> <> <> UL3_6_VFD1_I2 <> <> <>
|
|
||||||
'46B45 *U3319 <> <> UL3_7_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL3_7_VFD1 <> <> <> <> <> UL3_7_VFD1_I2 <> <> <>
|
|
||||||
'46B5C *U3320 <> <> UL3_8_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL3_8_VFD1 <> <> <> <> <> UL3_8_VFD1_I2 <> <> <>
|
|
||||||
'46B73 *U3146 <> <> UL3_9_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL3_9_VFD1 <> <> <> <> <> UL3_9_VFD1_I2 <> <> <>
|
|
||||||
'46B8A *U3304 <> <> UL2_9_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL2_9_VFD1 <> <> <> <> <> UL2_9_VFD1_I2 <> <> <>
|
|
||||||
'46BA1 *U3137 <> <> UL2_8_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL2_8_VFD1 <> <> <> <> <> UL2_8_VFD1_I2 <> <> <>
|
|
||||||
'46BB8 *U3261 <> <> UL2_7_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL2_7_VFD1 <> <> <> <> <> UL2_7_VFD1_I2 <> <> <>
|
|
||||||
'46BFF *U3069 <> <> UL5_4_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL5_4_VFD1_SI2 UL5_4_VFD1_SI3 ALLEN BRADLEY <>
|
|
||||||
'46C16 *U3069 <> <> UL5_4_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL5_4_VFD1_SI0 UL5_4_VFD1_SI1 ALLEN BRADLEY <>
|
|
||||||
'46C2D *U3069 <> <> UL4_4_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL4_4_VFD1_SI2 UL4_4_VFD1_SI3 ALLEN BRADLEY <>
|
|
||||||
'46C44 *U3069 <> <> UL4_4_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL4_4_VFD1_SI0 UL4_4_VFD1_SI1 ALLEN BRADLEY <>
|
|
||||||
'46C5B *U3069 <> <> UL3_2_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL3_2_VFD1_SI2 UL3_2_VFD1_SI3 ALLEN BRADLEY <>
|
|
||||||
'46C72 *U3069 <> <> UL3_2_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL3_2_VFD1_SI0 UL3_2_VFD1_SI1 ALLEN BRADLEY <>
|
|
||||||
'46C89 *U3069 <> <> UL2_4_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL2_4_VFD1_SI2 UL2_4_VFD1_SI3 ALLEN BRADLEY <>
|
|
||||||
'46CA0 *U3069 <> <> UL2_4_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL2_4_VFD1_SI0 UL2_4_VFD1_SI1 ALLEN BRADLEY <>
|
|
||||||
'46CB7 *U3069 <> <> UL1_4_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL1_4_VFD.SI2 UL1_4_VFD.SI3 ALLEN BRADLEY <>
|
|
||||||
'46CCE *U3069 <> <> UL1_4_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL1_4_VFD.SI0 UL1_4_VFD.SI1 ALLEN BRADLEY <>
|
|
||||||
'46D00 *U3214 <> <> UL5_4_S2 <> S22AMTSGRY3Q START PB MCM01 UL5_5_VFD1 <> <> <> <> <> UL5_5_VFD1_IO0 <> <> UL5_5_VFD1_IO1
|
|
||||||
'46D3F *U3237 <> <> UL4_4_S2 <> S22AMTSGRY3Q START PB MCM01 UL4_6_VFD1 <> <> <> <> <> UL4_6_VFD1_IO0 <> <> UL4_6_VFD1_IO1
|
|
||||||
'46D67 *U3215 <> <> UL4_4_S1 <> S22AMTSGRY3Q START PB MCM01 UL4_5_VFD1 <> <> <> <> <> UL4_5_VFD1_IO0 <> <> UL4_5_VFD1_IO1
|
|
||||||
'46D8F *U3240 <> <> UL3_2_S2 <> S22AMTSGRY3Q START PB MCM01 UL3_2_FIO1 <> <> <> <> <> UL3_2_FIO1_P7_C14 <> <> UL3_2_FIO1_P7_C15
|
|
||||||
'46DB7 *U3200 <> <> UL2_4_S2 <> S22AMTSGRY3Q START PB MCM01 UL2_5_VFD1 <> <> <> <> <> UL2_5_VFD1_IO0 <> <> UL2_5_VFD1_IO1
|
|
||||||
'46DDF *U3210 <> <> UL3_2_S1 <> S22AMTSGRY3Q START PB MCM01 UL3_2_FIO1 <> <> <> <> <> UL3_2_FIO1_P6_C12 <> <> UL3_2_FIO1_P6_C13
|
|
||||||
'46E07 *U3199 <> <> UL2_4_S1 <> S22AMTSGRY3Q START PB MCM01 UL2_4_VFD1 <> <> <> <> <> UL2_4_VFD1_IO0 <> <> UL2_4_VFD1_IO1
|
|
||||||
'46E2F *U3195 <> <> UL1_4_S2 <> S22AMTSGRY3Q START PB MCM01 UL1_5_VFD1 <> <> <> <> <> UL1_5_VFD1_IO0 <> <> UL1_5_VFD1_IO1
|
|
||||||
'46E57 *U3221 <> <> UL1_4_S1 <> S22AMTSGRY3Q START PB MCM01 UL1_4_VFD <> <> <> <> <> UL1_4_VFD.IO0 <> <> UL1_4_VFD.IO1
|
|
||||||
'46E68 *U3094 <> <> UL4_10_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL4_10_VFD1_SI2 UL4_10_VFD1_SI3 ALLEN BRADLEY <>
|
|
||||||
'46E7F *U3093 <> <> UL4_10_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL4_10_VFD1_SI0 UL4_10_VFD1_SI1 ALLEN BRADLEY <>
|
|
||||||
'46EAD *U3253 <> <> UL4_10_S2 <> S22AMTSGRY3Q START PB MCM01 UL4_10_FIO1 <> <> <> <> <> UL4_10_FIO1_P6_C12 <> <> UL4_10_FIO1_P6_C13
|
|
||||||
'46ED5 *U3213 <> <> UL4_10_S1 <> S22AMTSGRY3Q START PB MCM01 UL4_10_FIO1 <> <> <> <> <> UL4_10_FIO1_P5_C10 <> <> UL4_10_FIO1_P5_C11
|
|
||||||
'46EFD *U3082 <> <> UL1_10_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> NCP-015-SIO1 NCP-015-SIO1 ALLEN BRADLEY <>
|
|
||||||
'46F14 *U3069 <> <> UL1_10_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> NCP-015-SIO1 NCP-015-SIO1 ALLEN BRADLEY <>
|
|
||||||
'46F42 *U3208 <> <> UL1_10_S2 <> S22AMTSGRY3Q START PB MCM01 UL1_10_FIO1 <> <> <> <> <> UL1_10_FIO1_P6_C12 <> <> UL1_10_FIO1_P6_C13
|
|
||||||
'46F6A *U3196 <> <> UL1_10_S1 <> S22AMTSGRY3Q START PB MCM01 UL1_10_FIO1 <> <> <> <> <> UL1_10_FIO1_P5_C10 <> <> UL1_10_FIO1_P5_C11
|
|
||||||
'46FBC *U3203 <> <> PS1_1_S2 <> S22AMTSGRY3Q START PB MCM01 PS1_3_VFD1 <> <> <> <> <> PS1_3_VFD1_IO0 <> <> PS1_3_VFD1_IO1
|
|
||||||
'46FCF *U3069 <> <> UL3_1_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL3_1_VFD1_SI2 UL3_1_VFD1_SI3 ALLEN BRADLEY <>
|
|
||||||
'46FE6 *U3069 <> <> UL3_1_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL3_1_VFD1_SI0 UL3_1_VFD1_SI1 ALLEN BRADLEY <>
|
|
||||||
'46FFD *U3182 <> <> UL3_1_SS1 <> S22AMTSGRY3Q(2) CS MCM01 UL3_2_FIO1 <> <> <> <> <> UL3_2_FIO1_P1_C2 UL3_2_FIO1_P1_C3 <> UL3_2_FIO1_P2_C4
|
|
||||||
'472B1 *U3344 <> <> PS2_3_VFD1 11.200.1.176 35S-6D3-L001 VFD MCM01 <> <> 3HP PDP06 300 FPM DPM9_PS1_4_P8 <> <> <> <>
|
|
||||||
'472C6 *U3289 <> <> PS1_1_VFD1 11.200.1.169 35S-6D2-L001 VFD MCM01 <> <> 2HP PDP06 300 FPM DPM9_PS1_4_P1 <> <> <> <>
|
|
||||||
'472DB *U3290 <> <> PS1_2_VFD1 11.200.1.170 35S-6D2-L001 VFD MCM01 <> <> 2HP PDP06 300 FPM DPM9_PS1_4_P2 <> <> <> <>
|
|
||||||
'472F0 *U3345 <> <> PS2_4_VFD1 11.200.1.177 35S-6D3-L001 VFD MCM01 <> <> 3HP PDP06 300 FPM DPM9_PS1_4_P9 <> <> <> <>
|
|
||||||
'47305 *U3346 <> <> PS2_5_VFD1 11.200.1.178 35S-6D3-L001 VFD MCM01 <> <> 3HP PDP06 300 FPM DPM9_PS1_4_P10 <> <> <> <>
|
|
||||||
'4731A *U3347 <> <> PS2_6_VFD1 11.200.1.179 35S-6D2-L001 VFD MCM01 <> <> 2HP PDP06 300 FPM DPM9_PS1_4_P11 <> <> <> <>
|
|
||||||
'4732F *U3292 <> <> PS1_4_VFD1 11.200.1.172 35S-6D3-L001 VFD MCM01 <> <> 3HP PDP06 300 FPM DPM9_PS1_4_P4 <> <> <> <>
|
|
||||||
'47344 *U3291 <> <> PS1_3_VFD1 11.200.1.171 35S-6D3-L001 VFD MCM01 <> <> 3HP PDP06 300 FPM DPM9_PS1_4_P3 <> <> <> <>
|
|
||||||
'47359 *U3293 <> <> PS1_5_VFD1 11.200.1.173 35S-6D2-L001 VFD MCM01 <> <> 2HP PDP06 300 FPM DPM9_PS1_4_P5 <> <> <> <>
|
|
||||||
'47370 *U3102 <> <> PS1_1_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> PS1_1_VFD1_SI2 PS1_1_VFD1_SI3 ALLEN BRADLEY <>
|
|
||||||
'47388 *U3072 <> <> PS1_1_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> PS1_1_VFD1_SI0 PS1_1_VFD1_SI1 ALLEN BRADLEY <>
|
|
||||||
'473B7 *U3209 <> <> PS1_1_S1 <> S22AMTSGRY3Q START PB MCM01 PS1_1_VFD1 <> <> <> <> <> PS1_1_VFD1_IO0 <> <> PS1_1_VFD1_IO1
|
|
||||||
'473C8 *U3074 <> <> PS2_6_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> NCP-015-SIO1 NCP-015-SIO1 ALLEN BRADLEY <>
|
|
||||||
'473F6 *U3223 <> <> PS2_6_S2 <> S22AMTSGRY3Q START PB MCM01 <> <> <> <> <> <> <>
|
|
||||||
'47408 *U3076 <> <> PS1_5_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> PS1_5_VFD1_SI0 PS1_5_VFD1_SI1 ALLEN BRADLEY <>
|
|
||||||
'47436 *U3250 <> <> PS1_5_S1 <> S22AMTSGRY3Q START PB MCM01 PS1_4_VFD1 <> <> <> <> <> PS1_4_VFD1_IO0 <> <> PS1_4_VFD1_IO1
|
|
||||||
'47447 *U3118 <> <> PS1_2_TPE1 <> B25-K6LP-Q5 TPE MCM01 PS1_2_VFD1 <> <> <> <> <> PS1_2_VFD1_I2 <> <> <>
|
|
||||||
'4745E *U3119 <> <> PS1_4_TPE1 <> B25-K6LP-Q5 TPE MCM01 PS1_4_VFD1 <> <> <> <> <> PS1_4_VFD1_I2 <> <> <>
|
|
||||||
'47475 *U3120 <> <> PS1_4_TPE2 <> B25-K6LP-Q5 TPE MCM01 PS1_4_VFD1 <> <> <> <> <> PS1_4_VFD1_I3 <> <> <>
|
|
||||||
'4748C *U3121 <> <> PS2_5_TPE1 <> B25-K6LP-Q5 TPE MCM01 PS2_4_VFD1 <> <> <> <> <> PS2_4_VFD1_I2 <> <> <>
|
|
||||||
'474A3 *U3114 <> <> PS2_5_TPE2 <> B25-K6LP-Q5 MCM01 <> <> <> <> <> <> <> <>
|
|
||||||
'474D1 *U3115 <> <> PS1_2_TPE2 <> B25-K6LP-Q5 MCM01 <> <> <> <> <> <> <> <>
|
|
||||||
'474EA *U3073 <> <> PS1_5_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> PS1_5_VFD1_SI2 PS1_5_VFD1_SI3 ALLEN BRADLEY <>
|
|
||||||
'47518 *U3204 <> <> PS1_5_S2 <> S22AMTSGRY3Q START PB MCM01 PS1_5_VFD1 <> <> <> <> <> PS1_5_VFD1_IO0 <> <> PS1_5_VFD1_IO1
|
|
||||||
'4752A *U3075 <> <> PS2_6_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> NCP-015-SIO1 NCP-015-SIO1 ALLEN BRADLEY <>
|
|
||||||
'47542 *U3116 <> <> PS2_6_TPE1 <> B25-K6LP-Q5 MCM01 <> <> <> <> <> <> <> <>
|
|
||||||
'47559 *U3117 <> <> PS1_5_TPE1 <> B25-K6LP-Q5 TPE MCM01 PS1_5_VFD1 <> <> <> <> <> PS1_5_VFD1_I2 <> <> <>
|
|
||||||
'47570 *U3113 <> <> PS2_3_TPE1 <> Q5XKLAF2000-Q8-JAMAMZ JPE MCM01 PS2_3_VFD1 <> <> <> <> <> PS2_3_VFD1_I2 <> <> <>
|
|
||||||
'4759E *U3225 <> <> PS2_6_S1 <> S22AMTSGRY3Q START PB MCM01 <> <> <> <> <> <> <>
|
|
||||||
'47AEC *U3069 <> <> UL2_3_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL2_3_VFD1_SI2 UL2_3_VFD1_SI3 ALLEN BRADLEY <>
|
|
||||||
'47B03 *U3069 <> <> UL2_3_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL2_3_VFD1_SI0 UL2_3_VFD1_SI1 ALLEN BRADLEY <>
|
|
||||||
'47B33 *U3069 <> <> UL1_3_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL1_3_VFD1_SI2 UL1_3_VFD1_SI3 ALLEN BRADLEY <>
|
|
||||||
'47B4A *U3069 <> <> UL1_3_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL1_3_VFD1_SI0 UL1_3_VFD1_SI1 ALLEN BRADLEY <>
|
|
||||||
'47B7C *U3069 <> <> UL4_3_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL4_3_VFD1_SI2 UL4_3_VFD1_SI3 ALLEN BRADLEY <>
|
|
||||||
'47B93 *U3069 <> <> UL4_3_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL4_3_VFD1_SI0 UL4_3_VFD1_SI1 ALLEN BRADLEY <>
|
|
||||||
'47BC3 *U3069 <> <> UL5_3_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL5_3_VFD1_SI2 UL5_3_VFD1_SI3 ALLEN BRADLEY <>
|
|
||||||
'47BDA *U3069 <> <> UL5_3_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL5_3_VFD1_SI0 UL5_3_VFD1_SI1 ALLEN BRADLEY <>
|
|
||||||
'47C2B *U3198 <> <> UL2_3_S2 <> S22AMTSGRY3Q START PB MCM01 UL2_3_FIO1 <> <> <> <> <> UL2_3_FIO1_P5_C10 <> <> UL2_3_FIO1_P5_C11
|
|
||||||
'47C3C *U3194 <> <> UL1_3_S2 <> S22AMTSGRY3Q START PB MCM01 UL1_3_FIO1 <> <> <> <> <> UL1_3_FIO1_P5_C10 <> <> UL1_3_FIO1_P5_C11
|
|
||||||
'47C4D *U3309 <> <> UL3_2_TPE2 <> B25-K6LP-Q5 TPE MCM01 UL3_2_VFD1 <> <> <> <> <> UL3_2_VFD1_I3 <> <> <>
|
|
||||||
'47C64 *U3206 <> <> UL5_3_S2 <> S22AMTSGRY3Q START PB MCM01 UL5_3_FIO1 <> <> <> <> <> UL5_3_FIO1_P5_C10 <> <> UL5_3_FIO1_P5_C11
|
|
||||||
'47C77 *U3123 <> <> UL1_3_TPE1 <> B25-K6LP-Q5 PE MCM01 UL1_3_VFD1 <> <> <> <> <> UL1_3_VFD1_I2 <> <> <>
|
|
||||||
'47C8F *U3131 <> <> UL2_3_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL2_3_VFD1 <> <> <> <> <> UL2_3_VFD1_I2 <> <> <>
|
|
||||||
'47CD6 *U3147 <> <> UL4_3_TPE1 <> B25-K6LP-Q5 PE MCM01 UL4_3_VFD1 <> <> <> <> <> UL4_3_VFD1_I2 <> <> <>
|
|
||||||
'47D1D *U3155 <> <> UL5_3_TPE1 <> B25-K6LP-Q5 PE MCM01 UL5_3_VFD1 <> <> <> <> <> UL5_3_VFD1_I2 <> <> <>
|
|
||||||
'47D64 *U3262 <> <> UL2_3_FIO1 11.200.1.62 5032-8IOLM12DR FIO MCM01 <> <> <> <> <> <> <> <> <>
|
|
||||||
'47D77 *U3264 <> <> UL1_3_FIO1 11.200.1.43 5032-8IOLM12DR FIO MCM01 <> <> <> <> <> <> <> <> <>
|
|
||||||
'47D8A *U3140 <> <> UL3_2_TPE1 <> B25-K6LP-Q5 PE MCM01 UL3_2_VFD1 <> <> <> <> <> UL3_2_VFD1_I2 <> <> <>
|
|
||||||
'47DD1 *U3265 <> <> UL3_2_FIO1 11.200.1.63 5032-8IOLM12DR FIO MCM01 <> <> <> <> <> <> <> <> <>
|
|
||||||
'47DE4 *U3266 <> <> UL4_3_FIO1 11.200.1.77 5032-8IOLM12DR FIO MCM01 <> <> <> <> <> <> <> <> <>
|
|
||||||
'47DF7 *U3267 <> <> UL5_3_FIO1 11.200.1.96 5032-8IOLM12DR FIO MCM01 <> <> <> <> <> <> <> <> <>
|
|
||||||
'47E0A *U3263 <> <> UL6_2_FIO1 11.200.1.97 5032-8IOLM12DR FIO MCM01 <> <> <> <> <> <> <> <> <>
|
|
||||||
'47EA6 *U3193 <> <> UL1_3_S1 <> S22AMTSGRY3Q START PB MCM01 UL1_3_FIO1 <> <> <> <> <> UL1_3_FIO1_P4_C8 <> <> UL1_3_FIO1_P4_C9
|
|
||||||
'47ECE *U3211 <> <> UL2_3_S1 <> S22AMTSGRY3Q START PB MCM01 UL2_3_FIO1 <> <> <> <> <> UL2_3_FIO1_P4_C8 <> <> UL2_3_FIO1_P4_C9
|
|
||||||
'47F20 *U3124 <> <> UL1_8_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL1_8_VFD1 <> <> <> <> <> UL1_8_VFD1_I2 <> <> <>
|
|
||||||
'47F67 *U3205 <> <> UL4_3_S2 <> S22AMTSGRY3Q START PB MCM01 UL4_3_FIO1 <> <> <> <> <> UL4_3_FIO1_P5_C10 <> <> UL4_3_FIO1_P5_C11
|
|
||||||
'47F8F *U3212 <> <> UL4_3_S1 <> S22AMTSGRY3Q START PB MCM01 UL4_3_FIO1 <> <> <> <> <> UL4_3_FIO1_P4_C8 <> <> UL4_3_FIO1_P4_C9
|
|
||||||
'47FA0 *U3327 <> <> UL4_5_VFD1 11.200.1.67 35S-6D3-P101 VFD MCM01 <> <> 3HP PDP01 280 FPM DPM3_UL4_4_P4 <> <> <> <>
|
|
||||||
'47FB5 *U3330 <> <> UL4_6_VFD1 11.200.1.68 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 300 FPM DPM3_UL4_4_P5 <> <> <> <>
|
|
||||||
'47FCA *U3332 <> <> UL4_7_VFD1 11.200.1.69 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 300 FPM DPM3_UL4_4_P6 <> <> <> <>
|
|
||||||
'47FDF *U3333 <> <> UL4_8_VFD1 11.200.1.70 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 300 FPM DPM3_UL4_4_P7 <> <> <> <>
|
|
||||||
'4802D *U3326 <> <> UL4_5_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL4_5_VFD1 <> <> <> <> <> UL4_5_VFD1_I2 <> <> <>
|
|
||||||
'48044 *U3329 <> <> UL4_6_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL4_6_VFD1 <> <> <> <> <> UL4_6_VFD1_I2 <> <> <>
|
|
||||||
'4805B *U3331 <> <> UL4_7_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL4_7_VFD1 <> <> <> <> <> UL4_7_VFD1_I2 <> <> <>
|
|
||||||
'48072 *U3122 <> <> UL4_4_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL4_4_VFD1 <> <> <> <> <> UL4_4_VFD1_I2 <> <> <>
|
|
||||||
'4809C *U3124 <> <> UL4_8_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL4_8_VFD1 <> <> <> <> <> UL4_8_VFD1_I2 <> <> <>
|
|
||||||
'480B3 *U3336 <> <> UL4_11A_VFD1 11.200.1.72 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM3_UL4_4_P9 <> <> <> <>
|
|
||||||
'480C8 *U3337 <> <> UL4_11B_VFD1 11.200.1.73 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM3_UL4_4_P10 <> <> <> <>
|
|
||||||
'480DD *U3339 <> <> UL4_12_VFD1 11.200.1.74 35S-6D2-L001 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM3_UL4_4_P11 <> <> <> <>
|
|
||||||
'480F2 *U3340 <> <> UL4_13_VFD1 11.200.1.75 35S-6D2-L001 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM3_UL4_4_P12 <> <> <> <>
|
|
||||||
'48107 *U3186 <> <> UL4_12_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL4_12_VFD1 <> <> <> <> <> UL4_12_VFD1_I2 <> <> <>
|
|
||||||
'4811E *U3185 <> <> UL4_12_TPE2 <> B25-K6LP-Q5 TPE MCM01 UL4_12_VFD1 <> <> <> <> <> UL4_12_VFD1_I3 <> <> <>
|
|
||||||
'48135 *U3184 <> <> UL4_13_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL4_13_VFD1 <> <> <> <> <> UL4_13_VFD1_I2 <> <> <>
|
|
||||||
'48163 *U3207 <> <> PS2_1_S2 <> S22AMTSGRY3Q START PB MCM01 PS2_3_VFD1 <> <> <> <> <> PS2_3_VFD1_IO0 <> <> PS2_3_VFD1_IO1
|
|
||||||
'48174 *U3077 <> <> PS2_1_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> NCP-015-SIO1 NCP-015-SIO1 ALLEN BRADLEY <>
|
|
||||||
'4818B *U3072 <> <> PS2_1_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> NCP-015-SIO1 NCP-015-SIO1 ALLEN BRADLEY <>
|
|
||||||
'481B9 *U3202 <> <> PS2_1_S1 <> S22AMTSGRY3Q START PB MCM01 <> <> <> <> <> PS2_1_VFD1_IO0 <> <> PS2_1_VFD1_IO1
|
|
||||||
'481CA *U3251 <> <> PS2_2_TPE1 <> B25-K6LP-Q5 MCM01 <> <> <> <> <> <> <> <>
|
|
||||||
'481E1 *U3342 <> <> PS2_1_VFD1 11.200.1.174 35S-6D2-L001 VFD MCM01 <> <> 2HP PDP06 300 FPM DPM9_PS1_4_P6 <> <> <> <>
|
|
||||||
'481F6 *U3343 <> <> PS2_2_VFD1 11.200.1.175 35S-6D2-L001 VFD MCM01 <> <> 2HP PDP06 300 FPM DPM9_PS1_4_P7 <> <> <> <>
|
|
||||||
'4820B *U3154 <> <> PS2_2_TPE2 <> B25-K6LP-Q5 MCM01 <> <> <> <> <> <> <> <>
|
|
||||||
'48239 *U3197 <> <> UL5_3_S1 <> S22AMTSGRY3Q START PB MCM01 UL5_3_FIO1 <> <> <> <> <> UL5_3_FIO1_P4_C8 <> <> UL5_3_FIO1_P4_C9
|
|
||||||
'4824A *U3351 <> <> UL5_5_VFD1 11.200.1.81 35S-6D4-P101 VFD MCM01 <> <> 5HP PDP01 280 FPM DPM4_UL5_4_P4 <> <> <> <>
|
|
||||||
'4825F *U3355 <> <> UL5_6_VFD1 11.200.1.82 35S-6D4-P101 VFD MCM01 <> <> 5HP PDP01 280 FPM DPM4_UL5_4_P5 <> <> <> <>
|
|
||||||
'48274 *U3356 <> <> UL5_7_VFD1 11.200.1.83 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM4_UL5_4_P6 <> <> <> <>
|
|
||||||
'48289 *U3357 <> <> UL5_8_VFD1 11.200.1.84 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM4_UL5_4_P7 <> <> <> <>
|
|
||||||
'4829E *U3359 <> <> UL5_9_VFD1 11.200.1.85 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM4_UL5_4_P8 <> <> <> <>
|
|
||||||
'482B3 *U3360 <> <> UL5_10_VFD1 11.200.1.86 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM4_UL5_4_P9 <> <> <> <>
|
|
||||||
'48314 *U3138 <> <> UL5_10_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL5_10_VFD1 <> <> <> <> <> UL5_10_VFD1_I2 <> <> <>
|
|
||||||
'4832B *U3137 <> <> UL5_9_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL5_9_VFD1 <> <> <> <> <> UL5_9_VFD1_I2 <> <> <>
|
|
||||||
'48342 *U3136 <> <> UL5_8_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL5_8_VFD1 <> <> <> <> <> UL5_8_VFD1_I2 <> <> <>
|
|
||||||
'48359 *U3135 <> <> UL5_7_TPE2 <> B25-K6LP-Q5 TPE MCM01 UL5_7_VFD1 <> <> <> <> <> UL5_7_VFD1_I3 <> <> <>
|
|
||||||
'48370 *U3358 <> <> UL5_7_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL5_7_VFD1 <> <> <> <> <> UL5_7_VFD1_I2 <> <> <>
|
|
||||||
'48387 *U3361 <> <> UL6_1_VFD1 11.200.1.87 35S-6D2-L001 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM4_UL5_4_P10 <> <> <> <>
|
|
||||||
'4839C *U3362 <> <> UL6_2_VFD1 11.200.1.88 35S-6D4-P101 VFD MCM01 <> <> 5HP PDP01 280 FPM DPM4_UL5_4_P11 <> <> <> <>
|
|
||||||
'483B1 *U3365 <> <> UL6_3_VFD1 11.200.1.89 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM4_UL5_4_P12 <> <> <> <>
|
|
||||||
'483C6 *U3367 <> <> UL6_5_VFD1 11.200.1.90 35S-6D2-L001 VFD MCM01 <> <> 2HP PDP01 280 FPM DPM4_UL5_4_P13 <> <> <> <>
|
|
||||||
'483DB *U3369 <> <> UL6_6_VFD1 11.200.1.91 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM4_UL5_4_P14 <> <> <> <>
|
|
||||||
'484B0 *U3139 <> <> UL6_1_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL6_1_VFD1 <> <> <> <> <> UL6_1_VFD1_I2 <> <> <>
|
|
||||||
'484C7 *U3157 <> <> UL6_5_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL6_5_VFD1 <> <> <> <> <> UL6_5_VFD1_I2 <> <> <>
|
|
||||||
'484DE *U3158 <> <> UL6_5_TPE2 <> B25-K6LP-Q5 TPE MCM01 UL6_5_VFD1 <> <> <> <> <> UL6_5_VFD1_I3 <> <> <>
|
|
||||||
'484F5 *U3368 <> <> UL6_6_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL6_6_VFD1 <> <> <> <> <> UL6_6_VFD1_I2 <> <> <>
|
|
||||||
'4850C *U3144 <> <> UL6_7_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL6_7_VFD1 <> <> <> <> <> UL6_7_VFD1_I2 <> <> <>
|
|
||||||
'48523 *U3145 <> <> UL6_8_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL6_8_VFD1 <> <> <> <> <> UL6_8_VFD1_I2 <> <> <>
|
|
||||||
'4853A *U3146 <> <> UL6_9_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL6_9_VFD1 <> <> <> <> <> UL6_9_VFD1_I2 <> <> <>
|
|
||||||
'48551 *U3069 <> <> UL6_2_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL6_2_VFD1_SI2 UL6_2_VFD1_SI3 ALLEN BRADLEY <>
|
|
||||||
'48568 *U3069 <> <> UL6_2_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL6_2_VFD1_SI0 UL6_2_VFD1_SI1 ALLEN BRADLEY <>
|
|
||||||
'48596 *U3231 <> <> UL6_2_S2 <> S22AMTSGRY3Q START PB MCM01 UL6_2_FIO1 <> <> <> <> <> UL6_2_FIO1_P7_C14 <> <> UL6_2_FIO1_P7_C15
|
|
||||||
'485BE *U3201 <> <> UL6_2_S1 <> S22AMTSGRY3Q START PB MCM01 UL6_2_FIO1 <> <> <> <> <> UL6_2_FIO1_P6_C12 <> <> UL6_2_FIO1_P6_C13
|
|
||||||
'485E6 *U3069 <> <> UL6_1_EPC2 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL6_1_VFD1_SI2 UL6_1_VFD1_SI3 ALLEN BRADLEY <>
|
|
||||||
'485FD *U3069 <> <> UL6_1_EPC1 <> 440E-LL5SE5 EPC MCM01 <> <> <> <> <> <> UL6_1_VFD1_SI0 UL6_1_VFD1_SI1 ALLEN BRADLEY <>
|
|
||||||
'48614 *U3187 <> <> UL6_1_SS1 <> S22AMTSGRY3Q(2) CS MCM01 UL6_2_FIO1 <> <> <> <> <> UL6_2_FIO1_P1_C2 UL6_2_FIO1_P2_C4 <> UL6_2_FIO1_P1_C3
|
|
||||||
'48628 *U3141 <> <> UL6_2_TPE2 <> B25-K6LP-Q5 TPE MCM01 UL6_2_VFD1 <> <> <> <> <> UL6_2_VFD1_I3 <> <> <>
|
|
||||||
'4863F *U3140 <> <> UL6_2_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL6_2_VFD1 <> <> <> <> <> UL6_2_VFD1_I2 <> <> <>
|
|
||||||
'486AD DPM UL5_4_DPM1 MCM01 <> <> <> <> <> <> <> <> <> <> <> <> <> <> <>
|
|
||||||
'486B1 DPM UL4_4_DPM1 MCM01 <> <> <> <> <> <> <> <> <> <> <> <> <> <> <>
|
|
||||||
'486B5 DPM UL2_4_DPM1 MCM01 <> <> <> <> <> <> <> <> <> <> <> <> <> <> <>
|
|
||||||
'486B9 DPM UL1_4_DPM1 MCM01 <> <> <> <> <> <> <> <> <> <> <> <> <> <> <>
|
|
||||||
'486BD DPM PS1_4_DPM1 MCM01 <> <> <> <> <> <> <> <> <> <> <> <> <> <> <>
|
|
||||||
'49BD8 *U3269 <> <> UL1_14_FIO1 11.200.1.43 5032-8IOLM12DR FIO MCM01 <> <> <> <> <> <> <> <> <>
|
|
||||||
'49BEB *U3178 <> <> UL1_14_PE1 <> B25-K6LP-Q5 TPE MCM01 <> <> <> <> <> <> <> <>
|
|
||||||
'49C02 *U3161 <> <> UL1_14_PE2 <> B25-K6LP-Q5 TPE MCM01 <> <> <> <> <> <> <> <>
|
|
||||||
'49C19 *U3162 <> <> UL1_14_PE3 <> B25-K6LP-Q5 TPE MCM01 <> <> <> <> <> <> <> <>
|
|
||||||
'49C30 *U3257 <> <> UL1_14_PE4 <> B25-K6LP-Q5 TPE MCM01 <> <> <> <> <> <> <> <>
|
|
||||||
'49C47 *U3256 <> <> UL1_14_PE5 <> B25-K6LP-Q5 TPE MCM01 <> <> <> <> <> <> <> <>
|
|
||||||
'49CAA *U3341 <> <> UL4_14_VFD1 11.200.1.42 35S-6D4-L001 VFD MCM01 <> <> 5HP PDP01 280 FPM DPM1_UL1_4_P13 <> <> <> <>
|
|
||||||
'49CBF *U3268 <> <> UL4_14_FIO1 11.200.1.43 5032-8IOLM12DR FIO MCM01 <> <> <> <> <> <> <> <> <>
|
|
||||||
'49CD2 *U3183 <> <> UL4_14_PE1 <> B25-K6LP-Q5 TPE MCM01 UL4_14_FIO1 <> <> <> <> <> UL4_14_FIO1_P0 <> <> <>
|
|
||||||
'49CE9 *U3159 <> <> UL4_14_PE2 <> B25-K6LP-Q5 TPE MCM01 UL4_14_FIO1 <> <> <> <> <> UL4_14_FIO1_P1 <> <> <>
|
|
||||||
'49D00 *U3160 <> <> UL4_14_PE3 <> B25-K6LP-Q5 TPE MCM01 UL4_14_FIO1 <> <> <> <> <> UL4_14_FIO1_P4_C9 <> <> <>
|
|
||||||
'49D17 *U3228 <> <> UL4_14_PE4 <> B25-K6LP-Q5 TPE MCM01 UL4_14_FIO1 <> <> <> <> <> UL4_14_FIO1_P7 <> <> <>
|
|
||||||
'49D2E *U3229 <> <> UL4_14_PE5 <> B25-K6LP-Q5 TPE MCM01 UL4_14_VFD1 <> <> <> <> <> UL4_14_VFD1_IO0 <> <> <>
|
|
||||||
'49F5F *U3235 <> <> UL5_4_S1 <> S22AMTSGRY3Q START PB MCM01 UL5_4_VFD1 <> <> <> <> <> UL5_4_VFD1_IO0 <> <> UL5_4_VFD1_IO1
|
|
||||||
'56B70 *U3122 <> <> UL1_5_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL1_5_VFD1 <> <> <> <> <> UL1_5_VFD1_I2 <> <> <>
|
|
||||||
'56C95 *U3282 <> <> UL1_9_VFD1 11.200.1.36 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 300 FPM DPM1_UL1_4_P7 <> <> <> <>
|
|
||||||
'56CAC *U3126 <> <> UL1_10_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL1_9_VFD1 <> <> <> <> <> UL1_9_VFD1_I3 <> <> <>
|
|
||||||
'5717C *U3296 <> <> UL2_5_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL2_5_VFD1 <> <> <> <> <> UL2_5_VFD1_I2 <> <> <>
|
|
||||||
'5727C *U3261 <> <> UL2_7_TPE2 <> B25-K6LP-Q5 TPE MCM01 UL2_7_VFD1 <> <> <> <> <> UL2_7_VFD1_I3 <> <> <>
|
|
||||||
'57410 *U3304 <> <> UL2_10_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL2_10_VFD1 <> <> <> <> <> UL2_10_VFD1_I2 <> <> <>
|
|
||||||
'57427 *U3305 <> <> UL2_11_VFD1 11.200.1.52 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM2_UL2_4_P9 <> <> <> <>
|
|
||||||
'57592 *U3312 <> <> UL3_3_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL3_3_VFD1 <> <> <> <> <> UL3_3_VFD1_I2 <> <> <>
|
|
||||||
'5781D *U3322 <> <> UL3_10_VFD1 11.200.1.61 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM2_UL2_4_P18 <> <> <> <>
|
|
||||||
'57B0E *U3124 <> <> UL4_9_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL4_9_VFD1 <> <> <> <> <> UL4_9_VFD1_I2 <> <> <>
|
|
||||||
'57B25 *U3333 <> <> UL4_9_VFD1 11.200.1.70 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 300 FPM DPM3_UL4_4_P7 <> <> <> <>
|
|
||||||
'58005 *U3352 <> <> UL5_5_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL5_5_VFD1 <> <> <> <> <> UL5_5_VFD1_I2 <> <> <>
|
|
||||||
'5822A *U3360 <> <> UL5_11_VFD1 11.200.1.86 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM4_UL5_4_P9 <> <> <> <>
|
|
||||||
'582F2 *U3363 <> <> UL6_3_TPE1 <> B25-K6LP-Q5 TPE MCM01 UL6_3_VFD1 <> <> <> <> <> UL6_3_VFD1_I2 <> <> <>
|
|
||||||
'583B0 *U3365 <> <> UL6_4_VFD1 11.200.1.89 35S-6D4-P101 VFD MCM01 <> <> 5HP PDP01 280 FPM DPM4_UL5_4_P12 <> <> <> <>
|
|
||||||
'584B5 *U3369 <> <> UL6_7_VFD1 11.200.1.91 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM4_UL5_4_P14 <> <> <> <>
|
|
||||||
'584CC *U3369 <> <> UL6_8_VFD1 11.200.1.91 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM4_UL5_4_P14 <> <> <> <>
|
|
||||||
'584E3 *U3369 <> <> UL6_9_VFD1 11.200.1.91 35S-6D2-P101 VFD MCM01 <> <> 2HP PDP01 420 FPM DPM4_UL5_4_P14 <> <> <> <>
|
|
||||||
'584FA *U3369 <> <> UL6_10_VFD1 11.200.1.91 35S-6D3-P101 VFD MCM01 <> <> 3HP PDP01 420 FPM DPM4_UL5_4_P14 <> <> <> <>
|
|
||||||
'AA6A6 *U3264 <> <> UL1_10_FIO1 11.200.1.43 5032-8IOLM12DR FIO MCM01 <> <> <> <> <> <> <> <> <>
|
|
||||||
'AA6C3 *U3264 <> <> UL4_10_FIO1 11.200.1.43 5032-8IOLM12DR FIO MCM01 <> <> <> <> <> <> <> <> <>
|
|
||||||
1001
COMPARE_SVG_DWG/AMZ_TPA8_SYSDL_MCM08.txt
Normal file
1001
COMPARE_SVG_DWG/AMZ_TPA8_SYSDL_MCM08.txt
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
Before Width: | Height: | Size: 162 KiB |
4999
COMPARE_SVG_DWG/MCM08.svg
Normal file
4999
COMPARE_SVG_DWG/MCM08.svg
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 238 KiB |
@ -2,14 +2,16 @@ import csv
|
|||||||
import xml.etree.ElementTree as ET
|
import xml.etree.ElementTree as ET
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import re
|
import re
|
||||||
|
import sys
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
from openpyxl import Workbook
|
||||||
|
from openpyxl.styles import Font, PatternFill, Alignment
|
||||||
|
from openpyxl.utils import get_column_letter
|
||||||
|
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
# CONFIG
|
|
||||||
# -----------------------------
|
|
||||||
DWG_TXT_PATH = Path("AMZ_TPA8_SYSDL_MCM01.txt")
|
|
||||||
SVG_PATH = Path("MCM01.svg")
|
|
||||||
|
|
||||||
# SVG suffixes that mean "same device"
|
# SVG suffixes that mean "same device"
|
||||||
|
# -----------------------------
|
||||||
SVG_SUFFIXES = (
|
SVG_SUFFIXES = (
|
||||||
"_ASSEMBLY",
|
"_ASSEMBLY",
|
||||||
"_END",
|
"_END",
|
||||||
@ -21,6 +23,36 @@ SVG_SUFFIXES = (
|
|||||||
"_TRITOPRIGHT",
|
"_TRITOPRIGHT",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# -----------------------------
|
||||||
|
# DEVICE TYPES TO IGNORE
|
||||||
|
# (substring match after normalization)
|
||||||
|
# -----------------------------
|
||||||
|
IGNORE_CONTAINS = (
|
||||||
|
"_BCN",
|
||||||
|
"_ENC",
|
||||||
|
"_SOL",
|
||||||
|
)
|
||||||
|
|
||||||
|
# Output folder for reports
|
||||||
|
OUTPUT_DIR = Path("reports")
|
||||||
|
|
||||||
|
# -----------------------------
|
||||||
|
# NORMALIZATION HELPERS
|
||||||
|
# -----------------------------
|
||||||
|
_TRAILING_NUMERIC_CHUNKS_RE = re.compile(r"(?:_\d+)+$")
|
||||||
|
|
||||||
|
|
||||||
|
def _contains_svg_suffix_token(n_with_underscores: str) -> bool:
|
||||||
|
"""
|
||||||
|
Return True if any SVG suffix appears as a token boundary:
|
||||||
|
e.g. "..._RECT_5_18" contains "_RECT" token
|
||||||
|
"""
|
||||||
|
return any(
|
||||||
|
(suffix + "_") in n_with_underscores or n_with_underscores.endswith(suffix)
|
||||||
|
for suffix in SVG_SUFFIXES
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
# NORMALIZATION
|
# NORMALIZATION
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
@ -33,88 +65,259 @@ def normalize_name(name: str) -> str:
|
|||||||
# ---- VFD1 (DWG) vs VFD (SVG)
|
# ---- VFD1 (DWG) vs VFD (SVG)
|
||||||
n = re.sub(r"_VFD1$", "_VFD", n)
|
n = re.sub(r"_VFD1$", "_VFD", n)
|
||||||
|
|
||||||
# ---- Strip SVG part suffixes
|
# For SVG junk like "..._RECT-5-18", normalize dashes so we can parse consistently
|
||||||
|
n_u = n.replace("-", "_")
|
||||||
|
|
||||||
|
# If this looks like an SVG "part id" (RECT/CIRCLE/TRI...), clean it:
|
||||||
|
if _contains_svg_suffix_token(n_u):
|
||||||
|
# Remove trailing numeric chunks (e.g. _5_18, _1_0_01, etc.)
|
||||||
|
n_u = _TRAILING_NUMERIC_CHUNKS_RE.sub("", n_u)
|
||||||
|
|
||||||
|
# Strip SVG part suffixes using the existing list
|
||||||
for suffix in SVG_SUFFIXES:
|
for suffix in SVG_SUFFIXES:
|
||||||
if n.endswith(suffix):
|
if n_u.endswith(suffix):
|
||||||
n = n[: -len(suffix)]
|
n_u = n_u[: -len(suffix)]
|
||||||
break
|
break
|
||||||
|
|
||||||
return n
|
return n_u
|
||||||
|
|
||||||
|
|
||||||
|
def is_ignored(normalized_name: str) -> bool:
|
||||||
|
"""Return True if this normalized device name should be ignored."""
|
||||||
|
if not normalized_name:
|
||||||
|
return True
|
||||||
|
return any(token in normalized_name for token in IGNORE_CONTAINS)
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
# LOAD DWG
|
# FILE PICKER
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
def load_dwg_devices(path: Path) -> set[str]:
|
def pick_file(ext: str, label: str) -> Path:
|
||||||
devices = set()
|
"""
|
||||||
|
Scan current folder for files with given extension and let user choose.
|
||||||
|
ext example: ".txt" or ".svg"
|
||||||
|
"""
|
||||||
|
cwd = Path.cwd()
|
||||||
|
files = sorted([p for p in cwd.iterdir() if p.is_file() and p.suffix.lower() == ext.lower()])
|
||||||
|
|
||||||
|
if not files:
|
||||||
|
raise RuntimeError(f"No {ext} files found in: {cwd}")
|
||||||
|
|
||||||
|
# Auto pick if only one file exists
|
||||||
|
if len(files) == 1:
|
||||||
|
print(f"\nAuto-selected {label}: {files[0].name}")
|
||||||
|
return files[0]
|
||||||
|
|
||||||
|
print(f"\nSelect {label} ({ext}):")
|
||||||
|
for i, p in enumerate(files, start=1):
|
||||||
|
print(f" {i}) {p.name}")
|
||||||
|
|
||||||
|
while True:
|
||||||
|
choice = input(f"Enter number (1-{len(files)}): ").strip()
|
||||||
|
if choice.isdigit():
|
||||||
|
idx = int(choice)
|
||||||
|
if 1 <= idx <= len(files):
|
||||||
|
return files[idx - 1]
|
||||||
|
print("Invalid choice. Try again.")
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------
|
||||||
|
# LOAD DWG (TXT export)
|
||||||
|
# -----------------------------
|
||||||
|
def load_dwg_devices(path: Path) -> tuple[set[str], list[str]]:
|
||||||
|
devices: set[str] = set()
|
||||||
|
ignored: list[str] = []
|
||||||
|
|
||||||
with path.open("r", encoding="utf-8", errors="ignore") as f:
|
with path.open("r", encoding="utf-8", errors="ignore") as f:
|
||||||
reader = csv.DictReader(f, delimiter="\t")
|
reader = csv.DictReader(f, delimiter="\t")
|
||||||
|
|
||||||
|
if not reader.fieldnames:
|
||||||
|
raise RuntimeError(f"Could not read header from file: {path.name}")
|
||||||
|
|
||||||
if "P_TAG1" not in reader.fieldnames:
|
if "P_TAG1" not in reader.fieldnames:
|
||||||
raise RuntimeError(
|
raise RuntimeError(f"P_TAG1 column not found in {path.name}. Found: {reader.fieldnames}")
|
||||||
f"P_TAG1 column not found. Found: {reader.fieldnames}"
|
|
||||||
)
|
|
||||||
|
|
||||||
for row in reader:
|
for row in reader:
|
||||||
raw = row.get("P_TAG1", "")
|
raw = (row.get("P_TAG1") or "").strip()
|
||||||
if raw and raw != "<>":
|
if not raw or raw == "<>":
|
||||||
devices.add(normalize_name(raw))
|
continue
|
||||||
|
|
||||||
return devices
|
normalized = normalize_name(raw)
|
||||||
|
|
||||||
|
if is_ignored(normalized):
|
||||||
|
ignored.append(normalized)
|
||||||
|
continue
|
||||||
|
|
||||||
|
devices.add(normalized)
|
||||||
|
|
||||||
|
return devices, ignored
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
# LOAD SVG
|
# LOAD SVG
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
def load_svg_devices(path: Path) -> set[str]:
|
def load_svg_devices(path: Path) -> tuple[set[str], list[str]]:
|
||||||
devices = set()
|
devices: set[str] = set()
|
||||||
|
ignored: list[str] = []
|
||||||
|
|
||||||
tree = ET.parse(path)
|
tree = ET.parse(path)
|
||||||
root = tree.getroot()
|
root = tree.getroot()
|
||||||
|
|
||||||
for elem in root.iter():
|
for elem in root.iter():
|
||||||
elem_id = elem.attrib.get("id")
|
elem_id = elem.attrib.get("id")
|
||||||
if elem_id:
|
if not elem_id:
|
||||||
devices.add(normalize_name(elem_id))
|
continue
|
||||||
|
|
||||||
return devices
|
normalized = normalize_name(elem_id)
|
||||||
|
|
||||||
|
if is_ignored(normalized):
|
||||||
|
ignored.append(normalized)
|
||||||
|
continue
|
||||||
|
|
||||||
|
devices.add(normalized)
|
||||||
|
|
||||||
|
return devices, ignored
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------
|
||||||
|
# EXCEL REPORT
|
||||||
|
# -----------------------------
|
||||||
|
def _style_header_row(ws, header_fill_hex: str):
|
||||||
|
header_fill = PatternFill("solid", fgColor=header_fill_hex)
|
||||||
|
header_font = Font(bold=True, color="FFFFFF")
|
||||||
|
for cell in ws[1]:
|
||||||
|
cell.fill = header_fill
|
||||||
|
cell.font = header_font
|
||||||
|
cell.alignment = Alignment(horizontal="center", vertical="center")
|
||||||
|
|
||||||
|
|
||||||
|
def _autosize_columns(ws, max_width: int = 60):
|
||||||
|
for col in range(1, ws.max_column + 1):
|
||||||
|
letter = get_column_letter(col)
|
||||||
|
best = 0
|
||||||
|
for row in range(1, ws.max_row + 1):
|
||||||
|
v = ws.cell(row=row, column=col).value
|
||||||
|
if v is None:
|
||||||
|
continue
|
||||||
|
best = max(best, len(str(v)))
|
||||||
|
ws.column_dimensions[letter].width = min(max(best + 2, 12), max_width)
|
||||||
|
|
||||||
|
|
||||||
|
def write_excel_report(
|
||||||
|
dwg_file: Path,
|
||||||
|
svg_file: Path,
|
||||||
|
dwg_devices: set[str],
|
||||||
|
svg_devices: set[str],
|
||||||
|
dwg_ignored: list[str],
|
||||||
|
svg_ignored: list[str],
|
||||||
|
missing_in_svg: list[str],
|
||||||
|
extra_in_svg: list[str],
|
||||||
|
) -> Path:
|
||||||
|
OUTPUT_DIR.mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
ts = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
||||||
|
out_path = OUTPUT_DIR / f"dwg_vs_svg_report_{ts}.xlsx"
|
||||||
|
|
||||||
|
wb = Workbook()
|
||||||
|
|
||||||
|
# ---------- Summary ----------
|
||||||
|
ws = wb.active
|
||||||
|
ws.title = "Summary"
|
||||||
|
ws.append(["Field", "Value"])
|
||||||
|
_style_header_row(ws, "404040")
|
||||||
|
|
||||||
|
summary_rows = [
|
||||||
|
("DWG file", dwg_file.name),
|
||||||
|
("SVG file", svg_file.name),
|
||||||
|
("DWG logical devices", len(dwg_devices)),
|
||||||
|
("SVG logical devices", len(svg_devices)),
|
||||||
|
("Missing in SVG", len(missing_in_svg)),
|
||||||
|
("Extra in SVG", len(extra_in_svg)),
|
||||||
|
("Ignored in DWG", len(dwg_ignored)),
|
||||||
|
("Ignored in SVG", len(svg_ignored)),
|
||||||
|
("Ignore filters", ", ".join(IGNORE_CONTAINS)),
|
||||||
|
("SVG suffixes", ", ".join(SVG_SUFFIXES)),
|
||||||
|
]
|
||||||
|
for k, v in summary_rows:
|
||||||
|
ws.append([k, v])
|
||||||
|
|
||||||
|
_autosize_columns(ws)
|
||||||
|
|
||||||
|
# ---------- Missing ----------
|
||||||
|
ws_miss = wb.create_sheet("Missing_in_SVG")
|
||||||
|
ws_miss.append(["Missing Device"])
|
||||||
|
_style_header_row(ws_miss, "C00000") # red
|
||||||
|
for d in missing_in_svg:
|
||||||
|
ws_miss.append([d])
|
||||||
|
_autosize_columns(ws_miss)
|
||||||
|
|
||||||
|
# ---------- Extra ----------
|
||||||
|
ws_extra = wb.create_sheet("Extra_in_SVG")
|
||||||
|
ws_extra.append(["Extra Device"])
|
||||||
|
_style_header_row(ws_extra, "E69138") # orange
|
||||||
|
for d in extra_in_svg:
|
||||||
|
ws_extra.append([d])
|
||||||
|
_autosize_columns(ws_extra)
|
||||||
|
|
||||||
|
# ---------- Ignored DWG ----------
|
||||||
|
ws_idwg = wb.create_sheet("Ignored_DWG")
|
||||||
|
ws_idwg.append(["Ignored Device"])
|
||||||
|
_style_header_row(ws_idwg, "6A1B9A") # purple
|
||||||
|
for d in sorted(set(dwg_ignored)):
|
||||||
|
ws_idwg.append([d])
|
||||||
|
_autosize_columns(ws_idwg)
|
||||||
|
|
||||||
|
# ---------- Ignored SVG ----------
|
||||||
|
ws_isvg = wb.create_sheet("Ignored_SVG")
|
||||||
|
ws_isvg.append(["Ignored Device"])
|
||||||
|
_style_header_row(ws_isvg, "6A1B9A") # purple
|
||||||
|
for d in sorted(set(svg_ignored)):
|
||||||
|
ws_isvg.append([d])
|
||||||
|
_autosize_columns(ws_isvg)
|
||||||
|
|
||||||
|
wb.save(out_path)
|
||||||
|
return out_path
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
# MAIN
|
# MAIN
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
dwg_devices = load_dwg_devices(DWG_TXT_PATH)
|
def main():
|
||||||
svg_devices = load_svg_devices(SVG_PATH)
|
try:
|
||||||
|
dwg_txt_path = pick_file(".txt", "DWG export text file (DWG devices)")
|
||||||
|
svg_path = pick_file(".svg", "SVG file (SVG devices)")
|
||||||
|
except RuntimeError as e:
|
||||||
|
print(f"Error: {e}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
missing_in_svg = sorted(dwg_devices - svg_devices)
|
dwg_devices, dwg_ignored = load_dwg_devices(dwg_txt_path)
|
||||||
extra_in_svg = sorted(svg_devices - dwg_devices)
|
svg_devices, svg_ignored = load_svg_devices(svg_path)
|
||||||
|
|
||||||
# -----------------------------
|
missing_in_svg = sorted(dwg_devices - svg_devices)
|
||||||
# REPORT
|
extra_in_svg = sorted(svg_devices - dwg_devices)
|
||||||
# -----------------------------
|
|
||||||
print("====== DWG vs SVG DEVICE CHECK (NORMALIZED) ======")
|
|
||||||
print(f"DWG logical devices: {len(dwg_devices)}")
|
|
||||||
print(f"SVG logical devices: {len(svg_devices)}")
|
|
||||||
print()
|
|
||||||
|
|
||||||
# ---- EXTRA FIRST
|
report_path = write_excel_report(
|
||||||
if extra_in_svg:
|
dwg_txt_path,
|
||||||
print(f"⚠ Extra SVG devices ({len(extra_in_svg)}):")
|
svg_path,
|
||||||
for d in extra_in_svg:
|
dwg_devices,
|
||||||
print(f" - {d}")
|
svg_devices,
|
||||||
else:
|
dwg_ignored,
|
||||||
print("✅ No extra SVG devices")
|
svg_ignored,
|
||||||
|
missing_in_svg,
|
||||||
|
extra_in_svg,
|
||||||
|
)
|
||||||
|
|
||||||
print()
|
# Console summary (short)
|
||||||
|
print("\n====== DWG vs SVG DEVICE CHECK ======")
|
||||||
|
print(f"DWG devices: {len(dwg_devices)} ({dwg_txt_path.name})")
|
||||||
|
print(f"SVG devices: {len(svg_devices)} ({svg_path.name})")
|
||||||
|
print(f"Missing in SVG: {len(missing_in_svg)}")
|
||||||
|
print(f"Extra in SVG: {len(extra_in_svg)}")
|
||||||
|
print(f"Ignored DWG: {len(dwg_ignored)} filters={IGNORE_CONTAINS}")
|
||||||
|
print(f"Ignored SVG: {len(svg_ignored)} filters={IGNORE_CONTAINS}")
|
||||||
|
print(f"\n✅ Excel report saved to: {report_path}")
|
||||||
|
print("=====================================")
|
||||||
|
|
||||||
# ---- MISSING LAST
|
|
||||||
if missing_in_svg:
|
|
||||||
print(f"❌ Missing in SVG ({len(missing_in_svg)}):")
|
|
||||||
for d in missing_in_svg:
|
|
||||||
print(f" - {d}")
|
|
||||||
else:
|
|
||||||
print("✅ No missing DWG devices in SVG")
|
|
||||||
|
|
||||||
print("=================================================")
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|||||||
Binary file not shown.
@ -1,6 +1,5 @@
|
|||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import shutil
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
@ -25,14 +24,7 @@ if len(json_files) > 1:
|
|||||||
|
|
||||||
INPUT_JSON = os.path.join(SCRIPT_DIR, json_files[0])
|
INPUT_JSON = os.path.join(SCRIPT_DIR, json_files[0])
|
||||||
|
|
||||||
# Output and backup paths (same folder)
|
|
||||||
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||||
|
|
||||||
BACKUP_JSON = os.path.join(
|
|
||||||
SCRIPT_DIR,
|
|
||||||
"tag_export_backup_%s.json" % timestamp
|
|
||||||
)
|
|
||||||
|
|
||||||
OUTPUT_JSON = os.path.join(
|
OUTPUT_JSON = os.path.join(
|
||||||
SCRIPT_DIR,
|
SCRIPT_DIR,
|
||||||
"tag_export_modified_%s.json" % timestamp
|
"tag_export_modified_%s.json" % timestamp
|
||||||
@ -48,7 +40,7 @@ print(" 1 = OPC")
|
|||||||
print(" 2 = MEMORY")
|
print(" 2 = MEMORY")
|
||||||
print("")
|
print("")
|
||||||
|
|
||||||
choice = raw_input("Enter choice (1 or 2): ").strip()
|
choice = input("Enter choice (1 or 2): ").strip()
|
||||||
|
|
||||||
if choice == "1":
|
if choice == "1":
|
||||||
TARGET_MODE = "OPC"
|
TARGET_MODE = "OPC"
|
||||||
@ -60,16 +52,7 @@ else:
|
|||||||
print("Target mode:", TARGET_MODE)
|
print("Target mode:", TARGET_MODE)
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# BACKUP ORIGINAL FILE
|
# MODIFICATION LOGIC (SYSTEM FOLDER ONLY)
|
||||||
# =========================================================
|
|
||||||
|
|
||||||
shutil.copy2(INPUT_JSON, BACKUP_JSON)
|
|
||||||
|
|
||||||
print("Backup created:")
|
|
||||||
print(" ", BACKUP_JSON)
|
|
||||||
|
|
||||||
# =========================================================
|
|
||||||
# JSON MODIFICATION LOGIC
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
|
|
||||||
modified_count = 0
|
modified_count = 0
|
||||||
@ -94,18 +77,35 @@ def process_node(node):
|
|||||||
elif TARGET_MODE == "OPC":
|
elif TARGET_MODE == "OPC":
|
||||||
if value_source != "opc":
|
if value_source != "opc":
|
||||||
node["valueSource"] = "opc"
|
node["valueSource"] = "opc"
|
||||||
# opcItemPath preserved if it exists
|
|
||||||
modified_count += 1
|
modified_count += 1
|
||||||
|
|
||||||
# Recurse into child tags
|
# Recurse deeper
|
||||||
for key in ("tags", "children"):
|
for key in ("tags", "children"):
|
||||||
children = node.get(key)
|
children = node.get(key)
|
||||||
if isinstance(children, list):
|
if isinstance(children, list):
|
||||||
for child in children:
|
for child in children:
|
||||||
process_node(child)
|
process_node(child)
|
||||||
|
|
||||||
|
|
||||||
|
def find_and_process_system(root):
|
||||||
|
"""
|
||||||
|
Locate the 'System' folder and ONLY process its contents.
|
||||||
|
"""
|
||||||
|
if not isinstance(root, dict):
|
||||||
|
return
|
||||||
|
|
||||||
|
if root.get("tagType") == "Folder" and root.get("name") == "System":
|
||||||
|
process_node(root)
|
||||||
|
return
|
||||||
|
|
||||||
|
for key in ("tags", "children"):
|
||||||
|
children = root.get(key)
|
||||||
|
if isinstance(children, list):
|
||||||
|
for child in children:
|
||||||
|
find_and_process_system(child)
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# LOAD → PROCESS → WRITE
|
# LOAD → FIND SYSTEM → PROCESS → WRITE
|
||||||
# =========================================================
|
# =========================================================
|
||||||
|
|
||||||
with open(INPUT_JSON, "r") as f:
|
with open(INPUT_JSON, "r") as f:
|
||||||
@ -113,9 +113,9 @@ with open(INPUT_JSON, "r") as f:
|
|||||||
|
|
||||||
if isinstance(data, list):
|
if isinstance(data, list):
|
||||||
for root in data:
|
for root in data:
|
||||||
process_node(root)
|
find_and_process_system(root)
|
||||||
else:
|
else:
|
||||||
process_node(data)
|
find_and_process_system(data)
|
||||||
|
|
||||||
with open(OUTPUT_JSON, "w") as f:
|
with open(OUTPUT_JSON, "w") as f:
|
||||||
json.dump(data, f, indent=2)
|
json.dump(data, f, indent=2)
|
||||||
@ -128,12 +128,12 @@ print("")
|
|||||||
print("======================================")
|
print("======================================")
|
||||||
print(" Tag Source Update Complete")
|
print(" Tag Source Update Complete")
|
||||||
print("======================================")
|
print("======================================")
|
||||||
print(" Input File :", INPUT_JSON)
|
print(" Target Folder :", "System")
|
||||||
print(" Backup File :", BACKUP_JSON)
|
|
||||||
print(" Output File :", OUTPUT_JSON)
|
|
||||||
print(" Target Mode :", TARGET_MODE)
|
print(" Target Mode :", TARGET_MODE)
|
||||||
print(" Tags Modified :", modified_count)
|
print(" Tags Modified :", modified_count)
|
||||||
|
print(" Input File :", INPUT_JSON)
|
||||||
|
print(" Output File :", OUTPUT_JSON)
|
||||||
print("======================================")
|
print("======================================")
|
||||||
|
|
||||||
if modified_count == 0:
|
if modified_count == 0:
|
||||||
print("⚠ WARNING: No tags were modified.")
|
print("⚠ WARNING: No tags were modified inside 'System'.")
|
||||||
|
|||||||
637282
tags-switching/tag_export_backup_20260120_084344.json
Normal file
637282
tags-switching/tag_export_backup_20260120_084344.json
Normal file
File diff suppressed because one or more lines are too long
753467
tags-switching/tag_export_modified_20260120_084344.json
Normal file
753467
tags-switching/tag_export_modified_20260120_084344.json
Normal file
File diff suppressed because one or more lines are too long
637282
tags-switching/tags.json
Normal file
637282
tags-switching/tags.json
Normal file
File diff suppressed because one or more lines are too long
340
tags/generate-tags.py
Normal file
340
tags/generate-tags.py
Normal file
@ -0,0 +1,340 @@
|
|||||||
|
"""
|
||||||
|
!!! YOU MUST DELETE THE EXISTING {MCM_NUMBER}.JSON FILES BEFORE RUNNING THE SCRIPT !!!
|
||||||
|
This script is used to generate tags.json files for each MCM folder in the Detailed-Views folder.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import copy
|
||||||
|
|
||||||
|
default_view_path = r"C:\Program Files\Inductive Automation\Ignition\data\projects\BNA8\com.inductiveautomation.perspective\views\autStand\Detailed_Views"
|
||||||
|
|
||||||
|
def merge_tags(t1, t2):
|
||||||
|
"""
|
||||||
|
Merge two tag folder trees, deduplicating tags by name within each folder, preserving folder structure.
|
||||||
|
"""
|
||||||
|
if not (isinstance(t1, dict) and isinstance(t2, dict)):
|
||||||
|
return copy.deepcopy(t1) if t2 is None else copy.deepcopy(t2)
|
||||||
|
|
||||||
|
if t1.get('tagType') == 'Folder' and t2.get('tagType') == 'Folder':
|
||||||
|
merged = {k: v for k, v in t1.items() if k != 'tags'}
|
||||||
|
merged['tags'] = []
|
||||||
|
tags1 = {tag['name']: tag for tag in t1.get('tags', [])}
|
||||||
|
tags2 = {tag['name']: tag for tag in t2.get('tags', [])}
|
||||||
|
all_names = set(tags1) | set(tags2)
|
||||||
|
for name in sorted(all_names):
|
||||||
|
tag1 = tags1.get(name)
|
||||||
|
tag2 = tags2.get(name)
|
||||||
|
if tag1 and tag2:
|
||||||
|
merged['tags'].append(merge_tags(tag1, tag2))
|
||||||
|
elif tag1:
|
||||||
|
merged['tags'].append(copy.deepcopy(tag1))
|
||||||
|
elif tag2:
|
||||||
|
merged['tags'].append(copy.deepcopy(tag2))
|
||||||
|
return merged
|
||||||
|
else:
|
||||||
|
return copy.deepcopy(t1) if t2 is None else copy.deepcopy(t2)
|
||||||
|
|
||||||
|
# Filtering and classification rules
|
||||||
|
def classify_device(name, mcm_device_name):
|
||||||
|
skip_keywords = ["Line", "Image", "Button", "Camera", "END", "image", "PR", "GS", "ERSC", "DIV"]
|
||||||
|
|
||||||
|
def create_parameters(mcm_name):
|
||||||
|
return {
|
||||||
|
"parameters": {
|
||||||
|
"MCM": {
|
||||||
|
"dataType": "String",
|
||||||
|
"value": mcm_name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if any(re.search(rf'{kw}\d+$', name) for kw in ["FIO", "SIO", "DPM"]):
|
||||||
|
for kw in ["FIO", "SIO", "DPM"]:
|
||||||
|
if re.search(rf'{kw}\d+$', name):
|
||||||
|
result = {"folder": f"IO_BLOCK/{kw}", "typeId": "IO_BLOCK", "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
# Beacon rules
|
||||||
|
beacon_match = re.search(r'_BCN\d+_(R|G|A|H|B)$', name)
|
||||||
|
if beacon_match:
|
||||||
|
result = {
|
||||||
|
"folder": "Beacon",
|
||||||
|
"typeId": "Beacon",
|
||||||
|
"tagType": "UdtInstance",
|
||||||
|
"name": name
|
||||||
|
}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
# Photoeye rules with correct UDT typeId
|
||||||
|
for kw in ["TPE", "LRPE", "PE"]:
|
||||||
|
if re.search(rf'{kw}\d*$', name):
|
||||||
|
udt_path = f"PE/{kw}" # full UDT path
|
||||||
|
result = {"folder": f"Photoeye/{kw}", "typeId": udt_path, "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
# Encoders rules with correct UDT typeId
|
||||||
|
for kw in ["ENSH", "ENW"]:
|
||||||
|
if re.search(rf'{kw}\d*$', name):
|
||||||
|
udt_path = f"Encoder" # full UDT path
|
||||||
|
result = {"folder": f"Encoder/{kw}", "typeId": udt_path, "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
if "PRX" in name:
|
||||||
|
result = {"folder": "PRX", "typeId": "PRX", "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
if "PR" in name or any(kw in name for kw in skip_keywords):
|
||||||
|
return None
|
||||||
|
|
||||||
|
if "EPC" in name:
|
||||||
|
result = {"folder": "Station/EPC", "typeId": "Station/EPC", "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
if "SS1" in name or "SS2" in name:
|
||||||
|
result = {"folder": "Station/SS", "typeId": "Station/SS", "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
if name.startswith("S03") and "JR" in name:
|
||||||
|
result = {"folder": "Station/Chute_JR", "typeId": "Station/Chute_JR", "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
if "JR" in name:
|
||||||
|
result = {"folder": "Station/JR", "typeId": "Station/JR", "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
if "EN" in name:
|
||||||
|
result = {"folder": "Station/EN", "typeId": "Station/EN", "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
if any(kw in name for kw in ["DPM", "FIO", "SIO", "HUB"]):
|
||||||
|
for kw in ["DPM", "FIO", "SIO", "HUB"]:
|
||||||
|
if kw in name:
|
||||||
|
result = {"folder": f"IO_BLOCK/{kw}", "typeId": "IO_BLOCK", "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
if "TIPPER" in name:
|
||||||
|
result = {"folder": "Conveyor/Tipper", "typeId": "Conveyor/Tipper", "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
if "EX" in name:
|
||||||
|
result = {"folder": "Conveyor/Extendo", "typeId": "Conveyor/Extendo", "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
if "FL" in name and "CH" in name:
|
||||||
|
result = {"folder": "Chute/FL_CHUTE", "typeId": "Chute/FL_CHUTE", "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
if "VFD" in name:
|
||||||
|
result = {"folder": "VFD", "typeId": "VFD", "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
if "SOL" in name:
|
||||||
|
result = {"folder": "SOL", "typeId": "SOL", "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
if "CH" in name:
|
||||||
|
result = {"folder": "Chute", "typeId": "Chute", "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
result = {"folder": "Conveyor", "typeId": "Conveyor", "tagType": "UdtInstance", "name": name}
|
||||||
|
result.update(create_parameters(mcm_device_name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
# Recursive extraction of all nested devices
|
||||||
|
def extract_all_devices(children):
|
||||||
|
devices = []
|
||||||
|
for child in children:
|
||||||
|
meta = child.get("meta", {})
|
||||||
|
name = meta.get("name")
|
||||||
|
if name:
|
||||||
|
devices.append(name)
|
||||||
|
nested = child.get("children", [])
|
||||||
|
if nested:
|
||||||
|
devices.extend(extract_all_devices(nested))
|
||||||
|
return devices
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if not os.path.isdir(default_view_path):
|
||||||
|
print(f"Directory not found: {default_view_path}")
|
||||||
|
return
|
||||||
|
|
||||||
|
for folder_name in os.listdir(default_view_path):
|
||||||
|
folder_path = os.path.join(default_view_path, folder_name)
|
||||||
|
if not os.path.isdir(folder_path):
|
||||||
|
continue
|
||||||
|
view_json_path = os.path.join(folder_path, "view.json")
|
||||||
|
if not os.path.isfile(view_json_path):
|
||||||
|
print(f"No view.json in {folder_path}, skipping.")
|
||||||
|
continue
|
||||||
|
|
||||||
|
with open(view_json_path, encoding="utf-8") as f:
|
||||||
|
view = json.load(f)
|
||||||
|
|
||||||
|
children = view.get("root", {}).get("children", [])
|
||||||
|
all_device_names = extract_all_devices(children)
|
||||||
|
|
||||||
|
mcm_device_name = next((n for n in all_device_names if "MCM" in n), folder_name)
|
||||||
|
devices = []
|
||||||
|
seen_names = set()
|
||||||
|
|
||||||
|
for name in all_device_names:
|
||||||
|
if name not in seen_names:
|
||||||
|
seen_names.add(name)
|
||||||
|
classified = classify_device(name, mcm_device_name)
|
||||||
|
if classified:
|
||||||
|
devices.append(classified)
|
||||||
|
|
||||||
|
# Initialize folder structure
|
||||||
|
folders = {
|
||||||
|
"IO_BLOCK": {"FIO": [], "SIO": [], "DPM": []},
|
||||||
|
"Station": {"JR": [], "Chute_JR": [], "SS": [], "EPC": [], "EN": []},
|
||||||
|
"Photoeye": {"PE": [], "TPE": [], "LRPE": []},
|
||||||
|
"Beacon": [],
|
||||||
|
"Encoder": {"ENSH": [], "ENW": []},
|
||||||
|
"Chute": [],
|
||||||
|
"Conveyor":[],
|
||||||
|
"VFD": [],
|
||||||
|
"PRX":[],
|
||||||
|
"SOL": []
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# Organize devices into folders
|
||||||
|
for dev in devices:
|
||||||
|
folder_path = dev["folder"].split("/")
|
||||||
|
if folder_path[0] == "IO_BLOCK":
|
||||||
|
folders["IO_BLOCK"][folder_path[1]].append(dev)
|
||||||
|
elif folder_path[0] == "Station":
|
||||||
|
folders["Station"][folder_path[1]].append(dev)
|
||||||
|
elif folder_path[0] == "SOL":
|
||||||
|
folders["SOL"].append(dev)
|
||||||
|
elif folder_path[0] == "Chute":
|
||||||
|
folders["Chute"].append(dev)
|
||||||
|
elif folder_path[0] == "Photoeye":
|
||||||
|
folders["Photoeye"][folder_path[1]].append(dev)
|
||||||
|
elif folder_path[0] == "Beacon":
|
||||||
|
folders["Beacon"].append(dev)
|
||||||
|
elif folder_path[0] == "Encoder":
|
||||||
|
folders["Encoder"][folder_path[1]].append(dev)
|
||||||
|
elif folder_path[0] == "Conveyor":
|
||||||
|
folders["Conveyor"].append(dev)
|
||||||
|
elif folder_path[0] == "VFD":
|
||||||
|
folders["VFD"].append(dev)
|
||||||
|
elif folder_path[0] == "PRX":
|
||||||
|
folders["PRX"].append(dev)
|
||||||
|
|
||||||
|
# Build output structure
|
||||||
|
output = {
|
||||||
|
"name": mcm_device_name,
|
||||||
|
"tagType": "Folder",
|
||||||
|
"tags": [
|
||||||
|
{"name": mcm_device_name, "typeId": "MCM", "tagType": "UdtInstance", "tags": []},
|
||||||
|
{
|
||||||
|
"name": "IO_BLOCK",
|
||||||
|
"tagType": "Folder",
|
||||||
|
"tags": [
|
||||||
|
{"name": "FIO", "tagType": "Folder", "tags": folders["IO_BLOCK"]["FIO"]},
|
||||||
|
{"name": "SIO", "tagType": "Folder", "tags": folders["IO_BLOCK"]["SIO"]},
|
||||||
|
{"name": "DPM", "tagType": "Folder", "tags": folders["IO_BLOCK"]["DPM"]},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Station",
|
||||||
|
"tagType": "Folder",
|
||||||
|
"tags": [
|
||||||
|
{"name": "JR", "tagType": "Folder", "tags": folders["Station"]["JR"]},
|
||||||
|
{"name": "Chute_JR", "tagType": "Folder", "tags": folders["Station"]["Chute_JR"]},
|
||||||
|
{"name": "SS", "tagType": "Folder", "tags": folders["Station"]["SS"]},
|
||||||
|
{"name": "EPC", "tagType": "Folder", "tags": folders["Station"]["EPC"]},
|
||||||
|
{"name": "EN", "tagType": "Folder", "tags": folders["Station"]["EN"]},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Photoeye",
|
||||||
|
"tagType": "Folder",
|
||||||
|
"tags": [
|
||||||
|
{"name": "PE", "tagType": "Folder", "tags": folders["Photoeye"]["PE"]},
|
||||||
|
{"name": "TPE", "tagType": "Folder", "tags": folders["Photoeye"]["TPE"]},
|
||||||
|
{"name": "LRPE", "tagType": "Folder", "tags": folders["Photoeye"]["LRPE"]},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{"name": "Chute", "tagType": "Folder", "tags": folders["Chute"]},
|
||||||
|
{
|
||||||
|
"name": "Encoder",
|
||||||
|
"tagType": "Folder",
|
||||||
|
"tags": [
|
||||||
|
{"name": "ENSH", "tagType": "Folder", "tags": folders["Encoder"]["ENSH"]},
|
||||||
|
{"name": "ENW", "tagType": "Folder", "tags": folders["Encoder"]["ENW"]},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Beacon",
|
||||||
|
"tagType": "Folder",
|
||||||
|
"tags": folders["Beacon"],
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "Conveyor",
|
||||||
|
"tagType": "Folder",
|
||||||
|
"tags": folders["Conveyor"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "VFD",
|
||||||
|
"tagType": "Folder",
|
||||||
|
"tags": folders["VFD"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PRX",
|
||||||
|
"tagType": "Folder",
|
||||||
|
"tags": folders["PRX"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "SOL",
|
||||||
|
"tagType": "Folder",
|
||||||
|
"tags": folders["SOL"],
|
||||||
|
},
|
||||||
|
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
mcm_match = re.match(r'^(MCM\d+)', folder_name)
|
||||||
|
mcm_name = mcm_match.group(1) if mcm_match else folder_name
|
||||||
|
|
||||||
|
output_json_path = os.path.join(os.path.dirname(__file__), f"{mcm_name}.json")
|
||||||
|
|
||||||
|
if os.path.isfile(output_json_path):
|
||||||
|
print(f"Existing file found for {mcm_name}, merging data from folder '{folder_name}'...")
|
||||||
|
with open(output_json_path, "r", encoding="utf-8") as f:
|
||||||
|
existing_data = json.load(f)
|
||||||
|
merged_output = merge_tags(existing_data, output)
|
||||||
|
with open(output_json_path, "w", encoding="utf-8") as f:
|
||||||
|
json.dump(merged_output, f, indent=2)
|
||||||
|
print(f"Merged tags JSON updated at: {output_json_path}")
|
||||||
|
else:
|
||||||
|
with open(output_json_path, "w", encoding="utf-8") as f:
|
||||||
|
json.dump(output, f, indent=2)
|
||||||
|
print(f"New tags JSON generated for {mcm_name} from folder '{folder_name}' at: {output_json_path}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
173
tags/update_tagprops.py
Normal file
173
tags/update_tagprops.py
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
import json
|
||||||
|
import os
|
||||||
|
|
||||||
|
def get_structured_path(view_name, equipment_path, MCM):
|
||||||
|
"""
|
||||||
|
Create a structured path based on the equipment type
|
||||||
|
"""
|
||||||
|
base_path = f"System/{MCM}/"
|
||||||
|
|
||||||
|
# Check if it's a TPE (Photoeye) equipment
|
||||||
|
if "TPE" in view_name and "Photoeye" in equipment_path:
|
||||||
|
return f"{base_path}Photoeye/TPE/{view_name}"
|
||||||
|
|
||||||
|
# Check if it's a LRPE (Photoeye) equipment
|
||||||
|
elif "LRPE" in view_name and "Photoeye" in equipment_path:
|
||||||
|
return f"{base_path}Photoeye/LRPE/{view_name}"
|
||||||
|
|
||||||
|
elif "PE" in view_name and "Photoeye" in equipment_path:
|
||||||
|
return f"{base_path}Photoeye/PE/{view_name}"
|
||||||
|
|
||||||
|
# Check if it's an SIO equipment
|
||||||
|
elif "SIO" in view_name and "IO_Block" in equipment_path:
|
||||||
|
return f"{base_path}IO_Block/SIO/{view_name}"
|
||||||
|
|
||||||
|
# Check if it's an FIO equipment
|
||||||
|
elif "FIOM" in view_name and "IO_Block" in equipment_path:
|
||||||
|
return f"{base_path}IO_Block/FIO/{view_name}"
|
||||||
|
|
||||||
|
elif "DPM" in view_name and "DPM" in equipment_path:
|
||||||
|
return f"{base_path}IO_Block/DPM/{view_name}"
|
||||||
|
|
||||||
|
# Check if it's an Encoder equipment
|
||||||
|
elif "ENSH" in view_name and "Encoder" in equipment_path:
|
||||||
|
return f"{base_path}ENCODER/ENSH/{view_name}"
|
||||||
|
|
||||||
|
elif "ENW" in view_name and "Encoder" in equipment_path:
|
||||||
|
return f"{base_path}ENCODER/ENW/{view_name}"
|
||||||
|
|
||||||
|
elif "BCN" in view_name and "Beacon" in equipment_path:
|
||||||
|
return f"{base_path}Beacon/{view_name}"
|
||||||
|
|
||||||
|
elif "EPC" in view_name and "EPC" in equipment_path:
|
||||||
|
return f"{base_path}STATION/EPC/{view_name}"
|
||||||
|
|
||||||
|
elif "SS" in view_name and "SS_Button" in equipment_path:
|
||||||
|
return f"{base_path}STATION/SS/{view_name}"
|
||||||
|
|
||||||
|
elif "JR" in view_name and "S03" in view_name and "Button" in equipment_path:
|
||||||
|
return f"{base_path}STATION/Chute_JR/{view_name}"
|
||||||
|
|
||||||
|
elif "JR" in view_name and "Button" in equipment_path:
|
||||||
|
return f"{base_path}STATION/JR/{view_name}"
|
||||||
|
|
||||||
|
elif "EN" in view_name and "Button" in equipment_path:
|
||||||
|
return f"{base_path}STATION/EN/{view_name}"
|
||||||
|
|
||||||
|
elif "VFD" in view_name and "VFD" in equipment_path:
|
||||||
|
return f"{base_path}VFD/{view_name}"
|
||||||
|
|
||||||
|
elif "MCM" in view_name and "MCM" in equipment_path:
|
||||||
|
return f"{base_path}/{view_name}"
|
||||||
|
|
||||||
|
elif "Camera" in view_name and "Camera" in equipment_path:
|
||||||
|
return f"{base_path}Camera/{view_name}"
|
||||||
|
|
||||||
|
elif "Conveyor" in equipment_path:
|
||||||
|
return f"{base_path}Conveyor/{view_name}"
|
||||||
|
|
||||||
|
elif "SOL" in view_name and "Solenoid" in equipment_path:
|
||||||
|
return f"{base_path}SOL/{view_name}"
|
||||||
|
|
||||||
|
elif "PRX" in view_name and "ProxSensor" in equipment_path:
|
||||||
|
return f"{base_path}PRX/{view_name}"
|
||||||
|
|
||||||
|
elif "CH" in view_name and "Chute" in equipment_path:
|
||||||
|
return f"{base_path}Chute/{view_name}"
|
||||||
|
|
||||||
|
# We can expand this later for other equipment types
|
||||||
|
else:
|
||||||
|
return view_name
|
||||||
|
|
||||||
|
def update_tagprops_in_file(file_path):
|
||||||
|
"""
|
||||||
|
Update the first item in tagProps array for each view with structured paths
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# Read the JSON file
|
||||||
|
with open(file_path, 'r', encoding='utf-8') as file:
|
||||||
|
data = json.load(file)
|
||||||
|
|
||||||
|
|
||||||
|
name = os.path.basename(file_path)
|
||||||
|
MCM = name.split('.')[0] # Extract MCM from filename
|
||||||
|
|
||||||
|
# Counter for updated views
|
||||||
|
updated_count = 0
|
||||||
|
|
||||||
|
# Navigate to the container with children
|
||||||
|
if 'root' in data and 'children' in data['root']:
|
||||||
|
container = data['root']['children'][0] # First child is the CoordinateContainer
|
||||||
|
|
||||||
|
if 'children' in container:
|
||||||
|
# Iterate through all views in the container
|
||||||
|
for view in container['children']:
|
||||||
|
# Check if this view has meta.name and params.tagProps
|
||||||
|
if ('meta' in view and 'name' in view['meta'] and
|
||||||
|
'props' in view and 'params' in view['props'] and
|
||||||
|
'tagProps' in view['props']['params']):
|
||||||
|
|
||||||
|
# Get the view name and equipment path
|
||||||
|
view_name = view['meta']['name']
|
||||||
|
equipment_path = view['props'].get('path', '')
|
||||||
|
|
||||||
|
# Get the structured path
|
||||||
|
structured_path = get_structured_path(view_name, equipment_path, MCM)
|
||||||
|
|
||||||
|
# Update the first item in tagProps array
|
||||||
|
if len(view['props']['params']['tagProps']) > 0:
|
||||||
|
view['props']['params']['tagProps'][0] = structured_path
|
||||||
|
updated_count += 1
|
||||||
|
print(f"Updated {view_name} -> {structured_path}")
|
||||||
|
|
||||||
|
# Write the updated data back to the file
|
||||||
|
with open(file_path, 'w', encoding='utf-8') as file:
|
||||||
|
json.dump(data, file, indent=2, ensure_ascii=False)
|
||||||
|
|
||||||
|
print(f"\nSuccessfully updated {updated_count} views in {file_path}")
|
||||||
|
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(f"Error: File {file_path} not found")
|
||||||
|
except json.JSONDecodeError as e:
|
||||||
|
print(f"Error: Invalid JSON in file {file_path}: {e}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Find all JSON files in the current directory
|
||||||
|
json_files = [f for f in os.listdir('.') if f.endswith('.json')]
|
||||||
|
|
||||||
|
if not json_files:
|
||||||
|
print("No JSON files found in the current directory.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Display files to the user
|
||||||
|
print("Available JSON files:")
|
||||||
|
for i, f in enumerate(json_files, start=1):
|
||||||
|
print(f"{i}. {f}")
|
||||||
|
|
||||||
|
# Ask user to pick one
|
||||||
|
try:
|
||||||
|
choice = int(input("Select a file by number: ")) - 1
|
||||||
|
if choice < 0 or choice >= len(json_files):
|
||||||
|
print("Invalid choice.")
|
||||||
|
return
|
||||||
|
except ValueError:
|
||||||
|
print("Invalid input. Please enter a number.")
|
||||||
|
return
|
||||||
|
|
||||||
|
file_path = json_files[choice]
|
||||||
|
|
||||||
|
# Check if file exists (should always be true here)
|
||||||
|
if not os.path.exists(file_path):
|
||||||
|
print(f"File {file_path} not found in current directory")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Update the file
|
||||||
|
update_tagprops_in_file(file_path)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
1771
update-svg-view/update_svg.py
Normal file
1771
update-svg-view/update_svg.py
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user