728x90

AW 2026 전시회 관람 후기

최근 열린 AW 2026 (Automation World 2026) 전시회를 다녀왔다.
자동화, AI, 로봇, 스마트팩토리 기술을 한 자리에서 볼 수 있는 국내 대표 산업 자동화 전시회다.

올해 전시회를 관람하면서 가장 크게 느낀 점은 두 가지였다.

  • 휴머노이드 로봇 기술의 빠른 발전
  • 피지컬 AI(Physical AI) 기반 제품 증가

AI가 단순한 소프트웨어 기술을 넘어 실제 물리 세계에서 동작하는 기술로 빠르게 확장되고 있다는 것을 현장에서 직접 확인할 수 있었다.


휴머노이드 로봇 기술 트렌드

이번 전시회에서 특히 눈에 띄었던 분야는 휴머노이드 로봇(Humanoid Robot) 이었다.

휴머노이드 로봇은 인간과 유사한 형태를 가진 로봇으로 다음과 같은 특징을 가진다.

주요 특징

  1. 인간형 구조
    • 팔, 다리, 관절을 활용한 동작 가능
    • 기존 인간 환경에서 작업 가능
  2. AI 기반 인지 시스템
    • 카메라 + 센서 기반 환경 인식
    • 객체 인식 및 상황 판단
  3. 자율 작업 능력
    • 물건 집기
    • 이동 및 작업 수행

이러한 기술 덕분에 앞으로 물류, 제조, 서비스 산업에서 휴머노이드 활용이 빠르게 늘어날 것으로 예상된다.

특히 몇몇 부스에서는 실제로 물건을 집거나 이동하는 데모를 보여주어 관람객들의 관심이 매우 높았다.


피지컬 AI (Physical AI) 기술

또 하나 인상적이었던 기술은 피지컬 AI(Physical AI) 였다.

피지컬 AI란?

피지컬 AI는 AI가 실제 물리 환경과 상호작용하는 기술을 의미한다.

기존 AI는

  • 데이터 분석
  • 이미지 인식
  • 텍스트 처리

같은 디지털 영역 중심이었다.

하지만 피지컬 AI는

  • 로봇
  • 자율 시스템
  • 자동화 장비

와 결합하여 현실 세계에서 직접 행동하는 AI라고 볼 수 있다.

적용 사례

전시회에서 확인할 수 있었던 주요 사례는 다음과 같다.

  • AI 기반 로봇 팔 자동 조립
  • 비전 AI 기반 검사 시스템
  • 자율 이동 로봇(AMR)
  • 스마트 물류 자동화

특히 AI 비전 + 로봇 + 자동화 시스템이 결합된 형태의 제품들이 많았다.

이는 스마트팩토리 기술이 AI 중심으로 빠르게 진화하고 있다는 신호로 보인다.


전시회를 보며 느낀 점

이번 AW 2026 전시회를 보면서 느낀 점은 AI와 로봇 기술의 경계가 빠르게 사라지고 있다는 것이었다.

과거에는

  • AI = 소프트웨어
  • 로봇 = 하드웨어

라는 인식이 강했다.

하지만 이제는

AI + 로봇 + 자동화 + 데이터

가 하나의 생태계처럼 결합하고 있었다.

특히 휴머노이드 로봇은 아직 초기 단계이지만, 기술 발전 속도를 보면 앞으로 산업 현장에서도 실제 활용되는 시점이 멀지 않았다고 느껴졌다.

728x90
728x90

3축 서보 부하율 수집부터 클라우드 연동까지 – MCT 데이터 통합의 모든 것

**MCT(머시닝 센터)**와 같은 고정밀 공작기계는 실시간 데이터를 수집하고 분석하는 것이 생산성 향상과 예지보전의 핵심입니다.
이번 사례에서는 MCT의 서보 로드 정보 및 3축 부하율을 실시간으로 수집하고, 이를 다양한 **플랫폼(Grafana, 클라우드, 대시보드 등)**에서 활용하기 위한 구조를 정리합니다.


✅ 프로젝트 개요

항목 내용
대상 설비 머시닝 센터 (CNC 기반)
주요 데이터 서보 모터 부하율, 3축(X/Y/Z) 부하 상태, 스핀들 속도 등
수집 방식 OPC UA / MTConnect / CNC API 연동
개발 환경 Python, Node-RED, MQTT, InfluxDB, Grafana
활용 목적 실시간 시각화, 상태 진단, 클라우드 플랫폼 연동, 디지털 트윈 구축

1️⃣ 실시간 데이터 수집 구성도

 
[MCT] → [CNC Controller] → [OPC UA / MTConnect Adapter] → [Edge Gateway]  
                                     ↓  
                           [InfluxDB / MQTT Broker]  
                                     ↓  
                          [Grafana / Cloud Dashboard / MES]

MCT에서 서보 드라이브와 컨트롤러(CNC, FANUC, SIEMENS 등)를 통해 부하 정보, 위치, 속도 등 데이터를 추출합니다.


2️⃣ 서보 로드 및 3축 부하율 정보

항목 설명
Servo Load (%) 각 축 모터의 현재 부하 비율
Axis Load X/Y/Z 각각의 축에서 현재 작업 중인 부하율
Spindle Load 가공 중 스핀들에 가해지는 토크 비율
Feed Rate, Position 공정 중 위치 및 이송 속도 정보 포함 가능
 
