简述
OpenPLC
OpenPLC 可运行在嵌入式系统和普通计算机上,其基本原理是在硬件上安装类似 Linux 的操作系统,并在该环境下运行 OpenPLC 应用程序,从而让用户开发、调试和运行工业自动化控制逻辑。它目前只支持部分 ARM 架构的嵌入式系统,尤其是基于 Cortex-A 系列处理器的平台,但是官方尚未提供对 OpenEuler 系统的支持。
OpenPLC Webserver
OpenPLC Webserver的作用是提供一种简便的方式,通过网络访问和管理OpenPLC控制系统。作为一个Web应用程序,用户可以通过在计算机上打开浏览器并键入OpenPLC设备的IP地址(端口8080)来访问OpenPLC网络服务器。其功能包括:远程监控与控制、程序上传和下载、参数配置、日志和报警查看、系统诊断、跨平台访问。
操作流程
下载OpenPLC源码
OpenPLC_v3/background_installer.sh添加:
export CC=/home/master/hi3093_tool/toolchain/sysroots/x86_64-openeulersdk-linux/usr/bin/aarch64-openeuler-linux-gcc
export CXX=/home/master/hi3093_tool/toolchain/sysroots/x86_64-openeulersdk-linux/usr/bin/aarch64-openeuler-linux-g++
./configure CC=$CC CXX=$CXX
编译安装
#使能环境变量
source /home/$(whoami)/hi3093_tool/toolchain/environment-setup-aarch64-openeuler-linux
#执行脚本安装
sudo ./install.sh linux
在webserver目录下回生成webserver.py
移植相关依赖库
将webserver.py移植到开发板,并移植相关依赖库

python环境依赖安装
pip3 install pyserial
pip install pages
pip3 install --upgrade setuptools wheel
pip install monitoring
pip install flask
pip install flask_login
pip3 install pymodbus==2.5.0
运行
python3.10 webserver.py

交叉编译报错解决
找不到链接库,系统架构不匹配
解决:
编辑OpenPLC_v3/webserver/scripts/compile_program.sh将
g++ -std=gnu++11 -I ./lib -c Res0.c -lasiodnp3 -lasiopal -lopendnp3 -lopenpal -w $ETHERCAT_INC
改为
$CXX -std=gnu++11 -I ./lib -c Res0.c -lasiodnp3 -lasiopal -lopendnp3 -lopenpal -w $ETHERCAT_INC
找不到头文件
解决:OpenPLC_v3/webserver/scripts/compile_program.sh修改 补充路径
$CXX -std=gnu++11 *.cpp *.o -o openplc -I ./lib -I $(pwd)/../../utils/dnp3_src/cpp/libs/include -I $(pwd)/../../utils/dnp3_src/cpp/libs/src/ -pthread -fpermissive `pkg-config --cflags --libs libmodbus` -lasiodnp3 -lasiopal -lopendnp3 -lopenpal -w $ETHERCAT_INC
$CXX -std=gnu++11 *.cpp *.o -o openplc -I ./lib -I $(pwd)/../../utils/dnp3_src/cpp/libs/include -I $(pwd)/../../utils/dnp3_src/cpp/libs/src/ -pthread -fpermissive `pkg-config --cflags --libs libmodbus` -lasiodnp3 -lasiopal -lopendnp3 -lopenpal -w $ETHERCAT_INC
libmodbus.so.5.1.0架构不对
解决:
/OpenPLC_v3/background_installer.sh修改 制定架构
./configure CC=$CC CXX=$CXX --host=aarch64-openeuler-linux-gnu
Web启动报错解决
找不到libsqlite3.so.0
qemu-aarch64 /tmp # python3.10 webserver.py
Traceback (most recent call last): File "/tmp/webserver.py", line 1, in <module> import sqlite3 File "/tmp/Python3.10/build_arm/lib/python3.10/sqlite3/__init__.py", line 57, in <module> from sqlite3.dbapi2 import * File "/tmp/Python3.10/build_arm/lib/python3.10/sqlite3/dbapi2.py", line 27, in <module> from _sqlite3 import * ImportError: /lib64/libm.so.6: version `GLIBC_2.38' not found (required by /usr/lib64/libsqlite3.so.0)`
解决;
复制OpenPLC源码的libsqlite3.so.0到开发板
libsqlite3.so.0需要GLIBC_2.38
SQLite3是一个轻量级的嵌入式关系型数据库管理系统(RDBMS)。它是一个开源项目,广泛用于各种应用程序中,尤其是在嵌入式系统和移动设备中。SQLite3 主要用于本地存储小到中型的数据集,不需要一个独立的数据库服务器。
解决:
先安装tcl库用于编译libsqlite3源码
否则会报错找不到/usr/lib/aarch64-linux-gnu/tcl8.6/tclConfig.sh
wget https://sourceforge.net/projects/tcl/files/Tcl/8.6.10/tcl8.6.10-src.tar.gz
tar -xf tcl8.6.10-src.tar.gz
cd tcl8.6.10/unix
./configure --host=aarch64-openeuler-linux-gnu --build=x86_64-pc-linux-gnu --prefix=$(pwd)/build_tcl
make -j32
make install
方法一: 降低libsqlite3版本
#下载libsqlite3源码
https://github.com/sqlite/sqlite/tree/reuse-schema-3.30
#配置生成文件安装位置,指定使用的编译工具链
./configure --host=aarch64-openeuler-linux-gnu --build=x86_64-pc-linux-gnu --prefix=$(pwd)/build_sqlite
#编译
make
方法二:提升GLIBC库版本
#下载GLIBC-2.38源码
wget https://mirrors.aliyun.com/gnu/glibc/glibc-2.38.tar.gz
#配置生成文件安装位置,指定使用的编译工具链
./configure --host=aarch64-openeuler-linux-gnu --build=x86_64-pc-linux-gnu --prefix=$(pwd)/build_sqlite
#编译
make