1. 为什么要在Linux上折腾CODESYS
把CODESYS装到Linux上,这件事在工控圈里一直有点“非主流”。大多数人第一次接触CODESYS都是在Windows环境下,双击安装包、一路下一步,半小时就能跑起来。但当你手头只有一台Linux工控机、一台国产化平台的边缘网关,或者公司要求整套开发环境必须跑在国产操作系统上时,问题就来了——CODESYS官方并没有提供原生的Linux桌面版开发环境。
我最早动这个念头是在一个边缘计算项目上。现场部署的是一台基于ARM架构的国产化设备,系统是麒麟,客户明确要求PLC逻辑的开发调试也要在这台设备上完成,不能额外配一台Windows笔记本。当时第一反应是找官方有没有Linux版本,翻了一圈发现CODESYS Control for Linux SL是有的,那是运行时(Runtime),负责跑PLC程序;但CODESYS Development System(也就是我们常说的IDE开发环境)只有Windows版。这就意味着,想在Linux上写CODESYS程序,必须借助Wine这个兼容层来跑Windows版的IDE。
这里先把几个核心概念理清楚,不然后面容易绕晕。CODESYS Development System是你用来写梯形图、ST语言、配置IO的那个图形化开发环境,它本身是个Windows程序。CODESYS Runtime是跑在目标设备上的执行引擎,负责实际执行PLC逻辑,这个是有Linux原生版本的。Wine是一个在Linux上运行Windows程序的兼容层,它不是模拟器,而是把Windows的API调用翻译成Linux能理解的调用。三者关系搞明白了,整个安装思路就清晰了:用Wine跑IDE,用原生Runtime跑程序,两者通过网络通信。
这套方案适合什么人?一是做国产化替代项目的工程师,现场只有Linux环境;二是搞边缘计算、想在ARM设备上直接开发调试的;三是单纯不想为了一个CODESYS再装个Windows虚拟机的。如果你只是日常在Windows上开发,那没必要折腾这个,直接用Windows版体验最好。但如果你确实被环境限制住了,下面这套流程我踩过的坑、验证过的步骤,可以直接抄。
2. 安装前的环境准备与方案选型
2.1 系统与硬件的最低要求
在动手之前,先把环境底子打牢。CODESYS IDE本身不算特别吃资源,但套上Wine之后,资源开销会上去一截。我实测下来,最低配置建议是4核CPU、8GB内存、50GB可用磁盘空间。如果是在虚拟机上跑,内存最好给到8GB以上,否则Wine在加载大型项目时会明显卡顿。
操作系统方面,Ubuntu 20.04/22.04 LTS是最省心的选择,社区资料多,Wine的兼容性也最好。如果你用的是麒麟、统信UOS这类国产系统,底层大多是Debian或Ubuntu系,思路一样,但软件源和包管理可能有差异,后面会单独说。架构上,x86_64是最成熟的,ARM64也能跑,但Wine的ARM64支持相对折腾,需要额外的转译层,这个后面细讲。
有一点要特别注意:不要用太新的发行版。我试过在Ubuntu 24.04上装,Wine的某些依赖和系统自带的库版本冲突,折腾了半天。LTS版本经过时间验证,稳定性最好。另外,确保你的系统已经更新到最新:
sudo apt update && sudo apt upgrade -y2.2 Wine方案与虚拟机的取舍
这里有个关键决策:到底是用Wine,还是干脆装个Windows虚拟机?两种方案我都用过,各有适用场景。
Wine方案的优势是轻量、启动快、和Linux系统集成度高,文件系统直接互通,不用在虚拟机和主机之间来回传文件。缺点是兼容性偶尔出问题,某些Windows组件需要额外配置,而且CODESYS的某些高级功能(比如特定的在线调试视图)在Wine下可能显示异常。
虚拟机方案(比如VirtualBox或VMware)的优势是兼容性完美,CODESYS在Windows里怎么跑,虚拟机里就怎么跑,不用担心各种奇怪的报错。缺点是资源开销大,一个Windows虚拟机至少吃掉4GB内存,而且文件传输、网络配置都多一层。如果你只是偶尔用一下,虚拟机更省心;如果你要长期在Linux上开发,Wine方案更值得投入时间配置。
我的建议是:先试Wine,如果核心功能都能跑通,就用Wine;如果遇到无法绕过的兼容性问题,再退回虚拟机。下面主要讲Wine方案,因为这是大多数人想要的答案。
2.3 Wine版本的选择与安装
Wine的版本选择很关键。稳定版(Stable)最保险,但可能对某些新API支持不够;开发版(Development)功能新,但偶尔有回归问题;Staging版介于两者之间,包含了一些实验性补丁。我实测下来,Wine 8.x的Staging版对CODESYS的支持最好,既能跑起来,又不会太激进。
在Ubuntu上安装Wine,官方源里的版本通常偏旧,建议用WineHQ的官方源:
sudo dpkg --add-architecture i386 sudo mkdir -pm755 /etc/apt/keyrings sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/jammy/winehq-jammy.sources sudo apt update sudo apt install --install-recommends winehq-staging装完之后验证一下:
wine --version如果输出类似wine-8.21 (Staging)就对了。这里有个坑:32位支持必须开启,因为CODESYS的安装程序是32位的,即使你的系统是64位,也需要i386架构支持。上面第一步dpkg --add-architecture i386就是干这个的,漏了这步后面安装会报错。
2.4 国产系统与ARM64的特殊处理
如果你用的是麒麟或统信UOS,Wine的安装方式不太一样。这些系统通常自带或推荐“麒麟Wine助手”这类工具,它封装了Wine的配置,对国产系统做了适配。我试过在麒麟V10上用麒麟Wine助手装CODESYS,整体流程比手动配Wine简单,但版本可能偏旧,遇到问题不好排查。
ARM64架构是另一个难点。ARM64上跑x86的Windows程序,需要Wine配合Box86/Box64这样的转译层。这套组合的配置复杂度明显上升,而且性能有损耗。如果你的设备是ARM64,我的建议是:优先考虑用CODESYS Runtime的原生ARM64版本跑程序,IDE开发放在x86机器上,通过远程连接调试。如果非要在一台ARM64设备上跑IDE,那就要做好折腾Box86/Box64的准备,网上有相关的安装包和教程,但稳定性因设备而异。
3. CODESYS安装的完整实操流程
3.1 创建独立的Wine前缀
这是整个安装过程中最重要的一步,也是最容易被忽略的。不要直接用默认的Wine前缀(~/.wine)装CODESYS。默认前缀里可能已经有其他Windows程序,库文件版本混杂,很容易冲突。正确做法是为CODESYS单独创建一个前缀:
export WINEPREFIX=~/.codesys_wine export WINEARCH=win32 winecfgWINEARCH=win32指定创建32位前缀,因为CODESYS安装程序是32位的。执行winecfg会弹出Wine配置窗口,第一次运行会初始化前缀,稍等片刻。在配置窗口里,把Windows版本设置为Windows 10,这能提高CODESYS的兼容性。
注意:
WINEPREFIX和WINEARCH这两个环境变量必须在每次操作CODESYS前都设置好,否则Wine会去找默认前缀。建议写进一个脚本里,每次用的时候source一下。
创建好前缀后,安装一些必要的Windows组件。CODESYS依赖.NET Framework和Visual C++运行库,用winetricks来装:
winetricks -q dotnet48 vcrun2019 corefontsdotnet48是.NET Framework 4.8,CODESYS的某些模块需要它;vcrun2019是Visual C++ 2019运行库;corefonts装一些基础字体,不然界面中文可能显示成方块。这一步耗时比较长,尤其是dotnet48,下载和安装可能要十几分钟,耐心等。
3.2 安装CODESYS Development System
组件装好后,就可以跑CODESYS安装程序了。从官网下载CODESYS Development System的安装包,注意选32位版本。下载下来是个.exe文件,假设叫CODESYS_Development_System.exe,放到一个路径不含中文和空格的目录下,比如~/codesys_install/。
cd ~/codesys_install wine CODESYS_Development_System.exe安装程序启动后,界面和Windows下基本一样。一路下一步,安装路径保持默认即可。安装过程中可能会弹出一些缺少组件的提示,如果之前winetricks装全了,一般不会出问题。安装完成后,不要急着启动,先做几件事。
第一,检查安装目录下有没有生成快捷方式。Wine会在~/.local/share/applications/wine/Programs/下生成.desktop文件,但通常不太完善。我习惯手动创建一个启动脚本:
#!/bin/bash export WINEPREFIX=~/.codesys_wine export WINEARCH=win32 cd ~/.codesys_wine/drive_c/Program\ Files/CODESYS\ Development\ System\ 3.5/ wine CODESYS.exe保存为~/start_codesys.sh,加执行权限。这样每次启动不用记那些环境变量。
第二,处理中文显示问题。Wine默认的字体渲染有时候会让CODESYS界面里的中文变成乱码或方块。解决办法是把Windows的字体复制到Wine前缀里,或者用winetricks装wenquanyi字体。我一般直接装winetricks -q cjkfonts,能解决大部分中文显示问题。
3.3 首次启动的配置与验证
第一次启动CODESYS可能会比较慢,Wine需要初始化一些东西。启动后,先别急着建项目,做几个验证:
- 界面是否正常显示,菜单栏、工具栏有没有缺失
- 新建一个标准项目,选一个简单的PLC型号,看能不能正常创建
- 打开设备树,看设备描述文件能不能加载
- 试着写一段简单的ST代码,编译一下,看有没有报错
如果这几步都过了,说明基本环境没问题。如果某一步卡住,多半是缺少某个Windows组件,用winetricks补装对应的库。
这里有个经验:CODESYS的在线帮助和某些HTML视图在Wine下可能显示空白,这是因为Wine内置的浏览器组件不完整。如果遇到这种情况,可以装winetricks -q ie8或者winetricks -q webview2,但webview2在Wine下的支持一直不太稳定,有时候装了反而更糟。我的建议是,如果只是帮助文档显示不了,不影响核心开发功能,可以先不管,需要查文档的时候用浏览器看在线版。
3.4 Runtime的安装与连接配置
IDE跑起来只是第一步,真正要让PLC程序跑起来,还需要Runtime。CODESYS Control for Linux SL是官方提供的Linux原生Runtime,支持x86_64和ARM64。安装方式通常是通过.deb包或者直接解压运行。
以.deb包为例:
sudo dpkg -i codesyscontrol_linux_*.deb安装完成后,Runtime会作为系统服务运行。检查服务状态:
sudo systemctl status codesyscontrol如果服务没起来,看日志排查:
journalctl -u codesyscontrol -n 50Runtime默认监听端口是1217(用于CODESYS IDE连接)和11740(用于Web可视化)。确保防火墙放行这些端口。
然后在IDE里配置连接:在设备树里右键点击设备,选择“添加设备”,找到“CODESYS Control for Linux SL”,添加后配置IP地址。如果IDE和Runtime在同一台机器上,IP填127.0.0.1;如果在不同机器上,填Runtime所在机器的IP。
注意:IDE和Runtime的版本要匹配。如果IDE是3.5 SP17,Runtime最好也是3.5 SP17对应的版本,版本差异过大可能导致连接失败或功能异常。
连接成功后,就可以像在Windows下一样,把程序下载到Runtime里运行了。这里有个小技巧:在Linux上,Runtime的日志和配置文件通常在/etc/CODESYSControl/和/var/log/下,调试的时候多看看日志,能省很多时间。
4. 常见报错与排查技巧实录
4.1 Wine相关报错速查
Wine下跑CODESYS,报错五花八门,但常见的就那么几类。我整理了一个速查表,遇到问题先对照着看:
| 报错现象 | 可能原因 | 解决方法 |
|---|---|---|
| 安装程序启动即崩溃 | 缺少32位支持或Wine版本不对 | 确认dpkg --add-architecture i386已执行,换Wine Staging版 |
| 界面中文显示为方块 | 缺少中文字体 | winetricks -q cjkfonts或复制Windows字体到前缀 |
| 提示缺少.NET Framework | dotnet未安装或版本不对 | winetricks -q dotnet48,必要时先winetricks -q dotnet40再装48 |
| 编译时报缺少DLL | VC++运行库缺失 | winetricks -q vcrun2019 |
| 在线帮助显示空白 | Wine浏览器组件不完整 | 装winetricks -q ie8,或忽略,用浏览器看在线文档 |
| 启动后闪退 | 前缀损坏或组件冲突 | 删除前缀重建,重新走一遍安装流程 |
这里重点说两个高频问题。第一个是dotnet48安装失败。这个组件在Wine下安装经常卡住或报错,我的经验是:先装dotnet40,再装dotnet48,成功率会高很多。如果还是不行,试试用winetricks -q dotnet48 --force强制安装。第二个是中文乱码。除了装字体,还要在winecfg里把区域设置改成中国,Locale选zh_CN.UTF-8,这样能解决大部分编码问题。
4.2 Runtime连接失败的排查思路
IDE连不上Runtime,这是另一个高频问题。排查顺序建议这样:
先确认Runtime服务在跑:systemctl status codesyscontrol。如果服务没起来,看日志找原因,常见的是端口被占用或权限问题。
再确认网络通不通:从IDE所在机器ping一下Runtime的IP,telnet一下1217端口。如果端口不通,检查防火墙规则。
然后确认版本匹配:IDE和Runtime的版本号要对得上。在IDE的“帮助-关于”里看版本,在Runtime的日志里看版本,不一致就换。
最后看网关配置:如果Runtime在网关后面,或者有多个网卡,要确保Runtime绑定的是正确的网卡。在/etc/CODESYSControl/CODESYSControl.cfg里可以配置绑定的IP。
我遇到过一次很隐蔽的问题:Runtime服务起来了,端口也通,但IDE就是连不上。查了半天发现是Runtime的许可证没激活,试用期过了之后连接会被拒绝。所以别忘了检查Runtime的许可证状态,这个在日志里会有明确提示。
4.3 性能优化与日常使用建议
Wine下跑CODESYS,性能肯定不如原生Windows,但通过一些调整可以改善体验。
关闭Wine的桌面特效和动画,在winecfg的“显示”选项卡里,取消“允许窗口管理器装饰窗口”和“允许窗口管理器控制窗口”,能减少一些渲染开销。
给Wine前缀分配足够的内存,在winecfg的“驱动器”里,把C盘映射到一个SSD上的目录,读写速度会快很多。
如果项目比较大,编译慢,可以考虑把CODESYS的编译缓存目录也放到SSD上。默认缓存在前缀的drive_c/users/你的用户名/Temp/下,可以做个软链接指向SSD。
日常使用中,养成定期备份Wine前缀的习惯。Wine前缀出问题是常事,一旦坏了,重装CODESYS很费时间。我一般每周把~/.codesys_wine打包备份一次,出问题直接恢复,几分钟搞定。
5. 国产化环境下的适配经验
5.1 麒麟与统信系统的特殊配置
在麒麟V10和统信UOS上装CODESYS,和Ubuntu的思路一样,但有几个地方要注意。
软件源方面,国产系统通常有自己的软件源,Wine的版本可能和WineHQ的不一样。如果系统源里的Wine版本太旧,可以尝试添加WineHQ的源,但要注意依赖冲突。我遇到过麒麟系统上装WineHQ的包,把系统自带的某个库升级了,导致其他软件出问题。所以在国产系统上,优先用系统自带的Wine或麒麟Wine助手,虽然版本旧,但稳定性有保障。
麒麟Wine助手是个图形化工具,封装了Wine的安装和配置。用它装CODESYS,流程简化很多,但灵活性差。如果遇到问题,排查起来不如手动配Wine方便。我的建议是:新手先用麒麟Wine助手,能跑起来就行;有经验的可以手动配Wine,可控性更强。
5.2 ARM64平台的可行性分析
ARM64平台上跑CODESYS IDE,技术上可行,但体验打折扣。核心问题是x86到ARM的指令转译,Box86/Box64这套方案能跑,但性能损耗明显,而且不是所有Windows程序都能完美转译。
我实测过在RK3588开发板上用Box64跑CODESYS IDE,基本界面能出来,但编译速度慢,复杂项目会卡。如果只是做简单的逻辑开发和调试,勉强能用;如果是大型项目,建议还是用x86机器。
更推荐的方案是:IDE跑在x86的Linux机器上,Runtime跑在ARM64设备上,两者通过网络连接。这样IDE的性能有保障,Runtime又是原生的,整体体验最好。CODESYS的远程连接功能很成熟,跨平台调试不是问题。
5.3 与汇川等国产PLC的配合
汇川的PLC很多是基于CODESYS内核的,在Linux上开发汇川PLC,思路和标准CODESYS一样。需要注意的是,汇川有自己的设备描述文件和库,这些需要在IDE里额外安装。安装方法和Windows下一样,通过“设备库”或“库管理器”导入。
有个坑:汇川的某些库文件可能对Wine环境有额外要求,比如依赖特定的Windows组件。如果导入库之后编译报错,先检查是不是缺少某个运行库,用winetricks补装。
另外,汇川PLC的IP配置和标准CODESYS略有不同,在设备树里配置IP的时候,要参考汇川的文档,别照搬标准CODESYS的配置。我遇到过IP配好了但连不上的情况,后来发现是汇川的PLC需要在特定模式下才能接受连接,这个在手册里有说明。
6. 我踩过的几个大坑
第一个坑是Wine前缀混用。一开始图省事,直接用默认前缀装CODESYS,结果和之前装的其他Windows程序冲突,CODESYS启动就崩。后来单独建前缀,问题解决。这个教训是:每个大型Windows程序都应该有自己的Wine前缀,别混在一起。
第二个坑是dotnet版本。CODESYS 3.5 SP17需要.NET 4.8,但我先装了4.7.2,结果安装程序检测到版本不对,直接拒绝安装。后来先卸干净,再装4.8,才通过。所以装之前一定看清楚CODESYS版本对应的.NET要求。
第三个坑是Runtime许可证。试用期过了之后,IDE能连上Runtime,但下载程序时报错,提示许可证无效。当时以为是Wine的问题,排查了半天才发现是Runtime的许可证到期了。这个在日志里有明确提示,但容易被忽略。
第四个坑是中文路径。有次把CODESYS装在一个包含中文的目录下,结果Wine处理路径时出问题,各种找不到文件。后来改成纯英文路径,一切正常。所以Wine下的路径,尽量用英文,别用中文和空格。
第五个坑是ARM64上的Box86配置。在ARM设备上折腾Box86,按照网上的教程配了半天,结果CODESYS能启动但一编译就崩。后来发现是Box86的版本和Wine的版本不匹配,换了个组合才跑通。ARM64上的转译层,版本匹配比x86上更敏感,建议直接用别人验证过的组合,别自己乱配。
这套方案我前后折腾了大概两周,从完全跑不起来到稳定使用,中间踩的坑基本都写在这了。现在我的开发环境是一台Ubuntu 22.04的工控机,Wine 8.21 Staging,CODESYS 3.5 SP17,Runtime跑在同一台机器上,日常开发调试没问题。偶尔遇到小毛病,重启一下Wine前缀或者Runtime服务就能解决。如果你也在Linux上搞CODESYS,希望这些经验能帮你少走点弯路。