资讯动态

开源软PLC Beremiz完全指南:从IEC 61131-3到树莓派部署

发布时间:2026/9/30 8:26:51 来源:尧图企业网站定制
做自动化这些年我一直对开源PLC方案有执念。原因很简单传统品牌PLC的IDE授权费用不低项目多了还要跟销售磨半天碰上小型实验装置和教学平台根本犯不上把预算砸在软件上。所以当我第一次看到Beremiz这个项目第一个反应是“这玩意儿居然能跑在树莓派上还支持IEC 61131-3标准”后来实际用过几个项目从简单的Modbus数据采集到小型产线控制都跑得挺稳。这篇文章就把Beremiz的整体框架、核心组件和实操流程一次性讲透给想入坑开源软PLC的朋友一个完整的参考。Beremiz本质上是一套完整的开源PLC开发工具链覆盖了从编辑、编译、仿真到在线调试和运行的全流程。它最重要的价值不是某一个图形界面或编译器而是一整套符合工业标准的框架支持IEC 61131-3标准规定的ST、LD、FBD、SFC、IL五种编程语言内部还用PLCopenXML作为工程文件格式方便和其他工具交换数据。对于自动化工程师来说这意味着你可以用习惯了的高级语言或梯形图去写控制逻辑然后把它编译成C代码最后部署到普通PC、工控机、树莓派甚至自己画的嵌入式板子上。这套思路完全打破了原厂封闭PLC的绑定特别适合做定制化设备、边缘控制器和教育实验平台。1. 开源软PLC的答案为什么是Beremiz1.1 我为什么盯上这个项目入坑Beremiz之前我在几个工业项目里吃过品牌的亏。某个小型设备甲方指定要用某大厂PLC结果现场调试时发现程序容量不够选型升级还得等物流报价单比硬件本身还贵。那时候我就开始琢磨能不能有一种不绑定硬件、代码能自由迁移的PLC方案。Beremiz给我的第一印象是“这项目真把工控理想落地了”它不像某些教学软件那样只能仿真而是真的能生成C代码、编译成可执行文件、跑在独立的控制器上还能通过网口远程监控变量。对一个有嵌入式背景的自动化工程师来说这等于直接打开了PLC的“黑盒”你能看到自己写的那段ST语言最终变成了什么。1.2 软PLC在自动化里的定位软PLC并不是新鲜概念很多商业产品早就在做比如大家熟悉的Codesys、TwinCAT、LabVIEW其实都是软PLC思路。它们的核心逻辑都是把传统PLC的编程和运行环境搬到通用硬件上用PC或嵌入式板卡的算力来做逻辑控制。Beremiz的差异在于三点完全开源、多语言支持完整、运行框架轻量。它不需要你去买什么授权加密狗也不需要绑定专用硬件品牌只要目标平台上有C编译器和Linux/Windows环境就能把编译后的控制程序跑起来。对中小型设备、科研仪器、实验台和教学项目来说这个定位非常准预算有限、逻辑不算极端复杂、但需要快速迭代和跨平台部署。1.3 适合谁用不适合谁用我得先泼一盆冷水如果你要做的是安全等级极高的重型工业装备比如涉及人员安全的功能安全PLC系统Beremiz并不合适它没有SIL认证也没有原厂技术支持兜底。但如果你是设备集成商、自动化课程老师、机器人创客、边缘计算方案开发人员或者单纯想研究PLC内部工作原理的爱好者Beremiz几乎是目前最理想的开源选择。它最大的底气是“可定制”和“可移植”你觉得IO映射不够用自己改C代码你觉得通信协议缺东西框架里预留了Modbus和CANopen接口。这种自由度和可控性是商业IDE不可能给你的。2. Beremiz整体框架拆解从IDE到运行时2.1 整体架构分层Beremiz的框架可以从两层去理解开发环境和运行环境中间通过PLCopenXML和生成的C代码连接起来。开发环境就是我们说的IDE基于wxPython构建负责项目编辑、编译、调试运行环境则是部署在目标控制器上的运行时由生成的C代码和PLC服务程序组成负责周期扫描、任务调度、IO读写和通讯处理。IDE和运行时之间通过以太网通信支持代码下载、在线监控、强制变量等操作。这个分层逻辑和商业PLC完全一致好处是开发阶段和部署阶段可以分开你在一台电脑上编程编译然后把程序下载到树莓派或工控机上运行两边互不占用资源。2.2 核心组件IEC 61131-3编辑器Beremiz内置的PLCopenEditor是整套框架的“门面”它负责把五种PLC语言变成可视化的编辑界面。ST语言像写高级语言一样直接敲变量和表达式就行LD梯形图适合做继电器逻辑的升级替代画接触器线圈和触点的方式几乎不用学FBD功能块图用来做信号处理比较直观SFC顺序功能图特别适合流程控制比如步进、分支、并行这些场景IL指令表则是一些老工程师喜欢的风格类似汇编。编辑器内部维护着一个完整的PLCopen数据模型不管是哪一种语言最后都会转换成内部统一的抽象语法树再交给编译器处理。这个设计让多语言混编成为可能你完全可以在一个工程里用SFC写主流程用ST写数据处理再用FBD写PID功能块。2.3 核心组件编译器和代码生成器在自动化的圈子里大家都说“编译器是PLC的灵魂”。Beremiz的编译器来自MatPLC/IEC项目它把IEC 61131-3的语法翻译成ANSI C代码。你可以理解成你写的ST程序、梯形图逻辑、SFC流程最终会变成一个巨大的C语言函数和数据结构里面有全局变量表、任务调度表、IO映射表等等。编译器处理完语法树后会做类型检查、变量声明整理、常量和初始化计算然后输出干净的C代码。接着Beremiz调用本地工具链比如GCC把C代码连同运行时库一起编译成目标平台的可执行文件。这整套流程意味着你在IDE里按一下Build体验到的其实是“IEC语言加C交叉编译”的组合拳。2.4 核心组件运行时与PLC服务编译出来的可执行文件不是扔在命令行里随便跑的它需要和运行时框架配合。Beremiz运行时提供了一整套PLC服务能力周期扫描调度、任务优先级管理、变量诊断、断点调试、通信接口等。比如你定义了一个周期为20ms的任务运行时内核就会按照这个节奏去扫描程序处理中断更新输出。整个运行时被设计成可裁剪的不同的目标平台可以通过配置文件启动不同的服务模块有的平台只需要本地IO控制那就不加载Modbus服务有的项目要用触摸屏就把SVG可视化服务加进去。这种模块化设计让Beremiz可以在树莓派那么小的设备上跑得很轻快也能在工控机上承担更多功能。2.5 核心组件通讯与可视化框架Beremiz的通讯框架主要围绕Modbus和CANopen展开。Modbus部分内置了主站/从站协议栈支持Modbus TCP和Modbus RTU可以在工程树里直接配置设备参数和寄存器映射CANopen部分使用的是开源CanFestival库支持PDO、SDO传输和节点管理适合多轴运动控制和分布式IO。可视化方面Beremiz内置了SVG HMI方案可以把图形界面和PLC变量绑定在一起部署到控制器后用浏览器就能打开监控页面。这些组件和PLC本体解耦得很清楚新增通讯协议、增加HMI页面都不会影响控制逻辑的发布。如果你有特定设备的驱动要接框架也允许你用C语言直接写外部任务编译时链接进去就行。3. 搭建环境与第一个工程实操3.1 Ubuntu下的安装步骤我在Ubuntu 22.04上装Beremiz踩过不少坑现在基本摸清了依赖关系。Beremiz使用Python 3编写图形界面基于wxPython所以安装思路是先装系统依赖再从GitHub拉源码最后用Python直接启动。推荐顺序如下sudo apt update sudo apt install -y python3 python3-wxgtk4.0 python3-lxml \ python3-pyparsing python3-numpy python3-matplotlib \ python3-serial python3-twisted python3-pypubsub \ build-essential git git clone https://github.com/beremiz/beremiz.git cd beremiz python3 Beremiz.py如果你的发行版里找不到python3-wxgtk4.0可以试python3-wxgtk3.0但新版本建议用wxPython 4.x。除了这些依赖编译器流程还需要GCC和Make。如果在树莓派一类ARM设备上做交叉编译还要看目标平台的工具链是否就绪。个人经验是先用普通PC把整个流程跑通再折腾树莓派问题排查会容易很多。3.2 Windows环境怎么处理Windows上跑Beremiz IDE是可行的但我不建议在Windows上直接编译目标程序因为Beremiz生成的C代码编译流程依赖很多POSIX风格的工具链Windows下配起来比较磨人。我实际操作时的方案是在Windows上安装Python和wxPython用Beremiz IDE专门做项目编辑、梯形图绘制和代码浏览然后把整个工程目录拷贝到一台Linux机器或WSL里编译和部署。如果你非要在Windows下本地仿真一个折中办法是装WSL然后在WSL里跑Beremiz这样能避开一大堆驱动和路径问题。安装wxPython的话建议用pip install wxPython如果安装失败优先去官网找对应Python版本的预编译wheel这会节省很多时间。3.3 创建ST程序并跑通仿真打开Beremiz后先建一个空工程工程树里会自动生成配置、资源和程序这些层级。我习惯先把简单逻辑跑通再慢慢加设备。在程序组织单元里新建一个名为counter的ST程序输入PROGRAM counter VAR_OUTPUT myValue : INT; END_VAR myValue : myValue 1; END_PROGRAM然后创建一个周期任务比如INTERVAL : T#50ms再把这个程序绑定到任务上。接下来在菜单里执行构建Beremiz会调用编译器生成C代码并编译成本地可执行文件。构建成功后直接用IDE启动运行时或者手动运行生成的可执行文件再通过IDE的“连接”功能连上这个运行时就能在监控面板里看到myValue一直在递增。这一步跑通说明从编程到运行的核心链路没问题后面再接入Modbus、IO设备都只是在这个主干上加枝叶。3.4 部署到树莓派软PLC树莓派是Beremiz社区里最常见的部署目标之一。我一般是先把树莓派刷好系统设置静态IP然后安装依赖和编译工具链。Beremiz的targets目录里有针对树莓派的构建脚本和相关说明它可以把运行时编译成树莓派原生程序并利用GPIO引脚实现简单的数字量输入输出。为了让程序开机自启我会写一个systemd服务让树莓派开机就能自动运行PLC程序不需要手动登录[Unit] DescriptionBeremiz PLC Runtime Afternetwork.target [Service] ExecStart/home/pi/plc_app/counter --socket-port 1260 Restartalways Userpi [Install] WantedBymulti-user.target放到/etc/systemd/system/plc.service后执行sudo systemctl daemon-reload sudo systemctl enable plc sudo systemctl start plc这样一台树莓派就变成一个真正的软PLC控制器了。IDE通过网络端口连接树莓派上传、监控和修改程序都很顺手。4. 关键功能逐项实操编译、任务、调试4.1 PLCopenXML工程文件结构很多人第一次接触Beremiz会被工程文件的后缀和目录结构搞晕。Beremiz项目核心文件是plc.xml它遵守PLCopenXML规范存储了配置、资源、变量、程序组织单元、任务表等所有信息。好处很明显你可以用XML工具去解析工程结构也可以写脚本批量修改变量声明甚至可以在CI流程里自动生成PLC代码。比如你要批量添加200个IO变量手动在IDE里点会点到手软但写段Python脚本操作PLCopenXML就能几分钟搞定。IDE里的编辑操作本质上都是在改这棵XML树编译器拿到这棵树才去生成C代码。理解了这一点你遇到“某个工程文件损坏打不开”的报错可以直接用文本编辑器打开plc.xml查原因。4.2 任务与程序的执行模型IEC 61131-3里的任务概念是新手最容易忽略但实际控制里最要命的地方。简单说任务就是PLC扫描周期的心脏它决定了某个程序组是每10ms扫描一次还是每100ms扫描一次还是只在特定事件发生时执行一次。在Beremiz里任务配置一般在资源节点下你在资源里创建一个任务设定间隔和优先级再把一个或多个程序挂上去。需要注意的地方是不同优先级的任务同时触发时运行时会按照优先级排队执行高优先级任务会抢占低优先级任务。如果程序里有一段长时间运行的循环又没有做好任务拆分就可能造成整个PLC调度周期抖动对外表现为输出延迟或通讯丢包。所以我做项目时习惯把急停、轴使能这类高安全逻辑放到高优先级任务把数据统计、日志这类不要求时间精度的逻辑放到低优先级任务。4.3 在线调试与变量强制Beremiz的调试能力和商业IDE相比虽然还有差距但日常足够用。连接上运行中的PLC后IDE的“程序监控”面板会实时刷新程序变量值你可以看到ST代码旁边动态显示数值梯形图里触点和线圈的状态也会高亮。要修改变量时可以直接在监控面板里强制赋值比如我在调模拟量输出时直接把setpoint从0改成500看设备反应。这里有个实操小技巧强制变量前最好先确认程序里没有其他任务对该变量做周期赋值否则强制值和程序写入值来回冲突设备表现会非常奇怪。另外下载新程序前要明确是“热下载”还是“冷下载”修改变量表或新增程序时很多情况下是需要冷下载重启PLC的否则变量地址对不上轻则报错重则运行时崩溃。4.4 Modbus通讯配置Modbus是Beremiz用得最多的通讯方式我以Modbus TCP从站为例说一下配置思路。工程树里有通讯相关的节点右键添加设备时选Modbus TCP从站然后配置本地端口号默认502和允许访问的客户端地址。接下来是关键的一步建立寄存器映射。你需要在设备节点下创建一个映射表把Modbus的保持寄存器地址对应到PLC的全局变量或程序变量上。一个典型的映射是%QW100对应Modbus保持寄存器地址40001的前16位%IW150对应输入寄存器地址30001等。配置编译下载后上位机就可以通过标准的Modbus协议来读写这些变量了。这里特别提醒寄存器地址的偏移不同PLC工具的理解略有差异Beremiz中配置地址时要注意起始地址是0还是1这个坑能让人排查一下午我就因为没注意起始地址偏移导致通讯数据整体错位过。5. 实际应用用Beremiz做的几个典型项目5.1 低成本产线设备控制我曾给一个小型包装设备换过控制系统原方案用的是某品牌经济型PLC40多个IO加上通讯模块整套成本接近四千。后来我改用树莓派加Beremiz的方案IO模块用现成继电器板加Modbus RTU扩展IO硬件成本压缩到了千元以内。逻辑部分直接把原来的梯形图转成Beremiz的FBD和ST混合编写从拿需求到调试完成大概用了两周。最让我省心的是远程维护用户摄像头看下设备状态我直接通过SSH连树莓派把最新的程序下载进去重启完全不需要跑到现场。这套方案当然有局限环境太恶劣、电磁干扰强、高温振动大的场景工业PC和商业树莓派都没法和正经工业PLC比。但在车间环境相对干净的设备上它作为一个“省钱又可控”的替代方案非常能打。5.2 树莓派边缘控制器数据采集另一个场景是数据采集。客户现场有一批传统的继电器控制柜没有通讯接口只有普通的指示灯和按钮信号。我在控制柜里加了一个树莓派用Beremiz读取无源触点信号并加上Modbus TCP从站服务这样上位机SCADA系统就能通过网口拿到设备状态了。这个项目里Beremiz的价值在于它把PLC逻辑、Modbus通讯和上传数据封装在一个可执行文件里我不用额外写任何Python脚本或者Web服务。而且供电一断程序不会丢重新上电后自动恢复运行稳定性在测试里连续跑了三个多月没有掉线。如果只是做纯数据中转很多开源软件都能干但Beremiz提供的“工业扫描周期加上标准通信协议”这种组合让最终交付的形态更接近一台正规控制器客户和验收人员都更容易接受。5.3 教学实验平台我朋友在高校带自动化课程也用Beremiz搭过实验平台。因为学生人数多不可能人手一套商业PLC学校实验室就配了一批树莓派和面包板学生在Beremiz里写ST或梯形图GPIO驱动LED和按钮直接就能体验“写逻辑、下载程序、看到输出”的完整闭环。更有意思的是PLCopenXML这个格式学生可以直接在多个工具间交换工程比如把课堂演示的梯形图导出来放在不同组的工程里复用这比传统PPT教学有说服力得多。学生学会的还不是某一个品牌的封闭操作而是IEC 61131-3的标准概念以后转到任何主流PLC上都能快速上手。当然教学场景里会遇到一些兼容性问题比如不同版本的Beremiz界面位置有细微差别但只要记住核心框架这些问题都不难绕过去。6. 常见问题与排查技巧实录6.1 编译错误怎么快速定位Beremiz把IEC语言翻译成C代码后再用GCC编译所以编译报错有时会出现“中英文混搭”的信息一部分来自IEC语法检查一部分是GCC输出的C语言错误。遇到这种情况我先记住一个原则先看IEC语法检查的报错因为它对应的是你写的PLC代码信息一般直接指向具体的程序组织单元和行号如果IEC层面没问题而GCC报错再看是不是变量类型不匹配、数组越界、任务优先级配置错误。我曾遇到一个莫名其妙的错误查了半天发现是函数块实例名称和全局变量名称重名了这种事手写代码容易出现编译器给出的C语言报错又很晦涩。养成的习惯是新建工程之初就规定好变量命名规范比如全局变量带G_前缀功能块实例带FB_前缀这样能避开很多麻烦。6.2 IDE连不上运行时怎么办IDE的“连接PLC”失败了九成是网络和端口问题。Beremiz运行时会在指定端口监听等待IDE连接默认端口一般是1260。首先要确认运行中的PLC程序进程还在用ps -ef | grep 程序名检查其次确认端口监听是否正常ss -tunlp看端口有没有被绑定再检查防火墙树莓派上尤其要注意我因为默认防火墙策略把端口拦掉折腾了一晚上最后看看IDE里填的IP和端口是否匹配。有一个隐藏细节如果你同时开两个项目连同一个运行时第二个IDE进程可能会抢占连接导致第一个IDE的监控断线。多人在线协作调试时先沟通好谁连谁断能省不少事。6.3 树莓派运行时启动失败树莓派上部署Beremiz最常撞上的坑是动态库缺失和内存不足。编译生成的可执行文件依赖运行时目录里的一些.so和配置文件如果你把单一可执行文件拷贝到别的机器上跑很有可能会因为找不到依赖库而启动不了。我通常的做法是保留整个生成目录不要只拷一个文件。编译时还容易爆内存尤其是逻辑复杂、生成的C代码规模大时树莓派默认1GB内存很容易不够报错通常表现为GCC进程被Killed。解决方法是加一个swap分区或者交叉编译。另外树莓派跑软PLC不像跑业务脚本电源供电不稳会导致运行时进程无响应所以工业现场用树莓派的话最好选优质电源和工业SD卡。6.4 其他几个值得注意的小细节使用SVG HMI时页面在不同浏览器下显示会有差异建议统一使用Chrome系内核的浏览器减少CSS兼容性吐槽。PLCopenXML文件如果手动编辑过重新在IDE里打开前最好先备份我之前用脚本批量改变量声明时把某个闭合标签写错导致整个工程无法正常加载修复起来很费劲。另外长时间运行的PLC进程需要排查内存泄漏这问题不常出但出现在一些第三方通讯库上解决办法是定期重启PLC服务。最后想说Beremiz的社区更新不算特别快遇到Bug先在GitHub Issue里搜往往能找到官方或用户的解决方案别急着自定义改源码除非你确实清楚代码逻辑否则升级版本后可能白改一遍。最后再分享一个小技巧如果你打算把Beremiz方案真正落地到长期项目中最好从第一天就建立工程版本管理。PLCopenXML是纯文本格式天然适合Git管理每次改动都能看到变量声明和逻辑配置的差异相当于给PLC代码上了保险。回滚、分支验证新功能都变得轻松可控。开源软PLC这条路最大的优势就在这里一切都在你手里只要框架理解到位剩下的事只是时间问题。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