public static void Init(string PLCAddress)
{
busTcpClient = new SiemensS7Net(SiemensPLCS.S1200, PLCAddress);
int Num = 0;
Task.Run(() =>
{
while (true)
{
Thread.Sleep(1000);
if (!PLC_State)
{
Num++;
OperateResult connect = busTcpClient.ConnectServer();
if (connect.IsSuccess)
{
PLC_State = true;
}
else
{
PLC_State = false;
Thread.Sleep(1000);
if (Num > 4)
{
return;
}
}
}
if (PLC_State)
{
Blink_1s = !Blink_1s;
OperateResult result;
if (Blink_1s)
{
result = busTcpClient.Write("DB102.DBX114.1", true);
if (!result.IsSuccess)
{
PLC_State = false;
}
}
else
{
result = busTcpClient.Write("DB102.DBX114.1", false);
if (!result.IsSuccess)
{
PLC_State = false;
}
}
}
}
});
}
代碼功能概述
這是一個用於初始化並維護西門子S7-1200 PLC連接的靜態方法,主要功能包括:
- 建立PLC通信連接
- 實現自動重連機制
- 週期性向PLC寫入閃爍信號
逐行詳細解析
1. 方法聲明和初始化
csharp
public static void Init(string PLCAddress)
{
busTcpClient = new SiemensS7Net(SiemensPLCS.S1200, PLCAddress);
public static:公共靜態方法,可通過類名直接調用PLCAddress:參數,PLC的IP地址- 創建SiemensS7Net對象,指定PLC類型為S1200
2. 異步任務啓動
csharp
int Num = 0;
Task.Run(() =>
{
while (true)
{
Thread.Sleep(1000);
Num:計數器,記錄連接嘗試次數Task.Run():在後台線程池中啓動異步任務while (true):無限循環,持續監控連接狀態Thread.Sleep(1000):每次循環休眠1秒
3. 連接狀態管理
csharp
if (!PLC_State)
{
Num++;
OperateResult connect = busTcpClient.ConnectServer();
if (connect.IsSuccess)
{
PLC_State = true;
}
else
{
PLC_State = false;
Thread.Sleep(1000);
if (Num > 4)
{
return;
}
}
}
- 當
PLC_State為false時嘗試連接 Num++:增加重試計數ConnectServer():嘗試建立連接- 連接成功:設置
PLC_State = true - 連接失敗:等待1秒,如果重試超過4次則退出任務
4. 數據寫入邏輯
csharp
if (PLC_State)
{
Blink_1s = !Blink_1s;
OperateResult result;
if (Blink_1s)
{
result = busTcpClient.Write("DB102.DBX114.1", true);
if (!result.IsSuccess)
{
PLC_State = false;
}
}
else
{
result = busTcpClient.Write("DB102.DBX114.1", false);
if (!result.IsSuccess)
{
PLC_State = false;
}
}
}
- 連接正常時執行寫入操作
Blink_1s = !Blink_1s:每秒翻轉布爾值,產生1Hz閃爍信號- 向PLC的DB102數據塊、DBX114.1位地址寫入true/false
- 寫入失敗時標記連接斷開
代碼特點
優點:
- 自動重連機制提高可靠性
- 異步執行不阻塞主線程
- 簡單的故障恢復策略
潛在問題:
- 重試4次後永久退出,可能需要更完善的恢復策略
- 缺少異常處理和日誌記錄
- 硬編碼的PLC地址可能不夠靈活
使用示例
csharp
// 調用初始化方法
PLCManager.Init("19代碼功能概述
這是一個用於初始化並維護西門子S7-1200 PLC連接的靜態方法,主要功能包括:
建立PLC通信連接
實現自動重連機制
週期性向PLC寫入閃爍信號
逐行詳細解析
1. 方法聲明和初始化
csharp
public static void Init(string PLCAddress)
{
busTcpClient = new SiemensS7Net(SiemensPLCS.S1200, PLCAddress);
public static:公共靜態方法,可通過類名直接調用
PLCAddress:參數,PLC的IP地址
創建SiemensS7Net對象,指定PLC類型為S1200
2. 異步任務啓動
csharp
int Num = 0;
Task.Run(() =>
{
while (true)
{
Thread.Sleep(1000);
Num:計數器,記錄連接嘗試次數
Task.Run():在後台線程池中啓動異步任務
while (true):無限循環,持續監控連接狀態
Thread.Sleep(1000):每次循環休眠1秒
3. 連接狀態管理
csharp
if (!PLC_State)
{
Num++;
OperateResult connect = busTcpClient.ConnectServer();
if (connect.IsSuccess)
{
PLC_State = true;
}
else
{
PLC_State = false;
Thread.Sleep(1000);
if (Num > 4)
{
return;
}
}
}
當PLC_State為false時嘗試連接
Num++:增加重試計數
ConnectServer():嘗試建立連接
連接成功:設置PLC_State = true
連接失敗:等待1秒,如果重試超過4次則退出任務
4. 數據寫入邏輯
csharp
if (PLC_State)
{
Blink_1s = !Blink_1s;
OperateResult result;
if (Blink_1s)
{
result = busTcpClient.Write("DB102.DBX114.1", true);
if (!result.IsSuccess)
{
PLC_State = false;
}
}
else
{
result = busTcpClient.Write("DB102.DBX114.1", false);
if (!result.IsSuccess)
{
PLC_State = false;
}
}
}
連接正常時執行寫入操作
Blink_1s = !Blink_1s:每秒翻轉布爾值,產生1Hz閃爍信號
向PLC的DB102數據塊、DBX114.1位地址寫入true/false
寫入失敗時標記連接斷開
代碼特點
優點:
自動重連機制提高可靠性
異步執行不阻塞主線程
簡單的故障恢復策略
潛在問題:
重試4次後永久退出,可能需要更完善的恢復策略
缺少異常處理和日誌記錄
硬編碼的PLC地址可能不夠靈活
使用示例
csharp
// 調用初始化方法
PLCManager.Init("192.168.1.100");
這段代碼實現了一個典型的工業PLC通信管理模塊,具有良好的實時性和可靠性。2.168.1.100");
這段代碼實現了一個典型的工業PLC通信管理模塊,具有良好的實時性和可靠性。