首页 » 软件开发 » 上位机项目开发过程实录(1)(上位项目变量注塑机开发)

上位机项目开发过程实录(1)(上位项目变量注塑机开发)

萌界大人物 2024-07-24 13:53:00 0

扫一扫用手机浏览

文章目录 [+]

这套C#上位机项目实例有别于一些上位机Demo,它的最主要不同点是工程级别的应用。
作为工程级项目,它尤其注重稳定性和开发效率。
工业领域的应用,稳定性高于一切,无需多言。
其次是开发效率,因为开发效率的高低直接影响项目成本,所以高效率的开发对降低项目成本尤为重要。

重构后的项目实例在框架结构上做了优化,我们完全可以把它作为一个上位机模板来使用。
基于这套上位机项目模板,修修改改就可以完成一个上位机项目。
最近手头正好有一个这样的上位机项目,想着可以测试一下重构后的这套项目模板的实战能力,所以我们准备基于它来开发。

项目介绍

本项目是一个物料输送系统。
控制系统核心是两台S7-1200系列PLC。
人机界面是一台触摸式的工控一体机。
点数大概有2000点左右。

上位机项目开发过程实录(1)(上位项目变量注塑机开发) 软件开发
(图片来自网络侵删)

本项目我们将以重构后的C#上位机项目实例作为模板进行修改,以一个实际的上位机项目开发过程来检验它的开发效率。

开发过程-驱动部分

作为一个上位机,最基础也是最重要的部分就是通信驱动了。
在我们的C#上位机项目模板中,设备通信是作为后台独立运行的。
前端页面通过变量名称和PLC进行数据交互。
通信过程是封装好的,且开放的。
我们在开发时不需要关注通信细节,只需要根据物理PLC数据进行实例化,然后创建变量即可。

具体修改过程非常简单,首先我们根据实际的物理PLC数量进行声明和初始化。

//根据物理PLC数量声明变量,该项目一共2台PLCstatic S7PLC PLC1 = null;static S7PLC PLC2 = null;///<summary>///初始化PLC///</summary>public static void Initial(){ //往变量池中添加变量 AddTagsPLC1(); AddTagsPLC2(); //初始化1#PLC PLC1 = newS7PLC("192.168.0.11",0,1); //订阅事件 PLC1.StatusChanged += PLC1_StatusChanged; PLC1.DataUpdate += PLC1_DataUpdate; //读写信息 ByteList1(PLC1); PLC1.WriteTagsList = TagsPLC1; //通信启动 PLC1.Start(); //初始化2#PLC PLC2 = newS7PLC("192.168.0.12", 0, 1); //订阅事件 PLC2.StatusChanged += PLC2_StatusChanged; PLC2.DataUpdate += PLC2_DataUpdate; //读写信息 ByteList2(PLC2); PLC2.WriteTagsList = TagsPLC2; //通信启动 PLC2.Start();}

然后我们根据每台PLC需要访问的数据往PLC实例里面添加变量。

/// <summary>/// 添加变量/1#PLC/// </summary>private static void AddTagsPLC1(){ TagsPLC1.Add("A区注塑机料位1", new TagModel() { Address = "D1.0.0" }); TagsPLC1.Add("A区注塑机料位2", new TagModel() { Address = "D1.0.1" }); TagsPLC1.Add("A区注塑机料位3", new TagModel() { Address = "D1.0.2" }); TagsPLC1.Add("A区注塑机料位4", new TagModel() { Address = "D1.0.3" }); TagsPLC1.Add("A区注塑机料位5", new TagModel() { Address = "D1.0.4" }); TagsPLC1.Add("A区注塑机料位6", new TagModel() { Address = "D1.0.5" }); TagsPLC1.Add("A区注塑机料位7", new TagModel() { Address = "D1.0.6" }); TagsPLC1.Add("A区注塑机料位8", new TagModel() { Address = "D1.0.7" }); //…… //变量比较多,这里就不全面贴出来了。
}

同样的方法为2#PLC添加变量。
再根据变量情况设置需要请求的报文信息。

private static void ByteList2(S7PLC mdb) { ReadMsg msg = new ReadMsg(); msg.Id = "1"; msg.RgstArea = 0x84; msg.DBNumber = 1; msg.StartAddress = 0; msg.Count = 9000; mdb.ReadMsgList.Add(msg); }

最后一步是更新数据,我们需要将驱动返回的报文解析并绑定到相应的变量。
数据更新方法由PLC驱动的数据更新事件进行触发。

///<summary>///解析数据///</summary>///<param name="Data"></param>private static void AnalyzeDataPLC1(Dictionary<string, int[]> Data){ Byte[] DataArray = Array.ConvertAll(Data["1"], val => checked((Byte)val)); TagsPLC1["A区注塑机料位1"].Value1 = Sharp7.S7.GetBitAt(DataArray, 0, 0); TagsPLC1["A区注塑机料位2"].Value1 = Sharp7.S7.GetBitAt(DataArray, 0, 1); TagsPLC1["A区注塑机料位3"].Value1 = Sharp7.S7.GetBitAt(DataArray, 0, 2); TagsPLC1["A区注塑机料位4"].Value1 = Sharp7.S7.GetBitAt(DataArray, 0, 3); TagsPLC1["A区注塑机料位5"].Value1 = Sharp7.S7.GetBitAt(DataArray, 0, 4); TagsPLC1["A区注塑机料位6"].Value1 = Sharp7.S7.GetBitAt(DataArray, 0, 5); TagsPLC1["A区注塑机料位7"].Value1 = Sharp7.S7.GetBitAt(DataArray, 0, 6); TagsPLC1["A区注塑机料位7"].Value1 = Sharp7.S7.GetBitAt(DataArray, 0, 7); //…… //变量比较多,这里就不全面贴出来了。
}

