前言
在工业自动化系统中,上位机通常需要与 PLC(可编程逻辑控制器)进行高效稳定的通信,以实现设备状态监控、数据采集和控制指令下发等功能。PLC 控制方式常见包括:一个 PLC 控制一个设备、一个 PLC 控制多个设备、多个 PLC 控制多个设备。为了满足这些复杂场景的需求,上位机也需要具备批量连接、批量读写的能力。
本文将介绍如何使用 S7.NET 库实现 C# 上位机与西门子 PLC 的通信,并提供完整的代码示例,帮助大家快速开发稳定可靠的工业控制系统。
正文
一、项目准备与引用
首先,在你的 C# 项目中引入以下命名空间:
using HslCommunication.Profinet.Siemens;
using HslCommunication;
确保已正确安装 HslCommunication NuGet 包,它是 S7.NET 通信的核心库。
二、建立 PLC 连接
下面是一个封装好的 PLC 连接类,支持不同型号的西门子 PLC(如 S200、S1200、S400),并设置 Rack 和 Slot 参数以匹配实际硬件配置。
初始化连接
public SiemensS7Net siemensTcpNet { get; set; }
string devIP = "192.168.20.107";
int devPort = 102;
bool isOpen;
string plcType = "";
//初始化
public Init(string ip, int port,string type)
{
devIP = ip;
devPort = port;
plcType = type;
}
打开连接
public void TurnOn()
{
try
{
if (isOpen) return;
if (string.IsNullOrEmpty(plcType))
{
siemensTcpNet = new SiemensS7Net(SiemensPLCS.S400, devIP);
}
else
{
if (plcType == "200")
{
siemensTcpNet = new SiemensS7Net(SiemensPLCS.S200, devIP);
siemensTcpNet.Slot = 3;
}
if (plcType == "1200")
{
siemensTcpNet = new SiemensS7Net(SiemensPLCS.S1200, devIP);
siemensTcpNet.Slot = 1;
}
}
siemensTcpNet.Rack = 0;
siemensTcpNet.ConnectTimeOut = 5000;
OperateResult connect = siemensTcpNet.ConnectServer();
if (connect.IsSuccess == false)
{
throw new Exception("plc启动失败" + connect.Message);
}
isOpen = true;
}
catch (Exception ex)
{
isOpen = false;
throw new Exception(ex.Message);
}
}
关闭连接
public void TurnOff()
{
try
{
isOpen = false;
siemensTcpNet.ConnectClose();
siemensTcpNet.Dispose();
}
catch (Exception)
{
}
}
⚠️ 注意:一台上位机最多只能与单个 PLC 建立 8 次连接,因此需合理规划连接资源。
三、PLC 点位读写操作
写入 PLC 数据
支持 float、int、bool 类型的写入操作:
//float类型
public void SendPLCDataComm(string address, float value)
{
try
{
OperateResult result = siemensTcpNet.Write(address, value);
if (result.IsSuccess == false)
{
throw new Exception("写值失败!");
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
//int类型
public void SendPLCDataCommint(string address, int value)
{
try
{
OperateResult result = siemensTcpNet.Write(address, value);
if (result.IsSuccess == false)
{
throw new Exception("写值失败!");
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
//bool类型
public void SendPLCDataCommbool(string address, bool value)
{
try
{
OperateResult result = siemensTcpNet.Write(address, value);
if (result.IsSuccess == false)
{
throw new Exception("写值失败!");
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
读取 PLC 数据
同样支持 float、int、bool 类型的读取操作:
//float类型
public void GetPLCDataComm(string address, out float value)
{
try
{
OperateResult<float> result = siemensTcpNet.ReadFloat(address);
if (result.IsSuccess == false) throw new Exception(result.Message);
value = result.Content;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
//int类型
public void GetPLCDataCommBool(string address, out bool value)
{
try
{
OperateResult<bool> result = siemensTcpNet.ReadBool(address);
if (result.IsSuccess == false) throw new Exception(result.Message);
value = result.Content;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
//bool类型
public void GetPLCDataCommInt(string address, out int value)
{
try
{
OperateResult<int> result = siemensTcpNet.ReadInt32(address);
if (result.IsSuccess == false) throw new Exception(result.Message);
value = result.Content;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
总结
通过本文提供的完整示例代码,可以快速实现基于 S7.NET 的上位机与西门子 PLC 的通信功能。
该方案支持多种 PLC 类型、多点位读写操作,并具备良好的封装性,便于扩展为批量连接与批量读写系统。
在实际工程应用中,建议根据具体需求对连接状态、异常处理、线程安全等进行进一步优化,以提升系统的稳定性与可靠性。
关键词
上位机、PLC、S7.NET、HslCommunication、Siemens、PLC通信、批量连接、批量读写、读写数据、C#、工业自动化、SiemensPLCS、SiemensS7Net、OperateResult、ReadFloat、Write
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。
也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!
作者:上位机李工
出处:mp.weixin.qq.com/s/GaU0dbSDxKeSVEUAquhZBQ
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!