注:.net中通過TCP/IP方式通過S7.net.dll動(dòng)態(tài)庫(kù),連接到西門子PLC,西門子程序中許勾選優(yōu)化塊,程序讀取需要 db塊號(hào)+偏移量
一。使用VS項(xiàng)目,在項(xiàng)目中添加S7.net動(dòng)態(tài)庫(kù)
代碼中引用S7.net動(dòng)態(tài)庫(kù)
using S7.Net;
實(shí)例化PLC服務(wù)名
///
/// 實(shí)例化PLC
///
Plc S71500;
連接PLC按鈕時(shí)間編寫:
以上代碼可測(cè)試是否能連接至PLC
二.西門子中點(diǎn)位信息,在程序中地址表示說明
在DB塊中有如下變量
/// <summary>
/// 實(shí)例化PLC
/// </summary>
Plc S71500;
/// <summary>
/// 連接PLC
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
string ip=tb_plcip.Text.Trim(); //PLC地址IP 例192.168.0.1
short rack= short.Parse( tb_rack.Text.Trim()); //PLC機(jī)架位置 默認(rèn)0
short solt = short.Parse(tb_solt.Text.Trim()); //PLC插槽位置,以實(shí)際為準(zhǔn)
//CpuType根據(jù)實(shí)際PLC連接,我這邊已1500PLC為例
S71500 = new Plc(CpuType.S71500, ip, rack, solt);
//調(diào)用S7.NET中的方法連接PLC
S71500.Open();
//連接成功后使能操作按鈕
if (S71500.IsConnected)
{
//判斷是否連接成功
MessageBox.Show("連接PLC成功");
}
}
在程序中讀取需DB塊號(hào)+地址,分別寫法如下
DB1.DBW0 //地址為0,類型為整數(shù)
DB1.STRING2.18 //地址為2,字符長(zhǎng)度18 類型為字符串
DB1.B22 //地址為22,類型為字節(jié)型
DB1.DBD24 //地址為24,類型為實(shí)數(shù)
DB1.DBW28 //地址為28,類型為整數(shù)
DB1.DBW28 //地址為28,類型為整數(shù)
DB1.DBX29.0 //地址為29.0,類型為布爾文章來源:http://www.zghlxwxcb.cn/news/detail-414460.html
三,通過代碼讀寫Tag點(diǎn)信息,以下代碼可進(jìn)行以上Tag點(diǎn)信息的讀取及寫入,代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-414460.html
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using S7.Net;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 實(shí)例化PLC
/// </summary>
Plc S71500;
/// <summary>
/// 連接PLC
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
string ip=tb_plcip.Text.Trim(); //PLC地址IP 例192.168.0.1
short rack= short.Parse( tb_rack.Text.Trim()); //PLC機(jī)架位置 默認(rèn)0
short solt = short.Parse(tb_solt.Text.Trim()); //PLC插槽位置,以實(shí)際為準(zhǔn)
//CpuType根據(jù)實(shí)際PLC連接,我這邊已1500PLC為例
S71500 = new Plc(CpuType.S71500, ip, rack, solt);
//調(diào)用S7.NET中的方法連接PLC
S71500.Open();
//連接成功后使能操作按鈕
if (S71500.IsConnected)
{
//判斷是否連接成功
MessageBox.Show("連接PLC成功");
}
}
//****
//讀取 ReadPLC("DB1.DBW0");
//寫入 WritePLC("DB1.DBW0","1");
//其中BOOL寫入: WritePLC(DB1.DBX29.0, "False");或WritePLC(DB1.DBX29.0, "True");
#region 讀寫TAG點(diǎn)方法
/// <summary>
/// 去指定字符串中間字符
/// </summary>
/// <param name="sourse">字符串</param>
/// <param name="startstr">首字符</param>
/// <param name="endstr">尾字符</param>
/// <returns></returns>
public static string MidStrEx(string sourse, string startstr, string endstr)
{
string result = string.Empty;
int startindex, endindex;
try
{
startindex = sourse.IndexOf(startstr);
if (startindex == -1)
{
return result;
}
string tmpstr = sourse.Substring(startindex + startstr.Length);
endindex = tmpstr.IndexOf(endstr);
if (endindex == -1)
{
return result;
}
result = tmpstr.Remove(endindex);
}
catch (Exception)
{
}
return result;
}
/// <summary>
/// 寫入PLC數(shù)值
/// </summary>
/// <param name="DataTag"></param>
public void WritePLC(string DataTag, string Data)
{
try
{
#region 邏輯處理
string Type = "STRING";
if (DataTag.Contains("STRING"))
{
Type = "STRING";
}
else if (DataTag.Contains("DBW"))
{
Type = "Word";
}
else if (DataTag.Contains(".B"))
{
Type = "Byte";
}
else if (DataTag.Contains("DBD"))
{
Type = "Real";
}
else if (DataTag.Contains("DBX"))
{
Type = "Bool";
}
int strAdr = 0;
//取到db塊號(hào)
int dbInt = dbInt = int.Parse(MidStrEx(DataTag, "DB", ".")); ;
//字符串類型
if (Type == "STRING")
{
//取到地址
strAdr = int.Parse(MidStrEx(DataTag, "STRING", "."));
//寫入PLC數(shù)據(jù)
S71500.Write(DataType.DataBlock, dbInt, strAdr, GetPLCStringByteArray(Data));
}
else if (Type == "Word")
{
//寫入整數(shù)型
strAdr = int.Parse(Regex.Match(DataTag, @"\d+$").ToString());
S71500.Write(DataType.DataBlock, dbInt, strAdr, Convert.ToInt16(Data));
}
else if (Type == "Byte")
{
//寫入字節(jié)型
strAdr = int.Parse(Regex.Match(DataTag, @"\d+$").ToString());
S71500.Write(DataType.DataBlock, dbInt, strAdr, Convert.ToByte(Data));
}
else if (Type == "Real")
{
//寫入實(shí)數(shù)
strAdr = int.Parse(Regex.Match(DataTag, @"\d+$").ToString());
S71500.Write(DataType.DataBlock, dbInt, strAdr, Convert.ToDouble(Data));
}
else if (Type == "Bool")
{
//寫入Bool值
S71500.Write(DataTag.ToUpper(), Convert.ToBoolean(Data));
}
#endregion
}
catch (Exception ex)
{
//寫入異常
}
}
int errorCount = 0;
/// <summary>
/// 讀取PLC數(shù)據(jù)
/// </summary>
/// <param name="DataTag">Tag點(diǎn)名稱</param>
public string ReadPLC(string DataTag)
{
string returnData = "";
try
{
if (DataTag.Contains("STRING"))
{
//取到DB塊號(hào)
int dbInt = dbInt = int.Parse(MidStrEx(DataTag, "DB", "."));
//取到偏移量地址
int strAdr = int.Parse(MidStrEx(DataTag, "STRING", "."));
//獲取字符串長(zhǎng)度
var reservedLength = (byte)S71500.Read(DataType.DataBlock, dbInt, strAdr, VarType.Byte, 1);
//讀取時(shí)在地址前加兩位偏移
string StrReplac = (string)S71500.Read(DataType.DataBlock, dbInt, strAdr + 2, VarType.String, reservedLength);
//去除字符串后面空白符號(hào)
returnData = StrReplac.Replace("\0", "");
}
else if (DataTag.Contains("DBW"))
{
//讀取整數(shù)型數(shù)據(jù)
ushort UpValue = (ushort)S71500.Read(DataTag);
returnData = Convert.ToString(UpValue);
}
else if (DataTag.Contains(".B"))
{
//取到DB塊號(hào)
int dbInt = dbInt = int.Parse(MidStrEx(DataTag, "DB", "."));
//取到偏移量地址
int strAdr = int.Parse(Regex.Match(DataTag, @"\d+$").ToString());
//獲取字符串長(zhǎng)度
var reservedLength = (byte)S71500.Read(DataType.DataBlock, dbInt, strAdr, VarType.Byte, 1);
//將讀取數(shù)據(jù)轉(zhuǎn)為字符串
returnData = Convert.ToString(reservedLength);
}
else if (DataTag.Contains("DBD"))
{
//讀取小數(shù)型數(shù)據(jù)
double UpValue = ((uint)S71500.Read(DataTag)).ConvertToFloat();
if (Convert.ToString(UpValue).Trim() != "")
{
//截取保留小數(shù)位長(zhǎng)度
returnData = Math.Round(UpValue, 3).ToString();
}
}
else if (DataTag.Contains("DBX"))
{
//讀取Bool值數(shù)據(jù)
var db1Bool1 = S71500.Read(DataTag);
returnData = db1Bool1.ToString();
}
}
catch (Exception ex)
{
//讀取異常
}
return returnData;
}
/// <summary>
/// 獲取西門子PLC字符串?dāng)?shù)組--String
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private byte[] GetPLCStringByteArray(string str)
{
byte[] value = Encoding.Default.GetBytes(str);
byte[] head = new byte[2];
head[0] = Convert.ToByte(254);
head[1] = Convert.ToByte(str.Length);
value = head.Concat(value).ToArray();
return value;
}
/// <summary>
/// 獲取西門子PLC字符串?dāng)?shù)組--WString
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private byte[] GetPLCWStringByteArray(string str)
{
byte[] value = Encoding.BigEndianUnicode.GetBytes(str);
byte[] head = BitConverter.GetBytes((short)508);
byte[] length = BitConverter.GetBytes((short)str.Length);
Array.Reverse(head);
Array.Reverse(length);
head = head.Concat(length).ToArray();
value = head.Concat(value).ToArray();
return value;
}
#endregion
}
}
到了這里,關(guān)于.net通過S7.net讀寫西門子PLC中,字符串,bool,整數(shù),小數(shù)及byte型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!