{
  "timestamp": "2024-02-11T10:15:30Z",
  "axis": {
    "X": {"load": 45.3},
    "Y": {"load": 38.7},
    "Z": {"load": 51.2}
  },
  "servo": {
    "spindleLoad": 63.5
  }
}

📌 Tip: 대부분의 컨트롤러는 위 정보를 OPC UA 노드 또는 MTConnect의 XML 스트림으로 제공함


3️⃣ 다양한 플랫폼을 위한 수집 구성

Edge → DB 구조

  • 수집기: Python or Node-RED 기반 OPC UA/MTConnect 클라이언트
  • 저장소: InfluxDB, PostgreSQL 등 시계열/관계형 DB
  • 시각화: Grafana (실시간 부하율 트렌드 확인)

MQTT + 클라우드 연동

  • MQTT Broker로 실시간 스트림 전송
  • AWS IoT Core / Azure IoT Hub 연계 가능
  • 클라우드에서 대시보드 구성 또는 예지보전 모델 접목

4️⃣ 실시간 시각화 예시 (Grafana)

  • 서보 로드 변화율 (시간대별 그래프)
  • 3축 동시 부하율 모니터링
  • 알람 조건: 특정 축이 80% 이상 부하 시 경고

🛠️ 실무 노하우

 

항목
컨트롤러 종류 확인 FANUC/Siemens/Mitsubishi는 각기 다른 OPC 노드 구성
네트워크 지연 대응 MQTT QoS 조정 또는 버퍼 처리 로직 구현
DB 선택 기준 InfluxDB는 시계열 데이터에 최적, 알림 기능도 내장
데이터 병합 처리 서보/위치/알람을 하나의 JSON 패킷으로 통합 추천
클라우드 연동 팁 JSON 포맷 유지 & 장비 ID 명시 필수 (멀티 설비 구분)

https://www.youtube.com/watch?v=Pok7VcZDBUY

 

728x90
728x90

C#으로 G코드 전송하고 실시간 위치 제어까지!

3D 프린터를 디지털 트윈 환경에서 제어하거나 모니터링하려면, 프린터와의 실시간 통신과 상태 업데이트 체계가 필수입니다.
본 사례에서는 Visual Studio + C# 환경에서 시리얼 통신을 설정하고, G-code 명령어를 전송해 프린터를 직접 제어하는 구조를 소개합니다.


✅ 프로젝트 개요

항목 내용
대상 장비 FDM 방식 3D 프린터 (Marlin 펌웨어 기준)
통신 방식 Serial (USB/COM 포트)
개발 환경 Visual Studio 2022+, C# .NET 6
제어 명령 G-code (온도 설정, XY 이동, 홈 복귀 등)
활용 목적 디지털 트윈 기반 원격 제어, 프린터 상태 실시간 반영

