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);
相关推荐
低头不见24 分钟前
tcp的粘包拆包问题,如何解决?
网络·网络协议·tcp/ip
我命由我1234526 分钟前
Spring Boot 自定义日志打印(日志级别、logback-spring.xml 文件、自定义日志打印解读)
java·开发语言·jvm·spring boot·spring·java-ee·logback
lilye6627 分钟前
程序化广告行业(55/89):DMP与DSP对接及数据统计原理剖析
java·服务器·前端
徐小黑ACG1 小时前
GO语言 使用protobuf
开发语言·后端·golang·protobuf
SKYDROID云卓小助手1 小时前
三轴云台之相机技术篇
运维·服务器·网络·数码相机·音视频
0白露2 小时前
Apifox Helper 与 Swagger3 区别
开发语言
Tanecious.3 小时前
机器视觉--python基础语法
开发语言·python
叠叠乐3 小时前
rust Send Sync 以及对象安全和对象不安全
开发语言·安全·rust
·薯条大王3 小时前
MySQL联合查询
数据库·mysql
yuzhangfeng4 小时前
【云计算物理网络】从传统网络到SDN:云计算的网络演进之路
网络·云计算