搜索 | 会员  
c#操作plc
来源: CIOZJ   作者:记者  日期:2014/7/11  类别:编程语言  主题:.NET  编辑:dezai
使用c#程式,通過串口操作plc,在此例子中,使用西門子的plc,程式是winform。

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

德仔网尊重行业规范,每篇文章都注明有明确的作者和来源;德仔网的原创文章,请转载时务必注明文章作者和来源:德仔网;
头条那些事
大家在关注
广告那些事
我们的推荐
也许感兴趣的
干货