C#——使用S7netplus包实现西门子s7协议

使用S7netplus包实现西门子s7协议

S7netplus是一个用于与Siemens S7 PLC进行通信的C#库。它提供了一种简单的方式来读取和写入PLC中的数据。

安装

可以通过NuGet包管理器来安装。

S7netplus的使用

一、连接
cs 复制代码
// CpuType:PLC的CPU型号,咱用的这个设备1200 西门子1212C
// ip:PLC的ip地址
// rack:机台号的位置(plc知识)
// slot:插槽号的位置(plc知识)
// public Plc(CpuType cpu, string ip, short rack, short slot)
Plc plc = new Plc(CpuType.S71200, "192.168.102.202", 0, 1);
try { 
    // 打开连接
    myPlc.Open();
    // 是否连接成功
    Console.WriteLine(myPlc.IsConnected);
    if (myPlc.IsConnected)
    {
        MessageBox.Show("打开连接成功");
    }
} 
catch(Exception ex)
{
    MessageBox.Show("打开失败:" + ex.Message);
}
二、断开plc
cs 复制代码
    if (myPlc != null && myPlc.IsConnected)
    {
      myPlc.Close();
    }
    else
    {
      MessageBox.Show("请先连接PLC");
    }
三、数据写入和读取
cs 复制代码
    // public void Write(string variable, object value)
    // variable:PLC具体写入变量的名称("DB1.DBX0.0", "DB20.DBD200", "MB20", "T45", etc)
    // value:写入的具体的值
    
    // 写
    plc.Write("M10.1", True);  // 写入布尔值
    // 读
    plc.Read("M10.1");
四、实例
cs 复制代码
using S7.Net;
 
class Program
{
    static void Main()
    {
        // 创建plc对象
        // 所连接的西门子设备是s7-1200
        // 参数1: cpu类型 , 参数2: ip地址 , 参数3: 机架号 , 参数4: 插槽号
        var plc = new Plc(CpuType.S7300, "192.168.1.10", 0, 2); // 创建一个Plc实例
 
        try
        {
            plc.Open(); // 打开连接
 
            if (plc.IsConnected)
            {
                ushort data = (ushort)plc.Read("DB1.DBW10"); // 从DB1块的DBW10地址读取一个字
                Console.WriteLine($"Original value: {data}");
 
                plc.Write("DB1.DBW10", (ushort)1234); // 写入一个新的值到DB1块的DBW10地址
                data = (ushort)plc.Read("DB1.DBW10"); // 再次读取确认写入
                Console.WriteLine($"New value: {data}");
            }
        }
        catch (Exception e)
        {
            Console.WriteLine($"An error occurred: {e.Message}");
        }
        finally
        {
            if (plc.IsConnected)
            {
                plc.Close(); // 关闭连接
            }
        }
    }
}

不同类型数据的读取示例

