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通信管理模塊,具有良好的實時性和可靠性。