最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#與PLC通訊的實現(xiàn)代碼

 更新時間:2021年04月19日 09:36:30   作者:宥小稚  
這篇文章主要介紹了C#與PLC通訊的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

最近因為工作的原因用到了西門子PLC,在使用過程中一直在思考上位機和PLC的通訊問題,后來上網(wǎng)查了一下,找到了一個專門針對S7開發(fā)的一個.net庫–《S7netPlus》,PLC通訊方法比較多,所以也是在不斷地學習中,以下內(nèi)容如有不足之處,望大神予以指教。

公司設備一直都用的PLC做下端設備的控制,但是目前都沒有專職做上位機的,而我之前對PLC又接觸的比較少,做起來還是比較難的。。

查找了一堆資料后,終于找到了這個.net庫,在大致學習了一下之后,總結(jié)了一下,當作自己的學習筆記。

一、開發(fā)環(huán)境準備

最近因為疫情的影響,只能呆在總公司混日子,手里沒有設備,只能用博圖的仿真器來測試通訊,需要安裝的軟件包括:

Visual Studio 2015
TIA Portal V15
S7-PLCSIMV15
NetToPLCSIM-S7
這里先放個下載連接:S7Net.dll、NetToPLCSIM、S7Net使用手冊

TIA Protal(博圖)&S7-PLCSIM

西門子針對于PLC專門開發(fā)的一款編程軟件,相信各位肯定比我熟悉這個軟件了,這里就不作過多介紹了,同時提供了S7系列的仿真軟件S7-PLCSIM,這里我們就用這兩個設備仿真PLC設備來測試S7NETPlus庫的通訊。

在這里插入圖片描述

博圖V15.1

在這里插入圖片描述

S7-PLCSIM

NetToPLCSIM

在這里插入圖片描述

這個軟件是用于將西門子的PLCsim映射到網(wǎng)絡內(nèi),如果之前沒有用過這個軟件,建議按照后面的操作來,否則很容易出現(xiàn)Start server之后還是連不上仿真器。

二、開發(fā)測試

PLC配置

1、在組態(tài)好的PLC設備屬性中,找到“防護與安全”–>“連接機制”中,勾選“允許來自遠程對象的PUT/GET通信訪問”;

在這里插入圖片描述

2、新建DB塊,同時將該DB快屬性中的“優(yōu)化塊的訪問取消”;

在這里插入圖片描述

3、在新建的DB塊中新增一些數(shù)據(jù),完成后點擊編譯計算偏移量。

在這里插入圖片描述

4、以上步驟完成后,點擊開始仿真,將工程下載到仿真器中;

在這里插入圖片描述

NetToPLCSIM配置

1、打開軟件后,點擊Add增加設備

2、在彈出的窗口中,Network IP Address中填入本地回環(huán)IP“127.0.0.1”(如果你是在兩臺設備中測試,首先保證兩臺設備在同一個內(nèi)網(wǎng)中,該處IP就可以設置為運行仿真環(huán)境的IP了)

在這里插入圖片描述

3、Plcsim IP Address中,點擊后面兩個點,選擇軟件自己識別出來的仿真器地址;

在這里插入圖片描述

4、Plcsim Rack/Slot中Rack為機架號,Slot為插槽號,這兩個可以在PLC的設備組態(tài)屬性->項目信息中找到

配置完成后點擊完成,這時候就可以點擊Start Server開啟服務了。

在這里插入圖片描述

上面的操作一定要按照以上的步驟一步一步完成,否則很容易出現(xiàn)即使點Start Server顯示狀態(tài)為running,但是實際連接仍然連不上的情況。

另外需要注意的是,可能在打開NetToPLCSim的時候,會彈出“Port 102 is in use!”的警告,如果遇到這個情況,點擊是,之后在將PLCSIM關掉重新啟動一下就可以了。

在這里插入圖片描述

創(chuàng)建連接

配置連接

這里使用的是S7-1215的模塊,所以CpuType選擇S71200,IP地址使用回環(huán)地址“127.0.0.1”,機架號和插槽號在PLC工程中查。

using S7.Net;

Plc plc = new Plc(CpuType.S71200, "127.0.0.1", 0, 1);		

配置完成后,使用Open()來打開,在最早的一個版本中,Open有返回值,可以通過返回值獲取 ErrorCode 和 ErrorMessage,我目前使用的是最新版0.8.1.0,沒有返回值,所以用try…catch來接收異常

try
{
	plc.Open();
}
catch(Exception)
{
	Console.WriteLine($"連接到PLC設備失?。篒sConnect = {plc.IsConnected},IsAvailable={plc.IsAvailable}");
	return;
}

連接是否成功,可以用IsConnected去判斷一下。

訪問數(shù)據(jù)塊