只需要上述简单的几步即可完成上位机软件和设备的数据交互。
根据实测时间,一天不到的时间就完成了两台PLC共约2000点的变量配置。
除了支持批量导入PLC变量的WinCC外,对于一些不支持变量导入的组态软件,在配置这么多变量的时间花费上估计也是相差无几。
如果采用我们的支持变量自动解析的AdvScadaFramework高级上位机框架软件则可以在更短的时间内完成。

变量添加完成后,我们在需要展示的窗体定时刷新就可以了。
这种方式比较简单方便。
当然也可以采用基于变量名的绑定方式。
这两种方式的工作量其实差不多。

开发过程-周期归档

周期归档的数据一般用于曲线或者生成报表。
该上位机项目模板对于归档的处理也很简单。
首先我们新建一个实体类。
该实体类包含了需要归档的所有成员。

public class ArchiveModel{ [SugarColumn(IsPrimaryKey = true)] public DateTime DT { get; set; } public double TotalWeight1 { get; set; } public double TotalWeight2 { get; set; } public double TotalWeight3 { get; set; } public double TotalWeight4 { get; set; } public double TotalWeight5 { get; set; } public double TotalWeight6 { get; set; } public double TotalWeight7 { get; set; } public double TotalWeight8 { get; set; } public double TotalWeight9 { get; set; } public double TotalWeight10 { get; set; }}

归档是由一个单独的后台任务负责的。
我们把里面的代码稍微调整下就可以了。

public static void PowerArchive(){ while (true) { //控制归档周期 Thread.Sleep(2000); try { ArchiveModel am = new ArchiveModel(); am.DT = DateTime.Now; am.TotalWeight1 = PLC.TagsPLC2["总量1"].Value1 is null ? 0 : Convert.ToDouble(PLC.TagsPLC2["总量1"].Value1.ToString()); am.TotalWeight2 = PLC.TagsPLC2["总量2"].Value1 is null ? 0 : Convert.ToDouble(PLC.TagsPLC2["总量2"].Value1.ToString()); am.TotalWeight3 = PLC.TagsPLC2["总量3"].Value1 is null ? 0 : Convert.ToDouble(PLC.TagsPLC2["总量3"].Value1.ToString()); am.TotalWeight4 = PLC.TagsPLC2["总量4"].Value1 is null ? 0 : Convert.ToDouble(PLC.TagsPLC2["总量4"].Value1.ToString()); am.TotalWeight5 = PLC.TagsPLC2["总量5"].Value1 is null ? 0 : Convert.ToDouble(PLC.TagsPLC2["总量5"].Value1.ToString()); am.TotalWeight6 = PLC.TagsPLC2["总量6"].Value1 is null ? 0 : Convert.ToDouble(PLC.TagsPLC2["总量6"].Value1.ToString()); DAL.DBOperation.AddOperation(am); } catch (Exception) { //throw; } } }

这样启动程序后,它就会自动生成数据表并定时保存数据。
也是非常的方便快捷。

关于C#上位机项目框架

CSharpSCADA上位机项目实例软件(CSharpSCADA)源自一个定制化的上位机项目。
经过重构后,在框架结构上更加合理。
它也可以作为上位机项目模板使用,简单的修改调整即可实现一个上位机项目。

AdvScadaFramework高级上位机框架软件(AdvScadaFramework)是集成度更高的一款上位机框架软件,除了工艺画面外,其它功能均可以通过配置实现。

标签:

相关文章

语言中的借用,文化交融的桥梁

自古以来,人类社会的交流与发展离不开语言的传播。在漫长的历史长河中,各民族、各地区之间的文化相互碰撞、交融,产生了许多独特的语言现...

软件开发 2025-01-01 阅读1 评论0

机顶盒协议,守护数字生活的新卫士

随着科技的飞速发展,数字家庭逐渐走进千家万户。在这个时代,机顶盒成为了连接我们与丰富多彩的数字世界的重要桥梁。而机顶盒协议,作为保...

软件开发 2025-01-01 阅读1 评论0

语言基础在现代社会的重要性及方法步骤

语言是人类沟通的桥梁,是社会发展的基础。语言基础作为语言学习的基石,对于个人、社会乃至国家的发展具有重要意义。本文将从语言基础在现...

软件开发 2025-01-01 阅读2 评论0

粤语电影,传承文化,点亮时代之光

粤语电影,作为中国电影产业的一朵奇葩,以其独特的地域特色、丰富的文化内涵和鲜明的艺术风格,赢得了广大观众的喜爱。本文将从粤语电影的...

软件开发 2025-01-01 阅读3 评论0

苹果游戏语言,塑造未来娱乐体验的基石

随着科技的飞速发展,游戏产业逐渐成为全球娱乐市场的重要支柱。在我国,游戏产业更是蓬勃发展,吸引了无数玩家和投资者的目光。而在这其中...

软件开发 2025-01-01 阅读1 评论0