前言
這個類是針對S7協議的類,如果你是做上位機,和下位機(PLC)交互,可能會給你帶來幫助。
代碼
使用NuGet引入第三方庫(HslCommunication)
HslCommunication
HslCommunication的簡介:
HSL專注於解決工業網絡間的復雜的數據通信問題,解決多個獨立程序之間的數據通信,甚至是不同的操作系統,平台的網絡通信問題, 可以用來構建各種各樣的應用程序,下至通信小軟件,上位機軟件,CS架構的聊天系統,上至ERP系統,歷史追述系統,生產管理系統,MES系統, 無論你的開發環境是Visual Studio, Visual Studio Code, IntelliJ IDEA, Eclipse, Labview, Android Studio等等
HslCommunication的使用:
/// <summary>
/// 西門子S7協議的PLC客戶端操作類
/// </summary>
public class SiemensS7NetClient
{
/// <summary>
/// 獲取西門子S7協議的客戶端
/// </summary>
/// <param name="ip">下位機IP地址</param>
/// <returns>SiemensS7Net實例</returns>
public static SiemensS7Net GetInstance(string ip)
{
return new SiemensS7Net(SiemensPLCS.S1200, ip)
{
ConnectTimeOut = 200
};
}
/// <summary>
/// 獲取下位機單點數據
/// </summary>
/// <param name="client">西門子S7協議的客戶端實例</param>
/// <param name="dataType">數據類型</param>
/// <param name="block">數據塊</param>
/// <param name="offset">偏移量</param>
/// <param name="value">輸出參數:點位值(成功);</param>
/// <param name="errorMessage">輸出參數:空字符(成功);錯誤信息(失敗)</param>
/// <returns>返回是否獲取成功</returns>
public static bool GetPlcSingleData(SiemensS7Net client, string dataType, string block, decimal offset, ref object value, ref string errorMessage)
{
bool result = false;
if (client != null)
{
if (dataType.ToLower() == "int")
{
var operateResult = client.ReadInt16(block + "." + offset);
if (operateResult.IsSuccess)
{
value = operateResult.Content;
errorMessage = "";
result = true;
}
else
{
errorMessage = operateResult.Message;
}
}
else if (dataType.ToLower() == "bool")
{
var operateResult = client.ReadBool(block + "." + offset);
if (operateResult.IsSuccess)
{
value = operateResult.Content;
result = true;
}
else
{
value = operateResult.Message;
}
}
else if (dataType.ToLower() == "usint")
{
var operateResult = client.ReadUInt16(block + "." + offset);
if (operateResult.IsSuccess)
{
value = operateResult.Content;
result = true;
}
else
{
value = operateResult.Message;
}
}
else if (dataType.ToLower() == "word")
{
var operateResult = client.Read(block + "." + offset, 2);
if (operateResult.IsSuccess)
{
value = operateResult.Content;
result = true;
}
else
{
value = operateResult.Message;
}
}
else if (dataType.ToLower() == "wstring")
{
var operateResult = client.Read(block + "." + offset, 254);
if (operateResult.IsSuccess)
{
value = operateResult.Content;
result = true;
}
else
{
value = operateResult.Message;
}
}
}
else
{
errorMessage = "連接下位機的客戶端引擎未初始化";
}
return result;
}
/// <summary>
/// 設置下位機單點數據
/// </summary>
/// <param name="client">西門子S7協議的客戶端實例</param>
/// <param name="dataType">數據類型</param>
/// <param name="block">數據塊</param>
/// <param name="offset">偏移量</param>
/// <param name="value">寫入的值</param>
/// <param name="errorMessage">輸出參數:空字符(成功);錯誤信息(失敗)</param>
/// <returns>返回是否設置成功</returns>
public static bool SetPlcSingleData(SiemensS7Net client, string dataType, string block, decimal offset, object value, ref string errorMessage)
{
bool result = false;
if (client != null)
{
if (dataType.ToLower() == "int")
{
var operateResult = client.Write(block + "." + offset, Convert.ToInt16(value));
if (operateResult.IsSuccess)
{
errorMessage = "";
result = true;
}
else
{
errorMessage = operateResult.Message;
}
}
else if (dataType.ToLower() == "bool")
{
var operateResult = client.Write(block + "." + offset, Convert.ToBoolean(value));
if (operateResult.IsSuccess)
{
result = true;
}
else
{
errorMessage = operateResult.Message;
}
}
else if (dataType.ToLower() == "usint")
{
var operateResult = client.Write(block + "." + offset, Convert.ToByte(value));
if (operateResult.IsSuccess)
{
errorMessage = "";
result = true;
}
else
{
errorMessage = operateResult.Message;
}
}
}
else
{
errorMessage = "連接下位機的客戶端引擎未初始化";
}
return result;
}
/// <summary>
/// 獲取下位機批量數據
/// </summary>
/// <param name="client">西門子S7協議的客戶端實例</param>
/// <param name="startAddress">讀取的起始地址(例如:DB1.46.0)</param>
/// <param name="length">讀取數據的個數(1個數據2個字節)</param>
/// <param name="values">輸出參數:點位值字節數組(成功);</param>
/// <param name="errorMessage">輸出參數:空字符(成功);錯誤信息(失敗)</param>
/// <returns></returns>
public static bool GetPlcBatchData(SiemensS7Net client, string startAddress, ushort length, ref byte[] values, ref string errorMessage)
{
bool result = false;
if (client != null)
{
OperateResult<byte[]> read = client.Read(startAddress, length);
{
if (read.IsSuccess)
{
values = read.Content;
errorMessage = "";
result = true;
}
else
{
errorMessage = read.Message;
}
}
}
else
{
errorMessage = "連接下位機的客戶端引擎未初始化";
}
return result;
}
}
總結
其實我也是第一次使用到這個,可能做上位機的經常會使用到,它是一種協議,讓下位機和上位機之間建立某一種契約,上位機能給下位機發送命令,下位機執行命令,下位機返回信息給上位機,上位機處理。上位機監聽下位機的點位信息。