連接成功后,我們就可以去訪問PLC的數(shù)據(jù)塊了,訪問數(shù)據(jù)塊,我們先嘗試一下讀取數(shù)據(jù)塊

讀取單個數(shù)據(jù)–Read

這里主要用到了DBX,DBW,DBD讀取數(shù)據(jù),其他的各位可以在查一下PLC的資料

/*
方法:public object Read(string variable)
入?yún)ⅲ鹤x取數(shù)據(jù)地址
出參:Object類型數(shù)據(jù),可強制類型轉(zhuǎn)換
*/
var db1Bool1 = plc.Read("DB1.DBX0.0");
Console.WriteLine("DB1.DBX0.0:" + db1Bool1);

bool db1Bool2 = (bool)plc.Read("DB1.DBX0.1");
Console.WriteLine("DB1.DBX0.1:" + db1Bool2);

int IntVariable = (ushort)plc.Read("DB1.DBW2.0");
Console.WriteLine("DB1.DBW2.0:" + IntVariable);

float RealVariable = ((uint)plc.Read("DB1.DBD4.0")).ConvertToFloat();
Console.WriteLine("DB1.DBD4.0:" + RealVariable);

var dIntVariable = (uint)plc.Read("DB1.DBD8.0");
Console.WriteLine("DB1.DBD8.0: " + dIntVariable);

var dWordVariable = (uint)plc.Read("DB1.DBD12.0");
Console.WriteLine("DB1.DBD12.0: " + Convert.ToString(dWordVariable, 16));

var wordVariable = (ushort)plc.Read("DB1.DBW16.0");
Console.WriteLine("DB1.DBW16.0: " + Convert.ToString(wordVariable,16));

在這里插入圖片描述

讀取批量數(shù)據(jù)塊–ReadBytes

/*
方法:public byte[] ReadBytes(DataType dataType, int db, int startByteAdr, int count)
入?yún)ⅲ?
	1、DataType數(shù)據(jù)類型,可選擇從DB塊或者Memory中讀?。?
	2、db:1:DataBlock=1,Memory=0;
	3、startByteAdr:起始地址,即DB塊的起始偏移量;
	4、count:讀取大小,該大小由讀取的DB塊的最后一個數(shù)據(jù)的偏移量和大小決定,這里最后一個字節(jié)WordVariable偏移量為16,數(shù)據(jù)類型為word,2個字節(jié),因此此次讀取為16+2=18個字節(jié)。
出參:Byte[],這里Byte[]的大小必然和count的大小是相同的,
*/
//讀取數(shù)據(jù)選擇從DB塊中讀取,db設置為1,起始地址為0,讀取18個字節(jié)
var bytes = plc.ReadBytes(DataType.DataBlock, 1, 0, 18);
//取字節(jié)0中的第0位
var db1Bool1 = bytes[0].SelectBit(0);
Console.WriteLine("DB1.DBX0.0:" + db1Bool1);
//取字節(jié)0中的第1位
bool db1Bool2 = bytes[0].SelectBit(1); ;
Console.WriteLine("DB1.DBX0.1:" + db1Bool2);
//跳到字節(jié)2并連續(xù)取兩個字節(jié)數(shù)據(jù)
int IntVariable = S7.Net.Types.Int.FromByteArray(bytes.Skip(2).Take(2).ToArray());
Console.WriteLine("DB1.DBW2.0:" + IntVariable);
//...
double RealVariable = S7.Net.Types.Real.FromByteArray(bytes.Skip(4).Take(4).ToArray());
Console.WriteLine("DB1.DBD4.0:" + RealVariable);
//...
int dIntVariable = S7.Net.Types.DInt.FromByteArray(bytes.Skip(8).Take(4).ToArray());
Console.WriteLine("DB1.DBD8.0: " + dIntVariable);
//...
uint dWordVariable = S7.Net.Types.DWord.FromByteArray(bytes.Skip(12).Take(4).ToArray());
Console.WriteLine("DB1.DBD12.0: " + Convert.ToString(dWordVariable, 16));
//...
ushort wordVariable = S7.Net.Types.Word.FromByteArray(bytes.Skip(16).Take(2).ToArray());
Console.WriteLine("DB1.DBW16.0: " + Convert.ToString(wordVariable, 16));

在這里插入圖片描述

寫入單個數(shù)據(jù)–Write

/*
方法:public void Write(string variable, object value)
入?yún)ⅲ?
	1、string variable:寫入地址
	2、object value,寫入數(shù)據(jù)
*/
plc.Write("DB1.DBX0.0", true);
plc.Write("DB1.DBD12.0", 123457);

在這里插入圖片描述

寫入多個數(shù)據(jù)–WriteBytes

