Blade Distribution Program
10.1 Balde 配列 프로그램의 基本原理 (Principles of Blade Distribution Program)
10.2 Blade의 Moment 測定 (Measurements of Blade Moment)
10.3 Blade 配列 프로그램 使用方法 (User’s Guide of Blade Distribution Program)
10.4 프로그램 코드
1 Blade 배열 프로그램의 기본원리
Principles of Blade Distribution Program
Blade를 배열할 때 가장 중요한 것은 각각의 Blade 무게를 측정하고 Disc 원주상에 Blade를 적절히 배열하여 가능한한 Unbalance를 최소로 줄이는 것이다. 일반적으로 Blade 유효길이가 짧은 것은 중량계측에 의한 발란싱으로 충분하나 저압터빈 최종단과 같이 Blade 유효길이가 긴 것은 모멘트 발란싱을 한다. 모멘트 발란싱을 하는 이유는 긴 Blade의 경우 제조시 중량의 차이가 생기면서 중심위치의 변화가 비교적 크기 때문이다. 3600 rpm 로터의 경우 Blade의 유효길이가 200 ㎜, 중량 800 gr인 것은 모멘트 발란싱하도록 추천하고 있다. 무게의 측정이나 Moment 측정은 현장이나 제조공장에서 직접 측정하면 되나 Blade의 배열은 컴퓨터 프로그램에 의존해야 한다. 이 컴퓨터 프로그램은 초기 임의의 Blade 배치상태에서 시작하고 다음과 같은 목적을 기대하며 여러 쌍들의 Blade들을 상호위치 교환한다.
∙ 어떤 정해진 제한치 이내로 Unbalance량을 감소시키기 위한 것이다.
∙ Unbalance량이 Tolerance이내로 감소되었을 때에 Blade 배치의 변화가 Balance된 상태에서 Tolerance를 벗어나지 않는다면 분포상태를 개선하기 위한 것이다 (가볍거나 혹은 무거운 Blade들의 집중을 방지하기 위해서다.)
10.1.1 最終 殘留 不平衡量의 計算 (Calculations of Residual Unbalance)
기준 방향으로부터 위상각 θ에 있는 Blade의 모멘트 M을 가정한다. 여기서 M은 Blade 무게와 Blade의 무게중심 거리의 곱이다. 이 모멘트 값 M은 모멘트 발란싱에 의해 결정되고 데이터로서 프로그램에 공급된다.
불평형량의 X 성분 = MX
그림 3-75 Blade Moment Vector
그림 3-76 Blade 배열 Logic Diagram
불평형량의 Y 성분 = MY
N개의 Blade에 대한 총 X 및 Y 성분은
최종 잔류 Unbalance량,
최종 잔류 Unbalance의 방향,
최종 잔류 Unbalance량 M은 초기 Blade 분포상태에 대해서 계산되고 Pairs of Blade가 상호 배치 교환으로 Unbalance의 크기가 감소된다면 상호교환이 이루어진다.
예를 들어, 2개의 Blade가 각각 Mi, θi 및 Mj, θj의 크기 및 방향을 가지고 있으며 이 두 Blade를 상호교환할 경우 교환으로 인하여 모멘트 성분의 변화를 계산해보자
새로운 최종 잔류 모멘트량은
* Blade간의 상호 위치 교환은 모멘트 값이 초기치보다 작아야만 이루어진다.
10.1.2 分布의 計算 (Calculations of Distribution)
분포함수 D는 다음과 같이 정의된다.
이 함수는 인접 Blade간에 모멘트 차이를 최대로 함으로써 명백하게 최대화되고 무거운 Blade와 가벼운 Blade를 교대로 배치함으로써 성취될 수 있다. Blade를 쌍으로 상호교환할 때의 효과를 고려함에 있어서 Blade가 서로 인접해 있을 경우와 Blade가 서로 떨어져 있을 경우를 분리해서 생각할 필요가 있다.
∙ Blade i와 j가 상호교환 될 때 (i와 j는 인접해 있지 않음)
δD = [교환후 분포함수] – [교환전 분포함수]]
∙ Blade i와 i-1이 상호 교환될 때 (i와 i-1는 서로 인접함)
일단 잔류 Unbalance량이 Tolerance이내로 감소되어지면 Blade 상호교환 절차가 시작되나 δD의 값이 Positive이고 새로운 잔류 Unbalace 값이 여전히 Tolerance이내이어야만 상호교환이 행해진다.
10.1.3 分布에 관한 Tolerance (Tolerance for Distribution)
주어진 여러 Blade들에 대해서 가장 좋은 분포와 가장 나쁜 분포가 어떤것인지 명백하지 않기 때문에 2개의 임의 배치형태, 즉 명백하게 좋은 분포와 나쁜 분포의 Blade 배치 형태를 결정하고 이들 값 사이에 상대적인 Tolerance를 나타내는 식을 결정하는 것이다.
Good Arrangement : Heaviest, Lightest, 2nd Heaviest, 2nd Lightest …
Bad Arrangement : 무게순으로 배열
D = Dbad + F(Dgood – Dbad)
F : Fractional Tolerance
D : Acceptable Distribution
* 분포의 계산이 필요한 이유는 Disc Rim에 균일한 부하를 받게 하기 위함이다.
2 Blade의 Moment 측정
Measurements of Blade Moment
10.2.1 GEC Blade Moment 測定方法 (Blade Moment Measuring Method in GEC)
(1) GEC Moment 측정장비
다음의 그림과 같은 Device를 이용하여 Blade의 무게,를 측정하여 Blade Moment 공식에 대입하여 각 Blade의 Moment를 구한다.
Moment = Wa × (R – Q) + Wb (R – Q + C)
Wa : Support A에서의 무게
Wb : Support B에서의 무게
R : 로터 중심선에서 Blade Platform까지의 거리 (1143 ㎜)
Q : Support ‘A’에서 Blade Platform까지의 거리
C : Support ‘A’와 ‘B’ 사이의 거리
– GEC Moment 측정장비 사양
① 저울은 1 gr까지 읽을 수 있어야 하고 정확도는 +0.5 gr이내이어야 한다.
그림 3-77 GEC 모멘트 측정장비 개략도
그림 3-78 GEC 모멘트 측정장비 상세도
② Blade Support(e)의 높이는 Blade 높이가 수평이 되도록 조정해야 한다.
③ End Step(f)은 Blade Root의 Last Serration 이외의 위치에는 놓이지 않도록 한다.
④ Side Step(g)은 Beam의 Center Line을 따라서 Blade가 위치할 수 있도록 돕는다.
(2) GEC Moment 측정장비에 의한 무게측정
– GEC사의 원자력발전소 저압터빈 최종단 Blade의 전형적인 평균무게와 Moment는 61.5 ㎏, 88000 ㎏-m이다.
– 보통 Blade 무게분포는 가 44%, 는 56%이다. 그러나 저압터빈 ‘A’와 ’B’의 최종단 Blade 무게중심까지의 거리가 각각 1383 ㎜, 1441 ㎜로서 차이가 있기 때문에 주의를 해야한다.
– 저울의 측정 정밀도에 따라서 잔류 Moment량이 달라지므로 측정저울의 정밀도는 1 gr 범위내이어야 한다.
위의 표에서 보는 바와 같이 측정오차 보다는 측정오차가 더 큰 Unbalance를 제공하고, 1 ㎏의 측정오차는 Balancing Hole에서 1600~2500 gr의 Unabalance를 야기한다.
– 각각의 Blade 무게(Wt)는 두 개의 저울에서 측정한 와 의 합과 일치해야하므로, 일치하지 않을 경우 측정 Device의 정밀도를 확인하고 정확하게 재측정해야 한다.
– 일반적인 Device의 요구사항은 확실하고 일관성있는 Blade 위치를 고수하여 같은 Blade를 반복해서 측정할 경우 각 측정값이 ±5 gr이내의 측정공차를 유지해야 한다.
– GEC Blade 무게측정 Device의 특징
① Blade Root의 홈 부위와 Support Round 접촉부위( 측정위치)의 Round가 서로 맞지 않으면 Blade가 Device 위에 정확하게 안착되지 않아 오류가 발생한다.
② 따라서, Blade를 정확하게 안착시키기 위해 Blade를 길이 방향으로 적절히 움직여야하나, 이는 ‘V'(Gap)를 변화시키므로 ‘R’ 및 ‘Q’의 거리가 변경됨을 의미하는데 Blade Moment 산출공식에서 ‘R’ 및 ‘Q’는 고정상수이므로 오류가 발생한다.
10.2.2 Blade Moment 測定裝備에 의한 方法 (Blade Moment Measuring Method by Measuring Equipment)
(1) GEC Moment 측정장비
정확한 Blade Moment 측정을 위하여 한국중공업에서 보유하고 있는 장비를 이용하여 측정하였다.
– Moment 측정장비 제작회사 : 독일 CARL SCHENCK
– Moment 측정장비 제원
∙최대 측정무게 : 100 ㎏
∙최대 측정 Moment : 200 ㎏-m
∙Jig Interface까지의 거리 : 400 ㎜
∙측정시간 : 3 초
∙오차한계 : ±0.05 %
∙장비무게 : 800 ㎏
그림 3-79 CARL SCHENCK Moment 측정장비
(2) Blade Moment 測定시 注意事項
– Blade 무게는 1 gr까지 측정할 수 있는 정밀저울을 구입하여 측정하여야 한다.
– Sample Blade의 무게 61.5 ㎏, 중심으로부터 Blade 무게 중심까지의 거리 0.892 m를 이용하여 모멘트를 계산하면 54.858 ㎏-m이나 실측값은 26.285 ㎏-m로 나타나 오차를 규명하기 위해 Sample Plate를 제작하여 측정한 결과도 마찬가지로 오차가 발생하여 장비 공급사와 협의한 결과 다음과 같은 문제점이 있었다.
① Load Cell의 Force Transducing Rod가 상하 Nut에 의해 Tightening 되어 있어야하나 풀려 있었는데, 이 Connecting Rod는 적절히 조정되고 Tightening되어 Moment 표시창에서 Moment가 0±50 Unit 이내로 표시되어야 한다.
② Load Cell의 특성이 15 ㎏-m이상에서는 Input에 대한 Output에 비례성이 없음. 이는 Load Cell이 12 ㎏-m까지는 비례성이 있고 그 이상에서는 오차가 발생하므로 Counter Weight를 부착하고 측정해야 한다.
– Jig에 대한 제작사 추천사항
① Moment 측정장비의 중심선과 Jig의 축 방향 중심선, 그리고 Blade의 길이 방향 중심선이 일치되어야 한다.
② Jig End Face와 Blade Root End 사이의 간격은 3 ㎜ 이하로 조정해야 한다.
③ Jig에 Blade를 설치할 때 Blade 하부가 Jig Plate에 접촉되지 않아야 한다.
④ Blade 고정 Bar (or Pivot)는 점 또는 선접촉으로 수직 및 수평도가 맞아야 한다.
(3) Blade Moment 測定 節次
① Zero Setting
Jig가 설치된 상태에서 ±0 ㎏-m가 모멘트 지시창에 나타나도록 Tare Weight 및 Counter Weight를 조정한다.(-0.0002 ㎏-m로 조정됨).
② Counter Weight 설정
고리 1호기의 최종단 Blade의 평균무게는 61.05 ㎏이며 예상되는 모멘트 측정치는 54.858 ㎏-m이다. 이 값은 Load Cell이 측정할 수 있는 한계(12 ㎏-m)를 초과하기 때문에 Counter Weight를 달아야 한다. Counter Weight의 양은 Pivot에서 Counter Weight Pan까지의 거리가 5m이기 때문에 9 ㎏의 분동을 달아 45 ㎏-m의 역모멘트가 작용되도록 한다. 이와 같은 상태에서 Load Cell에 지시되는 값은 상대치로서 9.858 ㎏-m이다. 이 9.858 ㎏-m의 모멘트치는 Load Cell의 측정범위내로 신뢰성이 있는 것으로 판단됨. 전산 프로그램에는 9.858 ㎏-m와 45 ㎏-m가 자동합산되어 54.858 ㎏-m이 기록된다.
③ Moment 측정
그림과 같이 2개의 고정 Bar 사이에 Blade Root가 안착되도록 하여 상대모멘트를 측정한다.
그림 3-80 Blade 모멘트 측정장비 개략도
④ Blade 무게측정
위의 그림에서와 같이 Pivot 중심점에서 Blade Platform까지의 거리가 400+30.2+X(Blade에 따라 다름)이며 X값은 평균하여 174 ㎜이다. 그러므로 Pivot 중심에서 Blade Platform까지의 거리는 604.2 ㎜가 된다.
그러나 실제 Blade가 로터 디스크에 설치될때는 중심에서 Blade Platform까지의 거리가 1143 ㎜이므로 Schenck 장비에서 측정된 모멘트는 실제 거리에 맞도록 환산되어야 한다. Schenck 모멘트에서 실제 모멘트로 환산하기 위해서는 Blade의 무게중심을 찾아내는 것이 중요하며 Pivot 중심점은 로터의 중심점과 같고 Schenck 장비에서 구한 Blade의 무게중심은 실제 로터에서도 같은 무게중심을 갖기 때문에 Schenck 모멘트를 Blade 무게로 나누면 Pivot 중심에서 Blade 무게중심까지의 거리가 계산되고 여기서 Pivot 중심에서 Blade Platform까지의 거리를 감하면 Platform에서 무게중심까지의 거리가 계산된다. Blade 무게측정은 1 gr 단위까지 측정되어야한다.
⑤ ‘X’값 측정
위의 그림에서 X값(Jig End Surface에서 Blade Platform까지의 거리)을 버어니어캘리퍼스로 측정한다.
⑥ 실제 모멘트 계산
모멘트 측정시의 미지수는 X, Y이며 X값은 (5)항에서 실제 측정하여 구하고 따라서 Y값이 구해진다. 실제 로터에 있어서 Blade Platform까지의 거리는 45″(1143 ㎜)로 정해져 있기 때문에 이 값에 Y값을 더하면 실제 로터의 축 중심선에서 무게중심까지의 거리가 되고 Blade 무게와 곱하므로서 실제 모멘트값을 얻게된다.
3 Blade 배열 프로그램 사용방법
User’s Guide of Blade Distribution Program
이 프로그램은 Quickbasic으로 작성되었으므로 기본적인 사용법은 Quickbasic 설명서를 참고로 한다.
(1) Blade Weight File Name 입력 :
Blade Weight File을 별도로 작성하였을 경우에는 “Give name of weight file?”이 화면에 나타나면 File Name을 입력하고 그렇지 않을 경우에는 프로그램의 끝부분에 있는 Blade Weight 입력부분에 미리 입력한다. 이 경우에는 Enter를 치면된다.
(2) Blade 배열 프로그램 사용목표 입력 :
“Do you want to sort blades to get balance in tolerance? or to calculate lengths of existing arrangement?”가 화면에 나타나면, 규정치 이내로 밸런싱하여 Blade 배치를 다시 할 경우에는 “Y”를 입력하고 현재의 입력자료의 Unbalance 상태를 구하고자 할 경우에는 “N”을 입력한다.
현재 프로그램상에는 밸런싱 규정치는 6 ㎏으로 되어 있으므로 더욱 정밀한 계산을 하고자 할 경우에는 “wub=”에 그 값을 미리 입력해 둔다.
GEC가 기준으로 하고 있는 잔류불평형 Moment의 한계치는 최종단 Blade의 무게중심(CG)에서 10 gr이하의 불평형량으로서 컴퓨터는 이 한계치 이하로 잔류불평형 Moment 값이 나올때까지 Blade의 배열을 바꾸어 가면서 계산하는 것이다. 이 한계치는 통상 Wt. Balancing Hole(Screw Type Wt. 취부하는 곳)에서는 약 200 gr의 Unbalance량에 해당된다.
구 Blade를 제거하고 신 Blade로 교체하여 배치하고자할 때는, 구 Blade에 대한 Moment Unbalance를 계산하여 그 위치에 Moment Unbalance량을 사전에 입력하고 프로그램을 Run 시켜야 교체전과 같은 Unbalance 상태를 유지할 수 있다.
(3) Blade 배열 프로그램 계산방법 입력 :
“Do you want to balance on weight? or balance on moment?”가 화면에 나타나면, Blade Weight만을 고려하여 Blade를 배열하고 Unbalance를 계산하고자 할 경우에는 “Y”를 입력하고 Blade Moment를 고려하여 Blade를 배열하고 Unbalance를 구하고자 할 경우에는 “N”을 입력한다.
각각의 Blade에 대한 자료(Weight외)를 입력하고자 할 때는 프로그램 끝부분에 INIT.STN, IDENTIFIER, WT(KG), JIGM(MM), MOMENT(KG-M) 등을 직접 입력하되 각각의 자리수와 동일하게 입력해야 한다.
(4) Blade drawing no. 입력 :
“Blade drawing no.”가 화면에 나타나면 관련 Blade Drawing no.를 입력하며 이것이 프로그램 계산과정에 사용되는 것이 아니므로 반듯이 입력해야하는 것은 아니다. 단지 프로그램 입력사항에 프린트되어 관련자료로서 기록된다.
(5) Blade 수 입력 :
“NO. of BLADE” 이 화면에 나타나면 Blade 수량을 입력하며, 이것은 프로그램에 500개까지 입력할 수 있도록 되어 있으므로 500개 초과시에는 Error가 발생하며 500개 초과시에는 프로그램의 서두에 있는 ibld(500)을 원하는 수 이상으로 고쳐야하고 istn, ifree, wm, sm, tm, sn, cs, theta, cjf, cg, wt 등도 고쳐야 한다.
(6) 터빈의 단(Stage) 입력 :
“Identification of input tbn stage?”가 화면에 나타나면 현재의 계산하고자하는 Blade가 설치된 터빈의 단(Stage)를 입력한다. 이것은 프로그램의 계산과정에 사용되는 것이 아니므로 필수적인 것이 아니며 입력사항에 프린트되어 참고자료로 기록된다.
(7) 입출력 프린트
입력 및 출력 프린트는 화면 및 프린터로 할 수 있도록 되어 있으나, 프로그램상으로는 프린터로 인쇄하도록 되어 있으므로 프로그램 수행전에 미리 프린터와 연결되어야 하며, 화면상으로 프린트할 경우에는 프로그램상의 LPRINT를 PRINT로 바꿔야 한다.
4 Blade 배열 프로그램 코드
Blade Distribution Program Code
“본 프로그램 코드는 QuickBasic으로 작성된 것입니다.”
DEFDBL A-H, O-Z
DEFINT I-N
DIM istn(500), ibld(500), ifree(1000), wm(500), sm(500)
DIM tm(500), sn(500), cs(500), theta(500), cjf(500), cg(500)
DIM wt(500), ifirst(500), bname(500) AS STRING * 12
DIM mline AS STRING, wfile AS STRING, title AS STRING, btitle AS STRING
DIM undrln AS STRING, dwgno AS STRING, verd AS STRING, lline AS STRING
DIM bignam AS STRING * 16, smlnam AS STRING * 16, name1 AS STRING * 16
DIM c1 AS STRING * 1, optp AS STRING * 1, optw AS STRING * 1
DIM worm AS STRING * 1
‘istn(i) CURRENT STATION CONTAINING BLADE i (-ve if stn. is fixed)
‘ibld(i) NUMBER OF BLADE CURRENTLY IN STATION i
‘ifree(i) STATION NUMBER OF iTH FREE STATION
verd = “94.07.02”
undrln = “————–“
degrad = ATN(1#) / 45#
raddeg = 1# / degrad
‘GIVE NAME OF WEIGHT FILE AMD CHOOSE OPTION
PRINT “Give name of weight file?”
INPUT ” File name; “, wfile
IF wfile <> ” ” THEN
PRINT “Do you want to sort blades to get balance in tolerance?”
PRINT ” or to calculate lengths of existing arrangement?”
INPUT “Y or N;”, ans$
IF UCASE$(ans$) = “Y” THEN
optw = “Y”
PRINT “Do you want to balance on weight?”
PRINT ” or balance on moment?”
INPUT “Y or N;”, r$
IF UCASE$(r$) = “Y” THEN
worm = “W”
ELSE
worm = “M”
END IF
ELSE
optw = “N”
worm = “M”
END IF
ELSE
wfile = “x”
optw = “N”
worm = “M”
END IF
IF (optw = “N”) THEN
iswap = 0
ELSE
iswap = 1
END IF
‘INITIALIZE EVERY IDENTIFIER TO BLANK & INITIAL STATION TO 0
INPUT “Blade drawing no. :”; dwgno
FOR i = 1 TO 500
istn(i) = 0
ibld(i) = 0
ifree(i) = 0
bname(i) = ” “
NEXT i
totom = 0#
smlbld = 59.6#
bigbld = 62.811#
‘INPUT NUMBER OF BLADE
INPUT ” NO. of BLADE;”, nblade
IF nblade < 1 OR nblade > 500 THEN
PRINT ” Error- “; nbp; ” is an illegal number of blade”
END IF
‘INPUT BALANCE DATA
INPUT “Identification of input tbn stage? “; btitle
LPRINT “‘KIM KAY YOUN’ Moment Balancing Program-Version “; verd
LPRINT
LPRINT btitle
LPRINT undrln
LPRINT
LPRINT “Weight/Moment file : “; wfile
LPRINT ; “Blade Drawing No. : “; dwgno
wub = 6!: ‘MAX. ACCEPTABLE UNBALANCE WT. AT BLADE C.G.
distol = .5: minmax = .01: minset = wub – minmax: maxset = wub + minmax
LPRINT “Max. acceptable unbalanced wt at blade C.G.:”; wub * 1000; ” Gr “
LPRINT “Distribution tolerance ratio :”; distol; ” No of blade ;”; nblade
LPRINT “Lower wt limit :”; smlbld; “KG”; ” Upper wt limit :”; bigbld; “KG”
LPRINT
‘IF NOT DOING A MOMENT OR WEIGHT BALANCE CHANGE wub TO SOMETHING VERY
‘BIG & DISTOL TO 0
IF (optw = “N”) THEN
wub = 1000000#
distol = 0#
END IF
IF (distol > 1#) THEN
LPRINT “Error-illegal distribution tolerance “; distol; “cannot exceed 1”
END IF
‘kerr = 0 AS LONG AS DATA IS OK. GETS SET TO 1 IF AN ERROR IS FOUND
‘nl = NO. OF MOVABLE BLADES
‘nf = NO. OF FIXED-POSITION BLADES
‘nt = TOTAL NO. OF BLADES
‘kount COUNTS NUMBER OF LINES PRINTED ON CURRENT PAGE
kount = 10
bigwt = -1D+70
smlwt = -bigwt
IF (bigbld < .0000000001#) THEN bigbld = 1000#
FOR i = 1 TO nblade
bname(i) = ” “
NEXT i
‘READ ONE BLADE EACH TIME ROUND THIS LOOP
IF (wfile <> “x”) THEN
ifirl = 0
ifirs = 0
FOR i = 1 TO nblade
‘PUT OUT PAGE HEADING BEFORE FIRST BLADE OR START NEW PAGE & PUT OUT
‘PAGE HEADING ON IT
IF (i <> 1) THEN
IF (kount <> 50) GOTO kcount
LPRINT CHR$(12)
END IF
LPRINT “INIT.STN IDENTIFIER WT(KG) JIGM(MM) MOMENT(KG-M)”
IF (i <> 1) THEN kount = 0
kcount:
kount = kount + 1
‘READ IDENTIFIER
READ name1
IF (LEFT$(name1, 1) <> “-“) THEN name1 = ” ” + name1
nn = LEN(name1)
FOR ii = 2 TO nn
IF (MID$(name1, ii, 1) < “0” OR MID$(name1, ii, 1) > “9”) THEN GOTO figure
NEXT ii
ii = 13: ‘THE END OF CHARACTER
figure:
IF (ii = 2) THEN
jstn = i
ELSE
jstn = VAL(LEFT$(name1, ii – 1))
END IF
‘IF IDENTIFIER STARTS WITH – THE BLADE IS FIXED
‘IF NOT, PUT A SPACE IN FRONT SO MINUS SIGN STANDS OUT IN O/P
IF (LEFT$(name1, 1) <> “-” AND jstn < 0) THEN
name1 = “-” + name1
END IF
IF (LEFT$(name1, 1) <> “-” AND LEFT$(name1, 1) <> ” “) THEN
name1 = ” ” + name1
END IF
bname(i) = name1
IF (LEFT$(bname(i), 1) = “-“) THEN
istn(i) = -ABS(jstn)
ELSE
istn(i) = jstn
END IF
jj = i
kstn = istn(i)
‘CHECK THAT THIS STATION HASN’T BEEN FILLED ALREADY
FOR ii = 1 TO nblade
IF (ii <> i AND ABS(istn(ii)) = ABS(jstn)) THEN
LPRINT ” ERROR-MORE THAN 1 BLADE IN STATION “; jstn; “IN WEIGHT FILE”
END IF
NEXT ii
‘READ TOTAL WEIGHT(wt) & MOMENT(sm)OF EACH BLADE & TOTAL WEIGHT
‘swt) & MOMENT(ssm)OF ROW
READ wt(jj), sm(jj), cjf(jj)
swt = swt + wt(jj)
ssm = ssm + sm(jj)
sjf = sjf + cjf(jj)
‘SET INITIAL POSITION
IF (wt(jj) > bigwt) THEN
bigwt = wt(jj)
ibig = jj
bignam = bname(jj)
END IF
IF (wt(jj) < smlwt) THEN
smlwt = wt(jj)
isml = jj
smlnam = bname(jj)
END IF
c1 = ” “
IF (wt(jj) > bigbld) THEN c1 = “H”
IF (wt(jj) < smlbld) THEN c1 = “L”
LPRINT USING “###”; kstn; : LPRINT SPC(8);
LPRINT USING “&”; name1; : LPRINT SPC(1);
LPRINT USING “##.###”; wt(jj); : LPRINT SPC(4);
LPRINT USING “###.##”; cjf(jj); : LPRINT SPC(6);
LPRINT USING “##.####”; sm(jj); : LPRINT SPC(1);
LPRINT USING “!”; c1
NEXT i
END IF
‘END OF DATA INPUT LOOP
IF (bigbld < 9.99D+20) THEN
LPRINT ” L=blade wt. below lower limit “
LPRINT ” H=blade wt. above upper limit “
END IF
LPRINT CHR$(12)
‘SET UP REFERENCES TO FREE STATIONS
nfree = 0
avwt = swt / nblade
hml = bigwt – smlwt
avjf = sjf / nblade
FOR i = 1 TO nblade
IF (istn(i) = 0) THEN nberr = 1
IF (istn(i) > 0) THEN
nfree = nfree + 1
ifree(nfree) = istn(i)
END IF
NEXT i
‘MOMENT(SCHENCK ;sm) CONVERSION TO ACTUAL ROTOR MOMENT(tm)
‘NB; swm INCLUDES UNDERSTRAPS, totmom DOES NOT
‘IF DOING A MOMENT BALANCE PUT tm INTO wm ELSE PUT wt IN
‘PUT SPARE COPY OF MOMENT INTO sn FOR USE IN CALCULATING DISTRIBUTION
‘LIMITS
FOR i = 1 TO nblade
fcg = sm(i) / wt(i) – .4302 – avjf / 1000
cg(i) = 1.143 + fcg
tm(i) = cg(i) * wt(i)
totmom = totmom + tm(i)
swm = swm + tm(i)
avmom = swm / nblade
IF (worm = “M”) THEN
wm(i) = tm(i)
ELSE
wm(i) = wt(i)
END IF
sn(i) = wm(i)
NEXT i
‘RESULTANT LEVER ARM(TOTAL MOMENT/TOTAL MASS)
w1 = swt
IF (ABS(w1) < .000001#) THEN
swm = 0#
ELSE
swm = swm / w1
END IF
‘BALANCE TOLERANCE SQUARED
IF (worm = “M”) THEN
tol = (wub * swm) ^ 2 + .0000000001#
ELSE
tol = wub ^ 2 + .000000001#
END IF
‘PRODUCE A LIST OF BLADES IN ASCENDING WEIGHT ORDER(FOR BAD
‘DISTRIBUTION FUNCTION diss)
FOR i = 2 TO nblade
FOR j = 2 TO nblade
IF (sn(j) > sn(j – 1)) THEN GOTO ascend
SWAP sn(j), sn(j – 1)
ascend:
NEXT j
NEXT i
‘PRODUCE A LIST OF BLADES IN ORDER: LIGHTEST, HEAVIEST, 2ND LIGHTEST,
‘2ND HEAVIEST…ETC. (FOR GOOD DISTRIBUTION FUNCTION disb)
j = nblade / 2
k = -1
‘FIRST SORT THEM IN PAIRS
‘PUT SORTED ARRAY IN CS
FOR i = 1 TO j
k = k + 2
cs(k) = sn(i)
cs(k + 1) = sn(nblade – i + 1)
NEXT i
‘IF nblade IS ODD, PUT THE REMAINING 1 ON THE END OF THE LIST
IF (j + j <> nblade) THEN cs(nblade) = sn(j + 1)
‘WORK OUT DISTRIBUTION FUNCTIONS
‘disb=BEST POSSIBLE
‘diss=WORST POSSIBLE
‘dist=SMALLEST VALUE WHICH WILL BE IN TOLERANCE
diss = (sn(nblade) – sn(1)) ^ 2
disb = (cs(nblade) – cs(1)) ^ 2
FOR i = 2 TO nblade
diss = (sn(i) – sn(i – 1)) ^ 2 + diss
disb = (cs(i) – cs(i – 1)) ^ 2 + disb
NEXT i
diss = .5# * diss
disb = .5# * disb
dist = diss + distol * (disb – diss) – .000001#
‘WORK OUT ANGULAR POSITION OF EACH STATION ASSUMING EQUAL SPACING
‘STATION nblade+1 IS SAME AS STATION 1(SO 1ST & LAST DON’T
‘HAVE TO BE TREATED AS SPECIAL CASES)
‘CALCULATE SINE & COSINE OF EACH
theta(1) = 0#
theta(2) = 360 / nblade
FOR i = 3 TO nblade
theta(i) = (i – 1) * theta(2)
NEXT i
FOR i = 1 TO nblade
sn(i) = SIN(degrad * theta(i))
cs(i) = COS(degrad * theta(i))
NEXT i
‘WORK OUT WHICHBLADE IS IN EACH STATION
FOR i = 1 TO nblade
FOR jj = 1 TO nblade
IF (ABS(istn(jj)) = i) THEN ibld(i) = jj
NEXT jj
NEXT i
‘FIX FIRST BLADE IF NONE ARE FIXED
IF (nfree = nblade) THEN
istn(ibld(1)) = -istn(ibld(1))
nfree = nfree – 1
FOR i = 1 TO nfree
ifree(i) = ifree(i + 1)
NEXT i
END IF
‘DUPLICATE FREE STATION NUMBERS A SECOND TIME ROUND
FOR i = 1 TO nfree
ifree(i + nfree) = ifree(i)
NEXT i
‘START OF SWAPPING CALCULATION
‘WORK OUT NET UNBALANCE(UBNET), DISTRIBUTION(DFUN)
‘FIRST PASS(ipass=1) – GET PACKET LENGTH INTO TOLERANCE
‘SECOND PASS(ipass=2) – GET BALANCE INTO TOLERANCE BUT DON’T LET
‘ PACKET LENGTH GET OUT
‘THIRD PASS (ipass=3) – GET DISTRIBUTION INTO TOLERANCE BUT DON’T
‘ LET PACKET LENGTHS & BALANCE GET OUT
ipass = 1
l1 = 1
xmu = 0#
ymu = 0#
‘WORK OUT CURRENT BALANCE & DISTRIBUTION
result:
xm = xmu
ym = ymu
dfun = 0#
FOR is1 = 1 TO nblade
ib = ibld(is1)
is2 = is1 + 1
IF (is2 > nblade) THEN is2 = 1
ib1 = ibld(is2)
xm = xm + wm(ib) * sn(is1)
ym = ym + wm(ib) * cs(is1)
dfun = dfun + .5# * (wm(ib1) – wm(ib)) ^ 2
NEXT is1
ubnet = xm ^ 2 + ym ^ 2
IF (ABS(xm) < .0000000001# AND ABS(ym) < .0000000001#) THEN
ang = 0#
ELSEIF (xm > 0# AND ym = 0#) THEN
ang = 90#
ELSEIF (xm < 0# AND ym = 0#) THEN
ang = 270#
ELSEIF (xm > 0# AND ym > 0#) THEN
ang = ATN(xm / ym) * raddeg
ELSEIF (xm < 0# AND ym > 0#) THEN
ang = ATN(xm / ym) * raddeg + 360#
ELSE
IF (ym < 0#) THEN
ang = ATN(xm / ym) * raddeg + 180#
END IF
END IF
‘IF THE TOLERANCE FOR THIS PASS IS SATISFIED GO TO NEXT PASS
‘(OR EXIT AFTER 3RD PASS)
IF (ipass = 1) THEN
IF (ubnet > minset ^ 2 AND ubnet < maxset ^ 2) THEN
ipass = 2
GOTO result
END IF
ELSEIF (ipass = 2) THEN
IF (ang > 239 AND ang < 241) THEN
ipass = 3
GOTO result
END IF
ELSE
IF (dfun >= dist) GOTO resultout
END IF
‘OUTER LOOP – COMPARE EACH BLADE WITH THE ONE L (L) STATIONS IN FRONT
OUTER:
FOR l = l1 TO nfree / 2
‘GO ROUND THE WHOLE BLADE ROW
‘IF WE DON’T DO A SWAP, THEN INCREMENT L AND TRY AGAIN
‘IF WE DO SET L BACK TO 1 AND START AGAIN, UNLESS IT’S ALREADY 1, WHEN
‘WE CONTINUE
FOR k = 1 TO nfree
is1 = ifree(k)
js = ifree(k + l)
ib = ibld(is1)
jb = ibld(js)
dw = wm(ib) – wm(jb)
dx = xm + dw * (sn(js) – sn(is1))
dy = ym + dw * (cs(js) – cs(is1))
IF (ABS(js – is1) = 1) THEN
IF (js > is1) THEN
jsm2 = js – 2
IF (jsm2 < 1) THEN jsm2 = jsm2 + nblade
jsp = js + 1
IF (jsp > nblade) THEN jsp = 1
dd = -dw * (wm(ibld(jsp)) – wm(ibld(jsm2)))
ELSE
ism2 = is1 – 2
IF (ism2 < 1) THEN ism2 = ism2 + nblade
isp = is1 + 1
IF (isp > nblade) THEN isp = 1
dd = dw * (wm(ibld(isp)) – wm(ibld(ism2)))
END IF
ELSE
ism = is1 – 1
IF (ism = 0) THEN ism = nblade
isp = is1 + 1
IF (isp > nblade) THEN isp = 1
jsm = js – 1
IF (jsm = 0) THEN jsm = nblade
jsp = js + 1
IF (jsp > nblade) THEN jsp = 1
dd = dw * (wm(ibld(isp)) + wm(ibld(ism)) – wm(ibld(jsp)) – wm(ibld(jsm))) – .000001#
END IF
dmb = dx * dx + dy * dy
‘SEE WHETHER WE WANT TO SWAP
‘PASS 1 – DON’T SWAP IT PITCH ERROR WOULD GET BIGGER
IF (ipass = 1) THEN
IF (dmb < minset OR dmb > maxset) THEN GOTO inner
‘PASS 2 – DON’T SWAP IF UNBALANCE GETS BIGGER OR BOTH PAKCKETS GO OUT
‘OF TOLERANCE AND EITHER THEY WERE IN BEFORE OR PITCH ERROR
‘WOULD INCREASE
ELSEIF (ipass = 2) THEN
IF (ang < 239 OR ang > 241) THEN GOTO inner
‘PASS 3 – DONT’T SWAP IF DISTRIBUTION FUNCTION GETS SMALLER OR
‘UNBALANCE GOES OUT OF TOLERANCE OR BOTH PACKETS GO OUT OF
‘TOLERANCE AND EITHER THEY WERE IN BEFORE OR PITCH ERROR
‘WOULD INCREASE
ELSE
IF (dd <= 0# OR dmb > tol) THEN GOTO inner
END IF
‘DO SWAP
dfun = dfun + dd
ubnet = dmb
xm = dx
ym = dy
SWAP istn(ib), istn(jb)
SWAP ibld(is1), ibld(js)
‘SEE WHETHER SWAP HAS BROUGHT CURRENT PASS WITHIN TOLERANCE
IF (ipass = 1) THEN
IF (ubnet > minset ^ 2 AND ubnet < maxset) THEN
ipass = 2
GOTO result
END IF
ELSEIF (ipass = 2) THEN
IF (ang > 239 AND ang < 241) THEN
ipass = 3
GOTO result
END IF
ELSE
IF (dfun >= dist) THEN GOTO resultout
END IF
IF (l > l1) THEN GOTO OUTER
‘END OF INNER LOOP
inner:
NEXT k
‘END OF OUTER LOOP
NEXT l
‘IF WE ARRIVE HERE SOMETHING MUST BE OUT OF TOLERANCE
‘GO ON TO NEXT PASS
IF (ipass < 3) THEN
ipass = ipass + 1
GOTO result
END IF
‘OUTPUT RESULTS
’40 BLADES ON EACH PAGE EXCEPT 1ST
resultout:
IF (wfile <> “X”) THEN
kount = 10
ELSE
kount = 0
END IF
nbeff = nblade + kount
npag = INT((nbeff + 39) / 40)
ipag = 1
kstart = 1
tol = SQR(tol)
ubnet = SQR(ubnet)
IF (worm = “M”) THEN
IF (ABS(swm) < .000001#) THEN
tow = 0#
ELSE
tow = ubnet / swm
END IF
ELSE
tow = ubnet
END IF
IF (ABS(disb – diss) < .000001#) THEN
drat = 1#
ELSE
drat = (dfun – diss) / (disb – diss)
END IF
IF (iswap = 0) THEN
lline = “BLADES NOT SORTED FROM ORIGINAL ORDER”
ELSE
lline = “BALANCING ON”
IF (wfile <lt;> “X”) THEN
IF (worm = “W”) THEN
mline = ” WEIGHTS “
ELSE
mline = ” MOMENTS”
END IF
END IF
END IF
‘PRINT O/P
FOR i = 1 TO nblade
kount = kount + 1
‘PRINT HEADINGS BEFORE 1ST BLADE THEN AT START OF EACH NEW PAGE
‘kstart FORCES HEADING BEFORE 1st BLADE. KOUNT DOESN’T ALWAYS START
‘FROM 0 TO ALLOW FOR EXTRA THINGS PRINTED ON 1st PAGE.
IF (kount >= 40 OR kstart = 1) THEN
IF (kstart <> 1) THEN kount = 0
LPRINT ” ‘KIM KAY YOUN’ Moment Balancing Program-Version “; verd
LPRINT
LPRINT btitle; “(“; wfile; “)”; SPC(30); “page”; ipag; ” of “; npag
LPRINT undrln
LPRINT
LPRINT “Lightest blade wt. = “; smlwt; ” KG”; ” no.”; isml; “(“; smlnam; “)”
LPRINT “Heaviest blade wt. = “; bigwt; ” KG”; ” no.”; ibig; “(“; bignam; “)”
LPRINT “Average weight = “;:LPRINT USING “##.###”; avwt; : LPRINT ” KG”;
LPRINT SPC(3); “Heaviest-lightest = “; : LPRINT USING “##.###”; hml; : LPRINT ” KG”
LPRINT “Average moment = “; : LPRINT USING “##.####”; avmom; : LPRINT ” KG-M”;
LPRINT ” Avg jig to pfm gap = “; avjf
kstart = 0
LPRINT “Blade Dwg. No.”;dwgno; SPC(15);”Calculated “; DATE$; ” “; TIME$
IF (worm = “M”) THEN
IF (optw = “N”) THEN
IF (ipag = 1) THEN
LPRINT “Final balance “; : LPRINT USING “##.####^^^^”; ubnet; : LPRINT ” KG-M “;
LPRINT ” Direction “; : LPRINT USING “###.##”; ang; : LPRINT ” Degree”
LPRINT “Unbalanced wt. “; : LPRINT USING “####.##”; tow * 1000;
LPRINT ” gr at “; : LPRINT USING “#.###”; swm; : LPRINT ” M. radius”
END IF
ELSE
IF (ipag = 1) THEN
LPRINT “Final balance “; : LPRINT USING “##.####^^^^”; ubnet; : LPRINT ” KG-M”;
LPRINT “Direction”; : LPRINT USING “###.##”; ang; : LPRINT “Degree”
LPRINT “Unbalanced wt. “; : LPRINT USING “####.##”; tow * 1000;
LPRINT ” gr at “; : LPRINT USING “#.###”; swm; : LPRINT ” M. radius”
LPRINT “Tolerance “; wub * 1000; ” gr. at “; : LPRINT USING “#.###”; swm;
LPRINT ” M radius”
END IF
END IF
ELSE
IF (ipag = 1) THEN
LPRINT “Final balance “; : LPRINT USING “##.####^^^^”; ubnet; : LPRINT ” KG-M”;
LPRINT “Direction”; : LPRINT USING “###.##”; ang; : LPRINT ” DEGREE”
LPRINT “Tolerance “; wub * 1000; ” gr”
END IF
END IF
IF (optw = “N”) THEN
IF (ipag = 1) THEN
LPRINT “Distribution Achieved “; : LPRINT USING “#.####”; drat
END IF
ELSE
IF (ipag = 1) THEN
LPRINT “Distribution Achieved “; : LPRINT USING “#.####”; drat;
LPRINT ” Tolerance “; distol
END IF
END IF
IF (ipag = 1) THEN
IF (tow > wub) THEN
LPRINT “WARNING – FINAL BALANCE NOT IN TOLERANCE”
END IF
IF (drat < distol) THEN
LPRINT “WARNING – FINAL DISTRIBUTION NOT IN TOLERANCE”
END IF
END IF
LPRINT lline + mline
LPRINT
LPRINT “DISC”;SPC(9);”BLADE”; SPC(8); “WTTOTAL”; SPC(3); “SCHMOM”;
LPRINT SPC(4); “JIGPFM”; SPC(4); “MOMENT”; SPC(7); “CG”
LPRINT “STN NO. IDENT.”; SPC(8); “(KG)”; SPC(4); “(KG-M)”;
LPRINT SPC(5); “(MM)”; SPC(4); “(KG-M)”; SPC(6); “(M)”
ipag = ipag + 1
END IF
ib = ibld(i)
c1 = ” “
IF (istn(ib) <= 0) THEN c1 = “F”
‘PRINT SWAP RESULT
LPRINT USING “###”; i; : LPRINT SPC(3); : LPRINT USING “###”; ib;
LPRINT c1; SPC(1); bname(ib); SPC(4); : LPRINT USING “##.###”; wt(ib);
LPRINT SPC(3); : LPRINT USING “##.####”; sm(ib);
LPRINT SPC(3); : LPRINT USING “###.##”; cjf(ib); : LPRINT SPC(3);
LPRINT USING “##.#####”; tm(ib); : LPRINT SPC(3);
LPRINT USING “##.####”; cg(ib)
IF kount = 39 THEN LPRINT CHR$(12)
NEXT i
END
‘BLADE WEIGHT & MOMENT DATA FOR LP2 FRONT(RHS) 1993.6
1 DATA 1 K1001 ,61.274,54.8504,174.51
2 DATA 2 K1002 ,61.120,54.7396,174.67
3 DATA 3 K1003 ,59.366,52.6220,173.56
4 DATA 4 K1004 ,60.811,54.3820,174.14
5 DATA 5 K1005 ,60.263,53.5118,174.30
6 DATA 6 K1006 ,61.317,55.0308,173.85
7 DATA 7 K1007 ,60.872,54.5790,173.63
8 DATA 8 K1008 ,61.256,54.8406,174.34
9 DATA 9 K1009 ,61.171,54.9554,174.24
10 DATA 10 K1010 ,59.357,52.5076,173.52
11 DATA 11 K1011 ,60.623,54.0104,173.81
12 DATA 12 K1012 ,60.721,54.1592,174.04
13 DATA 13 K1013 ,60.955,54.6050,173.89
14 DATA 14 K1014 ,60.014,53.2346,173.69
15 DATA 15 K1015 ,61.211,54.7332,173.77
16 DATA 16 K1016 ,60.557,54.1442,173.09
17 DATA 17 K1017 ,60.875,54.4464,173.63
18 DATA 18 K1018 ,61.528,54.8014,174.16
19 DATA 19 K1019 ,60.771,54.3074,174.03
20 DATA 20 K1020 ,60.165,53.6560,174.24
21 DATA 21 K1021 ,61.325,54.7196,174.02
22 DATA 22 K1022 ,60.953,54.7078,174.24
23 DATA 23 K1023 ,61.356,54.8686,173.35
24 DATA 24 K1024 ,60.399,53.5984,174.39
25 DATA 25 K1025 ,60.193,53.4414,174.74
26 DATA 26 K1026 ,61.775,55.6876,173.83
27 DATA 27 K1027 ,61.476,55.0588,174.14
28 DATA 28 K1028 ,61.238,54.8798,173.96
29 DATA 29 K1029 ,60.488,53.8126,174.13
30 DATA 30 K1030 ,61.237,54.7234,173.83
31 DATA 31 K1031 ,60.760,54.1364,174.84
32 DATA 32 K1032 ,59.299,52.6734,173.02
33 DATA 33 K1033 ,60.830,54.3126,174.47
34 DATA 34 K1034 ,61.328,54.9674,173.80
35 DATA 35 K1035 ,61.740,55.3734,173.89
36 DATA 36 K1036 ,61.096,54.6624,173.65
37 DATA 37 K1037 ,61.690,55.0654,174.42
38 DATA 38 K1038 ,61.245,54.8930,174.00
39 DATA 39 K1039 ,61.751,55.4016,174.04
40 DATA 40 K1040 ,61.383,55.0864,174.50
41 DATA 41 K1041 ,60.244,53.2910,174.54
42 DATA 42 K1042 ,60.665,53.9206,174.84
43 DATA 43 K1043 ,59.705,52.9246,174.41
44 DATA 44 K1044 ,61.212,54.6964,174.66
45 DATA 45 K1045 ,61.082,54.6732,173.79
46 DATA 46 K1046 ,60.376,53.8116,173.89
47 DATA 47 K1047 ,60.376,53.8630,173.56
48 DATA 48 K1048 ,61.681,55.5014,173.93
49 DATA 49 K1049 ,60.897,54.6198,173.52
50 DATA 50 K1050 ,62.187,55.8644,174.48
51 DATA 51 K1051 ,58.996,52.0830,174.08
52 DATA 52 K1052 ,61.257,54.8038,174.18
53 DATA 53 K1053 ,60.866,54.5744,173.75
54 DATA 54 K1054 ,60.796,54.3458,174.25
55 DATA 55 K1055 ,61.632,55.1416,173.73
56 DATA 56 K1056 ,62.024,55.7910,173.30
57 DATA 57 K1057 ,60.383,53.8678,174.08
58 DATA 58 K1058 ,61.456,55.0068,174.49
59 DATA 59 K1059 ,60.665,54.3464,173.19
60 DATA 60 K1060 ,60.817,54.4334,173.99
61 DATA 61 K1061 ,61.430,54.8986,174.21
62 DATA 62 K1062 ,60.745,54.3828,174.23
63 DATA 63 K1063 ,61.247,54.7344,174.02
64 DATA 64 K1064 ,60.641,54.1554,174.39