和PLC对配置的繁琐工序

news/2024/11/16 11:32:12/文章来源:https://www.cnblogs.com/guchen33/p/18411382

上位机开发最烦和PLC对轴的位置,点的位置,一大堆的手写工序,数据不是放在Excel表,就是放在txt或者ini
图1.
image
图2
image
这次的需求
我需要手动将图1的数据写到图2
太麻烦
所以我准备写一个工具实现它
首先,我打算生成图2,需要使用到XML反序列化,读取图1,我使用MiniExcel
所以我先准备三个类

// 用于标记根元素
[XmlRoot("AxisPositionGroupItem")]
public class AxisPositionGroupItem
{// 使用XmlAttributeAttribute标记属性为XML属性[XmlAttribute("GroupName")]public string GroupName { get; set; }// 使用XmlElementAttribute标记属性为XML元素[XmlElement("AxisPositionItem")]public AxisPositionItem[] AxisPositionItems { get; set; }
}// 用于标记AxisPositionItem元素
public class AxisPositionItem
{[XmlAttribute("Label")]public string Label { get; set; }[XmlAttribute("AxisName")]public string AxisName { get; set; }[XmlAttribute("AxisId")]public string AxisId { get; set; } = "45";[XmlAttribute("AxisType")]public string AxisType { get; set; } = "PLC";[XmlAttribute("GroupName")]public string GroupName { get; set; }[XmlAttribute("Value")]public string Value { get; set; } = "68";[XmlAttribute("Speed")]public string Speed { get; set; } = "20";[XmlAttribute("SpeedDescription")]public string SpeedDescription { get; set; }=string.Empty;[XmlAttribute("PosIndex")]public int PosIndex { get; set; }
}public class AxisConfig{[ExcelColumnName("轴号")]public string AxisNumber { get; set; }[ExcelColumnName("轴名称")]public string AxisName { get; set; }[ExcelColumnName("功能名称")]public string FunctionName { get; set; }[ExcelColumnName("位置")]public string Position { get; set; }}

然后先获取Excel表格的数据

 public class MiNiHelper{public static List<AxisConfig> ReadExcel(){var config = new OpenXmlConfiguration(){FillMergedCells = true};string path = "xxxxxx";var lists=MiniExcel.Query<AxisConfig>(path,"MotionParaInfo", configuration: config).ToList();var newList=lists.Where(x => x.Position != null).Where(y => y.AxisName != null).Where(z => z.FunctionName != null).ToList();return newList;}}

注意Where不能写在var lists=MiniExcel.Query(path,"MotionParaInfo", configuration: config).ToList();内部,因为MiniExcel会告诉你AxisConfig没有实例化,所有分开写
接下来,我们准备前端界面,看看效果

 <Grid><ListView Margin="20" ItemsSource="{Binding DataList}"><ListView.View><GridView><GridViewColumnWidth="80"DisplayMemberBinding="{Binding AxisNumber}"Header="轴号" /><GridViewColumnWidth="180"DisplayMemberBinding="{Binding AxisName}"Header="轴名称" /><GridViewColumnWidth="280"DisplayMemberBinding="{Binding FunctionName}"Header="功能名称" /><GridViewColumnWidth="280"DisplayMemberBinding="{Binding Position}"Header="位置" /></GridView></ListView.View></ListView></Grid>

ViewModel代码

  private ObservableCollection<AxisConfig> _dataList;public ObservableCollection<AxisConfig> DataList{get { return _dataList; }set { SetProperty(ref _dataList, value); }}DataList= MiNiHelper.ReadExcel().ToObservableCollection();

