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

相关推荐
该用户已不存在4 分钟前
6个值得收藏的.NET ORM 框架
前端·后端·.net
小码编匠5 小时前
WPF 中的高级交互通过右键拖动实现图像灵活缩放
后端·c#·.net
追逐时光者5 小时前
一个基于 .NET 开源、简易、轻量级的进销存管理系统
后端·.net
唐青枫12 小时前
C#.NET 定时任务与队列利器:Hangfire 完整教程
c#·.net
hez201018 小时前
Runtime Async - 步入高性能异步时代
c#·.net·.net core·clr
追逐时光者1 天前
.NET Fiddle:一个方便易用的在线.NET代码编辑工具
后端·.net
mudtools1 天前
.NET驾驭Word之力:玩转文本与格式
c#·.net
唐青枫1 天前
C#.NET 数据库开发提速秘籍:SqlSugar 实战详解
c#·.net
追逐时光者2 天前
精选 4 款基于 .NET 开源、功能强大的 Windows 系统优化工具
后端·.net
mudtools2 天前
.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)
c#·.net