【WPF】HslCommunication.Profinet.Siemens PLC通讯

8 篇文章 0 订阅

HslCommunication类库使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HslCommunication;
using HslCommunication.Profinet.Siemens;


namespace NormalizingApp.Lib
{
    public class S71KConnect  //连接西门子PLC   建立 Profinet 通讯 长连接。后台线程读取PLC数据.更新部分状态显示。
    {
        public static SiemensS7Net siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200, "192.168.0.1") { ConnectTimeOut = 10000 };//PLC连接对象
        public static Models.UserItems userItem = new Models.UserItems();    //PLC数据项
        //读取PLC的后台线程
        private static System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadBackgroundReadPlc));
        /// <summary>
        /// 长连接(调用此方法就是使用了长连接,如果不调用直接读取数据,那就是短连接)
        /// </summary>
        /// <returns></returns>
        public static bool ConnectPLC()
        {
            OperateResult connect = siemensS7Net.ConnectServer();//连接PLC
            if (connect.IsSuccess)
            {
                userItem.ConnectionState = true;//PLC连接状态 true
                return true;
            }
            else
            {
                userItem.ConnectionState = false;
                return false;
            }
                
        }
        /// <summary>
        /// 断开连接,也就是关闭了长连接,如果再去请求数据,就变成了短连接
        /// </summary>
        public static void DisconnectPLC()
        {
            siemensS7Net.ConnectClose();
        }
        /// <summary>
        /// 读取所有变量
        /// </summary>
        /// <param name="ut">数据对象</param>
        public static void ReadItems()
        {
            //HslCommunication 的操作结果类 OperateResult
            OperateResult<byte[]> read = siemensS7Net.Read("DB2.0", 141);//读取DB2.0地址的   141个字节
            {
                if (read.IsSuccess)
                {
                    userItem.Voltage = siemensS7Net.ByteTransform.TransSingle(read.Content, 0);//电压:4个字节,0-3位的字节转换为单精度
                    userItem.Current = siemensS7Net.ByteTransform.TransSingle(read.Content, 4);//电流:4个字节,4-7位的字节转换为单精度
                    userItem.Frequency = siemensS7Net.ByteTransform.TransSingle(read.Content, 8);//频率:4个字节,8-11位的字节转换为单精度
                    userItem.Power = siemensS7Net.ByteTransform.TransSingle(read.Content, 12);//功率:4个字节
                    userItem.Energy = siemensS7Net.ByteTransform.TransSingle(read.Content, 16);//能量:4个字节
                    //X Y Z的   实际位置,实际速度,设置位置,设置速度,实际电流
                    userItem.XActPos = siemensS7Net.ByteTransform.TransSingle(read.Content, 20);//
                    userItem.XActSpeed = siemensS7Net.ByteTransform.TransSingle(read.Content, 24);
                    userItem.XSetPos = siemensS7Net.ByteTransform.TransSingle(read.Content, 28);
                    userItem.XSetSpeed = siemensS7Net.ByteTransform.TransSingle(read.Content, 32);
                    userItem.XActCurrent = siemensS7Net.ByteTransform.TransSingle(read.Content, 36);

                    userItem.YActPos = siemensS7Net.ByteTransform.TransSingle(read.Content, 40);
                    userItem.YActSpeed = siemensS7Net.ByteTransform.TransSingle(read.Content, 44);
                    userItem.YSetPos = siemensS7Net.ByteTransform.TransSingle(read.Content, 48);
                    userItem.YSetSpeed = siemensS7Net.ByteTransform.TransSingle(read.Content, 52);
                    userItem.YActCurrent = siemensS7Net.ByteTransform.TransSingle(read.Content, 56);

                    userItem.ZActPos = siemensS7Net.ByteTransform.TransSingle(read.Content, 60);
                    userItem.ZActSpeed = siemensS7Net.ByteTransform.TransSingle(read.Content, 64);
                    userItem.ZSetPos = siemensS7Net.ByteTransform.TransSingle(read.Content, 68);
                    userItem.ZSetSpeed = siemensS7Net.ByteTransform.TransSingle(read.Content, 72);
                    userItem.ZActCurrent = siemensS7Net.ByteTransform.TransSingle(read.Content, 76);
                    //实际温度  4个温度传感器
                    userItem.ActTemp1 = siemensS7Net.ByteTransform.TransSingle(read.Content, 80);
                    userItem.ActTemp2 = siemensS7Net.ByteTransform.TransSingle(read.Content, 84);
                    userItem.ActTemp3 = siemensS7Net.ByteTransform.TransSingle(read.Content, 88);
                    userItem.ActTemp4 = siemensS7Net.ByteTransform.TransSingle(read.Content, 92);
                    //实际流量: 3个流量计
                    userItem.ActFlow1 = siemensS7Net.ByteTransform.TransSingle(read.Content, 96);
                    userItem.ActFlow2 = siemensS7Net.ByteTransform.TransSingle(read.Content, 100);
                    userItem.ActFlow3 = siemensS7Net.ByteTransform.TransSingle(read.Content, 104);
                    //实际压力: 1个压力传感器
                    userItem.ActPressure = siemensS7Net.ByteTransform.TransSingle(read.Content, 108);
                    
                    userItem.HeatRun = siemensS7Net.ByteTransform.TransBool(read.Content, 112);//自动加热启动信号  布尔变量
                    userItem.CoolingRun = siemensS7Net.ByteTransform.TransBool(read.Content, 113);//自动喷风启动信号  布尔变量:1字节
                    Views.CurvePage.heatStart.MyValue = userItem.HeatRun;//显示自动加热启动信号状态
                    Views.CurvePage.coolingStart.MyValue = userItem.CoolingRun;//显示自动喷风启动信号状态


                    userItem.ActAlarm1 = siemensS7Net.ByteTransform.TransUInt16(read.Content, 114);//报警1   短整型:2字节
                    userItem.ActAlarm2 = siemensS7Net.ByteTransform.TransUInt16(read.Content, 116);//报警2  

                    userItem.ActLenght1 = siemensS7Net.ByteTransform.TransSingle(read.Content, 118);//单精度:4字节   长度计1值
                    userItem.ActLenght2 = siemensS7Net.ByteTransform.TransSingle(read.Content, 122);//单精度:4字节   长度计2值

                    userItem.Y_CDJ_QGQW = siemensS7Net.ByteTransform.TransBool(read.Content,126);//Y轴长度计气缸前位
                    userItem.Y_CDJ_QGHW = siemensS7Net.ByteTransform.TransBool(read.Content, 127); //Y轴长度计气缸后位
                    userItem.Z_CDJ_QGQW = siemensS7Net.ByteTransform.TransBool(read.Content, 128);//Z轴长度计气缸前位
                    userItem.Z_CDJ_QGHW = siemensS7Net.ByteTransform.TransBool(read.Content, 129);//Z轴长度计气缸后位

                    userItem.JLG_1_SW = siemensS7Net.ByteTransform.TransBool(read.Content, 130);//举料缸1上位
                    userItem.JLG_1_XW = siemensS7Net.ByteTransform.TransBool(read.Content, 131);//举料缸1下位
                    userItem.JLG_2_SW = siemensS7Net.ByteTransform.TransBool(read.Content, 132);//举料缸2上位
                    userItem.JLG_2_XW = siemensS7Net.ByteTransform.TransBool(read.Content, 133); //举料缸2下位
                    userItem.JLG_3_SW = siemensS7Net.ByteTransform.TransBool(read.Content, 134); //举料缸3上位
                    userItem.JLG_3_XW = siemensS7Net.ByteTransform.TransBool(read.Content, 135); //举料缸3下位
                    userItem.JLG_4_SW = siemensS7Net.ByteTransform.TransBool(read.Content, 136); //举料缸4上位
                    userItem.JLG_4_XW = siemensS7Net.ByteTransform.TransBool(read.Content, 137); //举料缸4下位
                    userItem.DY_ZT = siemensS7Net.ByteTransform.TransBool(read.Content, 138);  //电源状态
                    userItem.PQ_ZT = siemensS7Net.ByteTransform.TransBool(read.Content, 139);  //喷气状态
                    userItem.ProcessOk = siemensS7Net.ByteTransform.TransBool(read.Content, 140); //工件加工完成
                    Views.CurvePage.processOk.MyValue = userItem.ProcessOk; //显示加工是否完成状态
                }
            }
        }
        /// <summary>
        /// 启动读取PLC数据线程
        /// </summary>
        public static void StartPLCRead()
        {
            // 启动后台读取的线程
            thread.IsBackground = true;
            thread.Start();
        }

        /// <summary>
        /// 停止读取PLC数据线程
        /// </summary>
        public static void StopPLCRead()
        {
            //结束后台读取的线程
            thread.Abort();
        }
        private static  void ThreadBackgroundReadPlc() //后台线程
        {
            while (true)
            {
                DateTime dt = DateTime.Now;         //更新时间 
                userItem.SystempDataTime = dt.ToString();//设置PLC数据项-系统时间
                ReadItems();//读取DB块数据
                double dd = (DateTime.Now - dt).TotalMilliseconds;//毫秒
                userItem.ConnectionDelay = (int)dd; //读取持续时间
            }
        }
    }
}

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
WPF(Windows Presentation Foundation)是一种用于创建Windows桌面应用程序的用户界面框架,而Caliburn.Micro是一种针对WPF应用程序的轻量级MVVM框架。通过结合使用这两个框架,可以更高效地编写WPF应用程序的界面和逻辑部分。 一个基本的WPF Caliburn.Micro框架编写案例可以是一个简单的待办事项列表应用程序。首先,我们可以创建一个WPF应用程序,并添加Caliburn.Micro框架的引用。然后,我们可以定义待办事项的模型,包括待办事项的名称、描述和状态等属性。 接下来,我们可以使用Caliburn.Micro框架提供的ViewModelBase类来创建一个待办事项的视图模型。在视图模型中,我们可以定义与界面交互的属性和命令,比如显示待办事项列表、添加新的待办事项、标记已完成的待办事项等功能。 然后,我们需要创建一个WPF的视图,用于显示待办事项列表和与用户进行交互。在视图中,我们可以绑定视图模型中的属性和命令,并使用WPF的控件来显示和编辑待办事项。 最后,我们将视图模型绑定到视图上,使得视图与视图模型能够实现双向的数据绑定和命令绑定。这样,当用户在界面上进行操作时,视图和视图模型之间的数据和行为可以实现同步。 通过这样一个简单的案例,我们可以看到WPF Caliburn.Micro框架编写的优势,它能够帮助我们更快速和高效地构建WPF应用程序,并实现良好的界面和逻辑分离。同时,借助MVVM架构,我们也能够实现更好的代码可读性和可维护性。 WPF Caliburn.Micro框架编写案例的实践将有助于我们更好地理解和运用这些框架,提升WPF应用程序的开发效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值