산업 현장에서 S7-200 SMART PLC와 V90 서보 드라이버를 Profinet으로 연동하여 점대점 위치 제어를 구현하는 방법을 살펴본다. 특히 SINA-POS 기능 블록을 활용한 EPOS(Electronic Positioning System) 제어와 왕복 운동 로직을 중심으로 다룬다.
하드웨어 구성 및 GSD 파일 등록
TIA Portal에서 프로젝트를 생성한 후, 하드웨어 카탈로그에 V90용 GSDML 파일을 등록한다. V90의 제어 모드는 반드시 EPOS로 설정해야 하며, Profinet 통신을 통한 위치 제어가 가능하다. GSD 파일 버전은 드라이버 펌웨어와 일치하는 최신 버전을 사용해야 통신 오류를 방지할 수 있다.
네트워크 토폴로지에서 PLC와 V90 간의 Profinet 연결을 구성하고, IO 주소를 할당한다. 표준 설정에서는 8바이트 출력 영역과 20바이트 입력 영역이 할당되며, 이를 통해 제어 워드, 상태 워드, 위치 및 속도 데이터가 교환된다.
Profinet 프로세스 데이터 매핑
V90 EPOS는 표준 Telegram 111을 사용하며, 다음과 같은 데이터 구조로 매핑된다.
| 방향 | 오프셋 | 변수명 | 데이터 타입 | 설명 |
|---|---|---|---|---|
| 출력(Q) | 0~1 | STW1 | Word | 제어 상태 워드 1 |
| 출력(Q) | 2~3 | STW2 | Word | 제어 상태 워드 2 |
| 출력(Q) | 4~7 | MDI_TargetPos | DInt | 목표 위치 |
| 출력(Q) | 8~11 | MDI_Velocity | DInt | 목표 속도 |
| 입력(I) | 0~1 | ZSW1 | Word | 상태 워드 1 |
| 입력(I) | 2~3 | ZSW2 | Word | 상태 워드 2 |
| 입력(I) | 4~7 | ActPos | DInt | 실제 위치 피드백 |
| 입력(I) | 8~11 | ActVel | DInt | 실제 속도 피드백 |
SINA-POS 기능 블록 파라미터 구성
SINA-POS(Single Axis Positioning) 기능 블록은 TIA Portal의 기술 객체 폴더에서 호출할 수 있다. 주요 파라미터는 다음과 같이 설정한다.
// SINA-POS 인스턴스 호출 예시
// DB: "AxisControl" (Instance DB)
"AxisControl".Execute := "StartTrigger"; // 상승엣지 트리거
"AxisControl".Position := "TargetPos"; // 목표 위치 [LU]
"AxisControl".Velocity := "MoveSpeed"; // 이동 속도 [LU/min]
"AxisControl".Acceleration:= "AccelRate"; // 가속도
"AxisControl".Deceleration:= "DecelRate"; // 감속도
"AxisControl".Direction := 2#00; // 0:最短, 1:正, 2:負
CALL "SINA_POS"
, DB := "AxisControl"
, Axis := "PN_V90_1"
, Execute := "AxisControl".Execute
, Position := "AxisControl".Position
, Velocity := "AxisControl".Velocity
, Done => "MotionDone"
, Busy => "InMotion"
, Error => "FaultActive"
, ErrorID => "DiagCode";
왕복 운동 상태 머신 구현
A점과 B점 사이의 왕복 운동을 구현하기 위해 5상태 순차 제어 로직을 적용한다. 각 상태는 현재 동작 완료 신호와 조건 논리에 의해 전이된다.
// 상태 정의
// 0: 초기화/대기
// 1: 원점 복
// 2: A→B 이동
// 3: B점 도착 대기
// 4: B→A 이뵤
CASE "MachineState" OF
0: // 대기 상태
IF "SystemReady" AND "HomeComplete" THEN
"MachineState" := 2; // 바로 A→B 이동
ELSIF "SystemReady" AND NOT "HomeComplete" THEN
"MachineState" := 1; // 원점 복귀 필요
END_IF;
1: // 원점 복귀
"AxisControl".Position := 0;
"AxisControl".Velocity := "HomeSpeed";
"AxisControl".Execute := TRUE;
IF "MotionDone" THEN
"HomeComplete" := TRUE;
"MachineState" := 2;
END_IF;
2: // A→B 이동
"AxisControl".Position := "PointB_Pos"; // B점 좌표
"AxisControl".Velocity := "Speed_AB"; // A→B 속도
"AxisControl".Execute := "TriggerAB";
IF "MotionDone" THEN
"DwellTimer" := TON(IN:=TRUE, PT:="WaitTime");
IF "DwellTimer".Q THEN
"MachineState" := 4; // 대기 후 귀환
END_IF;
END_IF;
4: // B→A 귀환
"AxisControl".Position := "PointA_Pos"; // A점 좌표
"AxisControl".Velocity := "Speed_BA"; // B→A 속도
"AxisControl".Execute := "TriggerBA";
IF "MotionDone" THEN
"CycleCount" := "CycleCount" + 1;
"MachineState" := 2; // 다음 사이클
END_IF;
END_CASE;
안전 논리 및 알람 처리
모든 운전 조건에서 드라이버 알람 발생 시 즉시 비상 정지를 수행하는 로직은 메인 순환 주기 내에서 우선 순위로 처리한다.
// 알람 모니터링 및 대응 (OB1 내, 최우선 실행)
IF "V90_ZSW1".Fault OR "V90_ZSW1".Warning THEN
"AxisControl".Enable := FALSE; // 즉시 인비저블
"AxisControl".Execute := FALSE; // 실행 중단
"PowerEnable" := FALSE; // MC_Power OFF
"MachineState" := 16#FF; // 오류 상태 진입
"AlarmActive" := TRUE;
// 현재 알람 코드 캡처
"CapturedFault" := "V90_ZSW2" AND 16#0FFF;
END_IF;
// 수동 리셋 후 원점 복귀 유도
IF "AlarmActive" AND "ResetPressed" AND NOT "V90_ZSW1".Fault THEN
"AlarmActive" := FALSE;
"HomeComplete" := FALSE; // 원점 무효화
"MachineState" := 1; // 자동 원점 복귀
END_IF;
HMI 연동 및 파라미터 동적 변경
터치 패널을 통한 거리, 속도 설정값은 PLC 내부에서 엔지니어링 단위와 드라이버 단위 간 변환을 거친다. 위치값은 [μm] 또는 [mm] 단위로 입력받고, 서보의 LU(Length Unit)로 환산하여 전송한다.
// HMI에서 설정된 파라미터 처리
// "HMI_Distance_mm" : 사용자 입력 거리 [mm]
// "PulsePerRev" : 1회전 당 펄스 수 [ppr]
// "LeadLength" : 볼스크류 리드 [mm]
// LU 환산: (거리[mm] / 리드[mm]) * 펄스수 * 전감비
"PointB_Pos" := REAL_TO_DINT(
("HMI_Distance_mm" / "LeadLength") *
DINT_TO_REAL("PulsePerRev") *
"GearRatio"
);
// 속도 환산: [mm/min] → [LU/min]
"Speed_AB" := REAL_TO_DINT(
("HMI_Speed_mmpm" / "LeadLength") *
DINT_TO_REAL("PulsePerRev") *
"GearRatio"
);
실시간 위치 모니터링 및 Trace
현재 축 위치는 V90의 실제 위치 피드백을 HMI에 실시간으로 표시한다. Profinet 갱신 주기 내에서 위치 데이터의 일관성을 위해 부호 확장이 필요한 경우가 있으므로, DInt 타입으로 명시적 처리한다.
// 위치 피드백 처리
"CurrentPos_LU" := "V90_ActPos"; // Profinet 입력 맵핑
// HMI 표시용 [mm] 환산
"DisplayPos_mm" := DINT_TO_REAL("CurrentPos_LU") *
"LeadLength" /
(DINT_TO_REAL("PulsePerRev") * "GearRatio");
// HMI 트리거 비트 (0.5초 주기 갱신)
"HM_UpdateTrig" := "Clock_0_5Hz";
디버깅 및 최적화 팁
V90 Assistant 도구를 활용하면 Profinet 통신 상태와 실시간 파라미터를 모니터링할 수 있다. 특히 다음 사항을 점검해야 한다.
- Telegram 111의 STW1 비트 10(제어 가능) 상태 확인
- MDI 모드 전환 시 STW1 비트 12~15의 모드 전환 타이밍
- SINA-POS의
Execute신호 상승엣지 검출 여부 - 위치 목표값 변경 시
Done비트 하강 후 재실행 필요
가감속 프로파일은 S-곡선 가감속을 적용하여 기계 진동을 억제하며, 급격한 속도 변화가 발생하는 구간에서 토크 편차를 모니터링하여 최적화한다.