c# 操作plc

來源:互聯網
上載者:User

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

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.