前言
在工业自动化领域,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
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!