ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

C# 连接西门子 S7-1200 PLC:S7netplus 与 HslCommunication 两种实现(WinForms 读写 DB 块实战)

C# 连接西门子 S7-1200 PLC:S7netplus 与 HslCommunication 两种实现(WinForms 读写 DB 块实战) C# 连接西门子 S7-1200 PLCS7netplus 与 HslCommunication 两种实现WinForms 读写 DB 块实战在 C# 上位机开发中和西门子 PLCS7-1200/1500 等通信是非常常见的需求。相比自己去拼 S7 协议报文社区已经有成熟的开源库可以直接用。本文记录自己用一个 WinForms Demo分别用S7netplusS7.Net和HslCommunication两个库实现对 S7-1200 的连接、读写 DB 数据块、读取 I 点并讲清西门子地址体系、PLC 端通信设置和常见坑。适合第一次做西门子 PLC 通信、有 C# 基础的初学者。一、西门子 S7 通信基础1.1 通信方式西门子 S7-1200/1500 等支持基于以太网的S7 通信ISO-on-TCP默认端口102。上位机作为客户端PLC 作为服务端电脑和 PLC 用网线连接、处于同一网段即可通信不需要额外的通信模块。建立连接时通常需要几个参数CPU 型号如 S7-1200、S7-1500、S7-300IP 地址PLC 的 IP本文为192.168.8.10机架 Rack 和插槽 SlotS7-1200/1500 一般为Rack0、Slot1S7-300 多为 Slot2。1.2 西门子地址体系初学者重点PLC 中的数据按区域和地址访问常见区域区域含义示例IInput输入区接外部输入信号I0.0、IB0、IW0、ID0QOutput输出区驱动外部执行机构Q0.0、QW0MMarker标志位/中间存储区M0.0、MW10、MD20DBData Block数据块用户自定义存储DB50.DBX12.0、DB50.DBD0DB 块地址中紧跟 DB 编号后的字母表示数据宽度标识宽度C# 类型说明DBX1 位bitboolDB50.DBX12.0 字节 12 的第 0 位DBB1 字节8 位byteDB50.DBB4DBW1 字16 位short/ushortDB50.DBW0DBD双字32 位int/floatDB50.DBD0、DB50.DBD8地址最后的数字是字节偏移量。例如DB50.DBD0占字节 0~3DB50.DBD8占字节 8~11中间 4~7 留空。可以把 DB 块类比成 Modbus 里的寄存器区但它支持位、字节、字、双字多种宽度。二、PLC 端与环境准备连不通多半是这里第三方库通过 S7 协议访问 S7-1200需要在博途TIA Portal里做两处关键设置这是初学者最容易忽略、导致连接/读写失败的原因关闭 DB 块的优化的块访问在博途中打开数据块如 DB50→ 属性 → 取消勾选“优化的块访问Optimized block access”这样才能用绝对地址DBD、DBX访问允许 PUT/GET 通信CPU 属性 → 防护与安全Protection→ 连接机制 → 勾选“允许来自伙伴对象的 PUT/GET 通信访问”配置好 PLC 的 IP把程序下载到 PLC并保证电脑和 PLC 在同一网段、能ping 192.168.8.10通。【插图 1西门子 S7-1200 设备运行图】三、方式一使用 S7netplusS7.NetS7netplus 是开源、轻量、纯 C# 的西门子通信库NuGet 包名S7netplus命名空间S7.Net支持异步使用非常简单。先看整个程序的执行流程【插图 3S7netplus 程序流程图】发布时在此插入图片S7netplus程序流程图.png3.1 安装与创建 Plc 对象NuGet 安装S7netplus会自动带上 System.Memory 等依赖。窗体加载时创建Plc对象参数从界面文本框读取usingS7.Net;Plc_plcnull;privatevoidForm1_Load(objectsender,EventArgse){try{// 参数依次为CPU 型号、IP、端口、机架 Rack、插槽 Slot_plcnewPlc(CpuType.S71200,txtIP.Text,// 192.168.8.10int.Parse(txtPort.Text),// 102short.Parse(txtRack.Text),// 0short.Parse(txtSlot.Text));// 1}catch(Exceptionex){MessageBox.Show(ex.Message);}}3.2 连接与断开S7netplus 提供异步连接接口用IsConnected判断状态privateasyncvoidbutton1_Click(objectsender,EventArgse){if(btnConected.Text连接){if(_plcnull)return;try{await_plc.OpenAsync();// 异步打开连接btnConected.Text断开;MessageBox.Show(连接成功);}catch(Exceptionex){btnConected.Text连接;MessageBox.Show($连接失败:{ex.Message});}}else{if(_plc.IsConnected)_plc.Close();// 断开连接btnConected.Text连接;}}3.3 写入数据int / float / boolWrite(地址, 值)会根据 C# 值的类型自动处理。下面对应界面上的三组点灯/灭灯// 第一组写 32 位整数DBD1 点灯、0 灭灯_plc.Write(DB50.DBD0,1);// 点灯_plc.Write(DB50.DBD0,0);// 灭灯// 第二组写 32 位浮点数 Real同样是 DBD注意用 float1.1f 才是 32 位单精度_plc.Write(DB50.DBD8,1.1f);_plc.Write(DB50.DBD8,0.1f);// 第三组写布尔位DBX_plc.Write(DB50.DBX12.0,true);_plc.Write(DB50.DBX12.0,false);注意1.1f后缀f表示 32 位float不带后缀的1.1默认是 64 位double写到 DBD32 位会出错。3.4 读取数据Read(地址)返回object需要按类型强转privatevoidbutton1_Click_1(objectsender,EventArgse){// 读取输入点 I0.0 的状态强转为 boolboolisPush(bool)_plc.Read(I0.0);Console.WriteLine(isPush);}界面上包含 IP/端口/机架/插槽输入框、连接按钮、三组点灯灭灯和一个读取按钮。【插图 2WinForm 程序运行效果图】S7netplus 程序界面连接成功并点灯发布时在此插入截图四、方式二使用 HslCommunicationHslCommunication简称 HSL是功能非常丰富的工业通信库支持西门子、三菱、欧姆龙、Modbus 等大量协议采用统一的OperateResult返回风格。NuGet 安装HslCommunication使用西门子类SiemensS7Net。整个程序的执行流程如下【插图 4HslCommunication 程序流程图】发布时在此插入图片HslCommunication程序流程图.png4.1 创建对象与连接usingHslCommunication;usingHslCommunication.Profinet.Siemens;SiemensS7Nets7null;privatevoidForm1_Load(objectsender,EventArgse){// 指定 PLC 型号与 IP机架插槽有默认值可再设置连接超时s7newSiemensS7Net(SiemensPLCS.S1200,192.168.8.10){ConnectTimeOut5000};}privatevoidbutton5_Click(objectsender,EventArgse){// 连接服务器返回 OperateResult用 IsSuccess 判断是否成功OperateResultresults7.ConnectServer();if(result.IsSuccess)MessageBox.Show(连接成功!!!);elseMessageBox.Show(连接失败!!! result.Message);}4.2 写入与读取HSL 的地址字符串和 S7netplus 基本一致读写方法按类型命名// 写入DBD 写整数点灯写 1、灭灯写 0s7.Write(DB50.DBD0,1);s7.Write(DB50.DBD0,0);// 读取布尔点ReadBool 返回 OperateResultbool实际值在 .Contentboolbool_M100s7.ReadBool(I0.0).Content;Console.WriteLine(bool_M100);HSL 还提供ReadInt16 / ReadFloat / ReadInt32等强类型方法以及Write(DB50.DBD8, 1.1f)写浮点数用法类似。它的读写默认内部会自动建立连接也可以不显式ConnectServer。五、两种方式对比对比项S7netplusS7.NetHslCommunicationNuGet 包S7netplusHslCommunication核心类PlcSiemensS7Net创建参数CPU 型号、IP、端口、Rack、Slot型号、IPRack/Slot 有默认值连接方法OpenAsync()/Close()ConnectServer()也可不显式连接返回值风格直接返回值异常靠抛异常统一OperateResult.IsSuccess/.Content读取写法(bool)_plc.Read(I0.0)s7.ReadBool(I0.0).Content特点轻量、专注西门子、原生异步协议覆盖广、功能多、风格统一适用场景只做西门子、追求轻量项目涉及多品牌 PLC、需要丰富功能两个库都能满足西门子通信需求只对接西门子、想要简单轻量选 S7netplus项目里还要兼容三菱/欧姆龙/Modbus 等多品牌或需要日志、断线重连等丰富能力可以选 HslCommunication。六、常见坑连不上 PLC检查网线、电脑和 PLC 是否同一网段、能否 ping 通、端口是否为 102、Rack/Slot 是否正确S7-1200 为 0/1。能连接但读写 DB 失败/报错DB 块没有取消优化的块访问或 CPU 没勾选允许 PUT/GET 通信。写 float 报错要写 32 位单精度值必须带f1.1f不能用默认的double。地址越界 / 读取错位注意 DBD 占 4 字节、DBW 占 2 字节地址不要重叠偏移量按字节计算。Read 出来转换报错Read返回 object要按地址的真实类型强转DBX→bool、DBD→int/float。改了程序不生效博途改完要重新下载到 PLCDB 地址、编号要和代码一致。HSL 读不到值强类型方法的结果在.Content先判断.IsSuccess失败看.Message。练习代码的健壮性正式项目可补充异常捕获、连接断开检测与重连并把 IP 等参数放到配置文件本 Demo 以跑通功能为主。七、小结本文用两个 WinForms 程序演示了 C# 连接西门子 S7-1200 的两种主流方式先理解 S7 通信端口 102、Rack/Slot和地址体系I/Q/M/DBDBX/DBB/DBW/DBD 对应位/字节/字/双字PLC 端要在博途中取消 DB 块优化的块访问、允许 PUT/GET并和电脑同网段S7netplusnew Plc(...)→OpenAsync→Read/Write轻量、原生异步HslCommunicationnew SiemensS7Net(...)→ConnectServer→ReadXxx/Write统一OperateResult风格、协议覆盖广。掌握这套流程后读写 PLC 的 DB 块、I/Q/M 点就能轻松实现。建议对照本文代码接一台真实 S7-1200或使用 PLC 仿真 网络调试亲手跑一遍。
返回列表