1. 시리얼 통신 연결 설정 (C#)

 
using System.IO.Ports;

SerialPort serial = new SerialPort("COM3", 115200); // 포트 & 속도 설정
serial.Open();
serial.WriteLine("M115"); // 펌웨어 정보 요청 G코드 전송

📌 Tip: 3D 프린터 대부분은 115200 또는 250000 bps 속도를 사용하며, Arduino 기반이면 COM 포트 자동 설정 로직을 넣는 것이 좋습니다.


2. 기본 G-code 명령어 예제

명령 기능 예시
M105 현재 온도 요청 M105
M104 S200 노즐 온도 설정 M104 S200 (200도)
G28 홈 위치 이동 G28
G1 X50 Y50 F3000 X,Y 위치 이동 X=50, Y=50으로 이동
M140 S60 히팅 배드 온도 설정 M140 S60

3. 실시간 위치 제어 예제

void MoveToPosition(float x, float y, int speed = 3000)
{
    string gcode = $"G1 X{x} Y{y} F{speed}";
    serial.WriteLine(gcode);
}
 

📌 실무 팁:

  • 프린터는 명령 처리 후 ok 응답을 반환함 → 응답을 기다리는 로직 필요
  • G-code 전송 후 딜레이(Thread.Sleep) 또는 수신 확인 필요

4. 프린터 상태 모니터링 구조

serial.WriteLine("M105"); // 현재 온도 요청
string response = serial.ReadLine();
Console.WriteLine($"프린터 응답: {response}");

📌 디지털 트윈 적용 사례:

  • 프린터 실제 온도와 위치 → 가상 시뮬레이션 모델에 반영
  • G코드 동기화 기반 양방향 제어 인터페이스 구축

🛠 실무 노하우

항목
전송 안정성 전송 후 \n 또는 \r\n 필수 (펌웨어 설정 확인)
응답 수신 타이밍 DataReceived 이벤트 활용 또는 폴링 방식
포트 충돌 방지 앱 종료 시 .Close() 필수 호출
다중 프린터 제어 포트별 쓰레드 분기 or 큐 처리 방식 구현
G코드 테스트 Pronterface, OctoPrint로 사전 테스트 후 적용 권장

https://www.youtube.com/watch?v=3adLFtTPAT4

 

728x90
728x90

현장 제어부터 복잡한 데이터 처리까지, 상황에 맞는 언어 선택 가이드

PLC를 처음 접하거나 새로운 프로젝트를 설계할 때 가장 많이 하는 고민 중 하나가 바로 **“어떤 언어로 짜야 하지?”**입니다.
과거에는 래더(LD) 중심이었지만, 최근에는 ST, SFC 등 고급 언어도 점점 중요해지고 있습니다.


✅ IEC 61131-3에서 정의한 5가지 표준 PLC 언어

언어 이름 주요 특징 추천 사용 환경
LD Ladder Diagram (래더 다이어그램) 전기 회로와 유사, 가시성 우수 기계 자동화, 유지보수
ST Structured Text (구조화 텍스트) C/파스칼 계열, 복잡한 연산 가능 수학 처리, 조건문, 데이터 조작
FBD Function Block Diagram (기능 블록) 블록 기반 시각화 논리 제어, PID, 모듈화
SFC Sequential Function Chart (순차 기능 차트) 순차 흐름 제어 공정 제어, 상태 기반 로직
IL Instruction List (명령어 목록) 어셈블리와 유사, 저수준 성능 최적화 (현재는 점차 폐지됨)

📌 IL은 IEC 61131-3 3rd Edition에서 사용 중단(deprecated) 되었지만, 일부 구형 PLC에서는 여전히 지원됩니다.

 


🧩 각 언어별 구조 및 예제

 

1️⃣ LD (Ladder Diagram)

: 전기 회로도와 유사한 형태로 가로줄(Rung)과 접점/코일로 구성된 가장 전통적인 언어

📌 누구나 쉽게 시각적으로 이해 가능하며 유지보수가 쉬움

예제: 버튼을 눌렀을 때 모터 작동

[ X00 ] --------( )--------[  Y10 ]
   |                           |
  버튼                       모터 ON

🛠 사용 팁:

  • 직관적 표현이 중요
  • 자기유지 회로, 인터록, 타이머 제어에 적합
  • 논리 흐름이 많아지면 복잡도 증가

2️⃣ ST (Structured Text)

: 고급 프로그래밍 언어처럼 if/for/while 구조를 지원하며, 코드 중심의 언어

📌 복잡한 계산, 배열 처리, 사용자 정의 함수 구현에 최적화

예제: 온도 조건에 따라 히터 작동

IF Temperature < 25 THEN
    Heater := TRUE;
ELSE
    Heater := FALSE;
END_IF;

🛠 사용 팁:

  • 데이터 처리, 수식 연산에 매우 강력
  • 개발자는 C 언어 또는 Python 경험자면 빠르게 적응 가능
  • 디버깅 편의성 ↑, 시각화는 부족

3️⃣ FBD (Function Block Diagram)

: 논리 블록(AND, OR, Timer 등)을 시각적으로 연결해 구성

📌 시각적이지만, 재사용 가능한 블록 지향적 로직 설계에 적합

예제: 타이머를 이용한 펌프 제어

(Start) ──[TON]──> (Pump)
         (IN)
         (PT := T#5s)

🛠 사용 팁:

  • 타이머, PID, 계산 블록 등 표준 기능 사용 시 유리
  • 재사용성이 높은 설계 가능
  • 복잡한 로직은 블록 트리 구조가 난해할 수 있음

4️⃣ SFC (Sequential Function Chart)

: 상태 기반 제어(Flowchart 형식)의 절차형 로직에 적합

📌 제조 공정의 단계별 흐름 정의 시 유리

예제: 공정 순서 – 대기 → 투입 → 가열 → 배출

[Step1: Wait] → [Step2: Input] → [Step3: Heat] → [Step4: Output]

🛠 사용 팁:

  • **상태 전이 조건(Transition)**과 액션을 명확히 설계해야 함
  • 공정 흐름 문서와 1:1 매칭 가능 → 디버깅에 강함
  • 조건 복잡도 증가 시 유지보수 부담

5️⃣ IL (Instruction List)

: 어셈블리 형태의 저수준 명령어 기반

📌 컴팩트하지만 가독성이 낮고 학습 난이도 높음

예제: 버튼 → 모터 ON

 
LD     I0.0
OUT    Q0.0

🛠 사용 팁:

  • CPU 자원 아끼는 초정밀 제어에 적합 (구형 장비에서 활용)
  • 디버깅과 유지보수 난이도 높음
  • 대부분의 최신 PLC는 더 이상 IL을 사용하지 않음

🔍 언어 선택 가이드 요약

상황 추천 언어
유지보수와 협업이 중요 LD, FBD
수식/조건/데이터 위주 제어 ST
공정 단계 제어 SFC
구형 시스템 마이그레이션 IL (임시 사용)

📌 마무리 팁

 

 

728x90
728x90

산업 프로토콜을 아두이노에 연결해보자! – IoT와 OPC UA의 연결고리 만들기

아두이노는 가볍고 빠르게 센서 데이터를 처리할 수 있어, 소형 자동화, IoT 실험, 데이터 수집용 게이트웨이로 자주 활용됩니다.
하지만 산업용 시스템(OPC UA 기반 PLC, SCADA 등)과 직접 연동하려면 다소 복잡한 설정이 필요하죠.

이 글에서는 아두이노를 OPC UA 시스템과 연동하는 2가지 접근 방식을 소개하고, 실제 구현에 필요한 설정과 노하우까지 정리해드립니다.

  • MCU 보드: Arduino Uno / Mega / ESP32 (ESP 추천)
  • 연동 방식:
    1. 아두이노 → 중계 서버 → OPC UA Server
    2. 아두이노 직접 OPC UA Client (ESP32+라이브러리 활용 시 가능)
  • 통신 프로토콜: OPC UA (opc.tcp://...)
  • 사용 환경:
    • 아두이노 IDE + 센서 코드
    • 중계용 Python/Node.js 서버 또는 ESP32 자체 OPC UA 구현
  •  

🧩 구조별 연동 방식 비교

방식 구성 장점 단점
중계 서버 방식 아두이노 → 시리얼 or MQTT → 중계 서버(Python) → OPC UA 구조 단순, 구현 쉬움 실시간성 다소 낮음
직접 OPC UA Client ESP32에서 OPC UA 요청 전송 실시간성 좋고 구조 간단 구현 복잡, 메모리 제약

1️⃣ 중계 서버 방식 (추천 접근)

📦 구성도

 

🧪 아두이노 코드 예제 (센서 값 전송)

// 예: 온도 센서 데이터 Serial로 전송
void loop() {
  int temp = analogRead(A0);
  Serial.println(temp);
  delay(1000);
}

🐍 Python 중계 서버 예제 (opcua 라이브러리 사용)

 
from opcua import Server
import serial

# OPC UA 서버 생성
server = Server()
server.set_endpoint("opc.tcp://0.0.0.0:4840/")
node = server.register_namespace("ArduinoData")
objects = server.get_objects_node()
sensor_obj = objects.add_object(node, "TemperatureSensor")
temp_val = sensor_obj.add_variable(node, "Temperature", 0.0)
temp_val.set_writable()

# 시리얼 연결
arduino = serial.Serial('COM3', 9600)

server.start()
try:
    while True:
        data = arduino.readline().decode().strip()
        temp_val.set_value(float(data))
except KeyboardInterrupt:
    server.stop()

📌 이 방식은 실시간 센서 데이터를 OPC UA 서버로 전달할 수 있어, SCADA, Node-RED, UA Client와 연동 용이합니다.


2️⃣ ESP32 직접 OPC UA 연동 (고급)

  • ESP32는 WiFi 지원 + 메모리 여유 → OPC UA 통신 가능
  • OPC UA 클라이언트 구현 라이브러리 필요
    • freemodbus + libuaclient (C++)
    • 또는 ESP32 + Arduino core + OPC UA 구현체 (매우 제한적)

❗️ 하지만 OPC UA는 메모리/성능 요구가 높아, 직접 구현보다는 중계 게이트웨이 구조가 현실적입니다.


🛠️ 실무 노하우 & 팁

항목
아두이노 ↔ Python 통신 시리얼 통신은 안정성 높지만, MQTT로 확장도 고려 가능
Node-RED 연동 Python 대신 Node-RED + OPC UA 노드로 중계 가능
OPC UA 서버 주소 opc.tcp://localhost:4840/ → 실제 PLC 연동 시 외부 IP 사용
인증서 이슈 테스트 시 SecurityPolicy.None 사용, 운영 시 인증서 필요
SCADA 연동 UA 클라이언트로 UAExpert, Ignition, WinCC 등에서 실시간 시각화 가능

 

 

728x90
728x90

TIA Portal에서 설정하고, Visual Studio로 실시간 제어까지

Siemens PLC는 글로벌 산업 자동화 표준이라 할 만큼 다양한 스마트팩토리 현장에서 활용되고 있습니다. 특히 S7-1200/1500 시리즈OPC UA 서버 내장으로, 외부 IT 시스템과의 연결성이 뛰어납니다.

이 글에서는 C# OPC UA 클라이언트 앱을 직접 구현하여, S7 PLC에서 실시간 데이터를 읽고 이벤트 처리까지 해보겠습니다.
TIA Portal → 인증서 설정 → C# 코드 구현까지 단계별로 구성되어 있어 실무에 바로 적용 가능합니다.

  • 통신 프로토콜: OPC UA (opc.tcp://<PLC IP>:4840)
  • 개발 언어: C# (.NET 6 이상)
  • 개발 환경: Visual Studio 2022+
  • 사용 라이브러리: OPCFoundation.NetStandard.Opc.Ua
  • 주요 기능:
    • TIA Portal에서 태그 공유 설정
    • C#으로 OPC UA 연결 및 데이터 Read
    • Subscription 기반 변경 이벤트 수신
    • 보안 정책/인증서 구성 실전 팁


🔧 Siemens OPC UA 서버 활성화 절차 (TIA Portal)

  1. S7-1200/1500 모델 선택 (1500은 고급 보안, 1200은 기본 기능 제공)
  2. Device Configuration → OPC UA 탭
  3. OPC UA Server 활성화
  4. Global DB 생성 → 공개할 변수에 Accessible from HMI/OPC UA 체크
  5. 보안 인증서 생성 및 외부 Client와 교환


📦 C# OPC UA 연결 코드 예제

 
string endpointUrl = "opc.tcp://192.168.130.72:4840"; // PLC IP 주소
string nodeId = "ns=3;s=\"DB1\".\"Speed\""; // TIA Portal에서 설정한 DB 변수

var session = await Session.Create(config, endpoint, false, "SiemensClient", 60000, null, null);
var value = session.ReadValue(nodeId);
Console.WriteLine($"Speed 값: {value.Value}");

Siemens의 노드ID는 "DB명"."태그명" 형식으로 표현됨. ns=3은 서버 구성에 따라 달라질 수 있으니 UA 클라이언트 툴(ex. UAExpert)로 확인 필요.


🔁 Subscription 이벤트 처리

 
var monitoredItem = new MonitoredItem(subscription.DefaultItem)
{
    StartNodeId = "ns=3;s=\"DB1\".\"Speed\"",
    DisplayName = "Speed",
    SamplingInterval = 500
};

monitoredItem.Notification += (item, args) =>
{
    foreach (var v in item.DequeueValues())
    {
        Console.WriteLine($"Speed 변경됨: {v.Value}");
    }
};

🛠️ 실무 노하우

항목설명
TIA Portal 설정 필수 Accessible from HMI/OPC UA 옵션 체크 안 하면 외부 접근 불가
인증서 관리 Siemens는 기본적으로 인증서 기반 접근만 허용 → C# 클라이언트 인증서 생성 후 교환
NodeId 확인 UAExpert 또는 TIA Portal에서 OPC UA 구조 Export 가능
포트 개방 기본 포트 4840 방화벽 허용 필수
S7-1200 제한사항 S7-1500 대비 OPC UA 채널 수, 보안 기능 제한 있음

https://www.youtube.com/watch?v=wPMMyGQfk4Y

 

 

728x90
728x90

디지털 트윈을 향한 첫 걸음, 오므론 PLC와 OPC UA 연결법 완전 정복!

스마트 팩토리 시대, 설비 간 연결은 선택이 아닌 필수입니다.
OMRON NX/NJ 시리즈는 OPC UA 서버 기능이 내장된 고성능 PLC로, 제어 + 정보화를 동시에 처리하는 것이 특징입니다. 특히 C# 기반 OPC UA 클라이언트를 이용하면 MES, SCADA, ERP 등 IT 시스템과 직접 통신이 가능하죠.

이 글에서는 Visual Studio + C# 환경에서 OMRON PLC 데이터를 실시간으로 읽고, 이벤트를 처리하는 구조까지 단계별로 안내합니다.

  • 통신 프로토콜: OPC UA (opc.tcp:// 포트 4840 기본)
  • 개발 언어: C# (.NET 6 이상)
  • 개발 환경: Visual Studio 2022 이상
  • 사용 라이브러리: OPCFoundation.NetStandard.Opc.Ua
  • 주요 기능:
    • OMRON Sysmac Studio에서 생성한 태그 노드 연결
    • PLC 변수(노드) 읽기 및 Subscription 기반 값 변경 감지
    • 인증서 신뢰 구성 및 이벤트 처리 실무 팁 제공

 

1 OMRON OPC UA 통신 사전 준비

Sysmac Studio 설정:

  • OPC UA 서버 기능 활성화
  • Anonymous or 사용자 인증 허용
  • 보안 정책: None, Basic256Sha256 등 설정 가능
  • 변수 공개 설정 (Publish to OPC UA: TRUE)
  • 노드 ID 확인 경로: Controller Variables > Export XML

 


 

📦 C# OPC UA 클라이언트 개발 주요 흐름

  1. OPC UA 라이브러리 설치 (NuGet)
  2. 서버 엔드포인트 설정 (opc.tcp://192.168.0.50:4840)
  3. 태그 NodeId 확인 후 데이터 Read
  4. Subscription 구성 → 값 변경 감지


🧪 예시 노드 구조

OMRON은 아래와 같은 심볼 기반 NodeId를 제공합니다:

// 예: Global 변수인 "MotorSpeed"
var nodeId = "ns=2;s=MotorSpeed"; // 또는 XML export로 확인
 

🧵 Subscription 이벤트 처리 예제

var monitoredItem = new MonitoredItem(subscription.DefaultItem)
{
    DisplayName = "MotorSpeed",
    StartNodeId = "ns=2;s=MotorSpeed"
};

monitoredItem.Notification += (item, args) =>
{
    foreach (var v in item.DequeueValues())
    {
        Console.WriteLine($"모터 속도 변경됨: {v.Value}");
    }
};
 

🛠️ 실무 노하우

항목 설명
Sysmac Studio 변수 노출 설정 사용 변수는 반드시 "Public" 설정 필수
보안 정책과 인증서 OMRON은 기본적으로 인증서 기반 접근을 권장함
노드 구조 확인 XML Export 또는 OPC UA Client Explorer 사용
연결 문제 시 Firewall, 보안 정책, 인증서 신뢰 여부 점검 필수
사용 사례 제조 데이터 시각화, MES 연동, AI 기반 품질 예측 등과 연계 가능

https://www.youtube.com/watch?v=jU-_lTpG9yc

 

 

728x90
728x90

GX Works3로 설정하고, Visual Studio로 바로 연동하세요!

Mitsubishi MELSEC PLC는 일본 자동화 업계의 대표 주자입니다.
기존엔 전용 프로토콜(MC, SLMP 등)만 지원했지만, 최신 iQ-R/iQ-F 시리즈는 OPC UA 서버 기능을 내장하면서 IT와 OT 통합의 중심에 섰습니다.

이 글에서는 C# 기반 OPC UA 클라이언트를 활용해 MELSEC PLC와 통신하는 방법을 소개합니다.
GX Works3에서 OPC UA 설정을 마치고 나면, Visual Studio에서 노드값을 읽고 변경 이벤트를 실시간으로 받을 수 있습니다

  • 통신 프로토콜: OPC UA (opc.tcp:// 포트 49320 등)
  • 개발 언어: C# (.NET 6 이상)
  • 개발 환경: Visual Studio 2022 이상
  • 사용 라이브러리: OPCFoundation.NetStandard.Opc.Ua
  • 주요 기능:
    • GX Works3에서 설정한 태그(NodeId) 연동
    • 실시간 변경 감지 (Subscription)
    • 인증서 기반 보안 통신 구성 팁 제공

1. 미쯔비시 MELSEC OPC UA 기본 설정

지원 모델 예시:

  • iQ-R Series: R04CPU-P, R08ENCPU 등
  • iQ-F Series: FX5U (OPC UA 옵션 모듈 필요)
  • Q 시리즈: Q03UDVCPU + QJ71E71 TCP/IP 모듈 + OPC UA 게이트웨이 필요

기본 설정 방법 (GOT or GX Works3 사용):

  • OPC UA 기능 활성화
  • 통신 포트 설정 (opc.tcp://192.168.0.10:49320)
  • 사용자 인증 or Anonymous 설정
  • 보안 정책 선택 (None, Basic256 등)
  • Server 인증서 등록 (클라이언트에서 신뢰 필요)

2. C# OPC UA 통신 – 기본 예제

Mitsubishi PLC도 LS산전과 동일하게 OPC Foundation 라이브러리 사용 가능. 핵심 코드는 비슷하지만, 노드 네이밍 규칙이 제조사마다 다릅니다.

 
var endpointURL = "opc.tcp://192.168.3.101:49320"; // Mitsubishi PLC OPC UA 주소
var nodeId = "ns=4;s=Channel1.Device1.D100"; // D100 주소에 연결된 태그

노드 ID 규칙은 OPC UA Gateway 또는 Mitsubishi의 설정 툴에서 확인 가능.


3. 예제 코드 – 값 읽기

 
var session = await Session.Create(config, endpoint, false, "MELSEC Client", 60000, null, null);
Console.WriteLine("미쯔비시 OPC UA 연결 성공.");

string nodeId = "ns=4;s=Channel1.Device1.D100"; // D100 메모리 주소
DataValue value = session.ReadValue(nodeId);
Console.WriteLine($"D100 현재값: {value.Value}");

4. 예제 코드 – Subscription 이벤트 처리

 
var subscription = new Subscription(session.DefaultSubscription)
{
    PublishingInterval = 1000
};

var monitoredItem = new MonitoredItem(subscription.DefaultItem)
{
    StartNodeId = "ns=4;s=Channel1.Device1.D100",
    DisplayName = "D100",
    SamplingInterval = 500
};

monitoredItem.Notification += OnValueChanged;
subscription.AddItem(monitoredItem);
session.AddSubscription(subscription);
subscription.Create();

private static void OnValueChanged(MonitoredItem item, MonitoredItemNotificationEventArgs e)
{
    foreach (var value in item.DequeueValues())
    {
        Console.WriteLine($"D100 변경됨: {value.Value}");
    }
}

5. 실무 노하우

항목 설명
포트 변경 OPC UA 포트 기본값이 49320으로, 방화벽에서 열어야 함
인증서 정책 Mitsubishi는 Client 인증서 신뢰 필요. CertificateStore 경로 확인
태그 구조 OPC UA 게이트웨이나 GX Works3로 설정한 태그 구조를 반드시 확인
보안 정책 테스트 시 SecurityPolicy.None으로 설정, 운영환경에서는 TLS 권장
통신 오류 대처 접속 지연 or Bad Status 발생 시, 재시도 또는 KeepAlive 체크 필수

6. Mitsubishi 노드 구조 확인 팁

  • MELSOFT OPC UA Configurator 사용하여 노드 ID 구조 확인
  • iQ-R의 경우 실제 노드 ID는 ns=4;s=Channel1.Device1.D100처럼 구성됨
  • GX Works3에서 변수 이름을 등록하면 심볼 기반 노드 사용 가능

https://www.youtube.com/watch?v=kUUtLGdolsE

 

 

728x90
728x90

 

  • 목표: LS산전 PLC와 C# 앱 간의 OPC UA 통신 기본 예제 구현
  • 언어/환경: Visual Studio, C#, .NET Framework 또는 .NET 6 이상

OPC UA란?

OPC UA (Open Platform Communications Unified Architecture)는 산업 자동화 환경에서 기기 간 데이터 통신을 위한 플랫폼 독립형, 확장성 있는 표준 프로토콜입니다.

OPC UA는 기존 DCOM 기반 OPC Classic의 한계를 극복하며, 보안, 플랫폼 독립성, 확장성을 갖춘 통신 방식으로 대부분의 PLC 제조사에서 지원합니다.

1. LS산전 OPC UA 기본 설정 확인

LS ELECTRIC PLC (예: XGT 시리즈)는 OPC UA 서버 기능이 내장된 모델이 있으며, 별도의 OPC UA 서버 보드GLOFA-GMWIN 등의 툴 설정이 필요합니다.

kepware 채널 설정


필수 조건
:

  • LS PLC에 OPC UA 기능이 활성화되어 있어야 함 / 이더넷 포트  <–> 컴퓨터, 공유기에 랜으로 연결
  • IP 주소, 포트 (기본: opc.tcp://<IP주소>:4840) 확인
  • 서버 인증서 설정 허용 또는 신뢰 인증서 사전 등록

2. C# OPC UA 클라이언트 라이브러리 설치

C#에서는 OPC Foundation의 OPC UA .NET Standard 라이브러리를 사용합니다.

NuGet 패키지 설치:

Install-Package OPCFoundation.NetStandard.Opc.Ua
 

또는 .NET CLI 사용 시:

dotnet add package OPCFoundation.NetStandard.Opc.Ua

3. 기본 통신 예제 코드 (데이터 읽기)

다음은 LS산전 OPC UA 서버에 연결하여 노드 값을 읽는 간단한 예제입니다.

 
using System;
using System.Threading.Tasks;
using Opc.Ua;
using Opc.Ua.Client;
using Opc.Ua.Configuration;

namespace LsOpcUaClient
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // 애플리케이션 구성
            var config = new ApplicationConfiguration()
            {
                ApplicationName = "LSOpcUaClient",
                ApplicationType = ApplicationType.Client,
                SecurityConfiguration = new SecurityConfiguration
                {
                    ApplicationCertificate = new CertificateIdentifier(),
                    AutoAcceptUntrustedCertificates = true, // 테스트용
                },
                TransportConfigurations = new TransportConfigurationCollection(),
                TransportQuotas = new TransportQuotas { OperationTimeout = 15000 },
                ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 }
            };

            await config.Validate(ApplicationType.Client);

            // OPC UA 엔드포인트 설정
            var endpointURL = "opc.tcp://192.168.0.100:4840"; // PLC의 OPC UA 주소 입력
            var endpointDescription = CoreClientUtils.SelectEndpoint(endpointURL, useSecurity: false);
            var endpointConfiguration = EndpointConfiguration.Create(config);
            var endpoint = new ConfiguredEndpoint(null, endpointDescription, endpointConfiguration);

            // 세션 생성
            var session = await Session.Create(config, endpoint, false, "LS OPC UA Client", 60000, null, null);
            Console.WriteLine("OPC UA 세션 연결 완료.");

            // 노드 값 읽기
            string nodeId = "ns=2;s=TAG1"; // PLC의 실제 노드 ID 입력
            DataValue value = session.ReadValue(nodeId);
            Console.WriteLine($"노드 값: {value.Value}");

            // 세션 종료
            session.Close();
            Console.WriteLine("세션 종료 완료.");
        }
    }
}

🔍 주요 설명:

  • endpointURL: LS PLC의 IP와 포트를 입력
  • nodeId: LS PLC에 정의된 태그 (예: s=DB1.Tag1 또는 ns=2;s=MyTag)
  • AutoAcceptUntrustedCertificates = true: 인증서 자동 수락 (실제 운영에선 보안 정책 필요)

4. 예제 실행 전 체크리스트

항목확인
PLC의 OPC UA 서버 활성화 여부
포트 방화벽 허용 (기본 4840)
PLC에 등록된 노드 ID 확인
인증서 정책 확인 및 설정


5. [실무 팁] 데이터 변경 이벤트 처리 (Subscription 방식)

OPC UA는 클라이언트가 주기적으로 값을 읽는 Polling 방식 외에도, 서버에서 값 변경 시 자동 통지받는 Subscription 방식을 지원합니다.
이를 활용하면 다음과 같은 이점이 있습니다:

✅ Subscription 방식의 장점

  • 실시간 데이터 반영 가능
  • CPU 부하 절감 (Polling 대비)
  • 산업 현장 이벤트 기반 제어에 적합

예제: 값 변경 시 자동 알림 받기

// Subscription 및 이벤트 핸들링 예제
var subscription = new Subscription(session.DefaultSubscription) 
{
    PublishingInterval = 1000 // 1초 간격으로 변경사항 체크
};

// 모니터링할 노드 지정
var monitoredItem = new MonitoredItem(subscription.DefaultItem)
{
    DisplayName = "MyTag",
    StartNodeId = "ns=2;s=TAG1", // LS PLC의 노드 ID
    SamplingInterval = 500,      // 샘플링 주기 (ms)
    QueueSize = 10,
    DiscardOldest = true
};

// 변경 시 이벤트 핸들러 등록
monitoredItem.Notification += OnValueChanged;

// 구독 항목에 추가하고 세션에 등록
subscription.AddItem(monitoredItem);
session.AddSubscription(subscription);
subscription.Create();

 

콜백 함수 정의

private static void OnValueChanged(MonitoredItem item, MonitoredItemNotificationEventArgs e)
{
    foreach (var value in item.DequeueValues())
    {
        Console.WriteLine($"[{DateTime.Now}] {item.DisplayName} 변경됨: {value.Value}");
    }
}

6. 실무 노하우: Subscription 구현 시 주의점

설명
1. PublishingInterval 과 SamplingInterval 적절 조절 너무 짧게 잡으면 불필요한 이벤트가 많아지고 성능 저하
2. QueueSize 조정 네트워크 지연 시 데이터 누락 방지
3. Network Loss 대비 재접속 로직 구현 KeepAlive 체크 및 세션 오류 시 재연결
4. 노드가 Null 또는 Bad Status인 경우 체크 일부 PLC에서는 데이터 초기화 전 Null 또는 StatusCode.Bad 리턴
5. 인증서 신뢰 문제로 Subscription 실패 가능 개발 중 AutoAcceptUntrustedCertificates = true 설정으로 임시 우회

고급 확장: 알람 연동

  • LS PLC에서 설정한 특정 조건 (예: 알람 태그)이 True로 바뀌는 순간만 감지하여 UI에 경고 표시
  • 예: ns=2;s=Alarm_MotorOverheat가 True → 팝업 or 로그 기록
if ((bool)value.Value == true)
{
    Console.WriteLine("🔥 모터 과열 경고!");
}

이처럼 Subscription 기반 구조는 SCADA 시스템, 디지털 트윈, AI 기반 제어 시스템에서 핵심 요소로 사용됩니다.

* 전용 모듈이 없는 경우, BridgeWare의 LSE OPC Server를 사용하여 LS산전 PLC(Glofa, XGT, Master-K)와 데이터를 수집 가능 / 모드버스 TCP 이용

728x90
728x90

기존 기구학은 “어디로 갈지”를 다룬다.
동역학은 “얼마나 힘을 써서 갈지”를 다룬다.


1️⃣ 동역학의 본질

  • 질량 (Mass)
    물체가 가지고 있는 고유한 물질의 양이자, 운동 상태 변화에 대한 저항(관성)의 크기를 나타내는 정량적인 척도
  • 관성(Inertia)
    외력이 작용하지 않을 때 물체가 현재의 운동 상태(정지 또는 등속도 운동)를 그대로 유지하려는 성질
  • 마찰(Friction)
    두 물체의 접촉면 사이에서 물체의 운동을 방해하거나, 상대적인 미끄러짐에 저항하는 힘
  • 중력(Gravity)
    질량을 가진 모든 물체 사이에 서로 당기는 힘

이 요소들이 다 로봇 움직임에 영향을 준다.
그래서 실제 로봇은 수학적으로 계산한 대로 절대 안 움직인다.


2️⃣ 제어 이론

대표적인 제어 방식:

  • PID 제어
    오차 값(목표값 - 현재값)을 이용하여 비례(P)-적분(I)-미분(D) 세 가지 요소를 조합해 제어량을 결정하는 피드백 제어
  • 토크 제어
    모터에 인가되는 전류를 제어하여 회전력(토크)을 직접적으로 조절하는 방식입니다. 주로 토크 기반의 힘 제어를 수행
  • 임피던스 제어
    로봇의 위치와 힘 사이의 동적인 관계(강성, 댐핑)를 제어하여, 로봇이 원하는 스프링-댐퍼 시스템처럼 행동하도록 하는 방식

제어는 결국 “오차를 줄이는 기술”이다.
로봇이 목표 위치와 실제 위치 사이의 차이를 얼마나 빨리, 얼마나 안정적으로 줄이느냐가 관건이다.


3️⃣ 시뮬레이터와 현실의 간극

시뮬레이터에선 완벽한데
현실 로봇에 올리면 망가지는 이유:

  • 마찰 모델 부정확
    실제 마찰(Coulomb + Viscous + Stribeck 효과)은 속도에 따라 변하고 비선형적입니다. 이를 정확히 모델링하지 못하면
    (예: 정지 마찰력 과소평가), 저속 운전 시 
    스틱-슬립(Stick-slip) 현상이 발생
  • 센서 노이즈
    엔코더나 힘 센서에서 발생하는 고주파 노이즈는 미분(속도 계산) 시 노이즈를 증폭
  • 기구물의 유격
    기어, 커플링 등 기구적 틈새로 인해 모터가 움직여도 부하(Load)가 바로 움직이지 않는 구간입니다. 방향 전환 시 데드존(Dead-zone)이 발생

여기서부터 “이론과 현실의 전쟁”이 시작된다.

해결 방안 :

마찰 모델 부정확
> 룩업 테이블, 신경망(RBF), 또는 고도화된 마찰 모델(LuGre 등)을 사용
센서 노이즈
> 저주파 통과 필터(Low-pass filter), 칼만 필터(Kalman filter), 또는 상태 관측기(Observer)를 통해 노이즈를 제거
기구물의 유격
>  백래시 보상 알고리즘(Dead-zone inverse) 적용, 이중 엔코더(모터측 + 부하측) 사용, 기계적 프리로드(Preload).

728x90

+ Recent posts