.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中读取指定的数据块并解析其中的内容了。

相关推荐
lljss20205 小时前
C# JSON
c#
驾驭人生5 小时前
c#从ftp服务器下载文件读取csv
c#
o0向阳而生0o6 小时前
21、c#中“?”的用途
c#·.net
许泽宇的技术分享6 小时前
MCP协议,.Net 使用示例
.net
棉晗榜6 小时前
Aspose.Words导出word,服务器用内存流处理,不生成磁盘文件
c#·word·aspose.words
哲科软件6 小时前
2025年C#人力外包趋势与价值分析
开发语言·c#
猫霸8 小时前
WPF静态资源StaticResource和动态资源DynamicResource有什么区别,x:Static又是什么意思?
分布式·c#·.net·wpf
云草桑11 小时前
基于.NET后端实现图片搜索图片库 核心是计算上传图片与库中图片的特征向量相似度并排序展示结果
图像处理·microsoft·c#·.net
o0向阳而生0o11 小时前
20、.NET SDK概述
c#·.net
BruceNeter12 小时前
WinDebug查看C#程序运行内存中的数据库连接字符串
c#·windebug