当前位置: 首页 > news >正文

C#跨平台上位机Windows/Linux双端跑通:S7-1200 PLC通信全攻略

大家好,我是威哥。最近在做一个工业视觉项目,现场要求上位机既能在Windows上跑,又能在Linux工控机上运行,还得和S7-1200 PLC稳定通信。折腾了一周,踩了不少坑,终于把双端都调通了。今天把整个过程整理出来,希望能帮到有同样需求的朋友。


一、为什么选这个方案?

先聊聊背景。工业现场现在越来越多Linux设备,成本低、稳定性好,但很多工程师还是习惯用C#开发上位机。好在.NET Core/.NET 5+已经完全跨平台,配合成熟的S7通信库,完全能满足需求。

我这次的需求很明确:

  • 读写S7-1200的DB块、I区、M区
  • Windows 10/11和Ubuntu 22.04双端稳定运行
  • 代码尽量简洁,方便后续维护

二、环境准备(踩坑从这里开始)

2.1 硬件与软件清单

先列一下我用的环境,大家可以参考:

  • PLC:S7-1214C(固件版本V4.4)
  • 开发环境:Windows 11 + Visual Studio 2022
  • Linux环境:Ubuntu 22.04 LTS(虚拟机/工控机都行)
  • .NET版本:.NET 8 SDK(长期支持版,稳定)
  • 通信库:S7netplus(GitHub上最火的S7通信库,没有之一)

2.2 PLC端必须做的设置

很多人一开始连不上PLC,都是因为这里没设对。用TIA Portal打开你的项目,检查这几点:

  1. IP地址设置:确保PLC和电脑在同一网段,比如我设的是192.168.0.1。
  2. 启用PUT/GET通信:在PLC属性里找到“保护与安全”→“连接机制”,勾选“允许来自远程伙伴的PUT/GET通信访问”。
  3. DB块设置:如果要读写DB块,记得把DB块的“优化的块访问”关掉(在DB块属性里取消勾选),否则S7netplus读不到。

三、核心代码实现(Windows先跑通)

我习惯先在Windows上把通信调通,再移到Linux,这样能排除平台差异的干扰。

3.1 新建项目并安装依赖

打开VS2022,新建一个.NET 8控制台应用,名字随便起,比如S7CrossPlatformDemo。然后通过NuGet安装S7netplus:

Install-Package S7netplus

3.2 写一个简单的通信测试类

直接上代码,我加了详细注释,都是踩坑后总结的:

