.NET与C#和PLC交互的例子

要读取PLC中指定数据块(DB)内连续的多个字节,可以使用HSLCommunication库的Read方法。这个方法允许你一次性读取多个字节,然后再根据需要解析这些字节。

下面是修改后的代码,示范如何从指定数据块的起始地址读取30个字节的数据:

csharp 复制代码
using System;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
using HslCommunication;
using HslCommunication.Profinet.Siemens;

namespace PLCdemo
{
    public partial class Form1 : Form
    {
        private SiemensS7Net plc;

        public Form1()
        {
            InitializeComponent();
            InitHslCommunication();
        }

        public void InitHslCommunication()
        {
            plc = new SiemensS7Net(SiemensPLCS.S1200, "10.32.58.65");

            // 设置连接超时时间(可选)
            plc.ConnectTimeOut = 3000; // 3秒

            // 启动连接和读写操作
            PlcOperation();
        }

        private void PlcOperation()
        {
            try
            {
                // 连接到PLC
                OperateResult connect = plc.ConnectServer();
                if (connect.IsSuccess)
                {
                    UpdateLabel("连接成功!");

                    // 读取DB50数据块中的连续30个字节
                    OperateResult<byte[]> readResult = plc.Read("DB50.0", 30);
                    if (readResult.IsSuccess)
                    {
                        byte[] data = readResult.Content;
                        string hex = BitConverter.ToString(data);
                        UpdateLabel("读取成功,数据为:" + hex);

                        // 解析特定地址的数据,例如读取DWord
                        uint taskNum = BitConverter.ToUInt32(data, 0);
                        UpdateLabel("任务号为:" + taskNum);

                        // 等待一段时间,便于观察读取结果
                        Thread.Sleep(2000);
                    }
                    else
                    {
                        UpdateLabel("读取失败,原因:" + readResult.Message);
                    }
                }
                else
                {
                    UpdateLabel("连接失败,原因:" + connect.Message);
                }
            }
            catch (Exception ex)
            {
                UpdateLabel("发生异常:" + ex.Message);
            }
            finally
            {
                // 确保连接关闭
                plc.ConnectClose();
                UpdateLabel("已断开与PLC的连接");
            }
        }

        private void UpdateLabel(string message)
        {
            if (InvokeRequired)
            {
                Invoke(new Action<string>(UpdateLabel), message);
            }
            else
            {
                label1.Text = message;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

说明:

  1. 读取数据 :

    使用 plc.Read("DB50.0", 30)DB50 数据块的起始地址读取30个字节的数据。注意这里使用的是"DB50.0"表示数据块DB50的起始地址。

  2. 解析数据 :

    读取到的数据是一个字节数组,可以根据需要进行解析。例如,BitConverter.ToUInt32(data, 0) 用于将前4个字节解析为一个DWord(任务号)。

  3. 显示数据 :

    使用 BitConverter.ToString(data) 将字节数组转换为十六进制字符串,便于显示读取到的原始数据。同时,解析特定地址的数据并显示任务号。

  4. 异常处理和资源释放 :

    finally块中关闭与PLC的连接,并更新界面标签,以确保无论操作成功还是失败,都能正确关闭连接。

这样,你就可以从PLC中读取指定的数据块并解析其中的内容了。

相关推荐
暖馒6 小时前
Modbus应用层协议的深度剖析
网络·网络协议·c#·wpf·智能硬件
刘欣的博客10 小时前
C# CS架构程序发版升级的走数据库方案
c#·单文件升级自己的方式
方见华Richard10 小时前
自指-认知几何架构 可行性边界白皮书(务实版)
人工智能·经验分享·交互·原型模式·空间计算
Yorlen_Zhang11 小时前
Python Tkinter Text 控件完全指南:从基础编辑器到富文本应用
开发语言·python·c#
不绝19111 小时前
C#进阶:预处理指令/反射,Gettype,Typeof/关键类
开发语言·c#
大鹏说大话12 小时前
告别 MSBuild 脚本混乱:用 C# 和 Nuke 构建清晰、可维护的现代化构建系统
开发语言·c#
子春一13 小时前
Flutter for OpenHarmony:绿氧 - 基于Flutter的呼吸训练应用开发实践与身心交互设计
flutter·交互
czhc114007566313 小时前
通信 28
c#
永远是我的最爱15 小时前
基于.NET的小小便利店前台收银系统
前端·sqlserver·.net·visual studio
菜鸟特工00716 小时前
javax.net.ssl.SSLPeerUnverifiedException 异常如何处理
网络协议·.net·ssl