加入收藏 在线留言 联系我们
关注微信
手机扫一扫 立刻联系商家
全国服务热线18475208684

四川省PLC代理商-触摸屏代理商-变频器代理商一级代理

更新时间
2024-12-01 08:00:00
价格
请来电询价
西门子变频器
西门子触摸屏
西门子伺服电机
西门子PLC
西门子直流调速器
西门子电缆
联系电话
13922889745
联系手机
18475208684
联系人
向小姐
立即询价

详细介绍

开发过程-驱动部分



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

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



































//根据物理PLC数量声明变量,该项目一共2台PLCstatic S7PLC PLC1 = null;static S7PLC PLC2 = null;
//////初始化PLC///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实例里面添加变量。

















/// /// 添加变量/1#PLC/// 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); }

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



















//////解析数据//////private static void AnalyzeDataPLC1(Dictionary 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外,对于一些不支持变量导入的组态软件,在配置这么多变量的时间花费上估计也是相差无几。如果采用我们的支持变量自动解析的AdvScadaFrameworkgaoji上位机框架软件则可以在更短的时间内完成。

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



开发过程-周期归档



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
















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#上位机项目框架




相关产品

联系方式

  • 电  话:13922889745
  • 经理:向小姐
  • 手  机:18475208684
  • 微  信:18475208684