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

相关推荐
hixiong12311 小时前
C# TensorRT部署RF-DETR目标检测&分割模型
人工智能·目标检测·计算机视觉·ai·c#
神仙别闹17 小时前
基于C# 利用工程活动图 AOE 网设计算法
算法·c#·php
游乐码17 小时前
c#迭代器
开发语言·c#
海盗123417 小时前
C# OPC UA客户端开发实战
服务器·开发语言·c#
asdzx6717 小时前
使用 C# 从 URL 下载 Word 文档
开发语言·c#·word
生信之灵17 小时前
追踪17只果蝇、7只线虫、10只小鼠,全程无需人工标注:这个无监督跟踪器如何颠覆动物行为研究?
人工智能·深度学习·神经网络·microsoft·交互
xiaoshuaishuai818 小时前
C# DeepSeek V4 与 V3对比
开发语言·c#·量子计算
游乐码19 小时前
c#特殊语法
开发语言·c#
.NET修仙日记20 小时前
2026 .NET 面试八股文:高频题 + 答案 + 原理(高级核心篇)
面试·职场和发展·c#·.net·.net core·.net 8
唐青枫21 小时前
终于不用手搓两级缓存了!C#.NET HybridCache 详解:L1 L2、标签失效与防击穿实战
c#·.net