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);
相关推荐
盼哥PyAI实验室18 小时前
纯前端打造个人成长网站:零后端、零部署、零服务器的实践分享
运维·服务器·前端·javascript·echarts·个人开发
信看18 小时前
树莓派 ADS1263 各种库程序
linux·运维·服务器
爱奥尼欧18 小时前
【Linux笔记】网络部分——传输层协议TCP(2)
linux·网络·笔记·tcp/ip
郝学胜-神的一滴18 小时前
QAxios研发笔记(二):在Qt环境下基于Promise风格简化Http的Post请求
开发语言·c++·笔记·qt·网络协议·程序人生·http
敲代码的嘎仔18 小时前
数据结构算法学习day3——二分查找
java·开发语言·数据结构·学习·程序人生·算法·职场和发展
TDengine (老段)18 小时前
TDengine 数学函数 TRUNCATE 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
m5655bj18 小时前
如何使用 Python 转换 Excel 工作表到 PDF 文档
开发语言·c#·excel
鹓于19 小时前
Excel图片批量插入与文件瘦身
java·服务器·数据库
馨谙19 小时前
Linux 安全文件传输完全指南:sftp 与 scp 的深度解析引言
linux·运维·服务器
TDengine (老段)19 小时前
TDengine 数据函数 CORR 用户手册
大数据·数据库·物联网·时序数据库·tdengine·1024程序员节