C# 的 S7.NET 通讯实现:连接 S7-1200 与 S7-200 SMART PLC

1,596 阅读3分钟

前言

在工业自动化系统中,上位机通常需要与 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

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!