【WPF】HslCommunication.Profinet.Siemens PLC通讯

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值