cs 复制代码
    Console.WriteLine("--------------bool-------------------");
    // 位读取,也就是读取布尔值
    bool b = (bool)plc.Read("DB21.DBX0.0");
    Console.WriteLine(b);
    b = (bool)plc.Read("DB21.DBX0.1");
    Console.WriteLine(b);
    // 参数:区域类型,db块编号,开始读取字节位置,读取数据类型,读取个数,[位地址]
    var ab = plc.Read(DataType.DataBlock, 21, 0, VarType.Bit, 4,1);
    Console.WriteLine(ab);
    
    Console.WriteLine("--------------byte-------------------");
    byte b1 = (byte)plc.Read("DB21.DBB1");
    Console.WriteLine(b1);
    b1 = (byte)plc.Read(DataType.DataBlock, 21, 1, VarType.Byte, 1);
    Console.WriteLine(b1);
    
    Console.WriteLine("--------------word-------------------");
    ushort us1 = (ushort)plc.Read("DB21.DBW2");
    Console.WriteLine(us1);
    us1 = (ushort)plc.Read(DataType.DataBlock, 21, 2, VarType.Word, 1);
    Console.WriteLine(us1);
    
    Console.WriteLine("--------------DWord-------------------");
    uint i1 = (uint)plc.Read("DB21.DBD4");
    Console.WriteLine(i1);
    i1 = (uint)plc.Read(DataType.DataBlock, 21, 4, VarType.DWord, 1);
    Console.WriteLine(i1);
    
    
    Console.WriteLine("--------------USInt-------------------");
    b1 = (byte)plc.Read("DB21.DBB1");
    Console.WriteLine(b1);
    b1 = (byte)plc.Read("DB21.DBB8");
    Console.WriteLine(b1);
    b1 = (byte)plc.Read(DataType.DataBlock, 21, 8, VarType.Byte, 1);
    Console.WriteLine(b1);
    
    Console.WriteLine("--------------SInt-------------------");
    sbyte b2 = (sbyte)(byte)plc.Read("DB21.DBB9");
    Console.WriteLine(b2);
    b2 = (sbyte)(byte)plc.Read(DataType.DataBlock, 21, 9, VarType.Byte, 1);
    Console.WriteLine(b2);
    
    
    Console.WriteLine("--------------UInt-------------------");
    ushort us = (ushort)plc.Read("DB21.DBW10");
    Console.WriteLine(us);
    us = (ushort)plc.Read(DataType.DataBlock, 21, 10, VarType.Word, 1);
    Console.WriteLine(us);
    
    Console.WriteLine("--------------Int-------------------");
    short s = (short)(ushort)plc.Read("DB21.DBW12");
    Console.WriteLine(s);
    
    
    Console.WriteLine("--------------UDInt-------------------");
    uint ui = (uint)plc.Read("DB21.DBD14");
    Console.WriteLine(ui);
    ui = (uint)plc.Read(DataType.DataBlock, 21, 14, VarType.DWord, 1);
    Console.WriteLine(ui);
    
    Console.WriteLine("--------------DInt-------------------");
    int i = (int)(uint)plc.Read("DB21.DBD18");
    Console.WriteLine(i);
    i = (int)plc.Read(DataType.DataBlock, 21, 18, VarType.DInt, 1);
    Console.WriteLine(i);
    
    
    Console.WriteLine("--------------Real-------------------");
    float f = ((uint)plc.Read("DB21.DBD22")).ConvertToFloat();
    Console.WriteLine(f);
    f = (float)plc.Read(DataType.DataBlock, 21, 22, VarType.Real, 1);
    Console.WriteLine(f);
    
    
    Console.WriteLine("--------------LReal-------------------");
    double d = (double)plc.Read(DataType.DataBlock, 21, 26, VarType.LReal,1);
    Console.WriteLine(d);
    
    
    Console.WriteLine("--------------DateTime-------------------");
    DateTime t = (DateTime)plc.Read(DataType.DataBlock, 21, 44, VarType.DateTimeLong, 1);
    Console.WriteLine(t);
相关推荐
无限进步_3 分钟前
【Linux】GDB 调试:定位问题的利器
linux·运维·服务器
iCxhust3 分钟前
C# 程序,实现二进制文件十六进制查看器,支持按行定位
开发语言·单片机·嵌入式硬件·c#·微机原理·8086最小系统·8088单板机
翼龙云_cloud4 分钟前
云服务器代理商:2026 年云计算趋势 AI 算力需求激增下的云服务器选择
服务器·人工智能·云计算·ai智能体
填满你的记忆5 分钟前
《为什么 MySQL 不适合做 AI 检索?》
数据库·人工智能·mysql·ai·向量数据库
map1e_zjc6 分钟前
Redis入门笔记
数据库·redis·缓存
咕噜企业签名分发-淼淼9 分钟前
浅谈云服务器在后端托管与签名分发场景中的应用价值
开发语言·php
在繁华处11 分钟前
Java从零到熟练(八):泛型与注解
java·开发语言·python
SilentSamsara12 分钟前
命令行工具开发:Click/Typer + 打包为独立二进制
linux·服务器·开发语言·前端·python·青少年编程·fastapi
Ulyanov13 分钟前
深入QML滑块与进度控制:构建动态数据可视化界面:QML+PySide6现代开发入门(六)
开发语言·python·算法·ui·信息可视化·雷达电子对抗仿真
zyl8372114 分钟前
Python 函数、模块、异常处理 超详细入门教程
开发语言·windows·python