usingS7.Net;usingSystem;namespaceS7CrossPlatformDemo{classProgram{// PLC实例,IP地址、机架号、槽号(S7-1200一般是0和1)staticPlcplc=newPlc(CpuType.S71200,"192.168.0.1",0,1);staticvoidMain(string[]args){Console.WriteLine("=== S7-1200 跨平台通信测试 ===");try{// 1. 连接PLCConsole.WriteLine("正在连接PLC...");plc.Open();if(plc.IsConnected){Console.WriteLine("✅ PLC连接成功!");// 2. 测试读写TestReadWrite();}else{Console.WriteLine("❌ PLC连接失败!");}}catch(Exceptionex){Console.WriteLine($"❌ 发生错误:{ex.Message}");}finally{// 3. 关闭连接if(plc.IsConnected){plc.Close();Console.WriteLine("🔌 PLC连接已关闭");}}Console.WriteLine("按任意键退出...");Console.ReadKey();}staticvoidTestReadWrite(){Console.WriteLine("\n--- 开始读写测试 ---");try{// 测试1:读取DB1.DBD0(REAL类型,对应C#的float)floatrealValue=(float)plc.Read("DB1.DBD0");Console.WriteLine($"📖 DB1.DBD0 (REAL) ={realValue}");// 测试2:写入DB1.DBD4(REAL类型)floatwriteValue=123.45f;plc.Write("DB1.DBD4",writeValue);Console.WriteLine($"✍️ 已写入 DB1.DBD4 (REAL) ={writeValue}");// 测试3:读取M区(MW10,WORD类型,对应ushort)ushortmValue=(ushort)plc.Read("MW10");Console.WriteLine($"📖 MW10 (WORD) ={mValue}");// 测试4:读取I区(I0.0,BOOL类型)booliValue=(bool)plc.Read("I0.0");Console.WriteLine($"📖 I0.0 (BOOL) ={iValue}");}catch(Exceptionex){Console.WriteLine($"❌ 读写测试失败:{ex.Message}");}}}}

3.3 Windows端调试

直接按F5运行,如果你PLC设置没问题,应该能看到连接成功和读写数据。我第一次运行时连不上,后来发现是Windows防火墙把102端口(S7通信端口)挡住了,临时关了防火墙就好了(生产环境记得单独开放端口)。


四、Linux端部署(重点踩坑区)

Windows跑通后,移到Linux本以为很简单,结果踩了三个大坑,一个个说。

4.1 第一步:在Linux上安装.NET 8 SDK

我用的是Ubuntu 22.04,按照微软官方文档安装:

# 添加Microsoft包仓库wgethttps://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.debsudodpkg -i packages-microsoft-prod.debrmpackages-microsoft-prod.deb# 安装.NET 8 SDKsudoapt-getupdatesudoapt-getinstall-y dotnet-sdk-8.0

安装完验证一下:

dotnet --version

能看到版本号就说明装好了。

4.2 第二步:发布项目

在Windows的VS2022里,右键项目→“发布”,选择“文件夹”,然后配置发布参数:

  • 配置:Release
  • 目标运行时:linux-x64
  • 部署模式:独立(这样Linux上不用装.NET运行时也能跑,更方便)
  • 文件发布选项:勾选“生成单个文件”

或者直接用命令行发布(更高效):

dotnet publish -c Release -r linux-x64 --self-containedtrue-p:PublishSingleFile=true

发布完成后,会在bin/Release/net8.0/linux-x64/publish文件夹里生成一个可执行文件(和项目名一样,比如S7CrossPlatformDemo)。

4.3 第三步:把文件传到Linux并运行

我用的是WinSCP把publish文件夹里的所有文件传到Linux的/home/user/s7demo目录下。然后给可执行文件加权限:

cd/home/user/s7demochmod+x S7CrossPlatformDemo

重点来了!我第一次运行时直接报错:

Unhandled exception. System.Net.Sockets.SocketException (13): Permission denied

查了半天,原来是Linux的非root用户不能直接访问102以下的端口(S7用的是102端口)。解决方法有两个:

  1. 用root运行(不推荐生产环境用):
    sudo./S7CrossPlatformDemo
  2. 给程序开放端口权限(推荐):
    sudosetcap'cap_net_bind_service=+ep'/home/user/s7demo/S7CrossPlatformDemo
    这样普通用户也能运行了。

刚解决权限问题,又遇到连接超时。检查了IP、PLC设置都没问题,最后发现是Linux的防火墙没开102端口:

# 开放102端口sudoufw allow102/tcp# 重启防火墙sudoufw reload

终于,运行成功了!和Windows上的输出一模一样。


五、进阶优化(让代码更工程化)

上面的代码只是个Demo,实际项目里还得优化,我分享两个常用的:

5.1 封装一个PLC通信服务

用单例模式封装一下,方便在ASP.NET Core或Avalonia UI里调用:

publicclassPlcService{privatestaticPlcService_instance;privatePlc_plc;privatestring_ip="192.168.0.1";privatebool_isConnecting;publicstaticPlcServiceInstance=>_instance??=newPlcService();privatePlcService(){_plc=newPlc(CpuType.S71200,_ip,0,1);}publicboolIsConnected=>_plc.IsConnected;// 断线重连publicasyncTask<bool>ConnectAsync(){if(_isConnecting)returnfalse;_isConnecting=true;try{if(!_plc.IsConnected){awaitTask.Run(()=>_plc.Open());}return_plc.IsConnected;}catch(Exceptionex){Console.WriteLine($"连接失败:{ex.Message}");returnfalse;}finally{_isConnecting=false;}}// 封装读写方法,加上异常处理publicTRead<T>(stringaddress){if(!_plc.IsConnected)thrownewException("PLC未连接");return(T)_plc.Read(address);}publicvoidWrite(stringaddress,objectvalue){if(!_plc.IsConnected)thrownewException("PLC未连接");_plc.Write(address,value);}}

5.2 加上日志

用Serilog记录通信日志,方便排查问题:

// 安装Serilog.AspNetCore和Serilog.Sinks.ConsoleLog.Logger=newLoggerConfiguration().MinimumLevel.Debug().WriteTo.Console().WriteTo.File("logs/plc-.txt",rollingInterval:RollingInterval.Day).CreateLogger();// 在PlcService里用Log.Information()记录连接、读写操作

六、总结

整个流程走下来,最大的感受是.NET跨平台现在真的很成熟了,只要注意Linux下的权限和防火墙问题,双端跑通并不难。

最后给大家几个建议:

  1. 先Windows后Linux:排除平台差异,调试更高效。
  2. PLC设置要仔细:PUT/GET和优化块访问是最容易踩的坑。
  3. Linux权限和防火墙:这两个是跨平台的拦路虎,一定要处理好。

如果大家有问题,欢迎在评论区交流,我会尽量回复。后续我还会写如何把这个通信方案集成到Avalonia跨平台UI里,感兴趣的朋友可以关注一下。

http://www.jsqmd.com/news/395683/

相关文章:

  • 红绿重构:TDD 如何让我写出更好的 Python 代码
  • 隔离的艺术:用 `unittest.mock` 驯服外部依赖,让测试真正可控
  • 2026年2月最新指南:如何找到靠谱的称重混料机源头厂家官方网站 - 2026年企业推荐榜
  • 2026年宁波全屋定制避坑指南:如何找到靠谱的木作源头厂家? - 2026年企业推荐榜
  • 2026年酒店民宿家具优质厂家甄选指南与实力推荐 - 2026年企业推荐榜
  • 2026年上饶青少年心理辅导学校现状与选择指南 - 2026年企业推荐榜
  • 2026年 AI工具这么多应该先学哪一个?
  • 103_Spring AI 干货笔记之可观测性
  • TensorFlow Keras 高级 API:超越 `model.fit()` 的现代深度学习工作流
  • 2026年十二碳醇酯制造厂竞争格局深度解析:五强服务商与选型指南 - 2026年企业推荐榜
  • 102_Spring AI 干货笔记之 Weaviate 向量存储
  • 2026年浙江成品家具采购指南:五大优质厂家深度解析 - 2026年企业推荐榜
  • Qwen3-TTS 是阿里巴巴通义千问团队推出的一系列功能强大的开源语音合成模型
  • 2026办公设计新趋势:如何选择真正顶尖的工作室? - 2026年企业推荐榜
  • 2026年浙江酒店民宿家具厂家口碑深度评测与选择指南 - 2026年企业推荐榜
  • 2026年周口轮胎供应商实力盘点:6家优质企业深度解析 - 2026年企业推荐榜
  • 2026年第一季度,五大优质办公设计施工工作室深度评测与口碑推荐 - 2026年企业推荐榜
  • 2026年工地防护棚制造商综合评测与选购指南 - 2026年企业推荐榜
  • 2026合肥中专择校指南:五大强校深度解析与决策路径 - 2026年企业推荐榜
  • 2026年北京高端全屋净水集成机选购指南与品牌深度解析 - 2026年企业推荐榜
  • 2026年免维护别墅净水系统官方直营品牌综合评析 - 2026年企业推荐榜
  • 2026年卫生间家装门窗实力工厂深度测评与推荐 - 2026年企业推荐榜
  • 2026年安徽钢筋棚专业采购指南与五大厂家深度解析 - 2026年企业推荐榜
  • 2026年江苏卧室家装门窗服务商综合评测与选购指南 - 2026年企业推荐榜
  • 2026年精装房改造服务商综合测评与科学选型指南 - 2026年企业推荐榜
  • 【R语言】单细胞——多样本整合分析(Harmony):从0到1避坑指南(附完整代码)
  • 2026年北京客厅家装门窗品牌综合选购指南 - 2026年企业推荐榜
  • 2026年长沙卤味品牌综合实力榜与选型指南 - 2026年企业推荐榜
  • 2026年上海家装门窗批发商综合实力测评与选择指南 - 2026年企业推荐榜
  • 人工智能应用- 人工智能交叉:07. AlphaFold3