
1. 项目缘起当工业边缘计算遇上开源SCADA最近在折腾一个工业数据采集的小项目手头正好有一台Jetson Orin Nano核心的reComputer R1000。这玩意儿性能是真不错但要把现场那些老旧的PLC、仪表的数据给读上来总得有个“翻译官”和“操作台”。传统的组态软件要么太贵要么对ARM架构的Linux支持不好。就在我到处找方案的时候一个叫FUXA的开源SCADA/HMI工具进入了视线。它基于Node.js和Web技术界面现代化最关键的是它原生支持Modbus协议无论是串口的RTU还是网络的TCP都能搞定。这不正好对上reComputer R1000的胃口吗一个轻量、免费、跨平台的方案在边缘侧做数据采集和可视化听起来就很有搞头。于是我就开始了在reComputer R1000上部署FUXA并打通Modbus RTU/TCP通信的实践。整个过程下来发现坑不少但走通了之后这套组合的性价比和灵活性确实很高。无论是想做个小型的数据监控看板还是作为边缘计算网关的前端界面都非常合适。下面我就把从环境准备、软件部署、协议配置到实际测试的完整过程以及中间遇到的那些“坑”和解决思路详细地分享出来。2. 环境准备为reComputer R1000打好基础工欲善其事必先利其器。在reComputer R1000上跑FUXA第一步就是搭建一个稳定、兼容的运行环境。这台设备默认搭载的是基于Ubuntu的JetPack系统我们需要在此基础上进行一些必要的配置。2.1 系统更新与依赖检查首先确保系统是最新的。通过SSH连接到你的reComputer R1000执行标准的更新命令sudo apt update sudo apt upgrade -y更新完成后建议重启一次系统确保所有更新生效。接下来安装一些基础编译工具和库这些是后续安装Node.js等软件所必需的sudo apt install -y curl wget git build-essential libssl-devbuild-essential包含了GCC、G、make等编译工具链libssl-dev则是Node.js编译和运行时常需要链接的加密库。2.2 Node.js环境部署版本选择与安装FUXA是基于Node.js的所以一个合适的Node.js环境至关重要。这里有个关键点不要使用Ubuntu默认软件源里过于陈旧的Node.js版本。太老的版本可能无法满足FUXA的依赖要求导致安装失败或运行异常。我推荐使用NodeSource维护的仓库来安装长期支持LTS版本。以安装Node.js 18.x LTS为例这是一个广泛兼容且稳定的版本执行以下命令# 下载并执行NodeSource的安装脚本 curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - # 安装Node.js和npm sudo apt install -y nodejs安装完成后验证一下版本node --version # 应输出 v18.x.x npm --version # 应输出 9.x.x 或更高如果一切正常Node.js环境就准备好了。这里有个小技巧国内用户如果遇到npm安装包速度慢的问题可以配置淘宝镜像源来加速npm config set registry https://registry.npmmirror.com2.3 串口权限配置为Modbus RTU做准备如果你计划使用Modbus RTU也就是通过串口如RS485/RS232那么必须确保运行FUXA的用户通常是当前用户或node用户有权限访问串口设备。在Linux下串口设备文件通常是/dev/ttyUSB0、/dev/ttyACM0或/dev/ttyS0等。默认情况下这些设备属于dialout用户组。最稳妥的做法是将当前用户添加到dialout组# 将当前登录用户添加到dialout组 sudo usermod -aG dialout $USER重要提示执行此命令后你需要完全退出当前SSH会话并重新登录或者重启系统用户组的变更才会生效。重新登录后可以使用groups命令查看当前用户所属组确认dialout组已存在。之后当你插入USB转串口适配器时使用ls -l /dev/ttyUSB*命令查看设备应该对dialout组用户是可读写的。3. FUXA的安装与初始配置环境就绪后我们就可以开始安装和配置FUXA本体了。3.1 获取与安装FUXAFUXA的官方代码仓库在GitHub上。我们可以直接克隆其项目并安装依赖# 克隆FUXA项目可以选择一个稳定的版本分支如 1.2.0 git clone https://github.com/frangoteam/FUXA.git cd FUXA # 安装项目依赖这个过程可能需要几分钟取决于网络速度 npm installnpm install会读取项目根目录下的package.json文件下载并安装所有必需的Node.js模块。如果遇到某些原生模块如serialport用于串口通信编译失败通常是因为缺少系统级的编译依赖。确保你已经安装了build-essential和python3Node.js的node-gyp工具需要。对于ARM架构的reComputer R1000大部分常用模块都有预编译的二进制包安装过程通常比较顺利。3.2 首次运行与基础设置安装完成后可以直接启动FUXA进行初步测试npm start如果一切正常终端会输出类似下面的信息表明FUXA服务已经启动并监听在3000端口 fuxa1.x.x start /home/nvidia/FUXA node ./server.js FUXA server running on port: 3000 Database file: ./fuxa.db此时打开你电脑上的浏览器访问http://你的reComputer R1000的IP地址:3000。你应该能看到FUXA的登录界面。默认的管理员账号和密码是admin/admin。首次登录后系统会强制要求你修改密码请务必设置一个强密码。登录成功后你会进入FUXA的主界面。界面左侧是导航栏中间是画布区。在开始连接设备之前我们需要先理解FUXA的核心概念设备Devices、数据点Tags和视图Views。设备代表一个物理的或网络的通信端点比如一台Modbus TCP从站设备或者一个串口。数据点代表你想要从设备读取或写入的一个具体数据项比如一个温度值、一个开关状态。每个数据点都关联到一个设备的特定寄存器地址。视图这是你构建人机交互界面HMI的地方。你可以拖拽各种控件按钮、图表、指示灯、输入框等到画布上并将这些控件绑定到之前定义好的数据点上从而实现数据的可视化展示和反向控制。4. 配置Modbus TCP通信Modbus TCP是在以太网上运行的Modbus协议配置相对简单我们先从这个开始。4.1 创建设备Device在FUXA左侧导航栏点击“设置”齿轮图标然后选择“设备”。点击右上角的“”按钮添加新设备。在弹出的表单中填写设备信息名称 给你设备起个名字例如PLC_ModbusTCP。类型 在下拉菜单中选择“Modbus TCP”。地址 填写你的Modbus从站设备的IP地址例如192.168.1.100。端口 Modbus TCP默认端口是502除非你的设备特意修改过。从站ID 填写目标Modbus设备的站号Slave ID通常是1。这个值必须与从站设备配置一致。轮询间隔 设置FUXA主动读取数据的频率单位是毫秒。例如1000表示每秒读取一次。根据实际需求和对设备负载的考虑来设置不宜过快。超时时间 网络请求的超时时间单位毫秒。默认50005秒通常够用。重试次数 通信失败后的重试次数。填写完毕后点击“保存”。你可以点击设备卡片上的“测试连接”按钮FUXA会尝试与指定的IP和端口建立TCP连接并发送一个功能码为0x03读保持寄存器的测试请求。如果配置正确会显示“连接成功”。4.2 创建数据点Tag设备创建好后我们需要告诉FUXA具体要读写哪些数据。在左侧导航栏点击“设置”然后选择“数据点”。点击右上角的“”按钮添加新数据点。配置数据点参数这是最关键的一步名称 数据点的逻辑名称如Temperature_1。设备 选择你刚刚创建的PLC_ModbusTCP。地址类型 这是最容易出错的地方它指的是Modbus协议中的寄存器类型不是内存地址或网络地址。常见的有Coil Status (0x) 可读写的线圈布尔量对应功能码01读和05/15写。Input Status (1x) 只读的离散量输入布尔量对应功能码02。Input Register (3x) 只读的输入寄存器16位整数对应功能码04。Holding Register (4x) 可读写的保持寄存器16位整数对应功能码03读和06/16写。地址这里的地址是寄存器编号通常从0开始计算。但很多设备和软件如Modbus Poll的地址显示是从1开始的。FUXA使用的是从0开始的地址。举例如果设备手册上写“温度值存放在保持寄存器40001”那么这里的“地址类型”应选Holding Register (4x)“地址”应填0因为40001 - 40001 0。如果是40002则地址填1。数据类型 选择数据在寄存器中的存储格式。对于单个寄存器常用UINT16无符号16位整数或INT16有符号16位整数。如果数据占用多个寄存器如32位浮点数、32位整数需要选择对应的类型如FLOAT32并正确设置“数据长度”。数据长度 对于UINT16/INT16是1表示1个寄存器。对于FLOAT32或INT32通常是2表示占用2个连续的寄存器。字节序 当数据长度大于1时如FLOAT32必须指定字节序Endianness。常见的有Big Endian (ABCD) 高位字节在前也称为“摩托罗拉序”。许多Modbus设备默认采用此顺序。Little Endian (DCBA) 低位字节在前也称为“英特尔序”。还有交换字节的变种如CDAB,BADC。必须与从站设备的数据格式严格匹配否则读上来的数值是完全错误的。系数 一个非常实用的功能。如果设备读上来的原始值需要经过缩放才能得到工程值可以在这里设置。例如原始值100代表10.0°C可以设置系数为0.1。保存数据点。你可以立即在“数据点”列表页看到该点的“当前值”列。如果设备在线且配置正确这里应该会显示从设备读取到的实时数值。如果显示NaN、undefined或一直不变说明通信或配置有问题。5. 配置Modbus RTU通信Modbus RTU通过串行接口如RS485通信配置上与TCP的主要区别在于“设备”类型的设置。5.1 物理连接与系统识别首先将USB转RS485适配器插入reComputer R1000的USB口。在终端使用dmesg | grep tty或ls /dev/ttyUSB*命令查看系统识别到的串口设备文件通常是/dev/ttyUSB0。请确保你的用户有读写权限参考2.3节。5.2 在FUXA中创建设备在“设备”页面点击添加。设备“类型”选择“Modbus RTU”。关键配置项串口路径 填写系统识别到的设备文件如/dev/ttyUSB0。波特率 必须与从站设备如仪表、PLC的波特率设置完全一致常见的有9600, 19200, 38400, 115200等。数据位 通常是8。停止位 通常是1。校验位 可以是none无校验、even偶校验、odd奇校验。必须与从站设备一致。从站ID 目标Modbus设备的站号。轮询间隔、超时、重试 含义同TCP配置。注意 RS485是半双工总线同一时刻只能有一个设备发送。FUXA作为主站会按照轮询间隔定时发送查询帧。确保总线上没有其他主站且所有从站的波特率、数据格式、站号都配置正确否则会导致通信混乱。5.3 创建RTU设备的数据点数据点Tag的创建过程与Modbus TCP完全一样。唯一需要注意的是在“设备”下拉框中要选择你刚刚创建的Modbus RTU设备。地址类型、地址、数据类型、字节序等参数的设置逻辑与TCP通信完全相同。6. 构建可视化界面HMI数据点配置好后它们还只是一堆后台数据。我们需要一个前端界面来展示和控制它们。在左侧导航栏点击“编辑器”画笔图标。在视图列表区域点击“”创建一个新视图命名为如Main_Dashboard。进入视图编辑界面。左侧是控件工具箱中间是画布右侧是选中控件的属性面板。添加控件 从工具箱拖拽需要的控件到画布上例如数值显示 拖一个“值”控件用于显示温度、压力等。开关按钮 拖一个“按钮”控件可以配置为开关样式用于控制线圈。图表 拖一个“图表”控件用于展示数据的历史趋势。指示灯 拖一个“形状”控件可以改变颜色用于显示设备状态。绑定数据点 这是让控件“活”起来的关键。点击画布上的控件在右侧属性面板中找到“绑定”或“数据点”相关的属性不同控件属性名略有不同可能是value、tag、source等。点击绑定按钮在弹出的数据点浏览器中选择之前创建好的对应数据点如Temperature_1。配置控件行为对于显示控件如数值、图表绑定后通常就能自动显示数据。对于输入/控制控件如按钮、输入框除了绑定数据点还需要设置“写”操作。例如一个开关按钮需要设置其“按下”和“释放”时分别向绑定的线圈数据点写入true或false。调整样式与布局 你可以自由调整控件的大小、位置、颜色、字体等打造专业的监控界面。编辑完成后点击右上角的保存按钮。你可以点击“预览”按钮在全屏模式下查看运行效果。7. 生产环境部署与后台运行在开发测试阶段我们使用npm start在前台启动。但对于需要长期运行的生产环境我们需要让FUXA在后台稳定运行并且能在系统启动时自动运行。7.1 使用PM2进行进程管理PM2是一个强大的Node.js进程管理器可以守护进程、自动重启、日志管理等。首先全局安装PM2sudo npm install -g pm2然后在FUXA项目根目录下使用PM2启动应用pm2 start server.js --name fuxa这条命令会以后台守护进程的方式启动FUXA并为其命名“fuxa”。PM2常用命令pm2 status # 查看所有托管进程状态 pm2 logs fuxa # 查看FUXA应用的实时日志 pm2 stop fuxa # 停止FUXA应用 pm2 restart fuxa # 重启FUXA应用 pm2 delete fuxa # 从PM2列表中删除应用 pm2 save # 保存当前进程列表 pm2 startup # 生成开机自启动脚本需按提示执行命令执行pm2 startup并按照其输出的命令执行后PM2托管的进程包括FUXA就会在系统启动时自动运行。7.2 配置反向代理与域名访问可选直接通过IP:3000访问不够友好也不安全。我们可以使用Nginx作为反向代理实现用域名或IP直接访问隐藏端口并配置HTTPS。安装Nginxsudo apt install -y nginx创建一个新的Nginx站点配置文件例如/etc/nginx/sites-available/fuxaserver { listen 80; server_name your-domain.com; # 替换为你的域名或reComputer的IP location / { proxy_pass http://localhost:3000; # 转发到FUXA服务 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }启用该配置并重启Nginxsudo ln -s /etc/nginx/sites-available/fuxa /etc/nginx/sites-enabled/ sudo nginx -t # 测试配置文件语法 sudo systemctl restart nginx现在你就可以通过http://your-domain.com或http://reComputer-IP访问FUXA了无需输入端口号。8. 实战排坑与经验分享在实际部署和调试过程中我遇到了不少问题。这里把一些典型问题和解决方案总结出来希望能帮你少走弯路。8.1 Modbus通信常见故障排查当数据点无法读取或显示异常时可以按照以下链路排查物理层与网络层TCP 使用ping 设备IP检查网络连通性。使用telnet 设备IP 502或nc -zv 设备IP 502检查502端口是否开放。如果端口不通检查从站设备防火墙设置和Modbus服务是否启用。RTU 确认串口线RS485 A/B线连接正确、牢固。确认波特率、数据位、停止位、校验位与从站设备完全一致。可以使用minicom或screen工具打开串口查看是否有乱码或异常数据以排除硬件和基础串口配置问题。FUXA设备配置从站ID 这是最常被忽略的错误。确认FUXA中配置的从站ID与物理设备上设置的站号一致。很多设备默认是1但也可能是其他值。寄存器地址反复确认“地址类型”和“地址”是否正确。牢记FUXA使用从0开始的地址。对照设备手册确认功能码对应地址类型和寄存器偏移量。一个快速验证的方法是如果手册说地址40001在FUXA里就填Holding Register和地址0。数据点配置数据类型与字节序 如果读上来的数值巨大、是负数、或者看起来完全不对但通信本身是通的没有超时错误那么99%的问题是数据类型或字节序设置错误。例如设备发送一个FLOAT32占2个寄存器你在FUXA里配置成了UINT16只读1个寄存器结果肯定不对。务必仔细查阅设备通信协议手册确定每个数据点的确切格式。轮询冲突 如果同一个数据点被多个控件或逻辑频繁读写或者轮询间隔设置得太快可能导致从站设备响应不过来产生超时错误。适当降低轮询频率。8.2 FUXA使用技巧与优化利用“数据点”页面进行调试 在配置视图之前先在“数据点”页面把所有的点创建好并观察它们的“当前值”是否正常。这里是通信调试的第一现场值对了再去做界面绑定。分组与命名规范 设备多了数据点会非常杂乱。建议在创建数据点时使用清晰的前缀或分组命名例如PLC1_TempMeter2_Voltage。FUXA支持按设备筛选数据点良好的命名习惯能极大提高效率。视图的复用与模板 对于多个结构相同的设备如多台水泵可以做好一个设备的视图后将其导出FUXA支持视图导出为JSON。然后复制这个视图仅修改其中控件绑定的数据点即可快速创建其他设备的界面。注意资源消耗 reComputer R1000性能虽强但作为边缘设备资源也非无限。如果连接了大量设备数十上百个且轮询频率很高或构建了非常复杂的动画界面需要关注CPU和内存使用情况。可以使用htop命令进行监控。适当调整轮询间隔简化非关键视图的动画效果。定期备份项目 FUXA的所有配置设备、数据点、视图都存储在一个SQLite数据库文件默认是fuxa.db和前端资源文件中。定期备份整个FUXA项目目录或者在做出重大修改前备份fuxa.db文件是防止意外丢失配置的好习惯。通过以上步骤你应该能在reComputer R1000上成功搭建起一个功能完整的、基于FUXA的Modbus数据采集与监控系统。这套方案的优势在于完全开源、轻量、跨平台并且充分利用了reComputer的ARM架构和算力非常适合在工业边缘侧进行部署为后续的数据分析、AI推理或云端同步提供了一个可靠的本地数据源和交互界面。