首页 > 编程语言 >C#基于HSL批量读取三菱PLC地址 反射/数据写入Model实体类

C#基于HSL批量读取三菱PLC地址 反射/数据写入Model实体类

时间:2023-03-01 20:56:39浏览次数:37  
标签:实体类 Console get C# HSL int set using public

using HslCommunication;
using HslCommunication.Profinet.Melsec;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace 批量读取三菱PLC数据
{
    class Program
    {
        private static MelsecMcNet melsec_net = new MelsecMcNet("127.0.0.1", 6000);
        public class MyClass
        {
            public int value1 { get; set; }
            public int value2 { get; set; }
            public int value3 { get; set; }
            public int value4 { get; set; }
            public int value5 { get; set; }
            public int value6 { get; set; }
            public int value7 { get; set; }
            public int value8 { get; set; }
            public int value9 { get; set; }
            public int value10 { get; set; }
        }
        static void Main(string[] args)
        {
            //构建一个实体类
            MyClass myClas = new MyClass();
            //构建一个字典
            Dictionary<string, string> dicPlcAddr = new Dictionary<string, string>()
            {
                ["value1"]="D100",
                ["value2"]="D101",
                ["value3"]="D102",
                ["value4"]="D103",
                ["value5"]="D104",
                ["value6"]="D105",
                ["value7"]="D106",
                ["value8"]="D107",
                ["value9"]="D108",
                ["value10"]="D109"
            };
            OperateResult connect = melsec_net.ConnectServer();
            if (connect.IsSuccess)
            {
                Console.WriteLine("连接成功!");
                //批量读取三菱D100-D109数据
                //读取字节数组
                //D100-D109读取
                byte[] read = melsec_net.Read("D100", 10).Content;
                //写入model
                if (read!=null)
                {
                    SetModelValue<MyClass>("D100", dicPlcAddr, read, ref myClas);
                }
            }
            else
            {
                Console.WriteLine("连接失败!");
            }

            ////输出json
            ///
            Console.WriteLine("----------------------------------");
            Console.WriteLine(JsonConvert.SerializeObject(myClas));
            Console.WriteLine("----------------------------------");
            Console.ReadKey();
        }
        
        public static bool SetModelValue<T>(string StartAddr, Dictionary<string,string> dicPlcAddr, byte[] buff, ref T obj)
        {
            var properties = obj.GetType().GetProperties();
            try
            {
                foreach (var item in properties)
                {
                    if (dicPlcAddr.Keys.Contains(item.Name))
                    {
                        foreach (var plcAddr in dicPlcAddr)
                        {
                            if (plcAddr.Key == item.Name)
                            {
                                string D = StartAddr.Remove(1, StartAddr.Length - 1);
                                int offest = (int.Parse(plcAddr.Value.Replace(D, "")) - int.Parse(StartAddr.Replace(D, ""))) * 2;
                                var val = melsec_net.ByteTransform.TransInt16(buff, offest);
                                Type t = obj.GetType();
                                object v = Convert.ChangeType(val, t.GetProperty(item.Name).PropertyType);
                                t.GetProperty(item.Name).SetValue(obj, v, null);
                            }
                            
                        }
                    }
                }
                
                return true;
            }
            catch
            {
                return false;
            }
        }
    }
}

 

调试输出如下

 

 

标签:实体类,Console,get,C#,HSL,int,set,using,public
From: https://www.cnblogs.com/yun5/p/17169732.html

相关文章

  • scroll-view和swiper的使用
    源码:<template>       <viexclass="out">      <viewclass="box">div</view>    <viewclass="block"></view>    <icontype......
  • AcWing 1562. 微博转发
    微博被称为中文版的Twitter。微博上的用户既可能有很多关注者,也可能关注很多其他用户。因此,形成了一种基于这些关注关系的社交网络。当用户在微博上发布帖子时,他/她的......
  • CF1268C K Integers
    CF1268CKIntegers洛谷:CF1268CKIntegersCodeforces:CF1268CKIntegersProblem给定\(n\)和一个\(1\)至\(n\)这\(n\)个数的排列\(p_1,p_2,p_3,\dots,p_n\)......
  • JavaScript 数组
    <!DOCTYPEhtml><html> <head> <metacharset="UTF-8"> <title></title> <scripttype="text/javascript"> /* *内建对象 *宿主对象 *自定......
  • vscode 配置typescript开发
    今天介绍如何用vscode开发typescript程序,开始前我们需要一点小小的配置:下载vscode,这个就不用说了,下面直接给出链接地址:vscode下载安装node.js.安装typescriptnod......
  • TypeScript 入门1:创建一个在Chrome上运行的TypeScript Demo
    概述目前使用TypeScript编写前端项目已成为趋势,所以搞一个运行在Chrome的demo来方便练习一下TypeScript相关语法。由于技术更新太快,会导致你在网上参考的例子可能已......
  • WGCLOUD的基础使用 - 邮件告警设置说明
    WGCLOUD的邮件告警配置比较简单,不过还是写一下,因为有时候一些细节容易被忽略本文以qq邮箱发送为例说明,邮件告警配置成功后,所有告警通知都会自动发送邮件,如果不想接收邮件了,......
  • 帝国CMS 7.5编辑器从WORD中粘贴过来无法保留格式和图片的解决办法
    1.配置过滤js文件首先打开 \e\admin\ecmseditor\infoeditor\plugins\pastefromword\filter\default.js 在文件的最后部分又如下代码(修改前的代码),也可以搜索CKEDITOR.cle......
  • 【深入浅出 Yarn 架构与实现】4-6 RM 行为探究 - 申请与分配 Container
    本小节介绍应用程序的ApplicationMaster在NodeManager成功启动并向ResourceManager注册后,向ResourceManager请求资源(Container)到获取到资源的整个过程,以及Resourc......
  • Hack the box靶机列表(类似OSCP lab的靶机)
     Linux的靶机列表Windows的靶机列表比OSCP更具挑战性的靶机列表,但值得练习2022年更新的靶机列表 5LamelegacyJeeves[Windows]Backdoor[Linux]  ......