image
可以看到界面已经有了数据,说明我们成功了第一步。
现在我们测试一下,本地的XML生成

 public class XMLHelper{public static void WriteMemory(){XmlSerializer serializer = new XmlSerializer(typeof(AxisPositionGroupItem));using (StringWriter writer = new StringWriter()){AxisPositionGroupItem groupItem = new AxisPositionGroupItem{GroupName = "UnLoad",AxisPositionItems = new AxisPositionItem[]{new AxisPositionItem{Label = "待机(安全)位置",AxisName = "ULD_TurnZ",AxisType = "PLC",GroupName = "ULD_TurnZ",SpeedDescription = "",PosIndex = "1"},// 其他 AxisPositionItem 对象...}};serializer.Serialize(writer, groupItem);string xml = writer.ToString();}}
}

然后将数据传递过去,修改WriteLocal

/// <summary>
/// 使用MiniExcel读取的数据
/// </summary>
/// <param name="axisConfigs"></param>
public static void WriteLocal(List<AxisConfig> axisConfigs)
{XmlSerializer serializer = new XmlSerializer(typeof(AxisPositionGroupItem));// 创建 AxisPositionGroupItem 对象AxisPositionGroupItem groupItem = new AxisPositionGroupItem{GroupName = "UnLoad",AxisPositionItems = axisConfigs.Select(config => new AxisPositionItem{Label = config.FunctionName,AxisName = config.AxisName,GroupName = config.AxisName, // 假设 AxisName 和 GroupName 保持一致AxisId = "45", // 如果轴号是固定的,可以直接赋值AxisType = "PLC",Value = "68", // 如果 Value 是固定的,可以直接赋值Speed = "20", // 如果 Speed 是固定的,可以直接赋值SpeedDescription = string.Empty, // 如果 SpeedDescription 没有值,可以直接赋值PosIndex = ExtractPosIndex(config.Position) // 假设轴号是整数,并且对应 PosIndex}).ToArray()};// 使用 StringWriter 来序列化对象using (StringWriter writer = new StringWriter()){serializer.Serialize(writer, groupItem);string xml = writer.ToString();// 指定要保存的文件路径string filePath = @"E:\CSharp Project\自定义习题\反序列化XML\file.xml";// 使用 StreamWriter 将字符串写入文件using (StreamWriter fileWriter = new StreamWriter(filePath)){fileWriter.Write(xml);}Console.WriteLine("XML has been saved to " + filePath);}
}
public static string ExtractPosIndex(string axisPosition)
{// 使用LINQ删除中括号并获取最后一个字符string lastString = new string(axisPosition.Where(c => c != '[' && c != ']').ToArray()).LastOrDefault().ToString();//   string last = axisPosition.Replace("[", "").Replace("]", "");// 获取最后一个字符// string lastString = last[last.Length - 1].ToString();return lastString;throw new ArgumentException("无法从轴位置字符串中提取PosIndex。");
}

接下来修改ViewModel代码

 public MainViewModel(){Init();}private void Init(){DataList= MiNiHelper.ReadExcel().ToObservableCollection();var axisConfigs=MiNiHelper.ReadExcel();XMLHelper.WriteLocal(axisConfigs);}

完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/796299.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis入门 - C#|.NET Core封装Nuget包

分享封装Redis C#库并打包成Nuget包的方法,旨在增强代码可测试性、解耦及扩展Redis功能。通过封装Redis客户端库,提供统一接口,便于测试、替换和扩展功能,同时支持依赖注入,简化配置和使用。经过前面章节的学习,可以说大家已经算Redis开发入门了。已经可以去到项目上磨砺…

vue3项目部署到Github

此教程适应于以webpack,vue-cli,vite等脚手架构建的vue项目。当然,vue2和vue3都是可以滴。1. 前提:你的代码库已经提交到Github上 如果没有的话,请到GitHub上新建仓库,并把你本地的项目提交到GitHub上新建的仓库里。 具体方法,可以参考我的博客 Git使用记录 - 持续更新 …

[极客大挑战 2019]LoveSQL 1

启动靶机作者不建议使用sqlmap我们这里就进行手工注入 用万能口令登录 admin or 1 =1# ,详情见上文(https://www.cnblogs.com/m1saka1/p/18411197) 登录成功获得用户名和密码,发现密码并没有卵用,只能换思路利用账号密码的回显页面进行sql注入爆破数据库 由于网站自动转义,…

Go日志管理库zap

一、zap介绍 在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 1.能够将事件记录到文件中,而不是应用程序控制台。 2.日志切割-能够根据文件大小、时间或间隔等来切割日志文件。 3.支持不同的日志级别。例如INFO,DEBUG,ERROR等。 4.能够打印基本信息,…

深度神经网络DNN、RNN、RCNN及多种机器学习金融交易策略研究|附数据代码

全文链接:https://tecdat.cn/?p=37668 原文出处:拓端数据部落公众号 分析师:Aijun Zhang 在当今的金融领域,量化交易正凭借其科学性和高效性逐渐成为主流投资方式之一。随着大数据技术的蓬勃发展,量化交易借助先进的数学模型和计算机分析能力,摒弃了人的主观判断,通过…

第一次个人作业

这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 实现论文查重算法,并对代码进行性能分析、单元测试,使用PSP表GitHub链接 一、PSP表PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)Planning 计划 15 20Estimate 估…

mybatis exists 中使用代替in关键字

使用场景,in适合数据量小的时候,exists适合数据量大的时候。<if test="torqueRecordPageDTO.vinList != null and torqueRecordPageDTO.vinList.size >0">and exists (select 1 from (<foreach collection="torqueRecordPageDTO.vinList" it…

图与网络——TSP问题精解

旅行商问题(Travelling Salesman Problem, TSP)是组合优化领域中的经典问题之一。TSP的概念最早可以追溯到18世纪,瑞士数学家欧拉在解决柯尼斯堡七桥问题时首次提出了关于图中遍历的问题。不过,作为一个优化问题,TSP在19世纪才开始形成系统的研究。1920年代,TSP被德国数学…

[NLP/AIGC] 大语言模型:零一万物

1 概述:零一万物 - 首款开源中英双语大模型 公司背景公司名称:零一万物(01.AI) 创始人:李开复博士(知名投资人、创新工场董事长兼CEO)产品介绍产品名称:Yi 系列大模型Yi-6B:数据参数量为60亿的双语(英文/中文)开源模型 Yi-34B:数据参数量为340亿的双语(英文/中文)…

jackson 原生反序列化触发 getter 方法

jackson 原生反序列化触发 getter 方法jackson的POJONode方法可以任意调用getterjackson序列化会任意调用getter分析 jackson 序列化会调用任意 getter 方法,jackson 反序列化也会任意调用 getter ,这两个都不需要多说什么了,在前面的 jackson 反序列化中的 TemplatesImpl 链…

urllib发送get请求_中文传参问题

GET请求是HTTP协议中的一种基本方法,当需要在GET请求中传递中文参数时需要额外对中文进行编码(英文不需要),因为url中只能包含ascii字符。 可以使用urllib.parser.urlencode()或urllib.parse.quote()方法对中文转码。 详细查官方文档: https://docs.python.org/3.12/libra…

jackson 反序列化学习

jackson 反序列化学习 jackson 介绍 Jackson 是一个用于处理 JSON 数据的开源 Java 库。Spring MVC 的默认 json 解析器便是 Jackson。 Jackson 优点很多。 Jackson 所依赖的 jar 包较少,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比…