通过伪 TTY 将 PLCnext PLC 连接到远程 RS232/RS485
在这篇 Makers 博客文章中,我们讨论了 Com 服务器为 PLCnext 平台提供的可能性和优势。
简介
Phoenix Contact 为其 PLC 提供的扩展模块可以是串行适配器,例如:
- AXL F RS UNI
- IB IL RS 232-PRO
- IB IL RS 485
- IB IL RS UNI
- …
所有扩展模块都有一个共同点:它们可以通过 processdata 循环访问。这提供了从我们的实时应用程序直接与串行设备交互的可能性。
在某些情况下,这不是我们想要的。相反,我们希望重用现有的 (C/C++) 库并且不需要实时上下文。但是,我们会发现这些库通常被编程为可以直接访问 COM 或 TTY 接口。
有两个选项可以为 PLCnext Control
创建 TTY 接口 :
- 实现一些函数(C++ / C#),从
PLCnext Runtime
内部为 AXL 或 IL 串行适配器创建 TTY 接口 . - 使用 COM-Server 设备,例如 GW 设备服务器
GW Device Server
提供了一个透明的 TCP to Serial
界面。借助像 Socat
这样的工具 我们可以将 Serial/TCP 流量直接转发到伪 TTY 接口。使用 GW Device Server
还提供了通过 TLS 加密通道与远程位置的串行设备通信的可能性。
注意
在本教程中,PLC 作为客户端执行并建立到 GW Device Server
的连接 .
(不过也可以切换PLCSocat
到一个监听选项,让GW作为客户端主动连接到PLC。)
设置

设置 GW 设备服务器
我们连接到 GW Device Server
通过基于 Web 的管理。 GW Device Server
的默认IP地址 是 192.168.254.254。
我们使用以下设置:
局域网设置 - 安全
- 启用 SSH 服务器
- 启用 Telnet 服务器
- 禁用安全数据模式
- 禁用 TFTP 服务器
串口设置
- 端口 1 配置 (COM1):在端口 8000 上启用 TCP 连接
- 端口 2 配置 (COM2):在端口 8001 上启用 TCP 连接
测试 GW 设备服务器
测试我们是否设置了 GW Device Server
正确,首先我们将我们的 PLC 连接到 GW Device Server
通过以太网。然后我们连接GW Device Server
的两个DSUB适配器 彼此。
我们可以使用工具 Telnet
快速测试设置 .使用这个工具,我们可以将数据从PLC发送到GW Device Server
在Port8000/COM1通过串口线连接到Port8001/COM2,最后在PLC接收。
我们使用以下命令:
ssh [email protected]
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
构建 Socat
在 Linux 操作系统上很容易,我们使用以下命令:
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 [email protected]:~/
ssh -ttt [email protected] \
"mkdir -p /opt/plcnext/socat-binaries && \
tar -xf /opt/plcnext/socat-binaries.tar -C /opt/plcnext/socat-binaries"
部署后,我们现在可以通过 ssh 连接到我们的 PLC。因此,我们首先通过运行以下命令设置目录和配置文件来准备 PLC:
deploy$ ssh [email protected]
[email protected]:~$ su root
[email protected]$ mkdir -p /etc/default/socat
[email protected]$ touch /etc/default/socat/socat.conf
[email protected]$ 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
文件自动连接到 GW Device Server
使用 Socat
守护进程。
注意:
此 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
来显示 .现在任何应用程序都可以访问连接到GW Device Server的Serial设备,就像直接连接到PLC一样。
工业技术