基于伪 TTY 的 PLCnext PLC 远程 RS232/RS485 连接方案
本 Maker 博客文章讨论 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 接口有两种选择:
- 实现一些函数 (C++ / C#) 在
PLCnext Runtime内部为 AXL 或 IL 串口适配器创建 TTY 接口。 - 使用
GW Device Server等 COM-Server 设备
GW Device Server 提供透明 TCP to Serial 接口。借助 Socat 等工具可将串口/TCP 流量直接转发到伪 TTY 接口。使用 GW Device Server 还提供通过 TLS 加密通道与远程位置串口设备通信的可能性。
注意
本教程中,PLC 作为客户端建立到 GW Device Server 的连接。
(不过也可将 PLC Socat 切为监听模式,让 GW 作为客户端主动连接 PLC。)
设置
设置 GW Device Server
通过基于 Web 的管理连接 GW Device Server。默认 IP 为 192.168.254.254。
使用以下设置:
LAN 设置 — 安全
- 启用 SSH Server
- 启用 Telnet Server
- 禁用 Secure Data Mode
- 禁用 TFTP Server

串口设置
- 端口 1 配置 (COM1):启用 TCP 连接端口 8000
- 端口 2 配置 (COM2):启用 TCP 连接端口 8001

测试 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 ## open another shell session telnet 192.168.254.254 8001 # Type some messages
构建 Socat
在 Linux OS 上轻松构建 Socat 使用以下命令:
mkdir tmp cd tmp git clone git://repo.or.cz/socat.git cd socat ## TODO: Modify to your SDK location 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/ # Create package 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"
部署后,现可 ssh 到 PLC。因此先在 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 手册页。
现在创建 SocatDaemon 文件,用 Socat 守护进程自动连接 GW Device Server。
注意:
此 SocatDaemon 文件为无错误/断线管理等的示例,请自行完善。
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 等命令看到运行中的守护进程。也可查 Socat 日志 cat /var/log/socat.log。
从终端访问 TTY 接口
现可通过 TTY 接口发送消息。
sudo echo "PLC to GW $var" > /dev/GWDeviceServer
持续测试伪 TTY 可用:
while true; do sleep 5 && sudo echo "PLC to GW $var" >/dev/ttyUSB0 && var=$((var+1)); done
执行 cat /dev/GWDeviceServer 显示接收流量。现在任何应用可像直接连接到 PLC 一样访问连接到 GW Device Server 的串口设备。
工业技术
- 电气原理图导线连接约定:清晰指南
- 工业PLC驱动变频器:核心控制与协同
- PCB 过孔盖油详解:优势、工艺与最佳实践
- 云监控:实时资产管理的远程控制系统
- 现代工业远程生产控制的5大核心优势
- 在PLCnext设备上用grpcurl安全远程访问gRPC
- 利用 SNMP 优化 PLCnext Control 设备:实用指南
- PLCnext 集群管理:利用 Kubernetes 赋能工业自动化
- 基于 Tableau 打造 PLCnext 实时监控仪表板
- 从 PLCnext 云数据创建 Power BI 仪表板
- 在 Azure IoT Hub 中为 PLCnext Control 构建实时 Grafana 仪表板
- 利用 Jlink 优化 PLCnext Control 上的 Java 9+ 应用