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);
相关推荐
傻啦嘿哟26 分钟前
代理IP在后端开发中的应用与后端工程师的角色
网络·网络协议·tcp/ip
湫ccc28 分钟前
《Python基础》之字符串格式化输出
开发语言·python
sun00770029 分钟前
ubuntu dpkg 删除安装包
运维·服务器·ubuntu
Red Red30 分钟前
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务
网络·笔记·学习·安全·web安全
向阳12181 小时前
Dubbo HTTP接入之triple协议
网络协议·http·dubbo
oi771 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
mqiqe1 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin1 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python