Pseudo TTY를 활용한 PLCnext PLC의 손쉬운 원격 RS232/RS485 연결
이 메이커 블로그 기사에서는 Com Server가 PLCnext 플랫폼에 제공하는 가능성과 이점에 대해 논의합니다.
소개
Phoenix Contact가 PLC용으로 제공하는 확장 모듈은 예를 들어 다음과 같은 시리얼 어댑터가 될 수 있습니다:
- AXL F RS UNI
- IB IL RS 232-PRO
- IB IL RS 485
- IB IL RS UNI
- ...
모든 확장 모듈은 한 가지 공통점이 있습니다: 프로세스 데이터를 통해 순환적으로 접근할 수 있습니다. 이는 실시간 애플리케이션에서 시리얼 장치와 직접 상호작용할 수 있는 가능성을 제공합니다.
어떤 경우에는 이것이 원하는 것이 아닙니다. 대신 기존 (C/C++) 라이브러리를 재사용하고 실시간 컨텍스트가 필요하지 않습니다. 그러나 이러한 라이브러리는 일반적으로 COM 또는 TTY 인터페이스에 직접 접근하도록 프로그래밍되어 있음을 알게 될 것입니다.
PLCnext Control에 TTY 인터페이스를 생성하는 두 가지 옵션이 있습니다:
PLCnext Runtime 내부에서 AXL 또는 IL 시리얼 어댑터용 TTY 인터페이스를 생성하는 일부 함수(C++ / C#)를 구현합니다.
- GW Device Server 같은 COM-Server 장치 사용
GW Device Server는 투명한 TCP to Serial 인터페이스를 제공합니다. Socat 같은 도구를 사용하면 시리얼/TCP 트래픽을 직접 pseudo TTY 인터페이스로 전달할 수 있습니다. GW Device Server 사용은 TLS 암호화 채널을 통해 원격 위치의 시리얼 장치와 통신할 가능성도 제공합니다.
참고
이 튜토리얼에서 PLC는 클라이언트 역할을 수행하며 GW Device Server에 연결을 설정합니다.
(그러나 PLC Socat을 리스닝 옵션으로 전환하고 GW가 클라이언트로 능동적으로 PLC에 연결하도록 하는 것도 가능합니다.)
설정
GW Device Server 설정
웹 기반 관리를 통해 GW Device Server에 연결합니다. GW Device Server의 기본 IP 주소는 192.168.254.254입니다.
다음 설정을 사용합니다:
LAN 설정 - 보안
- SSH 서버 활성화
- Telnet 서버 활성화
- 보안 데이터 모드 비활성화
- TFTP 서버 비활성화

시리얼 설정
- 포트 1 구성 (COM1): 포트 8000에서 TCP 연결 활성화
- 포트 2 구성 (COM2): 포트 8001에서 TCP 연결 활성화

GW Device Server 테스트
PLC를 이더넷으로 GW Device Server에 연결하고 GW Device Server의 두 DSUB 어댑터를 서로 연결하여 올바르게 설정되었는지 빠르게 테스트할 수 있습니다.
Telnet 도구를 사용하여 빠르게 테스트할 수 있습니다. 이 도구로 PLC에서 GW Device Server의 포트 8000/COM1로 데이터를 보내고 시리얼 케이블을 통해 포트 8001/COM2로 전달된 후 PLC에서 다시 수신할 수 있습니다.
다음 명령어를 사용합니다:
ssh admin@192.168.1.10
sudo passwd root
su root
ip addr add 192.168.254.10 dev eth0
telnet 192.168.254.254 8000
## 다른 셸 세션 열기
telnet 192.168.254.254 8001
# 메시지 입력
Socat 빌드
Linux OS에서 Socat을 쉽게 빌드하기 위해 다음 명령어를 사용합니다:
mkdir tmp
cd tmp
git clone git://repo.or.cz/socat.git
cd socat
## TODO: 자신의 SDK 위치로 수정
source /opt/pxc/release/axcf2152/2020/0/environment-setup-cortexa9t2hf-neon-pxc-linux-gnueabi
. /opt/pxc/release/axcf2152/2020/0/site-config-cortexa9t2hf-neon-pxc-linux-gnueabi
mkdir install
autoconf
./configure $CONFIGURE_FLAGS --prefix=$(pwd)/install --enable-openssl-method
make -j2
make install
Socat 배포 및 설치
Socat 설치를 배포하기 위해 다음 스크립트를 실행합니다:
cd tmp
mkdir -p deploy
cd deploy
mkdir -p usr
cp -r ../../Daemon/* .
cp -r ../socat/install/* usr/
# 패키지 생성
tar -cf ../socat-binaries.tar .
cd ..
scp socat-binaries.tar admin@192.168.188.41:~
ssh -ttt admin@192.168.188.41 \
"mkdir -p /opt/plcnext/socat-binaries && \
tar -xf /opt/plcnext/socat-binaries.tar -C /opt/plcnext/socat-binaries"
배포 후 이제 PLC에 SSH로 접속할 수 있습니다. 따라서 먼저 다음 명령어를 실행하여 PLC의 디렉토리와 설정 파일을 준비합니다:
deploy$ ssh admin@192.168.1.10
admin@192.168.1.10:~$ su root
root@192.168.1.10$ mkdir -p /etc/default/socat
root@192.168.1.10$ touch /etc/default/socat/socat.conf
root@192.168.1.10$ touch /etc/init.d/SocatDaemon
이제 socat.conf 파일을 수정하여 시리얼 인터페이스 매개변수를 필요에 맞게 구성합니다.
nano /etc/default/socat/socat.conf
파일 내용은 다음과 같습니다.
TARGETIP="192.168.254.254"
TARGETPORT="8000"
TTYNAME="/dev/ttyGWDeviceServer"
OPTIONS="pty,link=$TTYNAME tcp-connect:$TARGETIP:$TARGETPORT,forever,interval=15"
BAUD="9600"
PARITY=""
DATABITS="csN 8"
STOPBITS="-cstopb"
FLOWCONTROLL=""
추가 매개변수를 수정해야 한다면 SocatDaemon 파일도 수정해야 합니다. TTY 매개변수에 대한 자세한 정보는 stty 매뉴얼 페이지에서 찾을 수 있습니다.
이제 GW Device Server에 Socat 데몬을 사용하여 자동으로 연결하는 SocatDaemon 파일을 생성합니다.
참고:
이 SocatDaemon 파일은 오류/연결 끊김 관리 등이 없는 예제입니다. please.
nano /etc/init.d/SocatDaemon
파일 내용은 다음과 같습니다.(코드 보기/숨기기 클릭)
이제 모든 설정 파일이 준비되었으므로 Socat 바이너리를 설정하고 Socat 데몬을 등록할 수 있습니다.
chmod +x /etc/init.d/SocatDaemon
cd /opt/plcnext/socat-binaries
chmod +x usr/bin/*
cp -r usr /
update-rc.d -s -v SocatDaemon 99
/etc/init.d/SocatDaemon start
모든 것이 올바르게 설정되었다면 ps -e | grep socat 같은 명령어로 실행 중인 데몬을 볼 수 있습니다. cat /var/log/socat.log에 있는 Socat 로그도 확인할 수 있습니다.
터미널에서 TTY 인터페이스 접근
이제 TTY 인터페이스를 통해 메시지를 보낼 수 있습니다.
sudo echo "PLC to GW $var" > /dev/GWDeviceServer
pseudo TTY를 지속적으로 테스트하려면 다음 같은 명령어를 사용하세요:
while true; do sleep 5 && sudo echo "PLC to GW $var" >/dev/ttyUSB0 && var=$((var+1)); done
들어오는 트래픽은 cat /dev/GWDeviceServer 실행으로 표시할 수 있습니다. 이제 어떤 애플리케이션이든 GW Device Server에 연결된 시리얼 장치에 직접 연결된 것처럼 접근할 수 있습니다.