/*
public void WriteBytes(DataType dataType, int db, int startByteAdr, byte[] value)
用法如同ReadBytes,這里就不在寫例程了,有興趣的可以自己研究一下
*/

關閉連接

在通訊完之后,千萬不要忘了關閉通訊鏈路哈,這里使用Close來關閉。

 plc.Close();

到此這篇關于C#與PLC通訊的實現(xiàn)代碼的文章就介紹到這了,更多相關C#與PLC通訊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C#中實現(xiàn)值相等(Value Equality)的詳細步驟

    C#中實現(xiàn)值相等(Value Equality)的詳細步驟

    在 C# 中,相等并不是一個簡單的問題,很多開發(fā)者認為重寫 Equals 就夠了,但在真實系統(tǒng)中,錯誤或不完整的相等實現(xiàn)會導致一些bug,本文將從底層機制出發(fā),給出標準、完整、可復用的值相等實現(xiàn)步驟,需要的朋友可以參考下
    2026-01-01
  • C#調(diào)用python.exe使用arcpy方式

    C#調(diào)用python.exe使用arcpy方式

    這篇文章主要介紹了C#調(diào)用python.exe使用arcpy方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C#實現(xiàn)Menu和ContextMenu自定義風格及contextMenu自定義

    C#實現(xiàn)Menu和ContextMenu自定義風格及contextMenu自定義

    ContextMenu 類表示當用戶在控件或窗體的特定區(qū)域上單擊鼠標右鍵時會顯示的快捷菜單,要想實現(xiàn)自定義的Menu和ContextMenu效果,大家可以通過派生ProfessionalColorTable類,下面小編把實現(xiàn)Menu和ContextMenu自定義風格及ContextMenu自定義給大家整理一下
    2015-08-08
  • C#多線程的相關操作講解

    C#多線程的相關操作講解

    本文詳細講解了C#多線程的相關操作,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • C#實現(xiàn)漂亮的數(shù)字時鐘效果

    C#實現(xiàn)漂亮的數(shù)字時鐘效果

    這篇文章主要介紹了C#實現(xiàn)漂亮的數(shù)字時鐘效果,涉及時間函數(shù)的應用及繪圖的方法,需要的朋友可以參考下
    2014-10-10
  • C#控制臺模擬電梯工作原理

    C#控制臺模擬電梯工作原理

    簡單的模擬一下電梯的運行,電梯內(nèi)部和外部樓層呼叫的優(yōu)先級判斷。以前學硬件的時候做這個不成問題,現(xiàn)在用軟件來模擬對我來說比較難,要C#的圖形界面。求高手賜教。
    2015-06-06
  • C# string格式的日期時間字符串轉(zhuǎn)為DateTime類型的方法

    C# string格式的日期時間字符串轉(zhuǎn)為DateTime類型的方法

    這篇文章主要介紹了C# string格式的日期時間字符串轉(zhuǎn)為DateTime類型的方法,需要的朋友可以參考下
    2017-02-02
  • C#使用ILGenerator動態(tài)生成函數(shù)的簡單代碼

    C#使用ILGenerator動態(tài)生成函數(shù)的簡單代碼

    這篇文章主要介紹了C#使用ILGenerator動態(tài)生成函數(shù)的簡單代碼,需要的朋友可以參考下
    2017-08-08
  • C#實現(xiàn)字母與ASCII碼互相轉(zhuǎn)換

    C#實現(xiàn)字母與ASCII碼互相轉(zhuǎn)換

    ASCII是基于拉丁字母的編碼系統(tǒng),也是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng),本文主要為大家詳細介紹了如何使用C#實現(xiàn)字母與ASCII碼互轉(zhuǎn),需要的可以參考下
    2024-01-01
  • C#?Winform實現(xiàn)在Pancel上繪制矩形

    C#?Winform實現(xiàn)在Pancel上繪制矩形

    在C#的WinForms應用程序中,Panel控件本身不直接支持繪圖功能,但可以通過在Panel上覆蓋OnPaint方法或者使用Graphics對象來在Panel上繪制圖形,下面我們就來看看具體實現(xiàn)方法吧
    2025-01-01

最新評論

灵山县| 康平县| 房山区| 四川省| 睢宁县| 岳阳市| 寿光市| 楚雄市| 威宁| 九龙坡区| 昌图县| 南城县| 南川市| 弥渡县| 呼玛县| 秭归县| 吉木萨尔县| 咸宁市| 沿河| 牙克石市| 兴山县| 兖州市| 旬邑县| 安龙县| 林州市| 石阡县| 津市市| 无锡市| 二手房| 丁青县| 文昌市| 日土县| 漳州市| 彰化市| 红安县| 安康市| 金昌市| 济南市| 海宁市| 博乐市| 阆中市|