工业自动化开发必备:C# 使用 Sharp7 与 PLC 通讯详解

1,233 阅读4分钟

前言

在工业自动化领域,PLC(可编程逻辑控制器)是实现设备控制和数据采集的核心设备。西门子 S7 系列 PLC 由于其稳定性与广泛性,被大量应用于各类工程项目中。Sharp7 是一个基于 C# 的开源库,专为 .NET 开发者设计,用于与西门子 S7 系列 PLC 进行高效通信。

本文将详细介绍如何使用 Sharp7 实现对西门子 PLC 的连接、数据读取与写入操作,并提供多个完整示例代码,帮助大家快速上手并集成到实际项目中。

正文

一、Sharp7 简介

Sharp7 是由 Daniel Molteni 开发的开源通讯库,实现了西门子 S7 协议的核心功能,支持多种型号的 PLC,包括 S7-300、S7-400、S7-1200 和 S7-1500 等。该库轻量级、跨平台、易于使用,适合需要进行工业设备通信的 C# 开发者。

主要特性:

  • 支持 DB 块、输入输出点、标志位等数据读写。

  • 提供数据类型转换方法(如 Int、Real、Bit 等)。

  • 支持同步通信方式,适用于桌面应用和后台服务。

GitHub 地址:

https://github.com/fbarresi/Sharp7

二、环境搭建

您可以选择以下任意一种方式获取 Sharp7 库:

  • 从 GitHub 下载源码编译

  • 通过 NuGet 安装(推荐)

NuGet 包名称:Sharp7

三、与 PLC 建立连接

在进行数据交互之前,首先需要创建 S7Client 实例,并连接到目标 PLC。

1. 创建 S7Client 实例

// 创建 S7Client 实例
S7Client client = new S7Client();

2. 连接到 PLC

static void Main(string[] args)
{
    S7Client client = new S7Client();
    string ip = "127.0.0.1";
    int rack = 0; // 机架号,一般为0
    int slot = 0; // 槽号,对于 S7-1200/1500 通常为 0,S7-300/400 通常为 2
    
    // 设置端口号(默认为 102)
    client.PLCPort = 102;
    
    int result = client.ConnectTo(ip, rack, slot);
    
    if (result == 0)
    {
        Console.WriteLine("连接成功!");
    }
    else
    {
        Console.WriteLine($"连接失败,错误代码:{result}");
    }
}

四、读取 PLC 数据

1、读取字节数据

从 DB1 数据块中读取 10 个字节的数据:

byte[] buffer = new byte[10];
int dbNumber = 1; // 数据块编号
int start = 0;    // 起始地址
int size = 10;    // 读取长度

int result = client.DBRead(dbNumber, start, size, buffer);

if (result == 0)
{
    Console.WriteLine("数据读取成功!");
}
else
{
    Console.WriteLine($"数据读取失败,错误代码:{result}");
}

2、转换数据类型

将字节数组转换为具体的数据类型:

// 假设 buffer 中存储了一个 Int32 和一个 Real(Float)
int intValue = S7.GetIntAt(buffer, 0);
float floatValue = S7.GetRealAt(buffer, 4);

Console.WriteLine($"整数值:{intValue}");
Console.WriteLine($"浮点值:{floatValue}");

五、写入 PLC 数据

写入 DB 块数据

向 DB1 写入一个 Int32 和一个 Float:

byte[] buffer = new byte[6];

// 写入 Int32 到偏移 0
S7.SetIntAt(buffer, 0, 1234);

// 写入 Float 到偏移 2
S7.SetRealAt(buffer, 2, 56.78f);

int dbNumber = 1;
int start = 0;
int size = 6;

int result = client.DBWrite(dbNumber, start, size, buffer);

if (result == 0)
{
    Console.WriteLine("数据写入成功!");
}
else
{
    Console.WriteLine($"数据写入失败,错误代码:{result}");
}

M 点写入(Merkel 寄存器)

写入两个 Bit 类型数据到 M 区:

byte[] buffer = new byte[2];

// 设置要写入的数据
S7.SetBitAt(buffer, 0, 0, true);   // 第一个字节第 0 位
S7.SetBitAt(buffer, 0, 1, true);   // 第一个字节第 1 位

int start = 0;
int size = 2;

client.MBWrite(start, size, buffer);

总结

通过本文的介绍,我们了解了 Sharp7 这款强大的开源库的基本功能,并掌握了如何使用它与西门子 S7 系列 PLC 进行连接、读取和写入数据的操作。无论是读取 DB 块中的结构化数据,还是写入单个 Bit,Sharp7 都提供了简洁易用的 API 接口。

如果正在开发一个基于 C# 的工控项目,或者希望快速实现与西门子 PLC 的通信功能,那么 Sharp7 将是一个非常值得尝试的选择。

完整示例代码可以点击 这里 获取。

关键词

Sharp7、西门子PLC、S7协议、C#、数据读取、数据写入、DB块、M点、S7Client、Int、Real、Bit、PLC通信、工业自动化、数据转换、库使用、开源库、连接PLC、示例代码、数据采集、控制指令

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

作者:技术老小子

出处:mp.weixin.qq.com/s/VVnaVmDK6TVnfrJ8Ne2Czg

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