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; //读取持续时间
}
}
}
}