2026-09-30에 처음 등록했다. 기준 파일은 워크스페이스의 Cathode1_260915.L5X이고, VISION 타이머만 Desktop의 VISION_CSM1.L5K에서 다시 확인했다. 컨트롤러에 다운로드하지 않았고, 온라인 Trend도 아직 기록하지 않았다. 이 글은 수정안을 넣는 절차가 아니다.
2026-09-30에 동작 흐름을 CSM#1 VISION 등급소실 동작흐름 Rev.3으로 갱신했다. 등급이 0이 되는 중심은 이 글의 휠 오버런이 아니라, 조그로 다이에 올린 판정이 R1 집기보다 먼저 끝나는 쪽이다. 이 글은 전기동 감지의 상승과 번호 이동만 다룬다.
SC1 Robot3와 SM Finger Retry는 이 글의 대상이 아니다.
여기서 상승은 비트가 1이 되어 그 값으로 있는 구간이 아니다. 0에서 1로 바뀌는 그 스캔 한 번이다.
XIC 뒤에 ONS가 있으면 Logix는 앞 조건이 거짓에서 참으로 바뀌는 스캔에만 뒤 코일을 실행한다. 조건이 1로 유지되는 동안은 저장 비트만 1이고, 코일은 다시 나가지 않는다. 1에서 0으로 떨어질 때도 코일은 나가지 않는다. 저장 비트는 그때 0으로 되돌아간다.
그래서 “0이 1이 된다”와 “0에서 1로 바뀌는 가장자리”는 같은 변화를 가리키지만, 프로그램이 사용하는 것은 그 변화의 순간이다. 이미 1인 상태를 상승이라고 부르면 이 렁과 맞지 않는다.
책 이동의 저장 비트는 Robot1.ons_R4_Pickup이다. 이 비트는 한 스캔만 1이 되지 않는다. 전기동 감지 비트가 1로 있는 동안 같이 1로 남아 있으므로, 상승 순간을 보려면 이 비트를 Trend에 넣지 않는다. 상승의 결과는 컨트롤러 비트 z_Tracking_Commands[20]이다. z_Track_Infeed_Robot4_Pickup의 저장값은 20이다.
두 번 털릴 수 있다고 한 센서는 휠 홈 센서가 아니다. 인피드에서 전기동을 보는 감지 비트다.
| 이름 | 주소 | 프로그램이 쓰는 곳 |
|---|---|---|
Infeed_Conveyor.i_copper_not_at_robot |
N1:0:I.0 |
인덱스 출발과 일련번호 |
Robot1.i_infeed_copper_at_unload |
N1:I.Data[0].0 |
R4 책 이동 명령 20 |
Infeed_Conveyor.i_index_wheel_home |
N1:0:I.6 |
인덱스 정지와 일련번호 |
Robot1.i_infeed_wheel_home |
N1:I.Data[0].6 |
선언만 있고 렁에는 없다 |
명령 20 렁에는 휠 홈이 없다. 휠 홈은 일련번호 렁에만 있다. N1 슬롯 0은 1794-IB16이고 자체 연결 없이 어댑터 랙 연결만 가진다. 그래서 위 두 쌍은 같은 물리 비트일 가능성이 높지만, L5X는 둘을 하나의 alias로 묶어 두지 않았다. 배선도도 이 파일에 없다. Trend에서 각 쌍이 같이 움직이기 전에는 한 센서라고 단정하지 않는다. 다르게 움직이면 수정안을 넣지 않는다.
모듈 주석 Cathode_detect는 랙 입력 .1에 붙어 있다. 그 비트는 Infeed_Conveyor.i_conveyor_full, 주소 N1:0:I.1이다. 이 태그를 읽는 렁은 없다. 전기동 감지라고 보고 Trend에 넣지 않는다.
극성은 센서 등만으로 정하지 않고, 원본 렁이 비트를 어떻게 쓰는지로 읽는다. Infeed_Conveyor의 Permits 0렁은 i_copper_not_at_robot이 1일 때만 인덱스 출발을 허용한다. 태그 이름도 “로봇 자리에 전기동이 없다”이다. 같은 프로그램의 언로드 허용은 이 비트가 0일 때 나간다. 따라서 이 비트의 1은 집는 자리가 빈 상태이고, 0은 전기동이 빔에 있는 상태다.
책 이동은 반대편 주소 i_infeed_copper_at_unload의 1을 본다. 두 주소가 같은 와이어라면, 그 비트의 0에서 1은 전기동이 빔에서 빠지는 순간이다. 전기동이 빔에 들어오는 1에서 0에서는 명령 20이 나가지 않는다. 이름 i_infeed_copper_at_unload만 보면 전기동이 도착한 것으로 읽히므로, 그 이름만으로 극성을 판단하지 않는다.
| 비트 변화 | 두 주소가 같을 때의 뜻 | 명령 20 |
|---|---|---|
| 1로 유지 | 자리가 비어 있다 | 나가지 않는다 |
| 1에서 0 | 전기동이 빔에 들어온다 | 나가지 않는다 |
| 0에서 1 | 전기동이 빔에서 빠진다 | 그 스캔에 한 번 나간다 |
| 0으로 유지 | 전기동이 빔에 있다 | 나가지 않는다 |
조업에서 센서가 두 번 털린다는 말은 이 전기동 감지가 두 번 반응한다는 뜻이다. 들어왔다가 빠지는 과정이 두 번이면, PLC의 상승은 그중 빠지는 0에서 1이 두 번이다. 들어올 때마다 책이 움직이는 것이 아니다. 센서 등이 켜지는 방향을 PLC 1과 같다고 보지 않는다. 전기동을 빔에 두었을 때 i_copper_not_at_robot이 0이 되는지를 Trend로 먼저 본다. 반대로 움직이면 이 절의 현장 뜻을 멈추고 다시 적는다.
아래 그림은 Cathode1_260915.L5X 원본이다. 수정안이 아니다. SFC는 Routine 전체가 아니라 홈으로 들어가는 전이만 확대한 것이다.
i_index_wheel_home
State_Index2에 들어갈 때 속도는 param_volts_creep_velocity이다. 내보낸 값은 -2.55이다. Delay의 PRE는 350이고, 속도를 0으로 만드는 Action은 PulseFallingEdge이다. 홈을 처음 본 스캔에는 속도를 끄지 않고, 350 ms 스텝이 끝날 때 var_volts_velocity를 0으로 하고 z_set_Serial을 1로 한다. 그 350 ms 동안 휠은 홈 도그를 지나 홈 비트가 꺼질 수 있다. 크립이 실제로 도그를 얼마나 지나는지는 이 파일만으로 알 수 없고, Trend의 홈 비트로 본다. Delay에서 State_Idle로 나가는 조건은 Delay.DN이다. 그 Transition의 ID가 10이라 이 페이지의 SFC 확대에는 넣지 않았다.
이 렁의 oa_conveyor는 Infeed_Conveyor.oa_conveyor이고 주소는 N1:2:O.Ch0OutputData이다. 정수다. Bundle_Conveyor, Sheet_Conveyor_1, Sheet_Conveyor_2에도 같은 이름이 있으나 다른 출력이다. 바이어스 param_volts_velocity_bias의 내보낸 값은 0이다. 컨베이어 출력은 Background 3렁에서 계산되고, 번호 렁은 그보다 앞인 Main 0렁에서 실행된다. 그래서 z_set_Serial이 막 1이 된 스캔에는 출력이 아직 0이 아니어서 번호가 한 스캔 이상 기다릴 수 있다. 이것은 오버런이 아니다. 오버런은 홈 비트가 0으로 남아 번호 조건이 계속 거짓인 경우다.
홈이 0이면 전기동 감지가 몇 번 바뀌어도 ui_i_c_num은 오르지 않는다. z_set_Serial은 1로 남는다. 휠을 나중에 홈으로 되돌리고, 그 순간 감지 비트가 0이며 컨베이어 출력이 0이면, 그때 센서 앞에 있는 전기동에 번호가 한 번 써진다. 이미 Jog로 들어 올린 전기동에는 소급되지 않는다. 번호 루틴은 a_cathode[6].Weight를 0으로 지우고 Serial에 ui_i_c_num을 넣는다. 칸이 차 있는지는 보지 않는다.
Cathode_Tracking은 50 ms 태스크에서 Robot1보다 먼저 실행된다. 명령 20은 그 스캔의 장부에서는 아직 보이지 않고, 다음 50 ms에 처리된 뒤 꺼진다. Trend 샘플이 100 ms이면 이 펄스를 놓칠 수 있으므로 샘플은 10 ms로 한다.
장부는 6번 Serial이 0이 아닐 때만 집기 루틴을 호출한다. 루틴은 10번 Serial이 0일 때만 6번을 10번으로 복사한다. 10번에 이미 번호가 있으면 명령만 지우고 다시 옮기지 않는다. 6번이 0이면 루틴을 호출하지 않으므로, 루틴 안의 777은 정상 호출 경로에서는 실행되지 않는다. 두 번째 상승은 10번이 이미 찬 뒤에 오면 빈 명령으로 사라지고, 번호를 한 번 더 증가시키지도 않는다.
R4 Resume은 o_resume만 잠시 켠다. 일련번호를 증가시키지 않는다.
VISION의 RESET_GR PRE는 그 L5K에서 300이다. 등급 출력이 켜져 있는 동안 시간을 세고, 끝나면 네 등급 출력을 끈다. CATHODE는 수신 비트가 1인 동안 래치를 매 스캔 다시 켜므로, 이 래치 렁은 상승 한 번이 아니다.
E, G, R은 80, 81, 82렁에서 같은 방식으로 자기 래치만 남긴다. DELAY의 PRE는 700이다. 네 래치 중 하나가 켜지면 시간을 세고, 끝나면 84렁이 네 래치를 모두 끈다.
수신 비트가 아직 1이면 다음 스캔 79렁이 래치를 다시 켠다. 700 ms 해제는 수신 비트가 이미 0일 때 유지된다. 로봇을 잡아 두어도 이 타이머는 멈추지 않는다. prod_tracking 11렁은 래치가 1인 동안 z_GradeBackup에 1, 2, 3, 4를 매 스캔 덮어쓰지만, 그 값을 읽는 등급 기록 렁은 없다. 래치가 꺼진 뒤에도 마지막 숫자는 남는다. 이 값만 다음 전기동에 연결하면 이전 등급이 붙는다.
R1은 툴이 닫히고 다이 작업 신호가 꺼진 뒤에 등급 래치 또는 4초 타임아웃으로 명령 22를 낸다. TON_01의 PRE는 4000이다. 명령 22는 11번 번호를 확인하지 않고 집기 루틴을 호출한다. 래치가 없으면 Weight는 0으로 남고, 11번 번호가 0이면 119를 채운다. 119는 전기동의 식별자가 아니다.
Cathode_Tracking의 TestEdits에는 집기 루틴 끝의 래치 삭제를 주석 처리한 본이 있다. 프로그램 TestEdits는 false이므로 실행본이 아니다. 그 주석을 적용하지 않는다. 래치를 남기면 다음 전기동이 이전 등급을 받는다.
수정안은 컨트롤러에 없다. Cathode1_260915.L5X, 로봇 프로그램, VISION PLC를 고치지 않았고 온라인에 넣지 않는다. 84렁과 350 ms 정지, 일련번호 렁도 그대로 둔다. 먼저 버린 안은 700 ms를 늘리거나 84렁을 지우는 안이다. 그 안은 다시 열지 않는다.
수정안이 지키려는 순서는 이렇다. 6번이 실제로 10번으로 복사된 뒤에만 그 번호를 기억한다. 그 스캔에 N1:0:I.6이 0이면 모호로 표시하고 등급을 붙이지 않는다. 하차 전에 명령 20이 한 번 더 오고 10번에 번호가 있으면 역시 모호로 둔다. 등급 보관은 수신 비트의 상승 한 번만 잡고, 래치의 상승은 잡지 않는다. 11번 번호와 섹션이 그 집기 번호와 같을 때만 R1이 보관 숫자를 쓴다. 0, 119, 777은 제외한다. 수신 래치가 살아 있으면 래치가 우선이다. R 보관값 4를 쓸 때만 Rejected를 1로 하고, 1, 2, 3에서는 Rejected를 끄지 않는다. 4초가 지나 번호가 달라 빈 이동을 한 경우에는 보관함을 지우지 않는다. 섹션이 바뀌어 번호가 1부터 다시 시작하면 보관 번호와 모호 표시를 지운다.
| 경우 | 지금 프로그램 | 수정안을 넣었을 때 | 판단 |
|---|---|---|---|
| 정상 자동이고 래치가 700 ms 안에 살아 있다 | 래치로 Weight 1~4를 적는다 |
같은 래치가 우선이라 사이클 시간이 늘지 않는다 | 맞다. 이 경우는 보관함을 쓰지 않는다 |
| 홈이 0인 동안 전기동 비트가 여러 번 바뀐다 | 번호는 오르지 않는다 | 번호 렁을 그대로 둔다 | 맞다. Trend가 홈 0에서 ui_i_c_num이 오르면 이 판단은 틀린 것이다 |
| 홈이 0인데 감지 상승으로 6번이 10번으로 옮겨진다 | 홈을 보지 않고 옮긴다 | 그 이동을 모호로 보고 등급을 적지 않는다 | 등급 복구는 되지 않는다. 다른 장에 등급을 붙이지 않으려는 판단은 맞다 |
| 6번이 0인 채 Jog로 집는다 | 명령 20이 나와도 루틴을 호출하지 않는다 | 보관함을 열지 않는다 | 맞다. 번호가 없는 전기동은 등급 없음으로 남는다 |
| 휠을 나중에 홈으로 되돌린다 | 그때 센서 앞에 있는 전기동에 번호를 한 번 쓴다 | 이미 들어 올린 장과 그 번호를 연결하지 않는다 | 맞다. 빈 센서 앞이면 번호 조건 자체가 거짓이다 |
| 홈을 먼저 되돌린 뒤, 새 번호가 쓰기 전에 옛 6번이 상승으로 10번에 옮겨진다 | 옛 번호가 새 전기동의 자리로 간다 | 홈이 1이므로 모호가 아니고, 그 옛 번호에 새 판정이 붙을 수 있다 | 이 순서는 수정안이 막지 못한다. Trend에서 보이면 다운로드하지 않는다 |
| 정상 이동 뒤 빠짐이 한 번 더 생긴다 | 10번이 차 있으면 다시 옮기지 않는다 | 모호가 되어 보관 복구는 막힌다. 래치가 살아 있으면 래치로 적는다 | 지금보다 나쁜 등급을 만들지는 않는다. 정상 사이클의 두 번째 상승 빈도를 Trend로 본다 |
| 등급 수신이 700 ms 뒤에 꺼지고, 홈에서 한 번 옮긴 번호가 11번에 그대로 있다 | Weight 0으로 집는다 |
번호와 섹션이 같으면 보관 숫자를 적는다 | 복구가 성립하는 경우다. 홈 밖 이동에는 해당하지 않는다 |
| 집기가 판정보다 먼저 끝나 11번이 이미 떠났다 | 늦게 온 판정을 따라 적지 못한다 | 수정안도 따라 적지 못한다 | 맞다. 한 장의 한계로 남긴다 |
| 섹션이 바뀌어 같은 번호가 다시 나온다 | 번호만 1부터 다시 시작한다 | 옛 보관 번호를 지우므로 다음 섹션에 넘기지 않는다 | 이 초기화가 없으면 수정안은 틀린다. 글에 넣은 이유다 |
| 번호가 0, 119, 777이다 | 119는 빈 11번에 채우는 값이다 | 보관 대상에서 뺀다 | 맞다. 이 값들은 한 전기동의 식별자가 아니다 |
| 수신 래치와 보관 숫자가 다르다 | 래치만 Weight에 적힌다 |
래치가 우선이고 보관 숫자는 쓰지 않는다 | 맞다 |
| 보관값이 4이다 | R 래치일 때 Rejected를 1로 한다 |
보관으로 4를 쓸 때만 Rejected를 1로 한다 |
맞다. 1, 2, 3에서 Rejected를 끄면 기존 불량 표시를 지울 수 있다 |
| 4초 타임아웃인데 11번 번호가 보관 번호와 다르다 | 등급 없이 이동한다 | 보관함을 지우지 않고 이번 이동에는 적지 않는다 | 맞다. 다음 장의 번호까지 지워 버리면 안 된다 |
| 같은 스캔에 하차 21과 등급 가장자리가 만난다 | 원본은 등급 보관이 없다 | 10번이 이미 비면 11번의 하차 번호로 묶는다 | 장부 프로그램이 하차 루틴을 등급 묶음보다 먼저 실행할 때만 성립한다. 지금 Main 순서는 그렇다 |
| 두 감지 주소 또는 두 홈 주소가 다르게 움직인다 | 번호와 책이 서로 다른 접점을 본다 | 홈 판단은 N1:0:I.6을 쓰고, 책 상승은 N1:I.Data[0].0을 그대로 쓴다 |
다운로드 금지다. 같은 센서라는 전제가 깨진다 |
정리하면, 수정안은 오버런 중의 전기동을 항상 등급 있게 만드는 안이 아니다. 홈이 꺼진 이동과 번호가 없는 전기동은 지금처럼 등급 없음으로 남긴다. 다른 전기동에 등급을 추측해 적지 않으려고 그렇게 둔 것이다. 등급 유실을 없애는 효과는, 휠 홈이 켜진 상태에서 한 번만 옮겨진 번호가 판정 뒤에도 11번에 남아 있는 경우로 한정된다. 그 순서가 Trend에서 보이고, 위에서 다운로드하지 말라고 한 기록이 없을 때만 다음 검토로 넘어간다. 이 글의 Trend만으로 수정안을 다운로드하지 않는다.
확인할 대상은 지금 컨트롤러의 수정 전 프로그램이다. 수정안 태그는 아직 없으므로 Trend에 넣지 않는다. 프로그램을 고치거나 다운로드하지 않는다. 온라인에서 Trend만 연다. 창은 두 개까지고, 한 창의 펜은 여덟 개까지다.
일부러 휠을 홈 밖으로 밀거나 전기동을 빼먹게 만들지 않는다. 먼저 정상 자동 한 사이클을 기록한다. 그 다음, 이미 발생한 오버런 복구나 Jog 복귀가 있을 때 같은 두 창을 다시 기록한다. 센서 앞에 전기동을 넣고 빼는 극성 확인은 설비가 안전한 수동 상태일 때만 한다.
Studio 5000에서 Trend를 두 개 만든다. 샘플 주기는 10 ms로 한다. Slow_Operations_50ms가 명령 20을 약 한 주기 동안만 켜 두기 때문이다. BOOL은 디지털 펜으로 두고, DINT와 INT는 아날로그 펜으로 둔다. 번호와 컨베이어 출력을 한 눈금에 올리지 않는다. 트리거 없이 상황을 보기 전에 기록을 시작하고, R1이 집은 뒤 a_cathode[11].Weight가 남거나 0으로 끝나는 시점까지 멈춘다. 두 창은 동시에 켠다. 시각을 맞추는 공통 펜은 Robot1.i_infeed_copper_at_unload이다.
프로그램 태그는 프로그램 이름을 붙여 고른다. 컨트롤러 태그는 프로그램 이름 없이 고른다.
| 펜 | 태그 | 종류 | 보는 것 |
|---|---|---|---|
| 1 | Infeed_Conveyor.i_index_wheel_home |
디지털 | 일련번호가 요구하는 휠 홈 |
| 2 | Robot1.i_infeed_wheel_home |
디지털 | 1번과 같은 모양인지. 로직은 쓰지 않는다 |
| 3 | Infeed_Conveyor.i_copper_not_at_robot |
디지털 | 전기동 감지. 1이면 자리가 빈 것으로 렁이 취급한다 |
| 4 | Robot1.i_infeed_copper_at_unload |
디지털 | 3번과 같은 모양인지. 책 이동이 보는 비트 |
| 5 | Infeed_Conveyor.z_set_Serial |
디지털 | 1로 남으면 번호 조건이 아직 거짓이다 |
| 6 | Cathode_Tracking.ui_i_c_num |
아날로그 | 번호 카운터. 홈이 0인데 오르면 판단이 틀리다 |
| 7 | Cathode_Tracking.a_cathode[6].Serial |
아날로그 | 인피드 끝 칸의 번호 |
| 8 | Cathode_Tracking.a_cathode[10].Serial |
아날로그 | R4가 집은 것으로 장부가 옮긴 번호 |
홈이 1이고 3번이 0인데도 6번 카운터가 오르지 않으면, 창을 새로 만들지 말고 6번 펜만 Infeed_Conveyor.oa_conveyor로 바꿔 한 번 더 기록한다. 이 태그는 INT 아날로그이고 인피드 출력 N1:2:O.Ch0OutputData이다. 0이 아니면 번호 렁이 기다린다. 다른 프로그램의 oa_conveyor를 고르지 않는다.
| 펜 | 태그 | 종류 | 보는 것 |
|---|---|---|---|
| 1 | Robot1.i_infeed_copper_at_unload |
디지털 | 창 1과 시각을 맞춘다 |
| 2 | z_Tracking_Commands[20] |
디지털 | 0에서 1로 바뀐 직후 약 50 ms만 1인지 |
| 3 | Cathode_Tracking.a_cathode[10].Serial |
아날로그 | 그 상승 때 6번 번호가 여기로 왔는지 |
| 4 | Cathode_Tracking.a_cathode[11].Weight |
아날로그 | 실제로 남은 등급. 0이면 등급 없음 |
| 5 | R4_S_Grade |
디지털 | S 래치. 컨트롤러 태그 |
| 6 | R4_E_Grade |
디지털 | E 래치. 컨트롤러 태그 |
| 7 | R4_G_Grade |
디지털 | G 래치. 컨트롤러 태그 |
| 8 | R4_R_Grade |
디지털 | R 래치. 컨트롤러 태그 |
11번 번호를 같이 봐야 하면 창을 늘리지 말고 3번 펜만 Cathode_Tracking.a_cathode[11].Serial로 바꿔 다시 기록한다. 래치가 꺼진 뒤에도 수신이 남아 있는지를 보려면 5번부터 8번까지를 R4_i_Die_S_Grade_Signal, R4_i_Die_E_Grade_Signal, R4_i_Die_G_Grade_Signal, R4_i_Die_R_Grade_Signal로 바꿔 한 번 더 기록한다. 세 번째 창은 열지 않는다. ons_R4_Pickup은 넣지 않는다.
다음이 함께 보이면, 수정 전 프로그램에 대한 이번 판단은 맞다.
ui_i_c_num과 a_cathode[6].Serial은 그대로다. z_set_Serial은 1로 남을 수 있다.z_Tracking_Commands[20]은 창 1의 4번 펜이 0에서 1로 바뀌는 직후에만 짧게 1이 된다. 1로 유지되는 구간과 1에서 0으로 떨어지는 순간에는 다시 1이 되지 않는다.a_cathode[11].Weight가 0으로 남을 수 있다.다음 중 하나면 수정안을 넣지 않는다.
ui_i_c_num이 전기동 비트에 맞춰 증가한다.a_cathode[6].Serial이 10번으로 옮겨진다.이 Trend는 수정안이 컨트롤러에서 등급을 올바르게 쓴다는 증거는 되지 못한다. 수정안이 아직 없기 때문이다. 수정 전 설명과 센서 주소, 극성, 그리고 다운로드하면 안 되는 순서를 확인하는 기록이다. 내보낸 파일과 지금 컨트롤러가 같은지도 이 기록으로 본다. 온라인에서 아직 확인하지 않았다.
GitHub 계정으로 답니다. 내용은 이 저장소 Discussions에 남습니다.