Unity開發(fā)APP與西門子SIMATIC系列PLC連接 第二章

魔晶自動化機電工程社團原創(chuàng)技術(shù)資料
專欄分類
工業(yè),自動化,電器,軟件開發(fā),C#?
各位們好,我是魔晶自動化機電工程社團的團長 萬影 星夢

首先,非常抱歉,這一章只能以專欄的形式發(fā)布,因為我的電腦似乎不是很給力,14號晚上調(diào)試了半天還是不能正常錄屏,錄屏的時候出現(xiàn)了嚴(yán)重的編碼過載,所以只能以專欄的形式發(fā)布了。

あ 正文

あ - 本章標(biāo)題
S7.Net實際演示與常用變量的讀取和寫入

あ - 內(nèi)容
01.實際演示 (順便把TIA Protal的部分基礎(chǔ)教給大家,如果已經(jīng)會了可以跳過):
首先,要創(chuàng)建一個新的TIA Protal項目 (圖A-0),創(chuàng)建完成后會自動跳轉(zhuǎn)至 <新手上路> 如圖A-1所示:


然后,我們要添加一個設(shè)備:
Protal?視圖操作如下:
在 開始>新手上路 點擊 設(shè)備和網(wǎng)絡(luò) - 組態(tài)設(shè)備 (圖C-0),如下圖所示,點擊添加新設(shè)備:

這里以S7-1200 CPU1214C 1AG40演示 (圖H2-0),如圖H2-1所示,如果選擇了 <打開設(shè)備視圖> 在添加設(shè)備后會自動跳轉(zhuǎn)至 Project視圖 并打開該設(shè)備的組態(tài)界面,反之 則不會自動跳轉(zhuǎn)?Project界面:


剩下的要在 Project視圖 進行
在設(shè)備組態(tài)下 選中PLC本體,選中后,PLC本體周圍會有藍(lán)色線條,名稱背景色為藍(lán)色,如下圖所示:

如圖HC-0所示,點擊屬性,打開分支 <防護與安全> ,出現(xiàn)四個選項,如下圖所示:

如圖FX-0所示中,點擊訪問級別和連接機制進行必要的設(shè)置,如下所示:


CPU設(shè)置完成,接下來在Project視圖中 左邊欄<設(shè)備與網(wǎng)絡(luò) - 項目樹>中:
打開分支:PLC_1>程序塊,點擊添加新塊 (圖HNF-0),結(jié)果如圖HNF-1所示:


創(chuàng)建一個數(shù)據(jù)塊,如圖HNF-1所示,點擊左邊的數(shù)據(jù)塊選項然后命名選擇全局DB點擊確定添加數(shù)據(jù)塊
接下來要設(shè)置數(shù)據(jù)塊,如下圖,選中數(shù)據(jù)塊鼠標(biāo)右鍵>屬性:

取消<優(yōu)化的塊訪問>如下圖,點擊確定:

設(shè)置完畢,然后在數(shù)據(jù)塊中添加變量,我在這里添加幾個常用變量并賦值 (記得編譯和保存 編譯和保存在同一欄目):

TIA Protal中的設(shè)置全部完成,接下來是客戶端代碼部分
演示軟件:Microsoft Visual Studio 2019
在這里我們將使用 C#控制臺應(yīng)用(.NET Framework) 工程模板演示 (控制臺和Unity代碼結(jié)構(gòu)相差不大,孬會轉(zhuǎn)彎的都知道寫到Unity要怎么改)
連接部分的代碼如下圖所示 (上一期有詳細(xì)講):

接下來就可以測試連接了
以管理員身份運行NetToPLCsim.exe
彈出警告窗口時點擊是
注意,要底部狀態(tài)欄有 Port 102 OK才能繼續(xù),如下圖紅標(biāo)所示:

在TIA Protal里面啟動仿真,操作如下所示:



在Step 3中紅標(biāo)A0的選擇有無動作和啟動模塊兩個選項,選擇無動作的時候需要手動將PLC置為RUN,操作如下所示:

接下來,在NetToPLCsim.exe中點擊Add,彈出窗口如下所示:

設(shè)置如下:

完成后點擊Start Server,設(shè)置完成。
接下來啟動客戶端即可。
結(jié)果如下圖所示:

建議在后面添加個代碼,否則會自動退出:Console.ReadLine();
如下圖所示(因為后面的內(nèi)容需要,加了個While語句):


02.常用變量的讀取與寫入 (注意要放在最后)
在客戶端添加以下代碼:
if (PLC.Isconnected == true)
{
while(true)
{
Console.Write("請選擇操作> ");
String E = Console.ReadLine();
if (E == "Read")
{
Console.WriteLine("操作:讀取");
Console.Write("輸入偏移量> ");
string A = Console.ReadLine();
String B = null;
if (!A.Contains("DBX"))
{
Console.Write("輸入數(shù)據(jù)類型> ");
B = Console.ReadLine();
}
if (A.Contains("DBX"))
{
bool A1 = (bool)PLC.Read("DB1." + A);
Console.WriteLine(A1);
}
else if (A.Contains("DBW") & (B == "Int"))
{
int A2 = (ushort)PLC.Read("DB1." + A);
Console.WriteLine(A2);
}
else if (A.Contains("DBW") & (B == "Word"))
{
var A2 = (ushort)PLC.Read("DB1." + A);
Console.WriteLine(A2);
}
else if (A.Contains("DBD") & (B == "Real"))
{
var A3 = ((uint)PLC.Read("DB1." + A)).ConvertToFloat();
Console.WriteLine(A3);
}
else if (A.Contains("DBD") & (B == "Dint"))
{
var A3 = (uint)PLC.Read("DB1." + A);
Console.WriteLine(A3);
}
else if (A.Contains("DBD") & (B == "DWord"))
{
var A3 = (uint)PLC.Read("DB1." + A);
Console.WriteLine(A3);
}
else
{
Console.WriteLine("無效的輸入值");
}
}
else if (E == "Write")
{
Console.WriteLine("操作:寫入");
Console.Write("輸入偏移量> ");
string A = Console.ReadLine();
String B = null;
if (!A.Contains("DBX"))
{
Console.Write("輸入數(shù)據(jù)類型> ");
B = Console.ReadLine();
}
Console.Write("輸入寫入的值> ");
if (A.Contains("DBX"))
{
bool A1 = bool.Parse(Console.ReadLine());
PLC.Write("DB1." + A, A1);
}
else if (A.Contains("DBW") & (B == "Word") | (B == "Int"))
{
var A2 = short.Parse(Console.ReadLine());
PLC.Write("DB1." + A, A2);
}
else if (A.Contains("DBD") & (B == "Real"))
{
var A3 = double.Parse(Console.ReadLine());
PLC.Write("DB1." + A, A3);
}
else if (A.Contains("DBD") & (B == "Dint"))
{
var A3 = uint.Parse(Console.ReadLine());
PLC.Write("DB1." + A, A3);
}
else if (A.Contains("DBD") & (B == "DWord"))
{
var A3 = uint.Parse(Console.ReadLine());
PLC.Write("DB1." + A, A3);
}
else
{
Console.WriteLine("無效的輸入值");
}
}
else
{
Console.WriteLine("無效的輸入值");
}
}
}
運行效果:

到此,PLC的測試連接和數(shù)據(jù)的讀寫就完成了

い下期內(nèi)容預(yù)告
數(shù)據(jù)的批量讀取

最后,感謝各位能觀看我的專欄,你們的支持是UP主最大的動力

End