c# 操作plc

說明:使用c#程式,通過串口操作plc,在此例子中,使用西門子的plc,程式是winform。

1.引用AxInterop.MSCommLib控件,操作串口,此控件需要註冊。

2.設置AxInterop.MSCommLib控件的參數:

commport:1 端口號 sttting:9600,e,7,2波特率等   inbuffersize:1024 緩存大小

3.由於直接採用和plc通信,中間沒有採用通信模塊,直接用rs232接口,因此需要循環讀取串口的數據。

如果使用一個通信模塊,那麼plc可以主動發送數據,並且可以直接用字符串進行通信。自定義通信規則,在plc

那邊進行解析,然後處理。

4.通信之前要打開串口:

        isSerialPort = System.Configuration.ConfigurationSettings.AppSettings["isSerialPort"].ToString();

            if (isSerialPort != "0") {

                this.axMSCommTeco.PortOpen = true;

            }

5.開啟一個線程,讀取plc中的數據。讀取plc的數據,其實,就是發一個命令,然後,一直讀取串口,等待plc數據返回此地址的數據。

       private void GetData() {



           while (true)

           {

               axMSCommTeco.Output = SendmessageReadplcNumber;

               if (IsDataComplete())

               {

                   updateText("1");

               }

               System.Threading.Thread.Sleep(iTimeout);

               IsCountion = false;

               if (IsStop) {

                   break;

               }

           }

       }

6.給plc發送數據:

axMSCommTeco.Output = SendmessageReadplcNumber;

SendmessageReadplcNumber是要發送的字符串,發送之前要進行編碼。

7.寫plc地址:

        public static string WriteAddrData(string Sadd, string Dadd, string Sdadd)

        {



            string strReturn = "@" + Sadd + "WD" + Dadd + Sdadd;

            return strReturn + FCS(strReturn) + "*\r\n";

        }

8.讀取plc地址的數據

        public static   string ReadAddrData(string Sadd, string Dadd, string Sdadd)

        {



            string strReturn = "@" + Sadd + "RD" + Dadd + Sdadd;

            return strReturn + FCS(strReturn) + "*\r\n";

        }

9.數據校驗

          private static  string FCS(String Value)

          {

              int i, f;

              byte[] x;

              f = 0;

              for (i = 0; i < Value.Length; i++)

              {

                  x = ASCIIEncoding.ASCII.GetBytes(Value.Substring(i, 1));

                  f = f ^ (int)x[0];

              }



              return f.ToString("X");

          }

10.代碼使用寫串口數據

               string message = TecoPlc.WriteAddrData("00", "0316", EfficiencySops.Target.ToString("X").PadLeft(4,'0'));//標準工時

             axMSCommTeco.Output = message;

給地址316,寫入數據,數據 要求 4位,不夠位數補o。

11.讀取地址上的數據

   message = TecoPlc.ReadAddrData("00", "0010", "0001");

                   System.Threading.Thread.Sleep(1000);

                   axMSCommTeco.Output = message;

先發送讀取命令,然後 循環讀取串口數據。

       private string DataComplete()

       {



           string message = "";

           while (true)

           {



               message += TypeUtil.toString(axMSCommTeco.Input);

               if (message.Length > 2 && message.Substring(message.Length - 1, 1) == "\r")

               {



                   break;

               }

               if (IsStop) {

                   break;

               }



           }

           return message;

       }

要注意,在發送命令后,要停止一段時間,如果連續發送 ,會達不到你要求的效果。我這裡設置每一條命令發送完成后,停止

 System.Threading.Thread.Sleep(1000);

12.程式停止,不要關閉串口,除非關閉此窗口,才關閉串口。

 

 

你可能感兴趣的:(C#)