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.程式停止,不要關閉串口,除非關閉此窗口,才關閉串口。

 

 

posted @ 2012-06-28 14:51  無限遐想  阅读(11701)  评论(7编辑  收藏  举报