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